国际化Hello World程序.NET

时间:2009-07-15 02:10:03

标签: c# .net winforms internationalization

我有一个小型测试应用,它有2个资源文件(Resources.resx& Resources.de-DE.resx),具有相同的字符串名称,但其中一个字符串已转换为德语。

对于我的表单,我将Localize属性设置为ture。

在我的应用程序中,我正在获取字符串:

this.Text = Properties.Resources.frmCaption;

在我的发布文件夹中,我得到一个de-DE文件夹,其中包含名为International_test.resources.dll的dll。

我尝试将其分发到一台设置为德语的机器,所有拉出的字符串仍然是英语。

我尝试将International_test.resources.dll保留在de-DE文件夹中,或者只是放入我的apps目录。

我做错了什么或者我需要做些什么才能使用德语资源文件?

3 个答案:

答案 0 :(得分:6)

幸运的是,我使用hello world原型项目来测试构建管道中的大量内容。

假设您已正确设置资源文件,以下是一些可能有用的示例代码。为简洁起见,删除了代码文档。

public class HelloWorld
{
    public CultureInfo CultureInfo { get; private set; }

    public HelloWorld()
    {
        CultureInfo = CultureInfo.CurrentCulture;
    }

    public HelloWorld(string culture)
    {
        CultureInfo = CultureInfo.GetCultureInfo(culture);
    }

    public string SayHelloWorld()
    {
        return Resources.ResourceManager.GetString("HelloWorld", CultureInfo);
    }
}


[TestFixture]
public class HelloWorldFixture
{
    HelloWorld helloWorld;

    [Test]
    public void Ctor_SetsCultureInfo_ToCurrentCultureForParameterlessCtor()
    {
        helloWorld = new HelloWorld();
        Assert.AreEqual(helloWorld.CultureInfo, CultureInfo.CurrentCulture,
            "Expected CultureInfo to be set as CurrentCulture");
    }

    [Test]
    public void Ctor_SetsCultureInfo_ToAustralianCulture()
    {
        helloWorld = new HelloWorld("en-AU");
        Assert.AreEqual(helloWorld.CultureInfo.Name, "en-AU",
            "Expected CultureInfo to be set to Australian culture");
    }

    [Test]
    [ExpectedException(typeof(ArgumentException))]
    public void Ctor_ThrowsException_InvalidCultureName()
    {
        helloWorld = new HelloWorld("Bogus");
    }

    [Test]
    public void SayHelloWorld_ReturnsFallbackResource_OnUndefinedResource()
    {
        helloWorld = new HelloWorld("en-JM");
        string result = helloWorld.SayHelloWorld();
        Assert.AreEqual("Hello, World.", result, "Expected fallback resource string to be used");
    }

    [Test]
    public void SayHelloWorld_ReturnsAustralianResource_OnAustralianResource()
    {
        helloWorld = new HelloWorld("en-AU");
        string result = helloWorld.SayHelloWorld();
        Assert.AreEqual("G'Day, World.", result, "Expected australian resource string to be used");
    }
}

此项目的 Resources.resx 文件包含 HelloWorld 字符串键项和“Hello,World”值,以及相应的 Resources.en-AU.resx ,带有 HelloWorld 字符串键项和“G'Day,World”值,加上其他如zh-CH(我只)气垫船装满晒鳝。:)来测试非英文字符的显示,因为它显示在相关的hello world web项目中。

最后,添加一些日志记录以显示正在使用的文化(为简洁起见,我将其从此示例中删除),并检查编译器输出以确保调用AL.exe来链接资源程序集(听起来好像没问题)虽然)。

答案 1 :(得分:0)

我认为我的问题是我使用的是美国版本的XP,其语言设置为德语以及其他文化设置。 CurrentCulture和CurrentUICulture似乎仍然是“en-US”

我想测试的最佳方法是在程序开始时手动设置文化,如:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(“de-DE”); Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(“de-DE”);

答案 2 :(得分:0)

感谢一吨。

我终于弄清了我的问题。

我的资源文件位于Properties文件夹中,因此我需要输入以下内容

//using embedded resources
ResourceManager rm = new ResourceManager("International_test.Properties.Resources", Assembly.GetExecutingAssembly());