C #: Как получить строку ресурса из определенной культуры - PullRequest
19 голосов
/ 01 декабря 2009

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

  • 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;

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

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

Ответы [ 5 ]

19 голосов
/ 01 декабря 2009

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

13 голосов
/ 16 июля 2015

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

FooBar.ResourceManager.GetString("Hello", CultureInfo.GetCultureInfo("sv-SE"))
1 голос
/ 01 декабря 2009

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

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

 .GetValue(null, BindingFlags.GetProperty, null, null, CultureInfo.GetCultureInfo("sv-SE"))
0 голосов
/ 01 декабря 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...