我只是不能让本地化工作。
我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。
我该怎么做呢?
我只是不能让本地化工作。
我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。
我该怎么做呢?
当前回答
此外,@Fredrik Mörk关于字符串的伟大回答,要添加本地化到一个表单,请执行以下操作:
将表单的属性“Localizable”设置为true 将表单的Language属性更改为您想要的语言(从一个漂亮的下拉菜单中) 翻译这种形式的控件,并在需要时移动它们(把那些非常长的完整的法语句子塞进去!)
编辑:这篇MSDN关于Windows窗体本地化的文章不是我链接的原始文章…但如果需要的话,可能会提供更多线索。(旧的已经被拿走了)
其他回答
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”)
此外,@Fredrik Mörk关于字符串的伟大回答,要添加本地化到一个表单,请执行以下操作:
将表单的属性“Localizable”设置为true 将表单的Language属性更改为您想要的语言(从一个漂亮的下拉菜单中) 翻译这种形式的控件,并在需要时移动它们(把那些非常长的完整的法语句子塞进去!)
编辑:这篇MSDN关于Windows窗体本地化的文章不是我链接的原始文章…但如果需要的话,可能会提供更多线索。(旧的已经被拿走了)
一个修复和细化的@Fredrik Mörk答案。
添加一个字符串。resx资源文件到您的项目(或不同的文件名) 将Access Modifier设置为Public(在打开的字符串中)。Resx文件标签) 在resx文件中添加一个字符串资源:(例如:name Hello, value Hello) 保存资源文件
Visual Studio自动生成相应的strings类,它实际上放在strings. designer .cs中。类位于您希望放置新创建的.cs文件的相同名称空间中。
这段代码总是输出Hello,因为这是默认资源,没有特定于语言的资源可用:
Console.WriteLine(strings.Hello);
现在添加一个新的特定于语言的资源:
添加strings.fr.resx(法语) 添加一个与前面相同名称,但值不同的字符串:(name Hello, value Salut)
下面的代码打印Salut:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);
使用什么资源取决于thread . currentthread . currentuicculture。它的设置取决于Windows UI语言设置,也可以像本例中那样手动设置。点击这里了解更多。
您可以添加特定国家的资源,如strings.fr-FR.resx或strings.fr-CA.resx。
要使用的字符串按优先级顺序确定:
来自特定国家的资源,如strings.fr-CA.resx 从特定于语言的资源,如strings.fr.resx 从默认的strings.resx
注意,特定于语言的资源会生成附属程序集。
还可以在这里了解CurrentCulture与CurrentUICulture的不同之处。
你可以使用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所描述的方式编译程序集。