Multilanguage support

Тема в разделе "WASM.BEGINNERS", создана пользователем aglamer, 11 апр 2006.

  1. aglamer

    aglamer New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    3
    Доброго всем времени суток!

    Перерыл много форумов и гуглов, так ничего и не нашел: как сделать приложение (на MASM), поддерживающее несколько языков (человеческих, а не машинных:))? В принципе, все языковые файлы - это просто INI, сохраненные в unicode. Что-то типа:
    Код (Text):
    1.  
    2. [10001]
    3. 10002=Новый файл
    4.  


    Пытаюсь прочитать хоть один ключ и что-то вывести, скажем, в меню - не выходит каменный цветок!.. И GetPrivateProfileStringW пробую, и WideCharToMultiByte, и еще много всякого... И, главное, нигде ни одного намека, не за что ухватиться.

    Спасибою
     
  2. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    ОС какая?

    Покажи свой пример...
     
  3. aglamer

    aglamer New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    3
    XP.

    А пример - вот он весь, наверху. Ну, можно для чистоты эксперимента поменять на что-то более "норвежское"
    Код (Text):
    1.  
    2. [10001]
    3. 10037=Lås / Lås opp Fil
    4.  


    Как это прочитать и как это вывести? Надеюсь, ни у кого норвежский не выставлен в качестве non-unicode language :)
     
  4. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    INI-файлы сохраняются и читаются только в ASCII-кодировке, независимо от того, используешь ли ты GetPrivateProfileStringA или GetPrivateProfileStringW. Варианты такие:



    * Сделать свой собственный движок для парсинга Ini-файлов в Unicode (UTF-16 или UTF-8). Так сделано, например, в архиваторе 7-zip.



    * Сохранять файлы в UTF-8 без сигнатуры. Тогда строки "[10001]", "10037=" и символы конца строки будут как бы в восьмибитной ASCII, а норвежско-русские буквы будут закодированы несколькими байтами. Читать такой файл можно GetPrivateProfileStringA, затем декодировать из UTF-8 в UTF-16 (процедуру декодирования несложно написать самому). Конечно, это "некошерный" трюк, но он работает во всех существующих версиях Windows.



    Если непонятно объяснил, спрашивай еще - могу показать примеры ini-файлов в Unicode.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    MultiByteToWideString(CP_UTF8,...)
     
  6. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia


    Не работает в Win95, поэтому я использую свою процедуру :). На самом деле, там ничего сложного нет (см. Unicode FAQ).
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    aglamer

    Ресурсы stringtable хранятся именно в юникоде. Эти ресурсы можно поместить в DLL, даже по одной DLL на каждый язык, чтоб сэкономить память.
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    StringTable достаточно удобно получается. Создаешь несколько меню (по количеству языков). В момент переключения языков убиваешь старое меню окна, грузишь из ресурса меню на соответствующем языке и присваиваешь его окну.

    Так же можно и с выводимыми сообщениями, надписями на кнопках и т.д. - грузишь строку из нужной группы строк.
     
  9. aglamer

    aglamer New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2006
    Сообщения:
    3
    Иногда полезно бывает не заглядывать несколько дней - вон сколько сразу!

    Спасибо всем, теперь я пошел это осмысливать и воплощать :)