如何翻译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!!
但该应用程序仍显示在默认系统lamanguageEN
;我错过了什么
编辑
在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-a
输出中的名称;例如,如果编码包含在语言名称中,请不要删除,例如:ar_AE.utf8
不等于ar_AE
语言
;我们可以安装它它将正确的输出打印到控制台,但不在应用程序中?是的,控制台输出是*.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 )