Подтвердить что ты не робот

С#: Как получить строку ресурса из определенной культуры

У меня есть сборка ресурсов с переведенными текстами на разных языках. Тип проекта выглядит следующим образом:

  • FooBar.resx
  • FooBar.nb-NO.resx
  • FooBar.sv-SE.resx
  • ...

Я могу получить тексты, используя статические свойства следующим образом:

var value = FooBar.Hello;

Или используя отражение следующим образом:

var value = resourceAssembly
      .GetType("Namespace.FooBar")
      .GetProperty("Hello")
      .GetValue(null, null) as string;

Оба способа получат мне значение, принадлежащее текущей культуре пользовательского интерфейса текущего потока. Это нормально и полностью, что мне обычно нравится.

Но есть ли что-то, что я могу сделать, если я явно хочу, например, шведское значение, не изменяя культуру пользовательского интерфейса?

4b9b3361

Ответ 1

Вы можете вручную изменить свойство Culture класса FooBar, создаваемого Visual Studio. Или, если вы используете класс ResourceManager, вы можете использовать перегрузку GetString, который принимает желаемую культуру в качестве параметра.

Ответ 2

Попробуйте использовать следующий код. Для меня это работало как минимум:

FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))

Ответ 3

Вы можете вручную изменить культуру в своем классе доступа к ресурсам. Но это несколько неоправданно, потому что это приводит к множеству других проблем интернационализации.

например. вам придется:

  • Обрабатывать все числовое форматирование с перегрузками культуры
  • Убедитесь, что другие используемые библиотеки имеют аналогичный механизм, который у вас есть
  • В тех случаях, когда это невозможно (например, BCL), создайте обертки для всего, что МОЖЕТ быть специфичным для культуры (и это много вещей).

Итак, если вообще возможно изменить текущую культуру пользовательского интерфейса текущего потока.

Ответ 4

Вот некоторый код, который я использовал для захвата файла ресурсов по имени культуры - это 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

Ответ 5

Используйте вторую перегрузку GetValue: -

 .GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))