如何翻译pygtk;格莱德; gtk.Builder()应用程序?

时间:2014-06-20 05:26:20

标签: gtk interface-builder locale pygtk glade

这是我翻译pygtk glade的第一次试验;我在以下目录创建了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!!

但应用程序仍然出现在默认系统lamnguage EN中;我错过了什么?

修改

在pygtk和buider tutoial中搜索后;我找到了两种方法来告诉gtk& builder如何携带文字: 第一个来自here

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

失败。


here

中的第二个
 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也失败了。

2 个答案:

答案 0 :(得分:3)

以下方法与我成功合作>

  1. 使用locale模块而不是gettext
  2. 执行locale.setlocale(category , language )
  3. translation_domain之前设置gtk.Builder gtk.Builder.set_translation_domain(),然后按以下方式加载gtk.Builder.add_from_file:EX: 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 )
  4. 代码##

    locale.Error: unsupported locale setting

    为什么我们应该用locale

    替换gettext
      

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


    备注

    避免language

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

    3. 语言名称应与命令ar_AE.utf8的输出中的名称相同;即。如果它包含在语言名称中,请不要剥离编码,即: ar_AE不等于language

    4. 如果不支持{{1}};我们可以安装它。

    5. 安装不支持的语言:

    6.   

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

           

      sudo dpkg-reconfigure locales

      感谢您的链接

      how to make glade load translation

      locale error : unsupported locale setting

      locale module doc

      install unsupported locale

答案 1 :(得分: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.

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