Python论坛  - 讨论区

标题:[python-chinese] 用XRC生成wxPython的界面,如何实现I18N呢?

2007年07月19日 星期四 12:37

马踏飞燕 honeyday.mj在gmail.com
星期四 七月 19 12:37:21 HKT 2007

我用wxPython自带的XRCed生成了一个界面,然后用代码调用之后可以显示出界面了.
但是,现在的问题是,我虽然用XRCed提供的生成gettext的功能而得到了一个写有
_('File') 这样的代码,但是我用poEdit翻译之后并且install了,只有在程序代码中直接创建控件的地方写的_('some
text')才有翻译的效果,从xrc生成的还是英文的.

有什么办法吗?

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年07月23日 星期一 13:04

Hong Yuan hongyuan在homemaster.cn
星期一 七月 23 13:04:46 HKT 2007

马踏飞燕 写道:
> 我用wxPython自带的XRCed生成了一个界面,然后用代码调用之后可以显示出界面了.
> 但是,现在的问题是,我虽然用XRCed提供的生成gettext的功能而得到了一个写有
> _('File') 这样的代码,但是我用poEdit翻译之后并且install了,只有在程序代码中直接创建控件的地方写的_('some
> text')才有翻译的效果,从xrc生成的还是英文的.
>
> 有什么办法吗?
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese


  wxPython中XRC文件对 i18N的支持

上面的方法是对于所有python程序的通用方法。对于wxPython的程序,如果所有的 
界面元素都使用代码来生成,即界面中的文字都出现在界面代码中,则可以完全使 
用相同的方法来实现i18N。

但是wxPython提供了另外一种生成面界的方法,即使用XRC资源文件定义界面,在 
程序中只要加载相应的界面对象。通过这种方式生成界面时在 python代码中看不 
见界面元素的字串常量,这些字符串都保存在.xrc的资源文件中,无法用xgettext 
直接进行处理。

wxPython的XRC支持包括了对i18N的支持。函数XmlResource有一个默认参数flags= 
XRC_USE_LOCALE,这样在加载XRC资源时会根据当前locale判断是否存在语言包, 
从语言包中将相应字串的翻译显示出来。wxPython本身库函数中的文字内容则存放 
在 wxstd.mo中。

这样对于xrc使用i18N的前提一是正确设置wxPython的locale,二是从xrc文件中抽 
取需要翻译的字符串,生成.mo文件。具体的步骤如下:

   1. 从xrc文件中生成.po文件用于翻译。有两种方法,一是使用wxrc -g将xrc文
      件中可翻译的字符串转换成_(str)的格式,然后用xgettext像对其他程序一
      样进行.po文件的抽取。wxrc工具在Debian 中位于wx2.5-common包内。另一
      种方式是将xrc文件导入到wxGlade这样的工具中,通过wxGlade转换成C++或
      python代码,然后使用xgettext进行字串抽取。翻译完的.mo文件必须放在
      [lang]/LC_MESSAGES目录下。
   2. 初始化locale,指定语言以及在何处可以找到相应的.mo文件。通常情况下
      系统首先在当前目录中查找catalog,然后在系统目录中搜索。但保险起见
      用AddCatalogLookupPathPrefix比较可靠。

L = wx.Locale()
L.Init(wx.LANGUAGE_CHINESE_SIMPLIFIED)
L.AddCatalogLookupPathPrefix('./locale')
L.AddCatalog('messages')

*注意:* 在wxPython 2.7以后的版本中,必须先生成wx.App对象后才能调用 
wx.Locale对象的Init方法。因此对上述代码需略微修改,将L=wx.Locale ()放在 
生成wx.App前,而在wx.App对象的OnInit代码中调用L.Init等代码。这样可以保证 
在OnInit结束后L对象依旧作为全局变量存在。

   3. 之后可以使用XmlResource生成相应的对象。也可以使用Locale.GetString
      (string)函数返回对应Locale 的翻译字符。该函数的功能类似于_(),但如
      果在同一界面中需要显示同一字串的不同语言译文时只要调用不同Locale的
      GetString函数即可。

-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20070723/c43a8ba7/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年07月23日 星期一 13:11

wang_zheng_yong wang_zheng_yong在163.com
星期一 七月 23 13:11:12 HKT 2007

  ÕýºÃÐèÒªÕâ¸ö£¬ ¸Ðл hong yuan ºÍ Âí̤·ÉÑà




wang_zheng_yong
2007-07-23



·¢¼þÈË£º Hong Yuan
·¢ËÍʱ¼ä£º 2007-07-23 13:05:13
ÊÕ¼þÈË£º python-chinese在lists.python.cn
³­ËÍ£º 
Ö÷Ì⣺ Re: [python-chinese]ÓÃXRCÉú³ÉwxPythonµÄ½çÃæ,ÈçºÎʵÏÖI18NÄØ?

Âí̤·ÉÑà дµÀ: 
ÎÒÓÃwxPython×Ô´øµÄXRCedÉú³ÉÁËÒ»¸ö½çÃæ,È»ºóÓôúÂëµ÷ÓÃÖ®ºó¿ÉÒÔÏÔʾ³ö½çÃæÁË.
µ«ÊÇ,ÏÖÔÚµÄÎÊÌâÊÇ,ÎÒËäÈ»ÓÃXRCedÌṩµÄÉú³ÉgettextµÄ¹¦ÄܶøµÃµ½ÁËÒ»¸öдÓÐ
_('File') ÕâÑùµÄ´úÂë,µ«ÊÇÎÒÓÃpoEdit·­ÒëÖ®ºó²¢ÇÒinstallÁË,Ö»ÓÐÔÚ³ÌÐò´úÂëÖÐÖ±½Ó´´½¨¿Ø¼þµÄµØ·½Ð´µÄ_('some
text')²ÅÓз­ÒëµÄЧ¹û,´ÓxrcÉú³ÉµÄ»¹ÊÇÓ¢ÎĵÄ.

ÓÐʲô°ì·¨Âð?
_______________________________________________
python-chinese
Post: send python-chinese在lists.python.cn
Subscribe: send subscribe to python-chinese-request在lists.python.cn
Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese


wxPythonÖÐXRCÎļþ¶Ô i18NµÄÖ§³Ö
ÉÏÃæµÄ·½·¨ÊǶÔÓÚËùÓÐpython³ÌÐòµÄͨÓ÷½·¨¡£¶ÔÓÚwxPythonµÄ³ÌÐò£¬Èç¹ûËùÓеĽçÃæÔªËض¼Ê¹ÓôúÂëÀ´Éú³É£¬¼´½çÃæÖеÄÎÄ×Ö¶¼³öÏÖÔÚ½çÃæ´úÂëÖУ¬Ôò¿ÉÒÔÍêȫʹÓÃÏàͬµÄ·½·¨À´ÊµÏÖi18N¡£
µ«ÊÇwxPythonÌṩÁËÁíÍâÒ»ÖÖÉú³ÉÃæ½çµÄ·½·¨£¬¼´Ê¹ÓÃXRC×ÊÔ´Îļþ¶¨Òå½çÃ棬ÔÚ³ÌÐòÖÐÖ»Òª¼ÓÔØÏàÓ¦µÄ½çÃæ¶ÔÏó¡£Í¨¹ýÕâÖÖ·½Ê½Éú³É½çÃæʱÔÚ python´úÂëÖп´²»¼û½çÃæÔªËصÄ×Ö´®³£Á¿£¬ÕâЩ×Ö·û´®¶¼±£´æÔÚ.xrcµÄ×ÊÔ´ÎļþÖУ¬ÎÞ·¨ÓÃxgettextÖ±½Ó½øÐд¦Àí¡£
wxPythonµÄXRCÖ§³Ö°üÀ¨Á˶Ôi18NµÄÖ§³Ö¡£º¯ÊýXmlResourceÓÐÒ»¸öĬÈϲÎÊýflags=XRC_USE_LOCALE£¬ÕâÑùÔÚ¼ÓÔØXRC×ÊԴʱ»á¸ù¾Ýµ±Ç°localeÅжÏÊÇ·ñ´æÔÚÓïÑÔ°ü£¬´ÓÓïÑÔ°üÖн«ÏàÓ¦×Ö´®µÄ·­ÒëÏÔʾ³öÀ´¡£wxPython±¾Éí¿âº¯ÊýÖеÄÎÄ×ÖÄÚÈÝÔò´æ·ÅÔÚ wxstd.moÖС£
ÕâÑù¶ÔÓÚxrcʹÓÃi18NµÄÇ°ÌáÒ»ÊÇÕýÈ·ÉèÖÃwxPythonµÄlocale£¬¶þÊÇ´ÓxrcÎļþÖгéÈ¡ÐèÒª·­ÒëµÄ×Ö·û´®£¬Éú³É.moÎļþ¡£¾ßÌåµÄ²½ÖèÈçÏ£º
´ÓxrcÎļþÖÐÉú³É.poÎļþÓÃÓÚ·­Òë¡£ÓÐÁ½ÖÖ·½·¨£¬Ò»ÊÇʹÓÃwxrc -g½«xrcÎļþÖпɷ­ÒëµÄ×Ö·û´®×ª»»³É_(str)µÄ¸ñʽ£¬È»ºóÓÃxgettextÏñ¶ÔÆäËû³ÌÐòÒ»Ñù½øÐÐ.poÎļþµÄ³éÈ¡¡£wxrc¹¤¾ßÔÚDebian ÖÐλÓÚwx2.5-common°üÄÚ¡£ÁíÒ»ÖÖ·½Ê½Êǽ«xrcÎļþµ¼Èëµ½wxGladeÕâÑùµÄ¹¤¾ßÖУ¬Í¨¹ýwxGladeת»»³ÉC++»òpython´úÂ룬ȻºóʹÓÃxgettext½øÐÐ×Ö´®³éÈ¡¡£·­ÒëÍêµÄ.moÎļþ±ØÐë·ÅÔÚ[lang]/LC_MESSAGESĿ¼Ï¡£ 
³õʼ»¯locale£¬Ö¸¶¨ÓïÑÔÒÔ¼°Ôںδ¦¿ÉÒÔÕÒµ½ÏàÓ¦µÄ.moÎļþ¡£Í¨³£Çé¿öÏÂϵͳÊ×ÏÈÔÚµ±Ç°Ä¿Â¼ÖвéÕÒcatalog£¬È»ºóÔÚϵͳĿ¼ÖÐËÑË÷¡£µ«±£ÏÕÆð¼ûÓÃAddCatalogLookupPathPrefix±È½Ï¿É¿¿¡£ 
L = wx.Locale()
L.Init(wx.LANGUAGE_CHINESE_SIMPLIFIED)
L.AddCatalogLookupPathPrefix('./locale')
L.AddCatalog('messages')

×¢Òâ: ÔÚwxPython 2.7ÒÔºóµÄ°æ±¾ÖУ¬±ØÐëÏÈÉú³Éwx.App¶ÔÏóºó²ÅÄܵ÷ÓÃwx.Locale¶ÔÏóµÄInit·½·¨¡£Òò´Ë¶ÔÉÏÊö´úÂëÐèÂÔ΢Ð޸ģ¬½«L=wx.Locale ()·ÅÔÚÉú³Éwx.AppÇ°£¬¶øÔÚwx.App¶ÔÏóµÄOnInit´úÂëÖе÷ÓÃL.InitµÈ´úÂë¡£ÕâÑù¿ÉÒÔ±£Ö¤ÔÚOnInit½áÊøºóL¶ÔÏóÒÀ¾É×÷Ϊȫ¾Ö±äÁ¿´æÔÚ¡£
Ö®ºó¿ÉÒÔʹÓÃXmlResourceÉú³ÉÏàÓ¦µÄ¶ÔÏó¡£Ò²¿ÉÒÔʹÓÃLocale.GetString(string)º¯Êý·µ»Ø¶ÔÓ¦Locale µÄ·­Òë×Ö·û¡£¸Ãº¯ÊýµÄ¹¦ÄÜÀàËÆÓÚ_()£¬µ«Èç¹ûÔÚͬһ½çÃæÖÐÐèÒªÏÔʾͬһ×Ö´®µÄ²»Í¬ÓïÑÔÒëÎÄʱֻҪµ÷Óò»Í¬LocaleµÄGetStringº¯Êý¼´¿É¡£ 
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20070723/75285a19/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年07月23日 星期一 17:12

马踏飞燕 honeyday.mj在gmail.com
星期一 七月 23 17:12:17 HKT 2007

瓦考!
兄弟,你太强了.
第二种方法真是高!
我现在用的是第一种方法的变通方式,就是在程序里面手工的写上一大队的SetLableText()这样的代码,内容就是_('some text
need trandlate')的东西,也能达到目标,但是wx新提供的一些窗口对话框,例如AboutDialog还是汉化不了.
我试试第二招看看怎么样.

在 07-7-23,Hong Yuan<hongyuan在homemaster.cn> 写道:
> 马踏飞燕 写道:
> 我用wxPython自带的XRCed生成了一个界面,然后用代码调用之后可以显示出界面了.
但是,现在的问题是,我虽然用XRCed提供的生成gettext的功能而得到了一个写有
_('File')
> 这样的代码,但是我用poEdit翻译之后并且install了,只有在程序代码中直接创建控件的地方写的_('some
text')才有翻译的效果,从xrc生成的还是英文的.

有什么办法吗?
_______________________________________________
python-chinese
Post:
> send python-chinese在lists.python.cn
Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
Unsubscribe: send
> unsubscribe to
> python-chinese-request在lists.python.cn
Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>
>
> wxPython中XRC文件对 i18N的支持
>
> 上面的方法是对于所有python程序的通用方法。对于wxPython的程序,如果所有的界面元素都使用代码来生成,即界面中的文字都出现在界面代码中,则可以完全使用相同的方法来实现i18N。
>
> 但是wxPython提供了另外一种生成面界的方法,即使用XRC资源文件定义界面,在程序中只要加载相应的界面对象。通过这种方式生成界面时在
> python代码中看不见界面元素的字串常量,这些字符串都保存在.xrc的资源文件中,无法用xgettext直接进行处理。
>
> wxPython的XRC支持包括了对i18N的支持。函数XmlResource有一个默认参数flags=XRC_USE_LOCALE,这样在加载XRC资源时会根据当前locale判断是否存在语言包,从语言包中将相应字串的翻译显示出来。wxPython本身库函数中的文字内容则存放在
> wxstd.mo中。
>
> 这样对于xrc使用i18N的前提一是正确设置wxPython的locale,二是从xrc文件中抽取需要翻译的字符串,生成.mo文件。具体的步骤如下:
> 从xrc文件中生成.po文件用于翻译。有两种方法,一是使用wxrc
> -g将xrc文件中可翻译的字符串转换成_(str)的格式,然后用xgettext像对其他程序一样进行.po文件的抽取。wxrc工具在Debian
> 中位于wx2.5-common包内。另一种方式是将xrc文件导入到wxGlade这样的工具中,通过wxGlade转换成C++或python代码,然后使用xgettext进行字串抽取。翻译完的.mo文件必须放在[lang]/LC_MESSAGES目录下。
> 初始化locale,指定语言以及在何处可以找到相应的.mo文件。通常情况下系统首先在当前目录中查找catalog,然后在系统目录中搜索。但保险起见用AddCatalogLookupPathPrefix比较可靠。
> L =
> wx.Locale()
L.Init(wx.LANGUAGE_CHINESE_SIMPLIFIED)
L.AddCatalogLookupPathPrefix('./locale')
L.AddCatalog('messages')
>
>
> 注意: 在wxPython
> 2.7以后的版本中,必须先生成wx.App对象后才能调用wx.Locale对象的Init方法。因此对上述代码需略微修改,将L=wx.Locale
> ()放在生成wx.App前,而在wx.App对象的OnInit代码中调用L.Init等代码。这样可以保证在OnInit结束后L对象依旧作为全局变量存在。
> 之后可以使用XmlResource生成相应的对象。也可以使用Locale.GetString(string)函数返回对应Locale
> 的翻译字符。该函数的功能类似于_(),但如果在同一界面中需要显示同一字串的不同语言译文时只要调用不同Locale的GetString函数即可。
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号