如何翻译 pygtk、glade 和 gtk.Builder() 应用程序?

3

这是我第一次尝试翻译pygtkglade;我已在以下目录创建了Rockdome.mo文件:./locale/ar/LC_MESSAGES/Rockdome.mo

    def apply_locale(self , lang):
         domain  = "Rockdome"
         local_path = basefolder+"/locale"   # basefolder is the current dir
         lang = gettext.translation('Rockdome', local_path ,  languages=['%s'%lang])
         lang.install()
         _ = lang.gettext
         print _("Close") # the output is اغلاق which is correct arabic translation!!

但是应用程序仍然以默认系统语言 EN 显示;我错过了什么?

编辑

在搜索 pygtk 和 buider 教程后,我找到了两种方法来告诉 gtkbuilder 如何带来文本: 第一种方法来自 这里

 for module in (gettext, gtk.glade):
     module.bindtextdomain(APP_NAME, LOCALE_DIR)
     module.textdomain(APP_NAME)       

失败了。


这里开始的第二个

 self.builder.set_translation_domain('Rockdome')
 print self.builder.get_translation_domain() # the output is "Rockdome"

同样失败!!,应用程序仍未翻译!!

N.B: 我猜 builder 需要知道我的本地路径位置以在其中搜索而不是默认路径, 因此我将 ./local/ar/LC_MESSAGES/Rockdome.mo 复制到 /usr/share/locale/ar/LC_MESSAGES/Rockdome.mo 也失败了。


它在控制台上打印正确的输出,但不在应用程序中打印? - The_Cthulhu_Kid
你需要返回 lang,目前你只是在函数中改变它。 - The_Cthulhu_Kid
对不起,我是初学者,你能给我建议一下代码吗? - esnadr
返回的语言应该传递到什么地方? - esnadr
让我们在聊天中继续这个讨论 - esnadr
显示剩余4条评论
2个回答

3
以下方法已经成功地为我工作过:
  1. 使用 locale 模块而不是 gettext
  2. 执行 locale.setlocale(category , language )
  3. 在通过 gtk.Builder.add_from_file 加载 glade 文件之前,通过 gtk.Builder.set_translation_domain() 设置 gtk.Buildertranslation_domain。例如:gtk.Builder.set_translation_domain()

代码 ##

    import locale
    from locale import gettext as _

    def apply_locale(self , current_lang ):
        domain  = "Rockdome"
        local_path = basefolder+"/data/locale"
        locale.bindtextdomain(domain , local_path )
        locale.textdomain(domain)
        locale.setlocale(locale.LC_ALL, 'ar_AE.utf8')   
        # note that language is "ar_AE.utf8" not "ar" or "ar_AE"
        self.builder.set_translation_domain(domain )

为什么我们应该使用locale替代gettext

感谢Juha Sahakangas在#gtk+ IRC频道上提供的解释: 对于这种情况,需要使用locale模块而不是gettext。 Python的gettext模块是纯Python的,它实际上没有以C库可以读取的方式设置文本域,但是locale可以(通过调用libc)。 只要这样做了,GtkBuilder已经按您要求的方式工作。


注意事项

避免出现locale.Error: unsupported locale setting

  1. 在函数locale.setlocale(locale.LC_ALL, language);中,language应该是支持的语言之一。
  2. 获取支持的语言列表:使用命令locale -a

  3. 语言的名称应该等于命令locale -a的输出中的名称;即,如果包含在语言名称中,请勿删除编码,例如:ar_AE.utf8不等于ar_AE

  4. 如果不支持language,可以安装它。

  5. 安装不受支持的语言:

sudo apt-get install language-pack-en-base

sudo dpkg-reconfigure locales

感谢以下链接

如何使glade加载翻译

locale错误:不支持的语言环境设置

locale模块文档

安装不受支持的语言环境


在我的安装中,“locale”模块没有“gettext”。我有一台Windows7机器,安装了Python 2.7.8。来自“locale”文档的这个片段解释了原因:“在提供此接口的系统上,locale模块公开了C库的gettext接口。” - Zvika

1
你只是在函数的范围内更改了lang对象,必须返回它以正确设置它。
你需要像这样调用函数:my_lang = apply_locale(lang) 或者你可以将lang设置为类的属性。
def apply_locale(self , lang):
     domain  = "Rockdome"
     local_path = basefolder+"/locale"   # basefolder is the current dir
     lang = gettext.translation('Rockdome', local_path ,  languages=['%s'%lang])
     lang.install()
     _ = lang.gettext
     return lang  # Here you return the value and set it to the object you passed to your function.

您在这里使用的变量名很令人困惑。您正在将参数更改为完全不同类型的对象,您可能希望区分这两者。

请设置翻译域:self.builder.set_translationdomain() - esnadr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接