我维护一个包含翻译的可插拔Django应用程序。 Python和HTML代码中的所有字符串都是用英语编写的。在将字符串翻译成德语时,我总是在努力解决德语区分正式和非正式语音的问题(参见T–V distinction)。由于该应用程序用于不同的站点,从社交网络到银行网站,我不能只支持正式或非正式版本。由于翻译可能有很大不同,我无法对其进行参数化。例如。句子“你想退出吗?”会有这两个翻译:
Gettext中有什么可以帮我解决这个问题吗?
答案 0 :(得分:3)
您可以使用contextual markers为翻译提供更多背景信息。
logout = pgettext('casual', 'Do you want to log out?')
...
logout = pgettext('formal', 'Do you want to log out?')
答案 1 :(得分:0)
gettext和UNIX在其他类似情况下使用的最佳方法是使用locale variants。例如,sr_RS
是(或者,因为塞尔维亚人现在被认为是元语言......)用于塞尔维亚语的代码用西里尔语写成。但它有时也用拉丁文写成,所以sr_RS@latin
用作语言名称,当然也包括MO文件名或目录。
在这里,看看我在我的系统上提供的一些翻译:
$ find /usr/local/share/locale | grep /sr
/usr/local/share/locale/sr
/usr/local/share/locale/sr/LC_MESSAGES
/usr/local/share/locale/sr/LC_MESSAGES/bash.mo
/usr/local/share/locale/sr/LC_MESSAGES/bfd.mo
/usr/local/share/locale/sr/LC_MESSAGES/binutils.mo
/usr/local/share/locale/sr/LC_MESSAGES/gettext-runtime.mo
/usr/local/share/locale/sr/LC_MESSAGES/gettext-tools.mo
/usr/local/share/locale/sr/LC_MESSAGES/glib20.mo
/usr/local/share/locale/sr/LC_MESSAGES/wget.mo
/usr/local/share/locale/sr@ije
/usr/local/share/locale/sr@ije/LC_MESSAGES
/usr/local/share/locale/sr@ije/LC_MESSAGES/glib20.mo
/usr/local/share/locale/sr@latin
/usr/local/share/locale/sr@latin/LC_MESSAGES
/usr/local/share/locale/sr@latin/LC_MESSAGES/glib20.mo
/usr/local/share/locale/sr_RS
/usr/local/share/locale/sr_RS/LC_MESSAGES
/usr/local/share/locale/sr_RS/LC_MESSAGES/mkvtoolnix.mo
/usr/local/share/locale/sr_RS@latin
/usr/local/share/locale/sr_RS@latin/LC_MESSAGES
/usr/local/share/locale/sr_RS@latin/LC_MESSAGES/mkvtoolnix.mo
$
因此,处理德语变体的最佳方法是相同的:使用de
(或de_DE
)作为基本非正式变体,并使用单独的翻译文件de_DE@formal
与正式变体翻译。
这基本上也是WordPress的功能。当然,作为WordPress,它们有自己的特殊风格,不使用变体语法,而是在文件名中添加第三个组件:de_DE.mo
是非正式的(也是后备,因为它没有任何进一步的规范)variant和de_DE_formal.mo
包含正式变体。