Created
October 6, 2023 09:50
-
-
Save bannzai/971bd7ec5a9b9df069aaff754c401752 to your computer and use it in GitHub Desktop.
generate_translated_localizable_strings.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import os | |
import openai | |
openai.organization = os.environ.get("OPENAI_ORGANIZATION") | |
openai.api_key = os.environ.get("OPENAI_API_KEY") | |
langs = ['fr'] | |
os.chdir('./DigitalDetox/Resources/') | |
def create_lang_directory(lang): | |
path = f'{lang}.lproj' | |
os.makedirs(path, exist_ok=True) | |
return os.path.join(path, 'Localizable.strings') | |
def read_original_strings(file_path): | |
with open(file_path, 'r') as file: | |
return file.readlines() | |
def translate_text(target_lang, ja_text): | |
translated_localization_strings = [ | |
{ | |
"name": "translated_localization_strings", | |
"description": f'「Focus」というiOSのスクリーンタイムAPIを利用してユーザーが指定したアプリの制限時間を超えた場合に指定したアプリの利用を制限できる機能を持っているアプリを開発してます。ユーザーのアプリの使いすぎを防ぎ本来やりたかったことに集中(Focus)できるアプリになります。このアプリでローカライズをしたいです。指定された言語が使われている文化圏に相応しいFocusのアプリ上で表示するための翻訳を返してください', | |
"parameters": { | |
"type": "object", | |
"properties": { | |
"translated": { | |
"type": "string", | |
"description": "Translated Localizable.strings value for specify language", | |
} | |
}, | |
"required": ["translated"] | |
} | |
} | |
] | |
response = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo", | |
messages=[ | |
{"role": "user", "content": f'{ja_text}を{target_lang}向けの翻訳をしてください。{target_lang}はISO言語コードと一致しています。`%1$lld`,`%2$lld`,`%3$lld`や`%@` についてはそのままにしてください'}, | |
], | |
max_tokens=1000, | |
n=1, | |
stop=None, | |
functions=translated_localization_strings, | |
function_call={ "name": "translated_localization_strings" } | |
) | |
message = response["choices"][0]["message"] | |
if message.get("function_call"): | |
arguments = json.loads(message["function_call"]["arguments"]) | |
return arguments.get("translated"); | |
# main | |
original_strings = read_original_strings('ja.lproj/Localizable.strings') | |
for lang in langs: | |
print(f"Start {lang}") | |
translated_strings = [] | |
for line in original_strings: | |
if '=' not in line: | |
# 空白やコメント業はそのまま追加して次に進む | |
translated_strings.append(line) | |
continue | |
# 英語部分と日本語部分に分割 | |
key, value = line.split(' = ') | |
key = key.strip('"') | |
value = value.strip('";\n') | |
translated_value = translate_text(lang, value) | |
print(f'Translated lang:{lang} en_text:{key} ja_text:{value} to "{translated_value}"') | |
translated_strings.append(f'"{key}" = "{translated_value}";\n') | |
# 翻訳した結果を新しいファイルに書き込み | |
new_file_path = create_lang_directory(lang) | |
print(f"Start of writing {new_file_path}") | |
with open(new_file_path, 'w') as file: | |
file.writelines(translated_strings) | |
print(f"End of writing {new_file_path}") | |
# 完了メッセージを表示 | |
"Localizable.strings files have been created for the specified languages." | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment