Проблема локализации проекта.
От: dzeso  
Дата: 02.11.01 06:04
Оценка:
Как проще и эффективнее организуется локализация проекта? Ситуация такая: Есть проект (в смысле программа) на VC++, он состоит из множества компонент, которые могут добавляться/убирать в виде плагинов. Все текстовые сообщения находятся в ресурсных библиотеках (их много, у каждого плагина — своя). Нужно без перекомпиляции иметь возможность переводить тексты на разные языки, причем так, чтоб можно было просто поддерживать несколько языков. Основные требования:
1. Локализация без перекомпиляции
2. Модифицикация библиотеки с ресурсами должна быть ПРОЗРАЧНА для всех остальных библиотек (т.е.они должны продолжать работать как бы со стандартными ресурсами)

Мне видится идеальным такое решение — все текстовые сообщения хранятся в текстовом файле и есть утилита которая позволяет осуществить подмену одного текста на другой... Возможно ли такое? Попадались ли примеры? Есть ли другие варианты?
Re: Проблема локализации проекта.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 02.11.01 13:33
Оценка:
Здравствуйте dzeso, Вы писали:

D>1. Локализация без перекомпиляции

D>2. Модифицикация библиотеки с ресурсами должна быть ПРОЗРАЧНА для всех остальных библиотек (т.е.они должны продолжать работать как бы со стандартными ресурсами)

D>Мне видится идеальным такое решение — все текстовые сообщения хранятся в текстовом файле и есть утилита которая позволяет осуществить подмену одного текста на другой... Возможно ли такое? Попадались ли примеры? Есть ли другие варианты?


Есть два других способа
1-й ВСЕ тексты и ТОЛЬКО тексты сообщений запихать ресурсами в DLL и потом читыть типа

HRSRC   hRes;
HGLOBAL hResData;
LPSTR   lpStr;
// найти ресурс с данным языком
hRes = FindResourceEx(hDLLInstance,RT_STRING,"RESOURCE NAME HERE",MAKELANGID(LangYouWant,SubLangYouWant));
// загрузить его
if (hRes != NULL)
 {
  hResData = LoadResource(hDLLInstance,hRes);
  if (hResData != NULL)
   {
    lpStr = (LPSTR)LockResource(hResData);
   }
 }

поиск ресурса по языку идёт в порядке:
1) Language neutral
2) Thread LANGID, based on the thread's locale value
3) User default LANGID, based on the user's default locale value
4) System default LANGID, based on the system default locale value
5) US English

В принципе можно не извращатся с этим а просто добавлять к имени строки суффикс

2-й способ хранить в registry хотя Microsoft это по-моему не очень рекомендует...

и вообще это уже кажись спрашивали
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Проблема локализации проекта.
От: Аноним  
Дата: 02.11.01 19:53
Оценка:
Здравствуйте dzeso, Вы писали:
D>Мне видится идеальным такое решение — все текстовые сообщения хранятся в текстовом файле и есть утилита которая позволяет осуществить подмену одного текста на другой... Возможно ли такое? Попадались ли примеры? Есть ли другие варианты?

Привет!

Сделать можно. Яркий пример WindowsCommander. Ресуры ввиде текстовых файлов. Есть и другие примеры. Мне тоже нравиться такое решение — ресурсы в текстовом виде. При некоторой сноровке это делается. Ну может быть в начале будут проблемы.

Удачи Аноним
Re: кому интересно, вот что я нашел
От: doors  
Дата: 06.11.01 12:19
Оценка:
статья в MSDN про автоматизацию переводов
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/rc_8p83.asp

ссылка для скачивания тулзов
ftp://ftp.microsoft.com/softlib/mslfiles/rltools.exe
Re: Проблема локализации проекта.
От: McQwerty Россия  
Дата: 12.11.01 09:13
Оценка:
Здравствуйте dzeso, Вы писали:

D>Как проще и эффективнее организуется локализация проекта? Ситуация такая: Есть проект (в смысле программа) на VC++, он состоит из множества компонент, которые могут добавляться/убирать в виде плагинов. Все текстовые сообщения находятся в ресурсных библиотеках (их много, у каждого плагина — своя). Нужно без перекомпиляции иметь возможность переводить тексты на разные языки, причем так, чтоб можно было просто поддерживать несколько языков. Основные требования:

D>1. Локализация без перекомпиляции
D>2. Модифицикация библиотеки с ресурсами должна быть ПРОЗРАЧНА для всех остальных библиотек (т.е.они должны продолжать работать как бы со стандартными ресурсами)

D>Мне видится идеальным такое решение — все текстовые сообщения хранятся в текстовом файле и есть утилита которая позволяет осуществить подмену одного текста на другой... Возможно ли такое? Попадались ли примеры? Есть ли другие варианты?


Я использую следующий вариант:

в каждой DLL (или EXE) храню несколько string table, dialog template и т.д. (с различными языками).
Для выбора нужного я вызываю SetThreadLocale (<то, что нужно>). Начиная с этого вызова все обращения к ресурсам автоматически выбирают нужную версию (нужный язык). Для много поточного приложения — вызвать эту функцию в каждом из них.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.