-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathaction.yml
More file actions
238 lines (203 loc) · 9.81 KB
/
Copy pathaction.yml
File metadata and controls
238 lines (203 loc) · 9.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
name: 'Translate Changelog and Create PR'
description: 'Translates changelog files between languages and creates a PR'
inputs:
changelog_path:
description: 'Path to CHANGELOG directory'
required: false
default: 'CHANGELOG'
file_prefix:
description: 'Prefix for changelog files (e.g., "CHANGELOG-v" or "v")'
required: false
default: 'v'
source_lang:
description: 'Source language code (ru or en)'
required: false
default: 'ru'
target_lang:
description: 'Target language code (en or ru)'
required: false
default: 'en'
github_token:
description: 'GitHub token for creating pull requests'
required: false
python_version:
description: 'Python version to use'
required: false
default: '3.11'
base_branch:
description: 'Base branch for the pull request'
required: false
default: 'main'
outputs:
version:
description: 'Version of the translated changelog'
source_file:
description: 'Source changelog file name'
target_file:
description: 'Target changelog file name'
has_changes:
description: 'Whether CHANGELOG files were changed in the last commit'
runs:
using: "composite"
steps:
- name: Check if CHANGELOG files changed in last commit
id: check_changes
shell: bash
run: |
# Проверить, есть ли изменения в CHANGELOG файлах в последнем коммите
CHANGELOG_PATH="${{ inputs.changelog_path }}"
FILE_PREFIX="${{ inputs.file_prefix }}"
SOURCE_LANG="${{ inputs.source_lang }}"
# Определить паттерн исходных файлов на основе source_lang
if [ "$SOURCE_LANG" = "en" ]; then
# Для английского ищем файлы без языкового суффикса
FILE_PATTERN="^${CHANGELOG_PATH}/${FILE_PREFIX}[0-9]+\.[0-9]+\.[0-9]+\.yml$"
else
# Для других языков ищем файлы с языковым суффиксом
FILE_PATTERN="^${CHANGELOG_PATH}/${FILE_PREFIX}[0-9]+\.[0-9]+\.[0-9]+\.${SOURCE_LANG}\.yml$"
fi
# Получить список измененных файлов в последнем коммите
CHANGED_FILES=$(git show --name-only --pretty=format: HEAD | grep -E "$FILE_PATTERN" || true)
if [ -n "$CHANGED_FILES" ]; then
echo "CHANGELOG files changed in last commit (source_lang=$SOURCE_LANG):"
echo "$CHANGED_FILES"
echo "has_changes=true" >> $GITHUB_OUTPUT
else
echo "No CHANGELOG files changed in last commit for source_lang=$SOURCE_LANG, skipping"
echo "has_changes=false" >> $GITHUB_OUTPUT
fi
- name: Set up Python
if: steps.check_changes.outputs.has_changes == 'true'
uses: actions/setup-python@v5
with:
python-version: ${{ inputs.python_version }}
- name: Install dependencies
if: steps.check_changes.outputs.has_changes == 'true'
shell: bash
run: |
pip install pyyaml deep-translator packaging
- name: Find latest changelog
if: steps.check_changes.outputs.has_changes == 'true'
id: find_changelog
shell: bash
run: |
cd "${{ inputs.changelog_path }}"
export FILE_PREFIX="${{ inputs.file_prefix }}"
export SOURCE_LANG="${{ inputs.source_lang }}"
export TARGET_LANG="${{ inputs.target_lang }}"
# Найти все файлы исходного языка и отсортировать по semver
python3 << 'EOF'
import os
import re
from packaging import version
file_prefix = os.environ.get('FILE_PREFIX', 'CHANGELOG-v')
source_lang = os.environ.get('SOURCE_LANG', 'ru')
target_lang = os.environ.get('TARGET_LANG', 'en')
# Определить паттерн файлов на основе source_lang
if source_lang == 'en':
# Для английского ищем файлы без языкового суффикса
file_pattern = re.compile(rf'^{re.escape(file_prefix)}(\d+\.\d+\.\d+)\.yml$')
source_suffix = ''
else:
# Для других языков ищем файлы с языковым суффиксом
file_pattern = re.compile(rf'^{re.escape(file_prefix)}(\d+\.\d+\.\d+)\.{re.escape(source_lang)}\.yml$')
source_suffix = f'.{source_lang}'
files = [f for f in os.listdir('.') if file_pattern.match(f)]
# Извлечь версии из имен файлов
versions = []
for f in files:
match = file_pattern.match(f)
if match:
versions.append((version.parse(match.group(1)), f))
if not versions:
print(f"No changelog files found for source language: {source_lang}")
exit(1)
# Отсортировать по версии (последняя версия первая)
versions.sort(reverse=True)
latest_version, source_file = versions[0]
# Определить имя целевого файла
version_str = f"{latest_version}"
if target_lang == 'en':
# Для английского целевой файл без языкового суффикса
target_file = f"{file_prefix}{version_str}.yml"
else:
# Для других языков целевой файл с языковым суффиксом
target_file = f"{file_prefix}{version_str}.{target_lang}.yml"
github_output = os.environ.get('GITHUB_OUTPUT', '/dev/stdout')
with open(github_output, 'a') as f:
f.write(f"version=v{version_str}\n")
f.write(f"source_file={source_file}\n")
f.write(f"target_file={target_file}\n")
print(f"Latest version: v{version_str}, source: {source_file}, target: {target_file}")
EOF
continue-on-error: true
- name: Translate changelog
if: steps.check_changes.outputs.has_changes == 'true' && steps.find_changelog.outcome == 'success'
id: translate
shell: bash
env:
SOURCE_FILE: ${{ steps.find_changelog.outputs.source_file }}
TARGET_FILE: ${{ steps.find_changelog.outputs.target_file }}
SOURCE_LANG: ${{ inputs.source_lang }}
TARGET_LANG: ${{ inputs.target_lang }}
run: |
cd "${{ inputs.changelog_path }}"
python3 << 'EOF'
from deep_translator import GoogleTranslator
import os
import yaml
source_file = os.environ['SOURCE_FILE']
target_file = os.environ['TARGET_FILE']
source_lang = os.environ['SOURCE_LANG']
target_lang = os.environ['TARGET_LANG']
# Загрузить YAML файл
with open(source_file, 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
# Инициализировать переводчик
translator = GoogleTranslator(source=source_lang, target=target_lang)
def translate_value(value):
"""Рекурсивно переводит строки, ключи и значения в структуре данных"""
if isinstance(value, str):
# Переводим строку
try:
return translator.translate(value)
except Exception as e:
print(f"Warning: Failed to translate '{value[:50]}...': {e}")
return value
elif isinstance(value, dict):
return {
translate_value(key): translate_value(val)
for key, val in value.items()
}
elif isinstance(value, list):
# Рекурсивно обрабатываем список
return [translate_value(item) for item in value]
else:
# Другие типы (числа, bool, None) возвращаем без изменений
return value
# Перевести все ключи и значения в структуре
translated_data = translate_value(data)
# Сохранить переведенный YAML
with open(target_file, 'w', encoding='utf-8') as f:
yaml.dump(translated_data, f, allow_unicode=True, default_flow_style=False, sort_keys=False)
print(f"Translated {source_file} ({source_lang}) to {target_file} ({target_lang})")
EOF
- name: Create Pull Request
if: steps.check_changes.outputs.has_changes == 'true' && steps.find_changelog.outcome == 'success'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ inputs.github_token }}
commit-message: Translate changelog ${{ steps.find_changelog.outputs.version }} from ${{ inputs.source_lang }} to ${{ inputs.target_lang }}
branch: translation/${{ inputs.source_lang }}-to-${{ inputs.target_lang }}/${{ steps.find_changelog.outputs.version }}
delete-branch: false
title: ${{ steps.find_changelog.outputs.version }}
body: |
## Changelog ${{ steps.find_changelog.outputs.version }}
This PR contains the ${{ inputs.target_lang == 'ru' && 'Russian' || 'English' }} translation of the ${{ inputs.source_lang == 'ru' && 'Russian' || 'English' }} changelog for version ${{ steps.find_changelog.outputs.version }}.
**Source file:** `${{ inputs.changelog_path }}/${{ steps.find_changelog.outputs.source_file }}`
**Translated file:** `${{ inputs.changelog_path }}/${{ steps.find_changelog.outputs.target_file }}`
<details>
<summary>Changelog content</summary>
The translated changelog file has been generated and is ready for review.
</details>
base: ${{ inputs.base_branch }}