代码之家  ›  专栏  ›  技术社区  ›  landyman

生成本地化文件的最简单方法

  •  21
  • landyman  · 技术社区  · 17 年前

    我目前正在用python编写一个应用程序,需要为它提供本地化。

    我可以使用gettext和它附带的实用程序来生成.po和.mo文件。但是,为每种语言逐个编辑.po文件似乎有点乏味。然后,为每种语言创建目录,并逐个生成.mo文件,似乎有点过头了。最终结果是:

    /en_US/LC_MESSAGES/en_US.mo
    /en_CA/LC_MESSAGES/en_CA.mo
    etc.
    

    我可能是错的,但似乎有更好的方法可以做到这一点。有没有人有我还没有找到的工具、技巧或常识?

    事先谢谢!

    编辑:为了更清楚一点,我正在寻找一些可以加速这个过程的东西。因为已经很容易了。例如,在.NET中,我可以生成需要转换为Excel文件的所有字符串。然后,翻译人员可以填写Excel文件并为每种语言添加列。然后,我可以使用xls2resx生成语言资源文件。有没有什么像这样的东西?我意识到我可以写一个脚本来创建和读取csv并生成文件——我只是希望已经有了一些东西。

    7 回复  |  直到 13 年前
        1
  •  28
  •   warp    17 年前

    我刚刚为一个我正在做的项目做了这个,对我们来说,过程是这样的:

    首先,我有一个potfiles.in文件,其中包含需要翻译的源文件列表。我们实际上有两个文件(例如admin.in和user.in),因为管理界面并不总是需要翻译。所以我们只能将用户看到的包含字符串的文件发送给翻译人员。

    运行以下命令将从potfiles.in创建.pot模板:

    xgettext --files-from=POTFILES.in --directory=.. --output=messages.pot
    

    从po/目录运行上述命令,该目录应该是项目的子目录,并包含potfiles.in文件。.pot文件与.po文件的格式完全相同,但它是一个不包含翻译的模板。只要将新的可翻译字符串添加到源文件中,就可以创建新模板。

    要更新已翻译的.po文件并向其添加新字符串,请运行:

    msgmerge --update --no-fuzzy-matching --backup=off da.po messages.pot
    

    在上面的例子中,我禁用了模糊匹配,因为我们的字符串是混乱的,它弊大于利。我还禁用了备份文件,因为这里的所有内容都在Subversion中。对每种语言运行上述命令,在本例中,我更新了丹麦语翻译。

    最后运行msgfmt从.po文件创建.mo文件:

    msgfmt nl.po --output-file nl.mo
    

    当然,您不希望每次都手动运行这个脚本,所以创建一些脚本(或者最好是一个或多个makefile)来为您执行这个操作。

    请注意,您的目录布局与我的情况略有不同,因此您需要稍微调整输出文件名/路径,但步骤应该相同。

        2
  •  6
  •   glezos    14 年前

    你可以使用 Transifex 很多python项目(django,mercurial)都使用。它有一个基于Web的编辑器和用于自动化的命令行客户机,并且还支持.NET,如果这有帮助的话。

    免责声明:我是Transifex项目负责人。

        3
  •  4
  •   lothar    17 年前

    我不明白你是怎么想在不编辑每种语言的.po文件的情况下实现真正的翻译的?魔法?

    编辑(在注释之后)-如何自动生成 PO 文件夹:

    我不使用GetText,但来自 wiki page 看起来你只需要打电话

    msginit--locale=xx--input=name.pot

    你想支持的每一种语言。我将生成一个脚本,生成所有语言文件,将它们交给翻译人员,然后在您重新运行它们时 多层梯度薄膜晶体管 在他们身上。

        4
  •  3
  •   Sergey Stolyarov    17 年前

    使用脚本。假设您的源代码在$SRC目录中,那么为i18n文件(pot、po、mo等)创建$SRC/po目录。然后创建文件$src/po/potfiles.in,在该文件中使用gettext函数调用指定源代码文件的路径。它可能看起来像:

    [encoding: UTF-8]
    ./main.cpp
    ./plugins/list.cpp
    

    现在可以使用以下命令(在目录$SRC内):

    更新主文件消息.pot:

    intltool-update --pot --gettext-package=messages --verbose
    

    对于从messages.pot到fr.po文件的合并更改,例如:

    msgmerge -U fr.po messages.pot
    

    要生成mo文件,请使用命令:

    msgmerge -o - fr.po messages.pot | msgfmt -c -o fr/LC_MESSAGES/programname.mo -
    

    当然,目录fr/lc_messages/必须在调用之前创建,也可以在执行之前删除现有fr/lc_messages/programname.mo。

    例如,为了加快进程,将所有这些命令放入相应的.sh文件中。

        5
  •  3
  •   Dwayne    13 年前

    你可以试试 Translate Toolkit 对于各种订单文件转换(例如po2csv)。子项目 Pootle 允许通过Web管理翻译。

        6
  •  2
  •   raspi    17 年前

    我在用 poEdit 用于翻译。

        7
  •  2
  •   Van Gale    17 年前

    我的建议是 django-rosetta 提供了一个基于Web的界面来编辑翻译。Django根本不需要参与你的应用程序,你只需要将它用于在线.po编辑工具。

    另一个有趣的新翻译网站,我相信它是用django/pinax建立的。 Transifex 尽管我不确定它是否允许直接编辑.po文件。

    推荐文章