这是我翻译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)
失败。
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
也失败了。
答案 0 :(得分:3)
以下方法与我成功合作>
locale
模块而不是gettext
。locale.setlocale(category , language )
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 )
locale.Error: unsupported locale setting
感谢Juha Sahakangas在#gtk + IRC频道提供的解释: 对于这种特殊情况,需要使用locale模块而不是gettext。 Python的gettext模块是纯python,它实际上并没有以C库可以读取的方式设置文本域,但是locale(通过调用libc)。 只要这样做,GtkBuilder已经按照你要求的方式工作了。
避免language
locale -a
应该是受支持的语言之一。获取支持的语言列表; locale -a
命令。
语言名称应与命令ar_AE.utf8
的输出中的名称相同;即。如果它包含在语言名称中,请不要剥离编码,即: ar_AE
不等于language
。
如果不支持{{1}};我们可以安装它。
安装不支持的语言:
sudo apt-get install language-pack-en-base
sudo dpkg-reconfigure locales
how to make glade load translation
答案 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.
您在此处使用变量名称令人困惑。您正在将参数更改为完全不同类型的对象,您可能希望区分这两者。