代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

如何在C语言中使用本地化#

  •  245
  • JL. Hans Passant  · 技术社区  · 15 年前

    我只是不能让本地化工作。

    我有一个班级图书馆。现在我要创建 资源文件 文件,并根据线程区域性返回一些值。

    我该怎么做?

    7 回复  |  直到 7 年前
        1
  •  527
  •   Matt    7 年前
    • 通过执行以下操作,将资源文件添加到项目中(可以称为“strings.resx”):
      右击 性质 在项目中,选择 添加-新建项目… 在上下文菜单中,然后在 Visual C项目 挑选 “资源文件” 并命名它 strings.resx .
    • 在resx文件中添加一个字符串资源,并给它一个好名称(例如:将其命名为“hello”,并给它赋值为“hello”)。
    • 保存资源文件( 注: 这将是 违约 资源文件,因为它没有两个字母的语言代码)
    • 添加对程序的引用: System.Threading System.Globalization

    运行此代码:

    Console.WriteLine(Properties.strings.Hello);
    

    它应该打印“你好”。

    现在,添加一个名为“strings.fr.resx”的新资源文件(注意“fr”部分;这个部分将包含法语资源)。添加一个字符串资源,该资源的名称与strings.resx中的名称相同,但其值为法语(name=“hello”,value=“salut”)。现在,如果运行以下代码,它将打印salut:

    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
    Console.WriteLine(Properties.strings.Hello);
    

    发生的是系统将为“fr-fr”寻找资源。它将找不到一个(因为我们在您的文件中指定了“fr”)。然后它将返回到检查“fr”,它发现(并使用)。

    下面的代码,将打印“您好”:

    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
    Console.WriteLine(Properties.strings.Hello);
    

    这是因为它找不到任何“en-us”资源,也找不到“en”资源,所以它将返回到默认值,即我们从一开始就添加的值。

    如果需要,您可以创建具有更多特定资源的文件(例如,法国和加拿大分别为strings.fr-fr.resx和strings.fr-ca.resx)。在每一个这样的文件中,您将需要为那些字符串添加资源,这些字符串不同于它将返回到的资源。因此,如果在法国和加拿大文本相同,可以将其放入strings.fr.resx,而加拿大法语中不同的字符串可以放入strings.fr-ca.resx。

        2
  •  36
  •   Andrey Moiseev Ashraf Ali    8 年前

    实际上,这很简单。例如,创建一个新的资源文件 Strings.resx . 集合 Access Modifier Public . 使用适当的文件模板,因此Visual Studio将自动生成访问器类(名称将为 Strings ,在本例中)。这是您的默认语言。

    现在,如果要添加(例如德语本地化),请添加本地化的resx文件。这通常是 Strings.de.resx 在这种情况下。如果您想为奥地利等地添加其他本地化,您将另外创建一个 Strings.de-AT.resx .

    现在开始创建一个字符串-假设一个具有名称的字符串 HelloWorld . 在你 斯特林公司 ,添加值为“hello,world!”的字符串。在 斯特林公司 ,加上“哈罗,韦尔特!”而且在 字符串.de-at.resx ,添加“servus,welt!”到目前为止。

    现在您已经生成了这个 类,它有一个带有getter的属性 你好世界 . 获取此属性将加载“servus,welt!”当你的所在地是“哈罗,韦尔特!当您的区域设置是任何其他区域设置(包括de de de和de ch)和“你好,世界!”当您的区域设置为其他任何内容时。如果本地化版本中缺少字符串,资源管理器将自动沿着链从最专用的资源向不变的资源移动。

    你可以使用 ResourceManager 类来更精确地控制加载内容的方式。生成的 类也使用它。

        3
  •  14
  •   Eric Bole-Feysot    12 年前

    很好的答案。但是,如果您想要更新翻译,或者在应用程序发布后添加新语言,那么您将陷入困境,因为您总是需要重新编译它来生成resources.dll。

    下面是手动编译资源dll的解决方案。它使用resgen.exe和al.exe工具(与sdk一起安装)。

    假设您有strings.fr.resx资源文件,则可以使用以下批处理编译资源dll:

    resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources 
    Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
    del WpfRibbonApplication1.Strings.fr.resources
    pause
    

    请确保将原始命名空间保留在文件名中(此处为“wpfribbonapplication1”)。

        4
  •  14
  •   noelicus    10 年前

    此外,@fredrik m¶rk对弦乐的伟大回答 表单本地化 执行以下操作:

    • 设置 形式 的财产 "Localizable" true
    • 更改窗体 Language 属性转换为所需的语言(从包含所有属性的漂亮下拉列表中)
    • 以这种形式转换控件,并在需要时移动它们(将那些真正长的完整法语句子压扁!)

    这个 MSDN article on Localizing Windows Forms 提供更多信息。

        5
  •  9
  •   Community Reversed Engineer    7 年前

    修正和阐述 @弗雷德里克 回答。

    • 添加一个 Strings.resx 项目的资源文件(或其他文件名)
    • 集合 Access Modifier Public (打开的) 斯特林公司 文件选项卡)
    • 在resx文件中添加字符串资源:(示例:name Hello 价值 你好 )
    • 保存资源文件

    Visual Studio自动生成 Strings 类,实际放置在 Strings.Designer.cs . 该类与新创建的 .cs 要放入的文件。

    此代码始终打印 你好 ,因为这是默认资源,没有语言特定的资源可用:

    Console.WriteLine(Strings.Hello);
    

    现在添加一个新的语言特定资源:

    • 添加 Strings.fr.resx (法语)
    • 添加一个与以前同名但值不同的字符串:(名称) 你好 价值 Salut )

    以下代码打印 萨鲁特 :

    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
    Console.WriteLine(Strings.Hello);
    

    使用什么资源取决于 Thread.CurrentThread.CurrentUICulture .它是根据Windows UI语言设置设置的,或者可以像本例中那样手动设置。了解更多信息 here .

    您可以添加特定于国家的资源,如 Strings.fr-FR.resx Strings.fr-CA.resx .

    要使用的字符串按以下优先顺序确定:

    • 来自特定国家的资源,如 字符串.fr-ca.resx
    • 来自特定语言的资源,如 斯特林公司
    • 缺省 斯特林公司

    请注意,特定于语言的资源会生成 satellite assemblies .

    还学习如何 CurrentCulture 不同于 CurrentUICulture here .

        6
  •  0
  •   Tomasz Malik    9 年前

    除了 @埃里克·博勒·费索特 答:

    由于有了卫星组件,可以基于 .DLL/exe 文件夹。这种方式:

    • 源代码(vs项目)可以与语言项目分离,
    • 添加新语言不需要重新编译项目,
    • 甚至最终用户也可以进行翻译。

    有一种鲜为人知的工具叫做 LSACreator (非商业用途或购买选项免费)允许您基于.dll/.exe文件创建本地化。实际上,它在内部(在语言项目的目录中)创建/管理resx文件的本地化版本,并以类似于 @埃里克·博勒·费索特 描述。

        7
  •  0
  •   Aleksandr    9 年前

    以我为例

    [assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
    

    在assemblyinfo.cs中,阻止了正常工作。