Могу ли я переключаться между различными наборами значений для элементов управления надписью формы во время выполнения? - PullRequest
1 голос
/ 14 февраля 2012

Мне нужно иметь возможность изменять текст метки в зависимости от настройки (в основном метки, чекбоксы тоже ... хотя бы что-нибудь, что имеет метку какого-то рода).Это необходимо, потому что различные клиенты, использующие приложение, используют различную терминологию внутренне.Так, например, если я жестко закодировал значение текстовой метки (сопровождающей текстовое поле) в «Инцидент», который может не работать для другого клиента, так как он хочет использовать «Билет» или «Сервисный вызов».

Я думал, что мог бы использовать функцию локализации в WinForms и создать какую-то субкультуру (если вы об этом думаете), такую ​​как en-us-cust1, en-us-cust2.Ресурсы, связанные с ними, могут содержать разные значения для текста меток, где бы этот термин ни менялся.

Еще одна важная вещь - это возможность избежать компиляции этих ресурсов внутри сборки.

Примечание:Я продолжал искать похожий вопрос, и этот вопрос идентичен Реализация отраслевых ресурсов .Я пока не знаю, удовлетворительны ли ответы на этот вопрос, поэтому любые ответы все еще приветствуются.

Ответы [ 4 ]

1 голос
/ 14 февраля 2012

Возможно, создайте Dictionary для хранения вашей "локализации".

Dictionary<Control, string> myLocalization = new Dictionary<Control, string>();

Сохраните и прочитайте что-то вроде этого:

BinaryFormatter serializer = new BinaryFormatter();
using (Stream streamout = File.Create(path)) serializer.Serialize(streamout, myLocalization);
using (Stream streamin = File.OpenRead(path)) myLocalization = (Dictionary<Control,string>)serializer.Deserialize(streamin);

И используйте его так:

foreach (Control ctrl in myLocalization.Keys) ctrl.Text = myLocalization[ctrl];

Вам понадобится:

using System.Runtime.Serialization.Formatters.Binary;
1 голос
/ 14 февраля 2012

Да, вы можете.Вам потребуется:

1.- Подготовьте свой проект, создав различные файлы локализации (я рекомендую вам взглянуть на this )

2.- Установитекультура во время выполнения:

// C#
// Sets the UI culture to French (France).
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

(приведенный выше код извлечен из вышеупомянутого источника)

3.- Внедрить вспомогательный (static) класс, который будет отвечать за выполнение тяжелой работывсякий раз, когда вам это нужно, и во время выполнения, получая доступ к дочерним элементам управления вашей формы (рекурсия очень хорошо здесь) и получайте соответствующий текст для каждого из них.Конечно, не все элементы управления в Form должны быть ориентированы на язык пользователя, ваш код должен решить, может ли он основываться на типе проверяемого вами элемента управления, получать переведенную строку из ресурсов или нет.

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

1 голос
/ 14 февраля 2012

Вы можете загрузить текст метки из Resource

Посмотрите эту статью: http://www.codeproject.com/Articles/5447/NET-Localization-using-Resource-file

0 голосов
/ 19 февраля 2012

Ни одна из вышеперечисленных попыток полностью не ответила на мой вопрос.Итак, я потратил пару дней (которых я хотел избежать), читая о локализации в .Net, и вот что я собираюсь сделать.

Я написал крошечное консольное приложение, которое позволяет мне создавать собственную культуруна основе существующего и укажите новое CultureName, CultureEnglishName, CultureNativeName и зарегистрирует его на компьютере Windows.Это будет один из этапов настройки приложения.

public static void Main(string[] args)
{
    string operation = args[0];
    string newCultureName = args[1];
    string sourceCultureName = args[2];
    string newCultureDescriptiveName = args[3];

    try
    {
        if (operation == "Register")
        {
            CultureAndRegionInfoBuilder crib = new CultureAndRegionInfoBuilder(newCultureName, CultureAndRegionModifiers.None);
            crib.LoadDataFromCultureInfo(new CultureInfo(sourceCultureName));
            crib.LoadDataFromRegionInfo(new RegionInfo(sourceCultureName));
            crib.CultureEnglishName = newCultureDescriptiveName;
            crib.CultureNativeName = newCultureDescriptiveName;
            crib.Register();
        }
        else if (operation == "Unregister")
        {
            CultureAndRegionInfoBuilder.Unregister(newCultureName);
        }
        else
            throw new ArgumentException("The only accepted values are: Register; Unregister", "operation");
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine(ex.Message);
    }
    catch (ArgumentException ex)
    {
        Console.WriteLine(ex.Message);
    }
    catch (Exception ex)
    {
        throw;
    }
}

Например, я могу создать культуру под названием en-CA-Company, вызвав консольное приложение следующим образом:

consoleapp Register "en-CA-Company", "en-CA", "English (Canada) Company"

Требовалось задать описательное имя, поскольку свойства CultureEnglishName, CultureNativeName остались бы такими же, как в исходной культуре, что могло бы создать путаницу, когда, например, в Visual Studio вы выпадаете из списка языков для локализованной формы.и увидеть две записи "Английский (Канада)".Я не знаю, какое из свойств VS использует для отображения имени языка, поэтому я догадался о английском и родном имени.

Теперь, когда моя пользовательская культура зарегистрирована на компьютере, я вижу егов Visual Studio в поле Language свойств формы при включении локализации Localizable = True.enter image description here

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

Комучтобы получить этот конкретный файл ресурсов (и строки в нем), я просто должен:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-CA-Company");

где-нибудь, когда приложение инициализируется.

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