Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何翻译pygtk;林间空地gtk.Builder()应用程序?_Gtk_Interface Builder_Locale_Pygtk_Glade - Fatal编程技术网

如何翻译pygtk;林间空地gtk.Builder()应用程序?

如何翻译pygtk;林间空地gtk.Builder()应用程序?,gtk,interface-builder,locale,pygtk,glade,Gtk,Interface Builder,Locale,Pygtk,Glade,这是我第一次尝试翻译pygtkglade;我已经在以下目录中创建了Rockdome.mo文件:/locale/ar/LC\u MESSAGES/Rockdome.mo def apply_locale(self , lang): domain = "Rockdome" local_path = basefolder+"/locale" # basefolder is the current dir lang = gettext.

这是我第一次尝试翻译
pygtk
glade
;我已经在以下目录中创建了Rockdome.mo文件:
/locale/ar/LC\u 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!!
但该应用程序仍显示在默认系统lamanguage
EN
;我错过了什么

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

它失败了


第二个来自

这也失败了!!,应用程序仍然未翻译

注意:我想
builder
需要知道我的本地路径的位置才能在其中搜索,而不是在默认路径中 因此,我将
/local/ar/LC_MESSAGES/Rockdome.mo
复制到
/usr/share/locale/ar/LC_MESSAGES/Rockdome.mo
,但同样失败


您仅在函数范围内更改
lang
对象。您必须将其返回以正确设置

您需要像这样调用函数:
my\u lang=apply\u 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.

这里使用的变量名令人困惑。如果要将参数更改为完全不同的对象类型,可能需要区分这两种类型。

以下方法成功地适用于我>

  • 使用
    locale
    模块而不是
    gettext
  • 执行
    locale.setlocale(类别、语言)
  • 通过
    gtk.Builder设置
    gtk.Builder
    translation\u域。在加载glade文件之前,通过以下方式设置
    gtk.Builder的
    translation\u域()
    :例如:
    gtk.Builder。从\u文件添加\u
  • 代码##
    为什么我们应该用locale替换gettext 感谢#gtk+IRC频道上的Juha Sahakangas提供的解释: 对于这种特殊情况,需要使用locale模块而不是gettext。 Python的gettext模块是纯Python的,它实际上并没有以C库可以读取的方式设置文本域,但是locale(通过调用libc)设置了文本域。 只要这样做了,GtkBuilder就已经按照您要求的方式工作了


    笔记 避免
    locale.Error:不支持的区域设置

  • 在函数locale.setlocale(locale.LC_ALL,language)中<代码>语言应该是受支持的语言之一
  • 获取支持的语言列表<代码>区域设置-一个命令

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

  • 如果不支持
    语言
    ;我们可以安装它

  • 要安装不支持的语言,请执行以下操作:

  • sudo-apt-get安装语言包en-base

    sudo dpkg重新配置区域设置

    谢谢你的链接


    它将正确的输出打印到控制台,但不在应用程序中?是的,控制台输出是*.mo文件的正确阿拉伯语翻译。您需要在函数中更改它时返回
    lang
    返回lang
    ,以便您可以在应用程序中进行设置。对不起;我是初学者;你能建议代码吗?请参考问题<代码>self.builder.set_translationdomain()在我的安装“locale”模块中没有“gettext”。我有一台Windows7机器,带有Python 2.7.8。来自
    locale
    doc的这段代码解释了为什么:
    locale模块在提供此接口的系统上公开C库的gettext接口。
     self.builder.set_translation_domain('Rockdome')
     print self.builder.get_translation_domain() # the output is "Rockdome"
    
    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.
    
        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 )