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

我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。

我该怎么做呢?


当前回答

F.Mörk的回答很好。但是如果您想要更新翻译,或者在应用程序发布后添加新的语言,就会陷入困境,因为您总是必须重新编译它以生成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”)

其他回答

其实很简单。创建一个新的资源文件,例如Strings.resx。“访问修饰符”设置为“公共”。使用适当的文件模板,这样Visual Studio将自动生成一个访问器类(在本例中,名称为Strings)。这是您的默认语言。

现在,当你想添加,比如说,德语本地化,添加一个本地化的resx文件。在本例中,这通常是string .de.resx。如果你想为奥地利添加额外的本地化,你需要额外创建一个Strings.de-AT.resx。

现在去创建一个字符串——假设一个名为HelloWorld的字符串。在你的弦里。resx,添加值为“Hello, world!”的字符串。在Strings.de.resx中添加“Hallo, Welt!”在Strings.de-AT.resx中添加“Servus, Welt!”到目前为止就是这样。

现在你有了这个生成的Strings类,它有一个属性和getter HelloWorld。获取此属性将加载“Servus, Welt!”当您的locale为de-AT时,“Hallo, Welt!”当你的locale是任何其他de locale(包括de- de和de- ch)时,和“Hello, World!”当你的locale是任何其他地方时。如果本地化版本中缺少一个字符串,资源管理器将自动沿着链向上走,从最专门化的资源到不变的资源。

你可以使用ResourceManager类来控制你如何加载东西。生成的Strings类也使用它。

你可以使用Lexical。本地化¹允许将默认值和区域性特定值嵌入到代码中,并在外部本地化文件中扩展为进一步的区域性(如.json或.resx)。

public class MyClass
{
    /// <summary>
    /// Localization root for this class.
    /// </summary>
    static ILine localization = LineRoot.Global.Type<MyClass>();

    /// <summary>
    /// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
    /// </summary>
    static ILine ok = localization.Key("Success")
            .Text("Success")
            .fi("Onnistui")
            .sv("Det funkar");

    /// <summary>
    /// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
    /// </summary>
    static ILine error = localization.Key("Error")
            .Format("Error (Code=0x{0:X8})")
            .fi("Virhe (Koodi=0x{0:X8})")
            .sv("Sönder (Kod=0x{0:X8})");

    public void DoOk()
    {
        Console.WriteLine( ok );
    }

    public void DoError()
    {
        Console.WriteLine( error.Value(0x100) );
    }
}

除了@Eric Bole-Feysot的回答:

由于卫星程序集,本地化可以基于.dll/.exe文件创建。这种方式:

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

有一个鲜为人知的工具叫做LSACreator(非商业用途免费或购买选项),它允许您基于.dll/.exe文件创建本地化。事实上,它在内部(在语言项目的目录中)创建/管理resx文件的本地化版本,并以类似于@Eric Bole-Feysot所描述的方式编译程序集。

此外,@Fredrik Mörk关于字符串的伟大回答,要添加本地化到一个表单,请执行以下操作:

将表单的属性“Localizable”设置为true 将表单的Language属性更改为您想要的语言(从一个漂亮的下拉菜单中) 翻译这种形式的控件,并在需要时移动它们(把那些非常长的完整的法语句子塞进去!)

编辑:这篇MSDN关于Windows窗体本地化的文章不是我链接的原始文章…但如果需要的话,可能会提供更多线索。(旧的已经被拿走了)

对我来说

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

在AssemblyInfo.cs中阻止事情正常工作。