Django 翻译文件 - 将遗留翻译集成到 .po 文件中
Django Translation Files - Integrating legacy translations into .po files
我有一个 legacy/non-django 应用程序,其中的翻译文件格式与 Django/gettext .po
文件不同。我想在我的 Django 应用程序中使用所有字符串,但我也想在现有应用程序中继续使用它们。
当前系统格式为:
- 每种语言都有自己的文件。 (即
en.txt
、de.txt
、fr.txt
)
- 每一行都有一个字符串翻译成它自己的语言
- 当在应用程序中使用字符串时,首先在
en.txt
中找到与该字符串匹配的行号,然后从目标语言中 return 编辑同一行。因此,如果字符串是“hello world”并且在 en.txt 的第 5 行,该函数将 return de.txt 的第 5 行,这将是“hallo welt”。
在 Django 中使用旧翻译文件的最佳方式是什么?
这是我想到的一些想法
- 将 Django 中的
gettext
系统覆盖为 return 我自己的翻译
- 创建我自己的模板标签来处理翻译
- 创建脚本以从
.txt
个文件创建 .po
个文件
对于 #1,我认为覆盖内部 Django TranslationCatalog
是可能的,但似乎没有记录并且将来可能会发生变化。例如,如果您想 add/override 翻译,您可以执行以下操作:
from django.utils import translation
translation._trans._translations['de']._catalog._catalogs[1]['Hello World'] = 'Hallo Welt'
对于 #2,这会工作得很好,但如果 Django 更改了它的内部数据结构,我将不得不重新实现 Django 翻译系统的许多功能。
对于 #3,这似乎是最可行的,因为它允许我继续使用旧的文本文件,但只要有什么变化就让脚本处理它们。以下是我为我们创建的通用版本:
lans_dir = 'path/to/lans/files/'
lan_array = ['bg','ca','cs','da','de','el','en','es','fi','fr','hr','hu','it','ja','ko','nl','no','pb','pl','pt','ro','ru','sk','sr','sv','tr','tw','uk','zh']
lan_dict = {}
for lan_code in lan_array:
line_list = []
lan_file_name = os.path.join(lans_dir,f'{lan_code}.txt')
with open(lan_file_name) as file_in:
for line in file_in:
line_strip = line.strip()
line_list.append(line_strip)
lan_dict[lan_code] = line_list
en_lines = lan_dict['en']
for lan_code in lan_array:
path = os.path.join(f'locale/{lan_code}/LC_MESSAGES/django.po')
with open(path, 'wt', encoding='utf-8') as file_out:
for line_number, line in enumerate(lan_dict[lan_code]):
file_out.write(f"#: en.txt:{line_number + 1}\n")
file_out.write(f"msgid \"{en_line}\"\n")
file_out.write(f"msgstr \"{line}\"\n\n")
我有一个 legacy/non-django 应用程序,其中的翻译文件格式与 Django/gettext .po
文件不同。我想在我的 Django 应用程序中使用所有字符串,但我也想在现有应用程序中继续使用它们。
当前系统格式为:
- 每种语言都有自己的文件。 (即
en.txt
、de.txt
、fr.txt
) - 每一行都有一个字符串翻译成它自己的语言
- 当在应用程序中使用字符串时,首先在
en.txt
中找到与该字符串匹配的行号,然后从目标语言中 return 编辑同一行。因此,如果字符串是“hello world”并且在 en.txt 的第 5 行,该函数将 return de.txt 的第 5 行,这将是“hallo welt”。
在 Django 中使用旧翻译文件的最佳方式是什么?
这是我想到的一些想法
- 将 Django 中的
gettext
系统覆盖为 return 我自己的翻译 - 创建我自己的模板标签来处理翻译
- 创建脚本以从
.txt
个文件创建.po
个文件
对于 #1,我认为覆盖内部 Django TranslationCatalog
是可能的,但似乎没有记录并且将来可能会发生变化。例如,如果您想 add/override 翻译,您可以执行以下操作:
from django.utils import translation
translation._trans._translations['de']._catalog._catalogs[1]['Hello World'] = 'Hallo Welt'
对于 #2,这会工作得很好,但如果 Django 更改了它的内部数据结构,我将不得不重新实现 Django 翻译系统的许多功能。
对于 #3,这似乎是最可行的,因为它允许我继续使用旧的文本文件,但只要有什么变化就让脚本处理它们。以下是我为我们创建的通用版本:
lans_dir = 'path/to/lans/files/'
lan_array = ['bg','ca','cs','da','de','el','en','es','fi','fr','hr','hu','it','ja','ko','nl','no','pb','pl','pt','ro','ru','sk','sr','sv','tr','tw','uk','zh']
lan_dict = {}
for lan_code in lan_array:
line_list = []
lan_file_name = os.path.join(lans_dir,f'{lan_code}.txt')
with open(lan_file_name) as file_in:
for line in file_in:
line_strip = line.strip()
line_list.append(line_strip)
lan_dict[lan_code] = line_list
en_lines = lan_dict['en']
for lan_code in lan_array:
path = os.path.join(f'locale/{lan_code}/LC_MESSAGES/django.po')
with open(path, 'wt', encoding='utf-8') as file_out:
for line_number, line in enumerate(lan_dict[lan_code]):
file_out.write(f"#: en.txt:{line_number + 1}\n")
file_out.write(f"msgid \"{en_line}\"\n")
file_out.write(f"msgstr \"{line}\"\n\n")