【问题标题】:Django Translation Files - Integrating legacy translations into .po filesDjango 翻译文件 - 将旧版翻译集成到 .po 文件中
【发布时间】:2021-05-13 19:57:02
【问题描述】:

我有一个旧版/非 django 应用程序,其中的翻译文件格式与 Django/gettext .po 文件不同。我想在我的 Django 应用程序中使用所有字符串,但我也想在现有应用程序中继续使用它们。

当前系统的格式是:

  1. 每种语言都有自己的文件。 (即en.txtde.txtfr.txt
  2. 每一行都有一个字符串翻译成它自己的语言
  3. 在应用程序中使用字符串时,首先在en.txt 中找到与该字符串匹配的行号,并从目标语言返回同一行。因此,如果字符串是“hello world”并且在 en.txt 的第 5 行,该函数将返回 de.txt 的第 5 行,即“hallo welt”。

在 Django 中使用旧翻译文件的最佳方式是什么?

这是我想到的一些想法

  1. 覆盖 Django 中的 gettext 系统以返回我自己的翻译
  2. 创建我自己的模板标签来处理翻译
  3. 创建脚本以从 .txt 文件创建 .po 文件

【问题讨论】:

  • 1) 到目前为止。旧格式非常脆弱且难以调试:其中一个翻译文件中缺少行,您必须追溯到第一个不匹配的翻译。因此,将其转换为受良好支持和内置的东西。一旦你有了 .po 文件,你仍然可以根据需要决定使用不同的系统,而且很可能不同的系统会有一个 .po 导入器。
  • @Melvyn 问题是我仍然需要维护旧的 txt 文件,因为旧的应用程序依赖它们。但我可以创建一个脚本,以便在进行更改时将它们重新导入 Django 应用程序
  • 你有我的同情。 Legacy是个残忍的情妇。 :) 我会按下将旧应用程序迁移到 gettext,但如果无法做到,也许可以使用 Crowdin 之类的服务并以该应用程序的原生格式编写翻译。

标签: python django internationalization gettext


【解决方案1】:

对于#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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多