GUI Internationalization

Тема в разделе "WASM.HEAP", создана пользователем NeuronViking, 15 мар 2010.

  1. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    как обычно делается сабж? принципы?
    самый очевидный на мой взгляд - создание шаблонов фраз и предложений на разных языках в Юникод и отрисовка текста в нужном языке. но это наверняка не самый хороший способ =) я просто с этим вопросом не знаком особенно, всегда работал с английским...
    Спасибо!
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    подходы разные. либо полностью отдельный набор ресурсов для каждого языка (возможно в отдельных длл), либо только строки (но тогда диалоги нужно расчитывать под самые длинные варианты, в т.ч. и перспективные). естественно, все текстовые сообщения - из ресурсов. можно хранить строки в ini-подобных файлах - легко править юзерам, но в ресурсах эффективнее. возможны и другие варианты.
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    пецольда читайте, современная тенденция - динамическое размещение
    меняется только набор строковых ресурсов - приживется или нет время покажет
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    NeuronViking
     
  5. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    KeSqueer
    спасибо! примерно так я себе все и представлял. считаю что это тоже далеко не самый эффективный способ.

    Rockphorr
    Пецольд вроде предлагает тоже что и пример KeSqueer-а и о чем говорит shoo.

    Только вот один момент не понятен - каким таким боком для локализации GUI может использоваться XML?! Кто-нибудь может рассказать об этом?
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Вот пример xml файла описывающего диалоговое окно. Замените названия файлов с изображениями на идентификаторы строк и получится примерно то, что Вы спрашиваете. Таким образом можно менять не только надписи на элементах управления, но также и их расположение, очень удобно. Обложки Winamp, на сколько я знаю, используют именно такой подход.
    Остается только прикрутить xml-парсер. Впрочем, думаю, искать долго его не придется.
    Код (Text):
    1. <?xml version="1.0" encoding="UTF-8"?>
    2.  
    3. <PersonalShop>
    4.     <Frame>
    5.         <ID>PERSONALSHOP_FRAME</ID>
    6.         <RECT>100,100,429,400</RECT>
    7.     </Frame>
    8.     <Button>
    9.         <ID>PERSONALSHOP_CREATE_BUTTON</ID>
    10.         <RECT>100,366,115,24</RECT>
    11.         <TEX1>SB_Up.tga</TEX1>
    12.         <TEX2>SB_Dw.tga</TEX2>
    13.         <TEX3>SB_MO.tga</TEX3>
    14.         <TEX4>SB_Da.tga</TEX4>
    15.     </Button>
    16.     <Button>
    17.         <ID>PERSONALSHOP_CLOSE_BUTTON</ID>
    18.         <RECT>233,366,115,24</RECT>
    19.         <TEX1>SB_Up.tga</TEX1>
    20.         <TEX2>SB_Dw.tga</TEX2>
    21.         <TEX3>SB_MO.tga</TEX3>
    22.         <TEX4>SB_Da.tga</TEX4>
    23.     </Button>
    24.     <ListBoxItem>
    25.         <ID>REGISTRATION_LISTBOXITEM</ID>
    26.         <RECT>0,0,0,0</RECT>
    27.         <TEX1>ReidWnd_Bar.tga</TEX1>
    28.     </ListBoxItem>
    29.     <ListBox>
    30.         <ID>REGISTRATION_LISTBOX</ID>
    31.         <RECT>0,77,419,295</RECT>
    32.     </ListBox>
    33.    
    34.     <Frame>
    35.         <ID>OPENPERSONALSHOP_FRAME</ID>
    36.         <RECT>100,100,439,410</RECT>
    37.     </Frame>
    38.     <Button>
    39.         <ID>OPENPERSONALSHOP_CLOSE_BUTTON</ID>
    40.         <RECT>282,371,115,24</RECT>
    41.         <TEX1>SB_Up.tga</TEX1>
    42.         <TEX2>SB_Dw.tga</TEX2>
    43.         <TEX3>SB_MO.tga</TEX3>
    44.         <TEX4>SB_Da.tga</TEX4>
    45.     </Button>
    46.     <ListBoxItem>
    47.         <ID>OPENPERSONALSHOP_LISTBOXITEM</ID>
    48.         <RECT>0,0,0,0</RECT>
    49.         <TEX1>ReidWnd_Bar.tga</TEX1>
    50.     </ListBoxItem>
    51.     <ListBox>
    52.         <ID>OPENPERSONALSHOP_LISTBOX</ID>
    53.         <RECT>10,77,419,295</RECT>
    54.     </ListBox>
    55.  
    56.     <Frame>
    57.         <ID>OPENSEARCHITEM_FRAME</ID>
    58.         <RECT>100,100,694,451</RECT>
    59.     </Frame>
    60.     <Button>
    61.         <ID>SEARCH_BUTTON</ID>
    62.         <RECT>500,60,115,24</RECT>
    63.         <TEX1>SB_Up.tga</TEX1>
    64.         <TEX2>SB_Dw.tga</TEX2>
    65.         <TEX3>SB_MO.tga</TEX3>
    66.         <TEX4>SB_Da.tga</TEX4>
    67.     </Button>
    68.     <Button>
    69.         <ID>OPENSEARCHITEM_CLOSE_BUTTON</ID>
    70.         <RECT>283,402,115,24</RECT>
    71.         <TEX1>SB_Up.tga</TEX1>
    72.         <TEX2>SB_Dw.tga</TEX2>
    73.         <TEX3>SB_MO.tga</TEX3>
    74.         <TEX4>SB_Da.tga</TEX4>
    75.     </Button>
    76.     <ListBoxItem>
    77.         <ID>OPENSEARCHITEM_LISTBOXITEM</ID>
    78.         <RECT>0,0,0,0</RECT>
    79.         <TEX1>ReidWnd_Bar.tga</TEX1>
    80.     </ListBoxItem>
    81.     <ListBox>
    82.         <ID>OPENSEARCHITEM_LISTBOX</ID>
    83.         <RECT>10,118,665,280</RECT>
    84.     </ListBox>
    85.  
    86.     <Frame>
    87.         <ID>BUY_ITEM_FRAME</ID>
    88.         <RECT>150,150,425,175</RECT>
    89.     </Frame>
    90.     <Button>
    91.         <ID>BUYITEM_BUTTON</ID>
    92.         <RECT>288,70,115,24</RECT>
    93.         <TEX1>SB_Up.tga</TEX1>
    94.         <TEX2>SB_Dw.tga</TEX2>
    95.         <TEX3>SB_MO.tga</TEX3>
    96.         <TEX4>SB_Da.tga</TEX4>
    97.     </Button>
    98.     <Button>
    99.         <ID>CANCELITEM_BUTTON</ID>
    100.         <RECT>288,138,115,24</RECT>
    101.         <TEX1>SB_Up.tga</TEX1>
    102.         <TEX2>SB_Dw.tga</TEX2>
    103.         <TEX3>SB_MO.tga</TEX3>
    104.         <TEX4>SB_Da.tga</TEX4>
    105.     </Button>
    106.     <Frame>
    107.         <ID>OPEN_ALERT_FRAME</ID>
    108.         <RECT>0,0,0,0</RECT>
    109.     </Frame>
    110.     <Frame>
    111.         <ID>STATEBOARD_FRAME</ID>
    112.         <RECT>800,500,200,130</RECT>
    113.     </Frame>
    114. </PersonalShop>
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Ну и соответственно для каждого языка имеем по одному или несколько xml файлов.
     
  8. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    KeSqueer
    спасибо!

    оказывется есть даже такая штука как XUL (XML-based user interface language) https://developer.mozilla.org/en/XUL
     
  9. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Поидее во всех современных фреймворках и библиотеках GUI такая вещь как internationalization автоматизирована, ибо этой чистой воды monkey job, на которую не хочется тратить много времени.

    Для примера, как это сделано в Qt. В программе все строковые ресурсы обворачиваются в tr(), т.е. не "Hello", а tr("Hello") или, если класс не наследует базовый QObject пишется qApp::tr("Hello").

    В main добавляется такой код:
    Код (Text):
    1.     // Для системных ресурсов
    2.     QTranslator qtTranslator;
    3.     qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    4.     app.installTranslator(&qtTranslator);
    5.     // Для ресурсов программы
    6.     QTranslator appTranslator;
    7.     appTranslator.load("gui_" + QLocale::system().name());
    8.     app.installTranslator(&appTranslator);
    Потом на проект натравливается утилита lupdate, которая вытягивает все строки в отдельный *.ts файл, этот ts файл отдаётся переводчику или тому, кто будет переводить и он осуществляет перевод интерфейса в таком удобном виде:

    [​IMG]

    В ts файл записывается перевод, после чего отдаётся разработчику, он кладёт его к релизу. При запуске программа определяет язык системы и всё. Все ресурсы переведены.

    Т.о. для перевода программы на любой язык не требуется изменения ниодной строчки кода.
     
  10. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    W4FhLF
    а чем это отличается от использования юникода + ресурсных файлов? по-моему Qt-шный способ не самый оптимальный ИМХО. похоже как раз использование XML дает максимальную силу для локализации.