Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мультиязычное приложение, что для ентого нужно 
:(
    Опции темы
takedo
Дата 19.5.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



дорый день.
Кто знает или делал когда-нибудь приложение с возможностью выбора языка? (как в TotalComander) например? Что для этого нужно, кроме того, что в проекте поставить широкобайтовые символы? Вопрос то в том, как поменять надписи, меню  и.т.д. Да и вообще кто знает как в двух байтах располагаются языки, поясняю свой вопрос: например кииллица начинается с 25000, а украинская раскладка там же с 30000? или как?
Вообщем, всех кто располагает какой-либо информацией, прошу поделится, ПОЖАЛЙСТА smile  


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 19.5.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Способ, который предлагает Мелкософт, такой: продублировать все зависящие от языка ресурсы. 
Можно все это держать вместе, можно для каждого языка делать отдельную DLL с ресурсами.
При этом, приложение вовсе не должно быть UNICODE (даже если ты собираешься переводить его на японский-китайский), поскольку ресурсы и так всегда хранятся в UNICODE.
В API существуют функции выбора ресурса для конкретного языка.
Если не ошибаюсь, даже MFC это как-то внутри себя поддерживает - нужно только установить LANGUAGEID для процесса. Ищи в MSDN слова MultiLanguage и Localization.

Но остается открытым вопрос: а что делать при обновлении приложения? Т.е. выпускаем версию 1.1, в которой из 100 (допустим) диалогов поменялось 50. И что? Остается только ручками все приводить в соответствие. 
В свое время эта проблема меня сильно озаботила, и мы в итоге пришли к другому решению. Вкратце, вся ресурсы в программе - английские. Локальные ресурсы хранятся отдельно, в виде словарей специального формата, и загружаются на старте. Все обращения к ресурсам в программе проходят через специальные фильтры, которые выполняет "перевод". Как показывает практика, таких фильтров требуется немного: загрузка строк, инициализация меню и окон. 
Недостаток такого подхода - нельзя локализовать любое готовое приложение, нужно встраивать специальные классы в ядро приложения. Среди плюсов - возможность написать специальную утилиту, которая помогает переводить ресурсы и следит за изменениями...   


--------------------
...
PM   Вверх
takedo
Дата 19.5.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



если я правильно понял, то должны быть типа вот такой функции:
Код

bool ReadString(int numID,CString& str,INT LANGUAGE)
{
   switch(LANGUAGE)
   {
      case RUS:
      str = str_russ_array[numID]
     return true;
     case BELARUS:
      str = str_belaruss_array[numID]
     return true;
    default:
    return false;
   }
return false;
}

???

Добавлено @ 11:35 
и про утилиту не совсем понял 


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 19.5.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Нет, так не удобно. У тебя же все приложение на одном языке в каждый момент времени?
Так что функции нужны типа:
Код

bool AppLoadString (UINT nID,CString& str)
{
   if (_CurrentDictionary.find(ID,str))
       return true;
   else 
        return str.LoadString(ID);
}

void TranslateDlg (HWND hWnd,UINT nDlgResID) // вызывать, напр, из OnInitDialog базового класса
{
   // для каждого дочернего окна подставить перевод
}

А словарь загружается один раз, при установке языковой переменной.

Насчет утилиты. Я имела в виду, что словари надо как-то хранить, и удобнее это делать в двоичном формате. Значит, потребуется специальная программа для доступа к их содержимому (заполнять-то их как-то надо). А уж в эту программу можно добавить все, что нужно для счастья разработчика: и визивиг (чтобы видеть, например, влезают ли строки в диалог), и отслеживание изменений, и навигацию по непереведенным ресурсам, ...  


--------------------
...
PM   Вверх
takedo
Дата 22.5.2006, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Earnest
мда, понять сложновато... Но поскольку ты говоришь 
Цитата
 У тебя же все приложение на одном языке в каждый момент времени 
 я делаю вывод, что и мой вариант имеет право на жизнь, но не удолен - с этим в свете цитаты тебя я полностью согласен. Идем дальше,  а дальше я понимаю, что необходимо иметь словарь - файл или несколько файлов - словарей. При выборе языка мы должны этот словарь куда-то загрузить, но куда лучше? Дело в том, что мне надо не только диалоги мультиязыковывать, но и иметь набор строковых сообщений тоже на разных языках.
Что касается примера, пока так и не понял, что делает CurrentDictonary, и откуда при возвращении ей лжи загружается LoadString(ID)?
Я уже заранее был и буду тебе очень благодарен, только вот что понял, то понял, что не понял, то не понял  smile. Если есть на это время - можно чуть чуть более ясно (хоть чуточку) 


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 22.5.2006, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



CurrentDictionary - это объект класса, который хранит строки и, соответственно, ищет их.
Цитата(takedo @  22.5.2006,  06:35 Найти цитируемый пост)
откуда при возвращении ей лжи загружается LoadString(ID)?

Из ресурсов, конечно - то, что там есть - это же стандартная функция MFC-строки.

Значит, еще раз. Я исхожу из предположения, что программа именно локлизуется, т.е. имеет интерфейс на каком-то конкретном языке. Т.е. нет ситуации, когда тебе одновременно нужны строки и на русском, и на французском. 
(Если нужны, схему нужно доработать.)

Итак. Что нуждается в локализации? Строки, диалоги и меню. Все эти ресурсы изначально создаем на каком-то одном языке. ИМХО, удобнее использовать английский (хотя бы потому, что это будет нормально работать на любом Windows-компьютере). Но, конечно, могут быть и варианты.

Дальше, у нас есть некий класс-словарь, который как-то умеет найти то, что нам нужно. Данные в этот словарь мы загружаем на старте приложения (когда определяемся с языком).

Рассмотрим, например, локализацию диалога. Диалог загружается из ресурсов (с английскими словами). Но перед отображением его надо "перевести". Удобнее всего это сделать в OnInitDialog (после вызова базового метода) - просто для каждого дочернего окна запросить перевод и изменить текст. 

... Что-то я тону в объяснениях. Вот, лучше посмотри, это код нескольких файлов, которые как раз и отвечают за локализацию приложения. Там, конечно, много хвостов тянется к другим модулям, но, надеюсь, разберешься. Если что непонятно, спрашивай, можно в личку.


 

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  translate.rar 10,25 Kb


--------------------
...
PM   Вверх
takedo
Дата 23.5.2006, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



Earnest, спасибо, мысль уже понятна, сейчас файл скачаю, посмотрю к вечеру, сейчас бежать надо. В любом случае, тему пока закрыть не смогу, смогу когда что-то реализую.
СПАСИБО!!! ну а когда будет за что (на случай если ты про себя сказала : "да не за что"), скажу большое спасибо smile  


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
AlexPro
Дата 23.5.2006, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Меня тоже волнует этот вопрос, т.к. пишу мультиязычное приложение и пытался найти оптимальное решение этого вопроса. Судя по имеющейся у меня информации и множестве обсуждений этого вопроса, такого решения, увы, не существует. Способ Майкрософта, о котором упомянула Earnest, хорош для больших редко обновляемых проектов состоятельных компаний, но абсолютно непригоден для небольших часто обновляемых утилиток каких-нибудь шароварщиков, ограниченных в финансах.

Второй способ, о котором говорит Earnest (с классами-словарями), так же имеет свои недостатки (Earnest о них уже упомянула).

Я для своего проекта пошел другим путем (хотя и он мне не кажется идеальным). Ресурсы в проекте - на английском. Строки, требующие локализации, (для меню, диалогов и т.д.) хранятся в ini-файле. При необходимости (например, при открытии диалога) извлекаем строки и меняем английские строки на локализованные.
Недостатки способа: 
1. Вероятно, несколько большая трудоемкость (но не сложность) данного способа.
2. Нельзя заранее посмотреть, вписываются ли переведенные элементы в отведенные для них места.

Преимущества:
1. Простота.
2. Возможность локализации после компиляции приложения.
3. Обновленная версия не требует обязательного обновления файла локализованных строк (новые элементы будут просто выводиться на английском, что не критично, хотя и не слишком приятно).
4. Возможность локализации самим пользователем-носителем языка (что может сэкономить средства для программиста-одиночки или мелкой фирмы), т.к. файл локализованных строк является обычным текстовым файлом.

Добавлено @ 07:59 
Earnest, хотелось бы узнать, что ты думаешь об этом. 
PM MAIL   Вверх
Earnest
Дата 23.5.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Мы тоже сначала этим путем ходили: текстовый файл, содержащий словарь. Ini или что там еще - не принципиально. Как я понимаю, ты хочешь использовать готовый механизм чтения. Главное, что заполнять это дело можно руками в любом редакторе. Что, казалось бы, может быть проще?

Но по мере работы начинаешь понимать, что этого недостаточно. 

Насчет текстового недостатков способа - согласна - и еще добавлю:

3. Никакой возможности контроля. 
Синхронизация превращается в кошмар: что-то поменяли, что-то удалили, что-то добавили...
Т.е. можно что-то написать дополнительно, но тогда мы плавно переходим к нашему способу (и использовать двоичный формат резко становится удобнее).

4. Что использовать в качестве ключа переводной строки? 
Строка на английском? - но иногда одна и та же англ. строка должна переводится по-разному в разных контекстах.
Идентификатор? - не всегда достаточно (те же  IDC_STATIC в диалогах)? 
Можно, конечно, придумать хитрый комбинированный ключ, но тогда его ручное заполнение чревато ошибками.
Да и вообще, вписывать вручную что строки, что номера - обязательно ошибешься. 

Что касается преимуществ:
1. Простота. 
Скорее, быстрота.
Как говорится, первый раз, да. Но приложение для перевода пишется один раз и может поддерживать кучу разных проектов. А когда оно есть, использовать его очень просто.
Кроме того, поддержку перевода со строны локализуемого приложения все равно писать нужно. А это хоть и не половина, но значительная часть.

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

3. Обновленная версия не требует обязательного обновления файла локализованных строк (новые элементы будут просто выводиться на английском, что не критично, хотя и не слишком приятно).
Точно так же. Само приложение ведь не обновляется, только дополнительные файлы рядом лежат.

4. Возможность локализации самим пользователем-носителем языка (что может сэкономить средства для программиста-одиночки или мелкой фирмы), т.к. файл локализованных строк является обычным текстовым файлом.

Уже сказано. Приложение для перевода может использовать кто угодно. 

Как возник наш подход. В досовские времена у нас было как ты предлагаешь. Ну там понятно - немного интерфейса сочинишь. Потом, когда стали писать под виндоус, я долго мучилась, как бы скрестить уже с ежом (см. вышеупомянутые недостатки). Пока один знакомый программист не сказал: и чего ты мучаешься, сделай файл бинарным и пиши туда что хочешь. Неужели трудно написать утилиту для его заполнения? Мы начали с простого: графический интерфейс, список исполняемых модулей, форма для перевода ресурсов. Потом добавили визивиг (как диалоги-меню выглядят с переводом). Потом использование символьных идентификаторов, потом навигацию, потом контроль версий, потом... уже не помню что. Так что теперь процесс перевода выглядит следующим образом: загружаем проектный файл, в котором перечислены модули, текущие словари и еще какая-то служебная инфа, используемая для синхронизации. Программа перевода анализирует изменения, удаляет лишнее, пытается совместить измененные ид-ры и выводит список того, что не смогла сама.

Добавлено @ 16:24 
Среди недостатков нашего способа я бы отметила требования к локализуемому приложению: оно должно уметь грузить и использовать файлы словарей, созданные программой перевода. Т.е. любое приложение не локализуешь. Хотя самой программе перевода по барабану, что переводить - лишь бы ресурсы читались.
Так что если думать дальше, можно создать переводчик, который будет вписывать перевод прямо в ресурсы (или создавать DLL с локализацией, как это MFC предлагает). Сопроводительную информацию хранить в каком-нибудь служебном файле, чтобы все же поддерживать обновление версий.
И продавать это за большие деньги. smile  


--------------------
...
PM   Вверх
AlexPro
Дата 24.5.2006, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(Earnest @  24.5.2006,  00:18 Найти цитируемый пост)
Как я понимаю, ты хочешь использовать готовый механизм чтения. Главное, что заполнять это дело можно руками в любом редакторе. Что, казалось бы, может быть проще

Да, стандартные функции для работы с ini-файлами и реестром.
Но, как я и говорил ранее, этот способ мне не кажется идеальным. Он хорош для маленьких приложений. Но, по мере роста числа локализуемых объектов, недостатки в определенный момент начинают перевешивать достоинства.

Цитата(Earnest @  24.5.2006,  00:18 Найти цитируемый пост)
4. Что использовать в качестве ключа переводной строки?

Да, была у меня такая головная боль.

Цитата(Earnest @  24.5.2006,  00:18 Найти цитируемый пост)
Неужели трудно написать утилиту для его заполнения? Мы начали с простого: графический интерфейс, список исполняемых модулей, форма для перевода ресурсов. Потом добавили визивиг (как диалоги-меню выглядят с переводом). 

Вот-вот!  smile  Т.е. пришлось еще одну программу писать, специально для перевода. smile И если для большого проекта это может быть оправдано, для среднего - сомнительно, то для малого - ни к черту не годится! Ибо трудозатраты на дополнительные утилиты обслуживания могут перевесить трудозатраты на разработку самого приложения. smile 
Таким образом, опять возвращаемся к мысли о том, что хорошего универсального способа локализации, увы, не существует. smile  
PM MAIL   Вверх
takedo
Дата 24.5.2006, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: нет
Всего: 3



AlexPro, так делай постепенно, а способ нормальный, ты ведь не единственное приложение возможно будешь делать в жизни.
По теме, сделал диалог с кнопкой. Ресурсы на англицком. В OnInitDialog этой кнопке сделал SetWindowText(русский) - всё ок! Следоватеьно необходимо каждый диалог в OnInitDialog(да и вообще везде) корректировать по размерам кнопок. Каждую кнопку ставить в определенное место, но координаты вычислять как процент от ширины и высоты, которые вычисляются по размерам надписей - чтобы все они влезали.  Ну и при загрузке использовать технологию драгоценной Earnest, в которой я пока правда не разобрался "до руды" - но вектор задан. smile 
А программу - утилиту всё таки делать придется, чисто для синхронизации словарейт и без неё никуда не деться. Вот пока не понял одного, сделаю я сейчас файл с надписями на русском, texts.ru и на украинском  texts.ukr - просто наборы строк, надо ведь как-то их ID синхронизировать и с ID приложения. То есть ID_STRING_NUMBER1 есть в приложении, надо сделать так, чтобы и в файлах это была та же надпись. Может сделать так: каждой строке присваивать номер в файле и ID - имя, то есть строка бвыдет такая 10 ID_STROKAPOKANOMER_DESAT "строка за номеро десять". А дальше генерировать файл table_defines.h, в котором объявлять #define ID_STROKAPOKANOMER_DESAT 10 и так далее? да сам файл вставлять в проект. При добавлении нового словаря - никаких проблем.
PS.: пока не разбирался с примером, а пишу просто что бы AlexPro,  не чувствовал себя одиноким, мыслями опять же делюсь, пусть и глупыми smile 
 


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 24.5.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(takedo @  24.5.2006,  09:52 Найти цитируемый пост)
Каждую кнопку ставить в определенное место, но координаты вычислять как процент от ширины и высоты

Мы так не стали делать: общий дизайн диалога должен быть фиксирован, иначе будет выглядеть безобразно.
Поэтому, хотя исходные ресурсы на английском, во время разработки диалога делается прикидка с рускими строками (влезет-не влезет). А потом это контролируется при переводе: утилита-то показывает, как будет выглядеть. Иногда, конечно, не влазит, и приходится возвращаться в приложение и корректировать там. Но не часто. Конечно, этого не смогут сделать сторонние переводчики (на какой-нибудь длинный язык). Но нас это не особо волнует, потому что реальных интерфейсов 2: англ и рус. 

Цитата(takedo @  24.5.2006,  09:52 Найти цитируемый пост)
 их ID синхронизировать и с ID приложения

Вот в том коде, который я тебе дала как раз и есть формирование ключей. Насколько я помню, словарь многоуровневый: переводы разных ресурсов хранятся отдельно, строковые ресурсы индексируются просто их ID-ми, а строки диалогов - ID-ом диалога + IDC контрола или просто строкой для анонимных статиков. 


--------------------
...
PM   Вверх
SeregaLBN
Дата 24.5.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 3.10.2003
Где: Киев

Репутация: нет
Всего: нет



Я тоже локализировал проект почти так же как и AlexPro.
Есть словарь вида
Код
число=строка

'Число' - уникально для всего проекта...
Ну и локализация проста в коде:
Код

BOOL OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) {
   SetWindowText(GetDlgItem(hwnd, IDOK), CLang::m_StrArr[IDS__OK]);

   SetWindowText(GetDlgItem(hwnd, IDC_STATIC_FIRST      ), CLang::m_StrArr[IDS__DIALOG__TIMEOUT_USER_FIRST]);
   SetWindowText(GetDlgItem(hwnd, IDC_STATIC_NEXT       ), CLang::m_StrArr[IDS__DIALOG__TIMEOUT_NEXT]);
   SetWindowText(GetDlgItem(hwnd, IDC_STATIC_SECOND     ), CLang::m_StrArr[IDS__SECOND]);
   SetWindowText(GetDlgItem(hwnd, IDC_STATIC_MILISECOND ), CLang::m_StrArr[IDS__MILISECOND]);
   SetWindowText(GetDlgItem(hwnd, IDC_CHECKBOX_AUTOSTART), CLang::m_StrArr[IDS__DIALOG__AUTOSTART]);
   SetWindowText(GetDlgItem(hwnd, IDC_CHECKBOX_STOP     ), CLang::m_StrArr[IDS__DIALOG__STOP]);
   SetWindowText(GetDlgItem(hwnd, IDC_CHECKBOX_IGNORE   ), CLang::m_StrArr[IDS__DIALOG__IGNORE]);
}

Цитата(Earnest @  23.5.2006,  16:18 Найти цитируемый пост)
4. Что использовать в качестве ключа переводной строки? 
Строка на английском? - но иногда одна и та же англ. строка должна переводится по-разному в разных контекстах.
Идентификатор? - не всегда достаточно (те же  IDC_STATIC в диалогах)? 

Ключ переводной строки - у меня это идентификатор IDS__DIALOG__... (уникальный для всего проекта).
Как видно из кода C++, IDC_STATIC'ов у меня несколько, но я им присвоил разные идентификаторы. Об этом надо позаботится один раз при создании диалога.
Даже если на диалоге добавятся/удалятся контролы, то в обработчике OnInitDialog последовательность вызовов SetWindowText можно и не редактировать. Я во всяком случае только дописывал новый код для новых контролов в новых версиях...

Чесно говоря, метод локализации Earnest кажется мне очень сложным... 
PM MAIL   Вверх
AlexPro
Дата 24.5.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(Earnest @  24.5.2006,  17:19 Найти цитируемый пост)
Цитата(takedo @  24.5.2006,  09:52 )
Каждую кнопку ставить в определенное место, но координаты вычислять как процент от ширины и высоты


Мы так не стали делать: общий дизайн диалога должен быть фиксирован, иначе будет выглядеть безобразно.

Совершенно верно. Я просто делаю все с некоторым запасом (скажем, ширину кнопок), но опять же, так, чтоб это не выглядело безобразно с короткими английскими надписями.
Цитата(takedo @  24.5.2006,  16:52 Найти цитируемый пост)
AlexPro, так делай постепенно, а способ нормальный, ты ведь не единственное приложение возможно будешь делать в жизни.

В настоящее время я работаю над не очень увесистым приложением. Перед началом работы специально интересовался различными способами локализации. Хороших способов не нашел, пришлось брать лучшее из худшего smile , т.к. этот способ мне показался более подходящим для небольших приложений. Что там будет дальше - пока не берусь загадывать. А способ, о котором я говорил, используется в том числе и в довольно известных программах, сходу могу помянуть FlashGet, WhereIsIt. 
PM MAIL   Вверх
Earnest
Дата 24.5.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(SeregaLBN @  24.5.2006,  12:30 Найти цитируемый пост)
Чесно говоря, метод локализации Earnest кажется мне очень сложным...  

Сложен не способ, просто требуется некоторая подготовка. 
Вот сравни:
1)
Цитата(SeregaLBN @  24.5.2006,  12:30 Найти цитируемый пост)
Есть словарь вида

число=строка

'Число' - уникально для всего проекта...

Кто следит за уникальностью? Программист, надо полагать. Как минимум, нужно следить за тем, чтобы ид-ры в диалогах не повторялись. Речь, конечно, в основном, идет о кнопках и статиках. Но тем не менее.
Статикам придумывать ид-ры - тоже геморрой.

Цитата(SeregaLBN @  24.5.2006,  12:30 Найти цитируемый пост)
Ну и локализация проста в коде:

Просто, но муторна. После третьего диалога уже хочется застрелиться. В "моем" способе программист вообще не думает о переводе. Все делается на уровне базового класса.

Повторюсь: Способ SeregaLBN и AlexPro - это то, с чего мы начинали. Если речь идет об одном маленьком приложении, где этих диалоги на пальцах посчитать можно, то вполне. Только я бы все же код перевода вынесла в базовый класс. И добавила простейшую утилиту, которая: 
a) сканирует ресурсы exe и выделяет все нуждающиеся в переводе ид-ры
б) генерирует заготовку для нового словаря
в) читает старый словарь и переводит все, что может; что не может - оставляет

Все же согласитесь, рутинную работу должна делать машина.  


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0968 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.