我只是不能让本地化工作。
我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。
我该怎么做呢?
我只是不能让本地化工作。
我有一个类库。现在我想在那里创建resx文件,并根据线程区域性返回一些值。
我该怎么做呢?
当前回答
其实很简单。创建一个新的资源文件,例如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) );
}
}
Add a Resource file to your project (you can call it "strings.resx") by doing the following: Right-click Properties in the project, select Add -> New Item... in the context menu, then in the list of Visual C# Items pick "Resources file" and name it strings.resx. Add a string resouce in the resx file and give it a good name (example: name it "Hello" with and give it the value "Hello") Save the resource file (note: this will be the default resource file, since it does not have a two-letter language code) Add references to your program: System.Threading and System.Globalization
运行以下代码:
Console.WriteLine(Properties.strings.Hello);
它应该打印“Hello”。
现在,添加一个名为“strings.fr.resx”的新资源文件(注意“fr”部分;这个将包含法语的资源)。添加与字符串中同名的字符串资源。resx,但是值为法语(Name="Hello", value ="Salut")。现在,如果你运行下面的代码,它应该打印Salut:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);
系统会为“fr-FR”寻找资源。它不会找到一个(因为我们在您的文件中指定了“fr”)。然后它将返回到检查“fr”,它找到(并使用)。
下面的代码,将打印“Hello”:
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中。
其实很简单。创建一个新的资源文件,例如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类也使用它。
对我来说
[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
在AssemblyInfo.cs中阻止事情正常工作。
除了@Eric Bole-Feysot的回答:
由于卫星程序集,本地化可以基于.dll/.exe文件创建。这种方式:
源代码(VS项目)可以与语言项目分离, 添加新语言不需要重新编译项目, 甚至最终用户也可以进行翻译。
有一个鲜为人知的工具叫做LSACreator(非商业用途免费或购买选项),它允许您基于.dll/.exe文件创建本地化。事实上,它在内部(在语言项目的目录中)创建/管理resx文件的本地化版本,并以类似于@Eric Bole-Feysot所描述的方式编译程序集。