在尝试实施网站的翻译版本时,我遇到了以下问题:
假设我的模型定义如下:
class Model(models.model)
name=models.CharField(max_length=10)
...
要创建一些数据(稍后显示在网页上),我会使用包含以下行的特殊视图:
Model.objects.create(name = "testName",...)
我尝试使用以下代码实现翻译:
Model.objects.create(name = _("testName"),...)
如果我将ugettext
导入为_
,则只需将“testName”的翻译值放入数据库中。
如果我将ugettext_lazy
导入_
,我会InterfaceError
(更准确地说是Error binding parameter X - probably unsupported type
。
我想知道如果我必须找到一些解决方法,是否可以进行这样的初始化。
提前致谢。
答案 0 :(得分:2)
只需将英文版存储在数据库中,并在输出期间仅调用ugettext / _lazy。这显然只有在存在这些字符串的翻译时才有效,否则它将以任何方式显示英文版...
答案 1 :(得分:1)
ugettext
和ugettext_lazy
用于静态I18N翻译。它们应用于代码中的可翻译文本,以将文本收集到.po
文件,最后收集到.mo
个文件中。
通常对于动态文本,您需要通过Django ORM在DB中创建翻译模式,并编辑Django Admin等视图中的翻译。然后在您的视图中,根据请求的语言显示正确的翻译版本
您可以通过挑选将“ugettext_lazy
__proxy__
存储到数据库”,然后可以对其进行解压缩并应用unicode
来获取翻译。但是,IMO,将代码中的文字存储到DB无意义。
如果您想要通过Web界面管理的基于po的翻译解决方案,请参考https://github.com/mbi/django-rosetta
答案 2 :(得分:0)
只需添加,以防有人需要它。
这是我发现实施Florian解决方案的最佳方式,并且每次都不需要添加/删除_
函数。
您将在包含字符串的文件中定义一个虚函数:
def _(input):
return input
这样,您的字符串将以原始语言存储,但makemessages
仍然会像需要翻译的字符串一样处理它们,从而将它们放在.po
文件中。而你只需要在html中使用{% trans %}
块。