Доступ к строкам ресурсов с CultureInfo в .NET - PullRequest
10 голосов
/ 11 октября 2010

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

Resources.MyResourceFile.MyStringIdentifier

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

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

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

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

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

Ответы [ 7 ]

1 голос
/ 15 ноября 2010

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

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

0 голосов
/ 12 ноября 2010

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

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

0 голосов
/ 10 ноября 2010

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

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

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

0 голосов
/ 03 ноября 2010

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

0 голосов
/ 31 октября 2010

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

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

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

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

0 голосов
/ 22 октября 2010

ResourceSet имеет метод

public virtual IDictionaryEnumerator GetEnumerator()

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

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

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

0 голосов
/ 15 октября 2010

Вы пробовали:

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

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

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

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

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

...