Опубликован: 02.08.2013 | Уровень: для всех | Доступ: платный
Самостоятельная работа 19:

Локализация и глобализация приложений

Имена ресурсов в различных файлах ресурсов должны совпадать. В нашем случае ресурсы ButtonMsgText и MessageText добавлены в файл языка по умолчанию (AppResource.resx) и в файл для русского языка (AppResource.ru_RU.resx). В первом случае ресурсы имеют англоязычное написание, во втором – русскоязычное. Если в системе, в которой будет запущено приложение, используется какой-то другой язык, для отображения соответствующего ресурса будет выбран язык по умолчанию, то есть – английский. Автоматически формируемый файл AppResources.Designer.cs, используемый в системе локализации (при добавлении нового ресурса в файл ресурсов, здесь автоматически формируется соответствующий код для возврата ресурса) можно настроить на возврат при обращении к ресурсу не только строк, но и других объектов.

В коде, который собран в MainPage.xaml.cs, Листинг 53.4, обрабатывается выбор языка из списка, установка региональных параметров, соответствующих выбранному языку, и вывод данных, отформатированных с использованием региональных параметров. Это – пример глобализации приложения.

using System;
using System.Windows.Controls;
using Microsoft.Phone.Controls;
using System.Globalization;
using System.Threading;
using System.Windows;

namespace sdkGlobalizationCS
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();

            SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;
        }

        private void LocList_SelectedIndexChanged(object sender, SelectionChangedEventArgs e)
        {
            // Установка текущих региональных параметров в соответствии с выбранными и отображение сведений,
            // таких, как информация о дате, времени, валюте, и других, в соответствующем формате.

            string nl;
            string cul;

            nl = locList.SelectedIndex.ToString();

            switch (nl)
            {
                case "0":
                    cul = "zh-CN";
                    break;
                case "1":
                    cul = "zh-TW";
                    break;
                case "2":
                    cul = "cs-CZ";
                    break;
                case "3":
                    cul = "da-DK";
                    break;
                case "4":
                    cul = "nl-NL";
                    break;
                case "5":
                    cul = "en-GB";
                    break;
                case "6":
                    cul = "en-US";
                    break;
                case "7":
                    cul = "fi-FI";
                    break;
                case "8":
                    cul = "fr-FR";
                    break;
                case "9":
                    cul = "de-DE";
                    break;
                case "10":
                    cul = "el-GR";
                    break;
                case "11":
                    cul = "hu-HU";
                    break;
                case "12":
                    cul = "it-IT";
                    break;
                case "13":
                    cul = "ja-JP";
                    break;
                case "14":
                    cul = "ko-KR";
                    break;
                case "15":
                    cul = "nb-NO";
                    break;
                case "16":
                    cul = "pl-PL";
                    break;
                case "17":
                    cul = "pt-BR";
                    break;
                case "18":
                    cul = "pt-PT";
                    break;
                case "19":
                    cul = "ru-RU";
                    break;
                case "20":
                    cul = "es-ES";
                    break;
                case "21":
                    cul = "sv-SE";
                    break;
                default:
                    cul = "en-US";
                    break;
            }


            //Установка текущих ррегиональных параметров потока на выбранные
            
            CultureInfo newCulture = new CultureInfo(cul);
            Thread.CurrentThread.CurrentCulture = newCulture;

            CultureInfo cc, cuic;
            cc = Thread.CurrentThread.CurrentCulture;
            cuic = Thread.CurrentThread.CurrentUICulture;

            // Отображение названия региональных параметров на языке выбранного региона
            regionalFrmt.Text = cc.NativeName;

            // Отображение названия региональных параметров на языке локализации
            displayLang.Text = cuic.DisplayName;

            // Вывод даты (в сокращенной и полной формах) для текущих региональных параметров  
            DateTime curDate = DateTime.Now;
            longDate.Text = cc.DateTimeFormat.LongDatePattern.ToString() + " " + curDate.ToString("D");
            shortDate.Text = cc.DateTimeFormat.ShortDatePattern.ToString() + "   " + curDate.ToString("d");

            // Отображение времени (в полной форме) для текущих региональных параметров  
            longTime.Text = cc.DateTimeFormat.LongTimePattern + "   " + curDate.ToString("T");

            // Вывод форматированного представления валюты с символом валюты для текущих региональных параметров  
            Int64 money = 123456789;
            currencyFrmt.Text = money.ToString("C");
        }

        private void btnMessage_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            //Пример использования локализованных строк в коде
            //Вывод локализованного сообщения
            MessageBox.Show(sdkGlobalizationCS.AppResources.MessageText);
        }
    }
}
Листинг 53.4. Код файла MainPage.xaml.cs

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

sdkGlobalizationCS.AppResources.MessageText

Здесь MessageText – это имя ресурса в файле ресурсов.

Выводы

В проектах приложений, созданных по стандартным шаблонам, есть всё необходимое для их локализации. Существуют различные подходы к локализации приложений. Например, сначала разработчик создает приложение на знакомом ему языке, после чего находит в XAML-коде и в файлах программного кода все строки, которые нужно локализовать, создаёт ресурсы, соответствующие этим строкам на различных языках в RESX-файлах и меняет прямое указание строк ссылками на соответствующие ресурсы. Глобализация – это подготовка приложения к глобальному рынку. С технической точки зрения она заключается, в частности, в использовании форматов данных, применяемых в том или ином регионе. Кроме того, приложение не должно содержать материалов, которые покажутся оскорбительными пользователям какого-либо региона, в котором планируется распространять приложение. Для тестирования локализованных приложений можно воспользоваться либо эмулятором, либо аппаратным устройством, настраивая язык системы для проверки каждой из версий.

Задание

Так как локализация приложений позволяет успешно распространять их на множестве рынков, которые поддерживает Магазин Windows Phone, всегда, когда приложение может использоваться глобально, следует рассматривать возможность его локализации. Выполните локализацию приложения на английский язык (предполагается, что при разработке вы используете русский язык), установите его в качестве языка по умолчанию, в качестве отчёта о проделанной работе продемонстрируйте таблицу с перечнем имен, русскоязычных и англоязычных значений, соответствующих строк.

Дополнительные материалы

К данной лекции подготовлено видеоприложение и демонстрационный программный проект.

Вася Пупкин
Вася Пупкин
Россия, с. Оймякон
антон Антонкин
антон Антонкин
Россия