Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Локализация программы.


Автор: iddqd 20.4.2007, 10:10
Необходимо реализовать программу на нескольких языках, при этом, чтоб файлы локализации хранились в XML в легко достпуном для реадктирования виде и чтоб любой человек мог перевести на свой язык.
Как это реализовывается в C#? И как быть с переводом строковых литералов?

Автор: tol05 20.4.2007, 10:27
1. System.Resources Namespace (ResourceManager, ResXResourceWriter, ResXResourceReader).
2. Утилита Resgen.exe

Вообще об этом неплохо написано в "C#2005 для профессионалов"

Автор: iddqd 20.4.2007, 10:42
К сожалению, по двум строчкам мне сложно понять весь механизм работы и реализацию.
А вот книгой этой к сожалению не распологаю. Но на озоне заказали, счет сегодня подпишут smile

Автор: _Dream 20.4.2007, 11:11
так студия сама же все делает(когда форму локализуешь)

Автор: iddqd 20.4.2007, 11:30
Я же сказал, мне файлы языков надо хранить в XML.
И чтоб:
а) пользователь мог свободно добавить свой язык
б) там можно было хранить строковые литералы

Автор: _Dream 20.4.2007, 11:34
Цитата

мне файлы языков надо хранить в XML.

а они где хранятся ?
resx ресурсы и отлдичаются тем что там структура xml документа- ключ-значение

Автор: iddqd 20.4.2007, 11:43
Можно подробней про саму реализаию, теория тут не интересна.
Как это сделать?

Автор: tol05 20.4.2007, 11:55
Вот сделал архив с sources к учебнику. Лови.

Автор: iddqd 20.4.2007, 12:45
Спасибо. Посмотрел исходники. Пока не очень понятно.
Тут есть как раз статья из озвученной книги: http://www.rsdn.ru/article/dotnet/csprof2005_localization.xml

Множество вопросов осталось:
а) как быть со строковыми литералами, т.е.:
Код

string s = "привет"
 перевести в hello.
б) автоматическое нахождение всех файлов языка, которые добавил пользователь.
в) сам формат XMl файла.
г) перевод аттрибутов. т.е.:
Код

[Category("Основные"), Description("Надпись в текстовом поле")]

Тоже должно переводиться.

Может кто-нибудь сделать приложение, где будет одна кнопка и список всех доступных файлов языка, при выборе файла и нажатию кнопки происходит перевод. И чтоб использовался строковый литерал. Пожалуйста. Буду очень признателен и сразу все вопросы будут исчерпаны.

Автор: iddqd 20.4.2007, 13:15
Как я уже говорил - пользователь должен легко взять и перевести программу сам. Разве неподготовленный пользователь сможет такой ужас перевести?
Код

<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 
    
    Version 2.0
    
    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.
    
    Example:
    
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">2.0</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        <value>[base64 mime encoded serialized .NET Framework object]</value>
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
        <comment>This is a comment</comment>
    </data>
                
    There are any number of "resheader" rows that contain simple 
    name/value pairs.
    
    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set.
    
    The mimetype is used for serialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly:
    
    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below.
    
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array 
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="Title" xml:space="preserve">
    <value>Hello world</value>
  </data>
  <data name="Button" xml:space="preserve">
    <value>Text</value>
  </data>
</root>

Автор: _Dream 20.4.2007, 14:10
ну если проблема только в этом то
как ты знаешь все что тебе надо хранится в паре name-value
Код

<data name="Button" xml:space="preserve">
    <value>Text</value>
  </data>

и! только это необходимо перевести.. если пугают ResXResourceReader'ы со встроенными методами можеь просто парсить документ и выдирать оттуда эти пары(ну и записывать куда-то) а потом передать неподготовленному пользователю smile
http://www.codeproject.com/useritems/ZetaResourceEditor.asp и http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=59519817-ed3b-47ce-8652-73f37d58e2ab глянь

Цитата

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

разве ж так можно?
то есть студия тебе сама будет переводить? smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)