Ответ 1
Вы можете вручную изменить свойство Culture
класса FooBar, создаваемого Visual Studio. Или, если вы используете класс ResourceManager, вы можете использовать перегрузку GetString, который принимает желаемую культуру в качестве параметра.
У меня есть сборка ресурсов с переведенными текстами на разных языках. Тип проекта выглядит следующим образом:
Я могу получить тексты, используя статические свойства следующим образом:
var value = FooBar.Hello;
Или используя отражение следующим образом:
var value = resourceAssembly
.GetType("Namespace.FooBar")
.GetProperty("Hello")
.GetValue(null, null) as string;
Оба способа получат мне значение, принадлежащее текущей культуре пользовательского интерфейса текущего потока. Это нормально и полностью, что мне обычно нравится.
Но есть ли что-то, что я могу сделать, если я явно хочу, например, шведское значение, не изменяя культуру пользовательского интерфейса?
Вы можете вручную изменить свойство Culture
класса FooBar, создаваемого Visual Studio. Или, если вы используете класс ResourceManager, вы можете использовать перегрузку GetString, который принимает желаемую культуру в качестве параметра.
Попробуйте использовать следующий код. Для меня это работало как минимум:
FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))
Вы можете вручную изменить культуру в своем классе доступа к ресурсам. Но это несколько неоправданно, потому что это приводит к множеству других проблем интернационализации.
например. вам придется:
Итак, если вообще возможно изменить текущую культуру пользовательского интерфейса текущего потока.
Вот некоторый код, который я использовал для захвата файла ресурсов по имени культуры - это vb.net, но вы поняли идею.
Dim reader As New System.Resources.ResXResourceReader(String.Format(Server.MapPath("/App_GlobalResources/{0}.{1}.resx"), resourceFileName, culture))
И если вы хотите вернуть его в качестве словаря:
If reader IsNot Nothing Then
Dim d As New Dictionary(Of String, String)
Dim enumerator As System.Collections.IDictionaryEnumerator = reader.GetEnumerator()
While enumerator.MoveNext
d.Add(enumerator.Key, enumerator.Value)
End While
Return d
End If
Используйте вторую перегрузку GetValue: -
.GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))