Справочный центр

Локализация приложений .NET. Подготовка к локализации приложений .NET

Как подготовить к локализации проект, разработанный в среде .NET
При проектировании и разработке приложения с учетом его последующей локализации нужно следовать правилам, указанным ниже
Даже если вы разрабатываете приложение, которое предназначено для одной культуры или региона, необходимо использовать файлы ресурсов для сохранения строк и других ресурсов, отображаемых в пользовательском интерфейсе. Никогда не следует добавлять их непосредственно в код. При размещении ресурсов во вспомогательных сборках среда CLR позволяет выбрать соответствующий языку и региональным параметрам ресурс (с помощью экземпляра объекта ResourceManager или использовать строго типизированный класс ресурса)
using System;
using System.Collections;
using System.Globalization;
using System.Resources;

namespace ConsoleTaskShedulerManager
{
    class DatabaseResourceManager : ResourceManager
    {
        private string dsn;
        public DatabaseResourceManager(string dsn)
        {
            this.dsn = dsn;
            ResourceSets = new Hashtable();
        }

        protected override ResourceSet InternalGetResourceSet(CultureInfo culture, bool createIfNotExists, bool tryParents)
        {
            DatabaseResourceSet rs = null;

            if (ResourceSets.Contains(culture.Name))
            {
                rs = ResourceSets[culture.Name] as DatabaseResourceSet;
            }
            else
            {
                rs = new DatabaseResourceSet(dsn, culture);
                ResourceSets.Add(culture.Name, rs);
            }

            return rs;
        }
    }
}
Все что связано со строками, датами, числами необходимо хранить в инвариантной к культуре форме с помощью свойства CultureInfo.InvariantCulture.
// внести все культуры в представление дерева
public void AddCulturesToTree()
{
   // получить все культуры
   CultureInfo[] cultures = CultureInfo.GetCultures( CultureTypes.AllCultures );
   Array.Sort( cultures, new CultureComparer() );
   TreeNode[] nodes = new TreeNode[ cultures.Length ];
   int i = 0;
   TreeNode parent = null;
   foreach ( CultureInfo ci in cultures )
   {
      nodes[ i ] = new TreeNode();
      nodes[ i ].Text = ci.DisplayName;
      nodes[ i ].Tag = ci;

      if ( ci.IsNeutralCulture )
      {
         // запомнить нейтральные культуры, как родителей для последующих
         parent = nodes[ i ];
         treeCultures.Nodes.Add( nodes[ i ] );
      }
      else if ( ci.ThreeLetterISOLanguageName == CultureInfo.InvariantCulture.ThreeLetterISOLanguageName )
      {
         // инвариантные культуры не имеют родителей
         treeCultures.Nodes.Add( nodes[ i ] );
      }
      else
      {
         // специфические культуры добавляются к узлам родительских нейтральных
         parent.Nodes.Add( nodes[ i ] );
      }

      i++;
   }
}
Хотя в платформе .NET нет встроенной поддержки преобразования единиц измерения, можно использовать свойство RegionInfo.IsMetric, чтобы определить, использует ли определенная страна или регион метрическую систему. Все остальные параметры, такие как номера телефонов, адреса, единицы измерения длины, веса, площади, объема и температуры, а также специфические такие как размеры (форматы) бумаги, используемой в стране, вам надо уже высчитывать программно вручную.
Готовое к локализации приложение разделяется на два логических блока. Один из них содержит все элементы пользовательского интерфейса, а другой — исполняемый код. Блок пользовательского интерфейса содержит только локализуемые элементы, например строки, сообщения об ошибках, диалоговые окна, пункты меню, внедренные объектные ресурсы и т. д. для нейтрального языка и региональных параметров. Блок кода содержит только код приложения, который будет одинаковым для всех поддерживаемых языков и региональных параметров.

Для каждой локализованной версии приложения добавьте новую вспомогательную сборку, которая содержит локализованный блок пользовательского интерфейса, учитывающий все требования целевого языка и региональных параметров. Данная сборка должна в себя включать встроенные ресурсы (Embedded Resources) на основе ресурсных файлов в формате .resX (XML формат со специфическим DTD). Правила парсинга файлов *.resx можно прочитать на нашем сайте тут
<?xml version="1.0" encoding="utf-8"?>
<root>
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">    
</xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
<data name="AssistantFieldName" xml:space="preserve">
    <value>Ассистент</value>
  </data>
  <data name="ManagerFieldName" xml:space="preserve">
    <value>Менеджер</value>
  </data>
  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <data name="ManagerImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>Resources\ManagerImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
  </data>
  <data name="OperatorFieldName" xml:space="preserve">
    <value>Оператор</value>
  </data>
  <data name="OperatorHello" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>Resources\OperatorHello.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </data>
  <data name="OperatorImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>Resources\OperatorImage.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
  </data>
</root>
Блок кода должен оставаться одинаковым для всех языков и региональных параметров. Объединение локализованной версии блока пользовательского интерфейса с блоком кода создает новую локализованную версию приложения.

Формат файлов .resX текстовый – это позволяет очень просто экспортировать и импортировать текстовые строки в эти файлы. Соответственно на перевод отдаются .resX файлы.

Для локализации файлов мы предлагаем использовать нашу систему alingvo (войти можно по кнопке ниже).

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

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

Проект компилируется и вы получаете интернациональное приложение со встроенными функциями локализации и всеми необходимыми локализованными артефактами.

Подробные рекомендации Майкрософт при разработке можно почитать на их сайте тут