c# - 国际化 HelloWorld 程序 .NET

标签 c# .net winforms internationalization

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

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

在我的应用程序中,我得到的字符串如下:

this.Text = Properties.Resources.frmCaption;

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

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

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

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

最佳答案

幸运的是,我使用 hello world 原型(prototype)项目来测试构建管道中的一大堆东西。

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

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 来链接您的资源程序集(听起来没问题)不过)。

关于c# - 国际化 HelloWorld 程序 .NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129053/

相关文章:

c# - 根据类的内容使用属性

c# - 如何使用 roslyn 获取项目的默认命名空间?

.net - ResponseFormat.Json 返回 xml

.net - 在 Azure DevOps 中获取 UseDotNet@2 以使用 vmImage 的 dotnet SDK(或来自缓存的 SDK)

c# - 如何从网络控制 C# 程序?也许使用 AJAX?

c# - 单实例登录实现

c# - Radgrid 填充容器高度

c# - UserControl 的 RenderControl 要求在 (C# .NET) 中使用表单标记

c++ - 运行 WinForm 的函数 "In Background"(VS2010 c++)

.net - 如何获取Form的所有TextBox控件