Skip to content

Commit f656144

Browse files
author
Sascha Pfeiffer
committed
Added automatic translations
Signed-off-by: Sascha Pfeiffer <sascha.pfeiffer@esaqa.com>
1 parent 1f5065c commit f656144

File tree

3 files changed

+167
-1
lines changed

3 files changed

+167
-1
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@
1818

1919
npm-debug.log*
2020

21-
.idea
21+
.idea
22+
untranslated

.gitlab-ci.yml

+13
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,24 @@ variables:
44
CONTAINER_LATEST_IMAGE_JFROG: psono-docker.jfrog.io/psono/psono-admin-client:latest
55

66
stages:
7+
- translate
78
- test
89
- build
910
- release
1011
- deploy
1112

13+
create-translations:
14+
except:
15+
- schedules
16+
stage: translate
17+
image: psono-docker.jfrog.io/ubuntu:22.04
18+
script:
19+
- apt-get update && apt-get install -y python3 python3-pip
20+
- pip3 install requests openai==1.34.0
21+
- python3 var/translate.py
22+
only:
23+
- develop@psono/psono-admin-client
24+
1225
test-unittests:
1326
except:
1427
- schedules

var/translate.py

+152
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
import requests
2+
import json
3+
from openai import OpenAI
4+
import os
5+
6+
POEDITOR_API_KEY = os.environ['POEDITOR_API_KEY']
7+
POEDITOR_PROJECT_ID = os.environ['POEDITOR_PROJECT_ID']
8+
9+
client = OpenAI(
10+
api_key=os.environ.get("OPENAI_API_KEY"),
11+
)
12+
13+
LANGUAGE_CODES = [
14+
"ar",
15+
"de",
16+
"es",
17+
"fr",
18+
"hi",
19+
"it",
20+
"ja",
21+
"ko",
22+
"nl",
23+
"ru",
24+
"pl",
25+
"pt",
26+
"pt-br",
27+
"zh-cn",
28+
]
29+
30+
31+
# Function to translate text using OpenAI GPT-4o
32+
def translate_text(text, lang):
33+
response = client.chat.completions.create(
34+
model="gpt-4o",
35+
messages=[
36+
{"role": "system", "content": "You are a helpful assistant."},
37+
{"role": "user", "content": f"Translate the following text to language code '{lang}': {text}"}
38+
]
39+
)
40+
translated_text = response.choices[0].message.content.strip()
41+
return translated_text
42+
43+
def translate_language(lang):
44+
data = [
45+
('api_token', POEDITOR_API_KEY),
46+
('action', 'export'),
47+
('id', POEDITOR_PROJECT_ID),
48+
('filters', 'untranslated'),
49+
('language', lang),
50+
('type', 'key_value_json'),
51+
]
52+
53+
r = requests.post('https://poeditor.com/api/', data=data, timeout=20.0)
54+
55+
if not r.ok:
56+
print("Error: download_language")
57+
print(r.text)
58+
exit(1)
59+
60+
result = r.json()
61+
62+
r = requests.get(result['item'], stream=True, timeout=20.0)
63+
64+
if r.status_code != 200:
65+
print(f"Error: download_language {lang}")
66+
print(r.text)
67+
exit(1)
68+
69+
70+
r.raw.decode_content = True
71+
content = r.raw.read()
72+
73+
if not content:
74+
# no untrunslated terms
75+
print(f"Success: nothing to translate for {lang}")
76+
return
77+
78+
data = json.loads(content)
79+
80+
if not data:
81+
# no untrunslated terms
82+
print(f"Success: nothing to translate for {lang}")
83+
return
84+
85+
translated_data = {}
86+
for key, value in data.items():
87+
translated_data[key] = translate_text(value, lang)
88+
89+
folder_path = os.path.join('untranslated')
90+
os.makedirs(folder_path, exist_ok=True)
91+
path = os.path.join(folder_path, f"{lang}.json")
92+
with open(path, 'w') as f:
93+
json.dump(translated_data, f, ensure_ascii=False, indent=4)
94+
95+
print(f"Translation completed and saved to {path}")
96+
97+
data = {
98+
'id': POEDITOR_PROJECT_ID,
99+
'api_token': POEDITOR_API_KEY,
100+
'updating': 'translations',
101+
'language': lang,
102+
'sync_terms ': 0,
103+
}
104+
with open(path, 'rb') as file:
105+
r = requests.post('https://api.poeditor.com/v2/projects/upload', data=data, files={'file': file}, timeout=20.0)
106+
107+
if not r.ok:
108+
print("Error: upload_language " + lang)
109+
print(r.text)
110+
exit(1)
111+
content = json.loads(r.content)
112+
if "response" not in content or "status" not in content["response"] or content["response"]["status"] != 'success':
113+
print("Error: upload_language " + lang)
114+
print(r.text)
115+
exit(1)
116+
117+
return path
118+
119+
120+
def get_languages():
121+
data = [
122+
('api_token', POEDITOR_API_KEY),
123+
('id', POEDITOR_PROJECT_ID),
124+
]
125+
126+
r = requests.post('https://api.poeditor.com/v2/languages/list', data=data, timeout=20.0)
127+
if not r.ok:
128+
print("Error: get_languages")
129+
print(r.json())
130+
exit(1)
131+
result = r.json()
132+
print(result['result']['languages'])
133+
return result['result']['languages']
134+
135+
136+
137+
def main():
138+
139+
# Download
140+
languages = get_languages()
141+
for lang in languages:
142+
language_code = lang['code'].lower()
143+
if language_code not in LANGUAGE_CODES:
144+
print("skipping language " + language_code)
145+
continue
146+
print("processing language " + language_code)
147+
translate_language(language_code)
148+
149+
print("Success")
150+
151+
if __name__ == "__main__":
152+
main()

0 commit comments

Comments
 (0)