Skip to content

Commit b1902be

Browse files
author
Sascha Pfeiffer
committed
unified translation process
Signed-off-by: Sascha Pfeiffer <sascha.pfeiffer@esaqa.com>
1 parent 8cd379b commit b1902be

9 files changed

+149
-117
lines changed

.gitlab-ci.yml

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ test-upload-translations:
5353
image: psono-docker.jfrog.io/python:3
5454
script:
5555
- pip install requests
56+
- python3 var/upload_translations.py
5657
- python3 var/sync_translations.py
5758
only:
5859
- develop@psono/psono-admin-client
File renamed without changes.
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{
2+
}
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{
2+
}

src/i18n.js

+48-22
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ import { initReactI18next } from 'react-i18next';
66
// import moment from 'moment'
77

88
const languages = {
9+
ar: { code: 'ar', lng_code: 'LANG_AR', lng_title_native: 'عربي' },
10+
bn: {
11+
code: 'bn',
12+
lng_code: 'LANG_BN',
13+
lng_title_native: 'বাংলা',
14+
active: true,
15+
},
916
ca: {
1017
code: 'ca',
1118
lng_code: 'LANG_CA',
@@ -18,6 +25,12 @@ const languages = {
1825
lng_title_native: 'Česky',
1926
active: true,
2027
},
28+
da: {
29+
code: 'da',
30+
lng_code: 'LANG_DA',
31+
lng_title_native: 'Dansk',
32+
active: true,
33+
},
2134
de: {
2235
code: 'de',
2336
lng_code: 'LANG_DE',
@@ -62,14 +75,30 @@ const languages = {
6275
lng_title_native: 'Italiano',
6376
active: true,
6477
},
65-
ja: { code: 'ja', lng_code: 'LANG_JA', lng_title_native: '日本語' },
66-
ko: { code: 'ko', lng_code: 'LANG_KO', lng_title_native: '한국어' },
78+
ja: {
79+
code: 'ja',
80+
lng_code: 'LANG_JA',
81+
lng_title_native: '日本語',
82+
active: true,
83+
},
84+
ko: {
85+
code: 'ko',
86+
lng_code: 'LANG_KO',
87+
lng_title_native: '한국어',
88+
active: true,
89+
},
6790
nl: {
6891
code: 'nl',
6992
lng_code: 'LANG_NL',
7093
lng_title_native: 'Nederlands',
7194
active: true,
7295
},
96+
no: {
97+
code: 'no',
98+
lng_code: 'LANG_NO',
99+
lng_title_native: 'Norsk',
100+
active: true,
101+
},
73102
pl: {
74103
code: 'pl',
75104
lng_code: 'LANG_PL',
@@ -94,42 +123,39 @@ const languages = {
94123
lng_title_native: 'Русский',
95124
active: true,
96125
},
97-
vi: { code: 'vi', lng_code: 'LANG_VI', lng_title_native: '' }, // lng_title_native incorrect
98-
da: { code: 'da', lng_code: 'LANG_DA', lng_title_native: '' }, // lng_title_native incorrect
99126
sv: {
100127
code: 'sv',
101128
lng_code: 'LANG_SV',
102129
lng_title_native: 'Svenska',
103130
active: true,
104131
},
105-
sk: {
106-
code: 'sk',
107-
lng_code: 'LANG_SK',
108-
lng_title_native: 'Slovák',
109-
active: true,
110-
},
132+
sk: { code: 'sk', lng_code: 'LANG_SK', lng_title_native: 'Slovák' },
111133
uk: {
112134
code: 'uk',
113135
lng_code: 'LANG_UK',
114136
lng_title_native: 'Український',
115137
active: true,
116138
},
117-
no: {
118-
code: 'no',
119-
lng_code: 'LANG_NO',
120-
lng_title_native: 'Norsk',
139+
he: { code: 'he', lng_code: 'LANG_HE', lng_title_native: '' }, // deactivated
140+
hi: {
141+
code: 'hi',
142+
lng_code: 'LANG_HI',
143+
lng_title_native: 'हिंदी',
121144
active: true,
122145
},
123-
he: { code: 'he', lng_code: 'LANG_HE', lng_title_native: '' }, // lng_title_native incorrect
124-
ar: { code: 'ar', lng_code: 'LANG_AR', lng_title_native: '' }, // lng_title_native incorrect
125-
hi: { code: 'hi', lng_code: 'LANG_HI', lng_title_native: '' }, // lng_title_native incorrect
126-
bn: {
127-
code: 'bn',
128-
lng_code: 'LANG_BN',
129-
lng_title_native: 'বাংলা',
146+
vi: { code: 'vi', lng_code: 'LANG_VI', lng_title_native: '' }, // deactivated
147+
'zh-Hans': {
148+
code: 'zh-Hans',
149+
lng_code: 'LANG_ZH_HANS',
150+
lng_title_native: '简体中文',
151+
active: true,
152+
},
153+
'zh-Hant': {
154+
code: 'zh-Hant',
155+
lng_code: 'LANG_ZH_HANT',
156+
lng_title_native: '繁體中文',
130157
active: true,
131158
},
132-
zh_CN: { code: 'zh_CN', lng_code: 'LANG_ZH_CN', lng_title_native: '漢語' },
133159
};
134160

135161
const supportedLngs = [];

var/download_translations_from_artifactory.sh

+7-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
apt-get update && \
44
apt-get install -y curl && \
55
curl -o public/locales/da/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-da.json && \
6+
curl -o public/locales/ca/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-ca.json && \
67
curl -o public/locales/sv/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-sv.json && \
78
curl -o public/locales/no/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-no.json && \
89
curl -o public/locales/he/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-he.json && \
910
curl -o public/locales/ar/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-ar.json && \
1011
curl -o public/locales/hi/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-hi.json && \
12+
curl -o public/locales/hu/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-hu.json && \
1113
curl -o public/locales/bn/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-bn.json && \
1214
curl -o public/locales/cs/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-cs.json && \
1315
curl -o public/locales/de/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-de.json && \
@@ -20,9 +22,11 @@ curl -o public/locales/it/translation.json https://psono.jfrog.io/psono/psono/ad
2022
curl -o public/locales/ja/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-ja.json && \
2123
curl -o public/locales/ko/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-ko.json && \
2224
curl -o public/locales/nl/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-nl.json && \
23-
curl -o public/locales/pl/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-pl.json && \
2425
curl -o public/locales/pt/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-pt.json && \
25-
curl -o public/locales/pt-BR/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-pt-br.json && \
26+
curl -o public/locales/pt-br/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-pt-br.json && \
27+
curl -o public/locales/pl/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-pl.json && \
2628
curl -o public/locales/ru/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-ru.json && \
29+
curl -o public/locales/sk/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-sk.json && \
2730
curl -o public/locales/vi/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-vi.json && \
28-
curl -o public/locales/zh-cn/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-zh-cn.json
31+
curl -o public/locales/zh-Hant/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-zh-Hant.json
32+
curl -o public/locales/zh-Hans/translation.json https://psono.jfrog.io/psono/psono/admin-client/languages/locale-zh-Hans.json

var/sync_translations.py

+5-50
Original file line numberDiff line numberDiff line change
@@ -24,48 +24,9 @@
2424
"es", "es-ar", "es-gt", "es-cr", "es-pa", "es-do", "es-mx", "es-ve", "es-co",
2525
"es-pe", "es-ec", "es-cl", "es-uy", "es-py", "es-bo", "es-sv", "es-hn", "es-ni",
2626
"es-pr", "sx", "sv", "sv-fi", "th", "ts", "tn", "tr", "uk", "ur", "ve", "vi", "xh",
27-
"ji", "zu", "ar", "bn"
27+
"ji", "zu", "ar", "bn", "zh", "zh-Hant", "zh-Hans"
2828
]
2929

30-
FILE_PATHS = {
31-
'en': 'public/locales/en/translation.json',
32-
}
33-
34-
35-
def upload_language(lang):
36-
37-
if lang in FILE_PATHS:
38-
data = {
39-
'id': POEDITOR_PROJECT_ID,
40-
'api_token': POEDITOR_API_KEY,
41-
'updating': 'terms_translations',
42-
'language': lang,
43-
'overwrite': 1,
44-
}
45-
with open(FILE_PATHS[lang], 'rb') as file:
46-
r = requests.post('https://api.poeditor.com/v2/projects/upload', data=data, files={'file': file})
47-
48-
else:
49-
print("Error: upload_language " + lang + " No webhook configured for this language")
50-
# params = (
51-
# ('api_token', POEDITOR_API_KEY),
52-
# ('id_project', POEDITOR_PROJECT_ID),
53-
# ('language', lang),
54-
# ('operation', 'import_terms_and_translations'),
55-
# )
56-
#
57-
# r = requests.post('https://poeditor.com/api/webhooks/gitlab', params=params)
58-
if not r.ok:
59-
print("Error: upload_language " + lang)
60-
print(r.text)
61-
exit(1)
62-
content = json.loads(r.content)
63-
if "response" not in content or "status" not in content["response"] or content["response"]["status"] != 'success':
64-
print("Error: upload_language " + lang)
65-
print(r.text)
66-
exit(1)
67-
print("Success: upload_language " + lang)
68-
6930
def download_language(lang):
7031
data = [
7132
('api_token', POEDITOR_API_KEY),
@@ -127,21 +88,15 @@ def get_languages():
12788

12889

12990
def main():
130-
# Upload
131-
for lang in FILE_PATHS:
132-
upload_language(lang)
133-
time.sleep(20)
134-
13591
# Download
13692
languages = get_languages()
13793
for lang in languages:
138-
language_code = lang['code'].lower()
139-
if language_code not in LANGUAGE_CODES:
94+
if lang['code'] not in LANGUAGE_CODES:
14095
print("Error: main")
141-
print("Invalid Language Code " + language_code)
96+
print("Invalid Language Code " + lang['code'])
14297
exit(1)
143-
file = download_language(language_code)
144-
deploy_to_artifactory(ARTIFACTORY_USER, ARTIFACTORY_PASS, ARTIFACTORY_URL, ARTIFACTORY_PATH, language_code, file)
98+
file = download_language(lang['code'])
99+
deploy_to_artifactory(ARTIFACTORY_USER, ARTIFACTORY_PASS, ARTIFACTORY_URL, ARTIFACTORY_PATH, lang['code'], file)
145100

146101
print("Success")
147102

var/translate.py

+26-42
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,41 @@
1212
)
1313

1414
LANGUAGE_CODES = [
15-
"ar",
16-
"de",
17-
"es",
18-
"fr",
19-
"hi",
20-
"it",
21-
"ja",
22-
"ko",
23-
"nl",
24-
"ru",
25-
"pl",
26-
"pt",
27-
"pt-br",
28-
"zh-cn",
15+
("ar", "Arabic"),
16+
("da", "Danish"),
17+
("de", "German"),
18+
("es", "Spanish"),
19+
("fr", "French"),
20+
("hi", "Hindi"),
21+
("it", "Italian"),
22+
("ja", "Japanese"),
23+
("ko", "Korean"),
24+
("nl", "Dutch"),
25+
("no", "Norwegian"),
26+
("pl", "Polish"),
27+
("pt", "Portuguese"),
28+
("pt-br", "Portuguese Brazilian"),
29+
("sv", "Swedish"),
30+
("ru", "Russian"),
31+
("zh-Hans", "Simplified Chinese"),
32+
("zh-Hant", "Traditional Chinese"),
2933
]
3034

3135

36+
3237
# Function to translate text using OpenAI GPT-4o
33-
def translate_text(text, lang):
38+
def translate_text(text, lang, language):
3439
response = client.chat.completions.create(
3540
model="gpt-4o",
3641
messages=[
3742
{"role": "system", "content": "You are a helpful assistant."},
38-
{"role": "user", "content": f"Translate the following text to language code '{lang}' and provide only the translated text with no additional commentary or explanations: {text}"}
43+
{"role": "user", "content": f"Translate the following text to {language} language code '{lang}' and provide only the translated text with no additional commentary or explanations: {text}"}
3944
]
4045
)
4146
translated_text = response.choices[0].message.content.strip()
4247
return translated_text
4348

44-
def translate_language(lang):
49+
def translate_language(lang, language):
4550
data = [
4651
('api_token', POEDITOR_API_KEY),
4752
('action', 'export'),
@@ -85,7 +90,7 @@ def translate_language(lang):
8590

8691
translated_data = {}
8792
for key, value in data.items():
88-
translated_data[key] = translate_text(value, lang)
93+
translated_data[key] = translate_text(value, lang, language)
8994

9095
folder_path = os.path.join('untranslated')
9196
os.makedirs(folder_path, exist_ok=True)
@@ -119,31 +124,10 @@ def translate_language(lang):
119124

120125
return path
121126

122-
def get_languages():
123-
data = [
124-
('api_token', POEDITOR_API_KEY),
125-
('id', POEDITOR_PROJECT_ID),
126-
]
127-
128-
r = requests.post('https://api.poeditor.com/v2/languages/list', data=data, timeout=20.0)
129-
if not r.ok:
130-
print("Error: get_languages")
131-
print(r.json())
132-
exit(1)
133-
result = r.json()
134-
print(result['result']['languages'])
135-
return result['result']['languages']
136-
137127
def main():
138-
# Download
139-
languages = get_languages()
140-
for lang in languages:
141-
language_code = lang['code'].lower()
142-
if language_code not in LANGUAGE_CODES:
143-
print("skipping language " + language_code)
144-
continue
145-
print("processing language " + language_code)
146-
translate_language(language_code)
128+
for lang, language in LANGUAGE_CODES:
129+
print("processing language " + lang)
130+
translate_language(lang, language)
147131

148132
print("Success")
149133

0 commit comments

Comments
 (0)