Как использовать локализацию в C#

Вы могли использовать Взаимоисключающий класс, но Вы скоро узнаете, что необходимо будет реализовать код для передачи аргументов и такого сами. Ну, я изучил прием при программировании в WinForms, когда я читал книга Chris Sell. Этот прием использует логику, которая уже доступна нам в платформе. Я не знаю о Вас, но когда я узнаю о материале, я могу снова использовать в платформе, которая обычно является маршрутом, которым я следую вместо того, чтобы перестроить колесо. Если, конечно, это не делает всего, что я хочу.

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

Первый, мы должны создать наш класс приложений. В этом классе мы идем, переопределяют событие OnStartup и создают метод под названием, Активируются, который будет использоваться позже.

public class SingleInstanceApplication : System.Windows.Application
{
    protected override void OnStartup(System.Windows.StartupEventArgs e)
    {
        // Call the OnStartup event on our base class
        base.OnStartup(e);

        // Create our MainWindow and show it
        MainWindow window = new MainWindow();
        window.Show();
    }

    public void Activate()
    {
        // Reactivate the main window
        MainWindow.Activate();
    }
}

117-секундный, мы должны будем создать класс, который может управлять нашими экземплярами. Прежде чем мы пройдем это, мы на самом деле собираемся снова использовать некоторый код, который находится в Microsoft. Блок VisualBasic. С тех пор я использую C# в этом примере, я должен был сделать ссылку на блок. При использовании VB.NET Вы ничего не должны делать. Классом, который мы собираемся использовать, является WindowsFormsApplicationBase, и наследуйте наш менеджер экземпляра прочь его и затем усильте свойства и события для обработки единственного инстанцирования.

public class SingleInstanceManager : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase
{
    private SingleInstanceApplication _application;
    private System.Collections.ObjectModel.ReadOnlyCollection _commandLine;

    public SingleInstanceManager()
    {
        IsSingleInstance = true;
    }

    protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
    {
        // First time _application is launched
        _commandLine = eventArgs.CommandLine;
        _application = new SingleInstanceApplication();
        _application.Run();
        return false;
    }

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
    {
        // Subsequent launches
        base.OnStartupNextInstance(eventArgs);
        _commandLine = eventArgs.CommandLine;
        _application.Activate();
    }
}

В основном, мы используем биты VB для обнаружения единственного экземпляра и процесс соответственно. OnStartup будет запущен, когда первая инстанция загрузится. OnStartupNextInstance запущен, когда приложение повторно выполняется снова. Как Вы видите, я могу добраться до того, что было передано командной строке через аргументы события. Я установил значение к полю экземпляра. Вы могли проанализировать командную строку здесь, или Вы могли передать ее своему приложению через конструктора и вызов к Активировать методу.

В-третьих, пора создать наш EntryPoint. Вместо newing приложение как Вы обычно делало бы, мы собираемся использовать в своих интересах наш SingleInstanceManager.

public class EntryPoint
{
    [STAThread]
    public static void Main(string[] args)
    {
        SingleInstanceManager manager = new SingleInstanceManager();
        manager.Run(args);
    }
}

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

255
задан Otiel 4 December 2011 в 06:28
поделиться

2 ответа

  • Добавьте файл ресурсов в свой проект (вы можете назвать его «strings.resx»), выполнив следующие действия:
    Щелкните правой кнопкой мыши Свойства в проекте, выберите Добавить -> Новый элемент ... в контекстном меню, затем в списке Visual C # Items выберите «Файл ресурсов» и назовите его strings.resx .
  • Добавьте строку resouce в файле resx и дайте ему хорошее имя (пример: назовите его "Hello" и присвойте ему значение "Hello")
  • Сохраните файл ресурсов ( примечание: это будет ] default файл ресурсов, поскольку он не имеет двухбуквенного кода языка)
  • Добавьте ссылки на вашу программу: System.Threading и System.Globalization

Запустите это код:

Console.WriteLine(Properties.strings.Hello);

Он должен напечатать «Hello».

Теперь добавьте новый файл ресурсов с именем «strings.fr.resx» (обратите внимание на часть «fr»; этот файл будет содержать ресурсы на французском языке). Добавьте строковый ресурс с тем же именем, что и в strings.resx, но со значением на французском языке (Name = "Hello", Value = "Salut"). Теперь, если вы запустите следующий код, он должен напечатать Salut:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);

Что происходит, так это то, что система будет искать ресурс для «fr-FR». Он не найдет его (поскольку мы указали "fr" в вашем файле "). Затем он вернется к проверке" fr ", который он найдет (и использует).

Следующий код напечатает" Hello " :

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);

Это потому, что он не находит ни одного ресурса "en-US", а также ресурса "en", поэтому он вернется к значению по умолчанию, который мы добавили с самого начала.

При необходимости вы можете создавать файлы с более конкретными ресурсами (например, strings.fr-FR.resx и strings.fr-CA.resx для французского языка во Франции и Канаде соответственно) . В каждый такой файл вам нужно будет добавить ресурсы для тех строк, которые отличаются от ресурса, к которому он будет возвращаться. Таким образом, если текст одинаков во Франции и Канаде, вы можете поместить его в strings.fr.resx, а строки, которые отличаются в канадском французском, можно поместить в strings.fr-CA.resx.

547
ответ дан 23 November 2019 в 02:46
поделиться

Это довольно на самом деле просто. Создайте новый файл ресурсов, например Strings.resx . Установите Модификатор доступа на Открытый . Используйте шаблон файла apprioriate, чтобы Visual Studio автоматически сгенерировала класс доступа (в данном случае имя будет Strings ). Это ваш язык по умолчанию.

Теперь, когда вы хотите добавить, скажем, немецкую локализацию, добавьте локализованный файл resx. В данном случае это обычно Strings.de.resx . Если вы хотите добавить дополнительную локализацию, например, для Австрии, вы дополнительно создадите Strings.de-AT.resx .

Теперь создайте строку - скажем, строку с именем HelloWorld . В вашем Strings.resx добавьте эту строку со значением «Hello, world!». В Strings.de.resx добавьте «Hallo, Welt!». И в Strings.de-AT.resx добавьте «Servus, Welt!». На этом все.

Теперь у вас есть сгенерированный класс Strings , и у него есть свойство с геттером HelloWorld . Получение этого свойства загрузит "Servus, Welt!" если ваш языковой стандарт - de-AT, «Hallo, Welt!», если ваш языковой стандарт - это любой другой языковой стандарт (включая de-DE и de-CH), и «Hello, World!», если ваш языковой стандарт - любой другой. Если строка отсутствует в локализованной версии, диспетчер ресурсов автоматически переходит по цепочке от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи Сгенерированный класс Strings также использует его.

добавить «Сервус, Вельт!». На этом все.

Теперь у вас есть сгенерированный класс Strings , и у него есть свойство с геттером HelloWorld . Получение этого свойства загрузит "Servus, Welt!" если ваш языковой стандарт - de-AT, «Hallo, Welt!», если ваш языковой стандарт - это любой другой языковой стандарт (включая de-DE и de-CH), и «Hello, World!», если ваш языковой стандарт - любой другой. Если строка отсутствует в локализованной версии, диспетчер ресурсов автоматически переходит по цепочке от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи Сгенерированный класс Strings также использует его.

добавить «Сервус, Вельт!». На этом все.

Теперь у вас есть сгенерированный класс Strings , и у него есть свойство с геттером HelloWorld . Получение этого свойства загрузит "Servus, Welt!" если ваш языковой стандарт - de-AT, «Hallo, Welt!», если ваш языковой стандарт - это любой другой языковой стандарт (включая de-DE и de-CH), и «Hello, World!», если ваш языковой стандарт - любой другой. Если строка отсутствует в локализованной версии, диспетчер ресурсов автоматически переходит по цепочке от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи Сгенерированный класс Strings также использует его.

Теперь у вас есть сгенерированный класс Strings и у него есть свойство с геттером HelloWorld . Получение этого свойства загрузит "Servus, Welt!" если ваш языковой стандарт - de-AT, «Hallo, Welt!», если ваш языковой стандарт - это любой другой языковой стандарт (включая de-DE и de-CH), и «Hello, World!», если ваш языковой стандарт - любой другой. Если строка отсутствует в локализованной версии, диспетчер ресурсов автоматически переходит по цепочке от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи Сгенерированный класс Strings также использует его.

Теперь у вас есть сгенерированный класс Strings , и у него есть свойство с получателем HelloWorld . Получение этого свойства загрузит "Servus, Welt!" если ваш языковой стандарт - de-AT, «Hallo, Welt!», если ваш языковой стандарт - это любой другой языковой стандарт (включая de-DE и de-CH), и «Hello, World!», если ваш языковой стандарт - любой другой. Если строка отсутствует в локализованной версии, диспетчер ресурсов автоматически переходит по цепочке от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи Сгенерированный класс Strings также использует его.

Servus, Welt! », Когда ваш регион de-AT,« Hallo, Welt! когда ваш языковой стандарт - любой другой de locale (включая de-DE и de-CH), и "Hello, World!" когда у вас что-то другое. Если в локализованной версии отсутствует строка, диспетчер ресурсов автоматически перейдет по цепочке, от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи. Сгенерированный класс Strings также использует его.

Servus, Welt! », Когда ваш регион de-AT,« Hallo, Welt! когда ваш языковой стандарт - любой другой de locale (включая de-DE и de-CH), и "Hello, World!" когда у вас что-то другое. Если в локализованной версии отсутствует строка, диспетчер ресурсов автоматически перейдет по цепочке от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи. Сгенерированный класс Strings также использует его.

от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи. Сгенерированный класс Strings также использует его.

от наиболее специализированного к инвариантному ресурсу.

Вы можете использовать класс ResourceManager для большего контроля над тем, как именно вы загружаете вещи. Сгенерированный класс Strings также использует его.

38
ответ дан 23 November 2019 в 02:46
поделиться
Другие вопросы по тегам:

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