代码之家  ›  专栏  ›  技术社区  ›  lyricat

字符串文字的本地化

  •  0
  • lyricat  · 技术社区  · 15 年前

    我需要本地化来自编译器的错误消息。现在,所有错误消息都以英文字符串的形式在源代码中传播。我们想把这些错误信息翻译成德语。最好的方法是什么?保持字符串文字不变,并将char*映射到错误报告例程中的另一种语言,或者用描述性宏(例如)替换英文文字。 ERR_UNDEFINED_LABEL_NAME 在编译时将这个映射到正确的字符串?

    在类似的项目中,如何处理这样的事情?

    5 回复  |  直到 13 年前
        1
  •  5
  •   asveikau    15 年前

    在Windows上,通常通过用整型常量替换字符串,然后使用 LoadString 或者类似于从dll或exe中的资源获取它们。然后您可以有多个语言DLL和一个exe。

    在Unixy系统上,我认为最典型的方法是 gettext . 最终的结果是类似的,但是您不需要定义整型常量,而是将英文字符串文本包装在宏中,它将应用一些魔力将其转换为本地化字符串。

        2
  •  4
  •   carnieri    15 年前

    最灵活的方法是编译器从消息目录中读取翻译的消息,并根据语言环境选择语言。这将需要更改编译器以使用类似 gettext .

        3
  •  1
  •   Escualo    15 年前

    只是一个简单的想法…

    你能超载你的错误报告程序吗?说你在用

    printf("MESSAGE")
    

    你可以让它超载 "MESSAGE" 是输入,您可以将其散列到相应的德语消息中。

    这行吗?

        4
  •  1
  •   Serge Wautier    15 年前

    你可以用我的 CMsg() and CFMsg() 在loadstring()API周围包装。它们使您的生活更容易加载和格式化从资源中提取的字符串。

    当然, appTranslator 是您翻译资源的最好朋友;-)

    免责声明:我是AppTranslator的作者。

        5
  •  0
  •   Sogger    13 年前

    在Windows上,可以使用资源编译器和winapi加载函数来使用本地化字符串和其他资源。 FindResource (二)及其专门衍生产品 LoadString ()将根据用户当前的区域设置自动加载特定于语言的资源。 FindResourceEx ()甚至允许您手动指定要检索的资源的语言版本。

    为了在程序中启用此功能,必须首先更改程序以编译资源文件(.rc)中的字符串,并使用loadstring()在运行时提取字符串,而不是使用文字字符串。然后在资源文件中设置 STRINGTABLE 你用的,和 LANGUAGE 修饰语。然后根据以下在msdn上描述的搜索顺序加载多语言资源: Multiple-Language Resources

    注意:如果您没有理由需要单个可执行文件,或者在应用程序中使用用户选择的语言,则可以在单独的dll中编译每种语言并动态加载它们,而不是使用大的单个资源文件,并尝试动态切换区域设置,这样可以提供更多的控制和更少的混乱。

    以下是多语言字符串表资源文件(即strings.rc)的示例:

    #define IDS_HELLOSTR     361
    
    STRINGTABLE
      LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
      BEGIN
         IDS_HELLO, "Hello!"
      END
    
    STRINGTABLE
       LANG_FRENCH, SUBLANG_NEUTRAL
       BEGIN
          IDS_HELLO, "Bonjour!"
       END