Локализация.NET; язык Нейтрализации при использовании ResourceManager

Недавно я копался в Локализации с.NET. По существу я изучил, как настроить форму (использующий свойство Language и Localizable) и затем изменить культуру соответственно.

Однако я нашел, что при миграции моих твердых кодированных английских строк в автоматически сгенерированные файлы ресурсов и использования.GetString ("Ключ") - хорошо, позвольте нам просто сказать, что это не было счастливо :P.

Я решил сделать отдельный набор resx файлов выделенным просто трудным кодированным переводам текстовых строк. Они следовали конвенции/требованию [имени]. [культурный код] .resx. Я сделал из них для каждого соответствующего языка; например, appstrings.de.resx (Для немецкого языка) и appstrings.resx (как инвариантная базовая линия).

Для использования этих новых ресурсов я создал экземпляр ResourceManager и Набора ресурсов

Dim resManager As New ResourceManager("LanguageTest.appstrings", Assembly.GetExecutingAssembly)
Dim resSet As ResourceSet = resManager.GetResourceSet(My.Application.UICulture, True, True)

Текущая культура UI была установлена (например, немецкому языку) использование

My.Application.ChangeUICulture("de")

Первичное размещение

Если сброс. GetString ("Ключ") явно определяется в appstrings.de.resx, он возвратит пустую строку. Есть ли так или иначе, я могу сделать это нейтрализацией к appstrings.resx (где "Ключ" действительно существует), который я принял, будет базовая линия по умолчанию?

Обновление

Рапсодия сделала предложение ниже, в то время как сама фактическая подсказка не работала, это действительно на самом деле зажигало интересный момент, с помощью resManager. GetString ("Ключ") в противоположность сбросу. GetString ("Ключ"). Это, кажется, работает без дефекта до сих пор. Таким образом, значения, существующие в специализированном файле языка, возвращены при 'пропавших без вести' нейтрализации значений к культуре по умолчанию при доступе единственным ключом.

Последующая проблема

Единственная остающаяся проблема была бы, будет ли влияние производительности использования ResourceManger в противоположность кэшируемому ResourceSet настолько вредно?

7
задан MPelletier 6 May 2012 в 01:55
поделиться

2 ответа

Как создать один метод EnityButtons , который включает/отключает кнопки в соответствии с заданным критерием, таким как "enable cmdRight2, только если.... это правда ".

Затем вызовите метод всякий раз, когда некоторые критерии могут измениться. Преимущество этого по сравнению с путями, которые вы делаете сейчас, заключается в том, что критерии в методе являются «абсолютными» (в том, что кнопки либо включены, либо отключены в одном переходе), а не «относительными» (включить кнопку, когда пользователь делает то или иное).

Можно также вызвать этот метод из события Application.Idle вместо вызова его в ответ на какое-либо действие пользователя.

EDIT

Объявите следующий метод:

private void EnableButtons()
{
    controlX.Enabled = (<condition...>);
    controlY.Enabled = (<condition...>);
}

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

public Form1()
{
    // Other code...

    Application.Idle += new <The respective event handler>;
}

Затем объявите метод с соответствующей подписью для события и вызовите EnityButtons там. Этот метод вызывается в ситуациях, когда приложение находится в состоянии «простоя» (ожидание действий пользователя).

-121--5044375-

Проблема заключается в том, что элементы удаляются один за другим, поэтому, когда остается только один предмет, по существу выбирается один предмет, поэтому программа включает cmdRight. Самый простой способ обойти это - иметь

cmdRight2.Enabled = false;
cmdRight.Enabled = false;

в конце метода cmdRight2_Click.

-121--5044376-

Попробуйте

Public Function GetString(ByVal Name As String) As String
    Return My.Resources.Strings.ResourceManager.GetString(Name)
End Function

Где Последовательности - имя файлов resx в проекте. Это автоматически возвращает базовое значение, если оно недоступно для текущей культуры.

Это простой пример, вы можете сделать его более дурацким доказательством.

2
ответ дан 7 December 2019 в 10:01
поделиться

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

В основном, чтобы заставить его работать, я установил xml в web.config

<globalization uiCulture="auto" culture="auto" requestEncoding="utf-8" responseEncoding="utf-8"/>

Оттуда я использовал внутренний статический ResourceManager из . cs файла, который поставляется с вашим языком по умолчанию, например

Resources.<ResourceFileName>.ItemSearchNoResultsErrorText

и в .aspx файлах:

<%$ Resources:<ResourceFileName>, TimeSelect %>

Как я понимаю, тогда важно, где находится ваш .cs файл, который содержит класс ResourceManager, за языковым файлом .de или за резервным языком? Поскольку он компилируется как отдельная сателлитная сборка, то это зависит от того, где скомпилирован .cs класс и частью какой сателлитной сборки он является.

Как правило, я всегда использовал класс ResourceManager как код для языка en-US, потому что именно его я хочу использовать в качестве запасного языка, если более конкретные не найдены

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

0
ответ дан 7 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: