如何解决Django 翻译文件 - 将旧翻译集成到 .po 文件中
我有一个旧版/非 django 应用程序,其中的翻译文件与 Django/gettext .po
文件的格式不同。我想在我的 Django 应用程序中使用所有字符串,但我也想在现有应用程序中继续使用它们。
当前系统的格式为:
- 每种语言都有自己的文件。 (即
en.txt
、de.txt
、fr.txt
) - 每一行都有一个字符串翻译成它自己的语言
- 在应用程序中使用字符串时,首先在
en.txt
中找到与该字符串匹配的行号,然后从目标语言返回同一行。因此,如果字符串是“hello world”并且位于 en.txt 的第 5 行,则该函数将返回 de.txt 的第 5 行,即“hallo welt”。
在 Django 中使用旧翻译文件的最佳方式是什么?
以下是我想到的一些想法
- 覆盖 Django 中的
gettext
系统以返回我自己的翻译 - 创建我自己的模板标签来处理翻译
- 创建脚本以从
.po
文件创建.txt
文件
解决方法
对于#1,我决定覆盖内部 Django TranslationCatalog
是可能的,但似乎没有记录并且将来可能会发生变化。例如,如果您想添加/覆盖翻译,您可以执行以下操作:
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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。