【问题标题】:gettext: How to fall back to the base language?gettext:如何退回到基础语言?
【发布时间】:2012-12-05 13:20:03
【问题描述】:

我计划使用 wxWidgets 重写我们的应用程序。也正因为如此,我想使用gettext 处理人类语言的方式。我们目前使用其中四个:捷克语、斯洛伐克语、英语和德语。特定的语言并不那么重要。

重要的是,捷克语和英语被认为是一种基础语言。这意味着如果使用切换到德语,并且文本没有在那里定义,他或她会自动获取英文文本(这里的 gettext 没有问题)。但是,当用户使用斯洛伐克语时,备用语言是捷克语。而且当用户使用英语时,它甚至可以回退到捷克语(开发人员的一种错误,因为英语也应该是完整的)。

我知道 gettext 默认使用一种语言——直接写在源代码中。其他语言以 .mo 文件的形式提供。刚接触 gettext 和 wxWidgets...

有没有办法实现回退到与默认语言不同的另一种显式语言(即来自源文件)?换句话说,内存中可以存在更多的语言并动态切换吗?

感谢您的时间和经验,

彼得

【问题讨论】:

    标签: internationalization wxwidgets gettext


    【解决方案1】:

    不,您不能有选择地提供此类后备。 OTOH 绝对没有什么可以阻止您将捷克语翻译复制到斯洛伐克语的翻译(即cp cz.po sk.po),然后只用真正的斯洛伐克语翻译替换其中的一些。当然,对于德语,如果您在来源中使用英语,它应该会自动工作(即使您的母语是捷克语,我也强烈建议您这样做)。

    【讨论】:

    • 谢谢。这是有道理的。那么,我不应该深入研究 wxTranslations 吗?设置另一种语言时,该语言是否完全关闭了内存?
    • 我猜你可能会通过“深入研究”来做你想做的事,但老实说我不确定我是否建议这样做,它肯定会增加复杂性以获得非常不确定的收益。
    【解决方案2】:

    您的应用将显示的语言由 wxLocale (http://docs.wxwidgets.org/trunk/classwx_locale.html) 控制

    当您的应用程序启动时,您可以通过调用 Init(wxLANGUAGE_DEFAULT) http://docs.wxwidgets.org/trunk/classwx_locale.html#a37c254f20d4862b6efea2fedf63a231a 将语言设置为系统默认值

    你可以通过调用GetLanguage()http://docs.wxwidgets.org/trunk/classwx_locale.html#a6516d2529c936e441d7d23c42dc3e1b4来查看加载了什么语言

    如果返回的语言不是您支持的语言之一,那么您可以将其更改为您想要用作该特定语言的后备语言的任何语言。例如,如果 GetLanguage 告诉您使用了德语,您的代码可以将其设置为英语,但如果 Slovak 然后回退到捷克语等等,您可以定义任意多的对。

    // set languagew to system default
    myLocale = new wxLocale;
    myLocale->Init();
    
    // find language being used and choose fallback if required
    switch( myLocale->GetLanguage() ) {
       case wxLANGUAGE_ENGLISH: case wxLANGUAGE_CZECH: ...
       // a language we support, nothing more needed
       break;
       case wxLANGUAGE_SLOVAK: ...
       // a language that falls back to czech
       myLocale->Init( wxLANGUAGE_CZECH ); break;
      case wxLANGUAGE_GERMAN: ...
       // a language that falls back to english
       myLocale->Init( wxLANGUAGE_ENGLISH ); break;
       default:
       // a language we dont support and have not specified a fall back for
       // for now, let's go with english
       myLocale->Init( wxLANGUAGE_ENGLISH ); break;
    }
    

    【讨论】:

    • 是的,我从 wxBook 第 444 页知道这一点。在重建 GUI 时,或者至少在再次设置所有文本时,我可以通过用户干预来切换语言(比如选择菜单项)。问题是我是否可以为一个缺失的字符串做到这一点。但感谢您提供的信息。 +1
    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 2018-01-09
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多