Доступ к строкам ресурсов с помощью CultureInfo в .NET.

Другие простые вопросы. У меня есть веб-сайт с разными языками. Если я хочу получить доступ к строке из файла ресурсов, я бы использовал ее как

Resources.MyResourceFile.MyStringIdentifier

Очень легко. Таким образом, во время компиляции я знаю, что строка ресурса существует.

Теперь это работает, только если я хочу использовать текущую Культуру. Иногда мне нужно указать конкретную культуру (скажем, что текущий пользователь использует немецкий язык как язык, но его действие запускает сообщения для отправки другим пользователям, которые будут на языке получателей). Теперь я вижу два варианта:

Resources.MyResourceFile.ResourceManager.GetString("MyStringIdentifier", neededCulturInfo)

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

Есть ли третий способ? Что-то, что говорит мне во время компиляции, что ресурсы существуют, но без необходимости постоянно менять культуру потока?

Ответ 1

(Для вашего сценария) идея ResourceManager заключается в предоставлении информации о культуре в время выполнения не во время компиляции (она же бок о бок с откат).
Таким образом, ответ "НЕТ", не существует встроенного способа определения существования этих файлов ресурсов во время компиляции - для этого вам потребуется некая "жесткая кодировка" для всех строк в каждом отдельном langauge, а также код для доступа к ним. Идея "бок о бок" в точности противоположна жесткому кодированию;)

Что вы можете сделать, это написать unit test для ресурсов, которые повторяют ваши langauges и проверяет, использовалось ли значение по умолчанию или локализованное значение. Кроме того, если вы используете систему управления версиями, которая предоставляет политики регистрации (например, TFS), вы можете использовать этот unit test как часть политики регистрации.

Ответ 2

Вы пытались:

public static Object GetLocalResourceObject (
    string virtualPath,
    string resourceKey,
    CultureInfo culture)

Попробуйте эту ссылку Нажмите здесь

Вы также можете попробовать:

public static Object GetGlobalResourceObject (
    string classKey,
    string resourceKey,
    CultureInfo culture)

Попробуйте эту ссылку Нажмите здесь

Ответ 3

ResourceSet имеет метод

public virtual IDictionaryEnumerator GetEnumerator()

который дает доступ к парам ключ-значение файла ресурсов.
Например. (предполагая, что мы имеем дело только со строками - N.B. пары ключ-значение имеют объект типа):

while (set.MoveNext())
     {
         string key = (string)set.Key;
         // string value = (string)set.Value; 
         string value = ResourceManager.GetString(key, neededCulturInfo); 
     }

Это не то, что вы должны делать, потому что все осложняется - просто указать это.
Вы можете создавать разные файлы ресурсов для разных культур и использовать блок кода switch в методе, который имеет параметр CultureInfo as.

Ответ 4

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

Самый простой вариант - это try-catch и возвращает значение на общем языке в catch.

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

Мое решение - это то, что должно быть, все ресурсы должны быть последовательными, если мы плохо используем этот отличный инструмент.

Ответ 5

Сгенерированный класс Resources.MyResourceFile имеет статическое свойство Culture, которое вы можете установить на neededCultureInfo, чтобы переопределить текущий поток CurrentUICulture.

Ответ 6

1) В начале может быть полезно сохранить UICulture в сеансе, чтобы изменить его, когда захотите, в начале вы можете изменить его оттуда.

2) Вы можете переопределить UICulture в preRender и установить его там, а затем сохранить его в сеансе.

Вы также можете сохранить его в файле cookie, но это не лучшее решение для него.

Ответ 7

Вы можете использовать WorkItem для отправки сообщений асинхронно. Поскольку теперь вы работаете в другом потоке, вы должны иметь возможность изменять CurrentUICulture по мере необходимости.

P.S.: Это хороший пример, почему статические зависимости плохие, и все должно быть интерфейсами и экземплярами.