Форум: "Потрепаться";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизПеревод программы на иностранные языки Найти похожие ветки
← →
WondeRu © (2005-07-29 11:29) [0]Здравствуйте, Уважаемые!
Посоветуйте, пожалуйста, каким путем можно пойти для перевода на иностранный язык уже написанного программного комплекса? Какую программу для этого лучше применять? Какие трудности при этом встречаются?
Заранее благодарю за советы!
С уважением,
Игорь
← →
WondeRu © (2005-07-29 15:48) [1]Все же хотелось, бы услышать Ваше мнение, как перевести программу, не внося больших изменений в коде?
← →
oldman © (2005-07-29 15:50) [2]Имхо, в коде поменять русские caption на аглицкие.
Самый простой вариант.
← →
WondeRu © (2005-07-29 15:58) [3]oldman © (29.07.05 15:50) [2]
два проекта вести параллельно? Это и стандартный делфовский Translation Tool может... Не подходит... больно уже криво придется работать с CVS.
Проект должен иметь как минимум два интерфейса... (
← →
AxelBlack (2005-07-29 16:04) [4]У меня было два варианта:
1) смотри Project --> Languages --> ... + Translation Manager
2) "в ручную" (без перезагрузки формы)
а) Делаем енумератор, пробегаемся по всем формам, анализируем содержимое, заносим необходимые объекты в БД (или другое);
б) Создаем менеджер полученных БД, добавляем необходимое число колонок для языков, заносим данные/перевод в БД;
с) Пишем класс, один из методов которого получает в качестве параметров форму + язык (тут множество вариантов), добавляем необходимые процедуры/методы в существующие формы, делаем меню и т.д., применяем.
← →
Anatoly Podgoretsky © (2005-07-29 16:15) [5]На Си, Фортран или еще на что?
← →
oldman © (2005-07-29 16:17) [6]
> Anatoly Podgoretsky © (29.07.05 16:15) [5]
LOL :)))))))))
← →
WondeRu © (2005-07-29 16:50) [7]Anatoly Podgoretsky © (29.07.05 16:15) [5]
Думаю, словосочетание "иностранный язык", для НОРМАЛЬНОГО человека, имеет вполне определенное значение.
← →
Anatoly Podgoretsky © (2005-07-29 16:56) [8]WondeRu © (29.07.05 16:50) [7]
Ты про интерфейс что ли?
← →
Андрей Жук © (2005-07-29 16:59) [9]Еще есть вариант.
unit Locale;
interface
type proc=procedure;
TLocale=record
Name:string;
Func:proc;
LangID:integer;
end;
var Locales:array of TLocale;
CurrentLocale:integer;
var LOCstr_VersionMPUI:WideString;
LOCstr_VersionMPlayer:WideString;
LOCstr_OpenURL_Caption:WideString;
LOCstr_OpenURL_Prompt:WideString;
LOCstr_AutoLocale:WideString;
const NoLocale=-1;
AutoLocale=-1;
procedure RegisterLocale(const _Name:string; const _Func:proc; _LangID:integer);
procedure ActivateLocale(Index:integer);
implementation
uses Windows, Forms, Main, Help, Options;
procedure RegisterLocale(const _Name:string; const _Func:proc; _LangID:integer);
begin
SetLength(Locales,length(Locales)+1);
with Locales[High(Locales)] do begin
Name:=_Name;
Func:=_Func;
LangID:=_LangID;
end;
end;
procedure ActivateLocale(Index:integer);
var i,WantedLangID:integer;
begin
if Index=AutoLocale then begin
WantedLangID:=GetUserDefaultLCID() AND 1023;
Index:=0;
for i:=Low(Locales) to High(Locales) do
if Locales[i].LangID=WantedLangID then begin
Index:=i;
break;
end;
end;
if (Index<Low(Locales)) OR (Index>High(Locales)) then exit;
Locales[Index].Func;
Application.Title:=MainForm.Caption;
HelpForm.Format;
OptionsForm.Localize;
CurrentLocale:=Index;
end;
begin
SetLength(Locales,0);
CurrentLocale:=NoLocale;
end.
в программе
ActivateLocale(DefaultLocale);
пишешь файлы языковunit mo_ru;
interface
implementation
uses Windows,Locale,Main,Log,Help,About,Options, Extentions;
procedure Activate;
begin
with MainForm do begin
Caption:="MPlayer для Windows";
BFullscreen.Hint:="Переключить в полноэкранный режим";
BOSD.Hint:="Установка режима OSD";
BSetOSD.Hint:="Установить режим OSD";
MNoOSD.Caption:="Без OSD";
MDefaultOSD.Caption:="OSD по умолчанию";
MTimeOSD.Caption:="Отображать время";
MFullOSD.Caption:="Отображать общее время";
MFile.Caption:="Файл";
MOpenFile.Caption:="Воспоизвести файл ...";
MOpenURL.Caption:="Воспоизвести URL ...";
LOCstr_OpenURL_Caption:="Воспоизвести URL";
LOCstr_OpenURL_Prompt:="Какой URL вы хотите просмотреть?";
MOpenDrive.Caption:="Воспоизвести CD/DVD";
MClose.Caption:="Закрыть";
MQuit.Caption:="Выход"^I"Q";
MView.Caption:="Размеры";
MSizeAny.Caption:="Выбраный размер";
MSize50.Caption:="Половинный размер";
MSize100.Caption:="Оригинальный размер";
MSize200.Caption:="Двойной размер";
MFullscreen.Caption:="Полный экран"^I"F";
MOSD.Caption:="Установить OSD"^I"O";
MOnTop.Caption:="Всегда наверху";
MSeek.Caption:="Управление";
MPlay.Caption:="Вперёд";
MPause.Caption:="Пауза";
MSeekF10.Caption:="Вперёд на 10 секунд"^I"Right";
MSeekR10.Caption:="Назад на 10 секунд"^I"Left";
MSeekF60.Caption:="Вперёд на 1 хвилину"^I"Up";
MSeekR60.Caption:="Назад на 1 хвилину"^I"Down";
MSeekF600.Caption:="Вперёд на 10 хвилин"^I"PgUp";
MSeekR600.Caption:="Назад на 10 хвилин"^I"PgDn";
MExtra.Caption:="Настройки";
MAudio.Caption:="Звуковая дорожка";
MSubtitle.Caption:="Дорожка субтитров";
MAspect.Caption:="Пропорции вывода";
MAutoAspect.Caption:="Автоопределение";
MForce43.Caption:="Принудительно 4:3";
MForce169.Caption:="Принудительно 16:9";
MForceCinemascope.Caption:="Принудительно 2.35:1";
MDeinterlace.Caption:="Деинтерлейс";
MNoDeint.Caption:="Выключен";
MSimpleDeint.Caption:="Простой";
MAdaptiveDeint.Caption:="Адаптивный";
MOptions.Caption:="Настройки ...";
MLanguage.Caption:="Язык";
MShowOutput.Caption:="Показать консоль MPlayer";
MHelp.Caption:="Помощь";
MKeyHelp.Caption:="Клавиатурные сочетания ...";
MAbout.Caption:="О ...";
{Added Zhouck Andriy}
MExtentions.Caption := "Зарегистрировать расширения...";
MCyclePlayBox.Caption := "Проигрывать в цикле";
TntCheckBoxAsPlayList.Caption := "Как плэйлист";
end;
LogForm.Caption:="Вывод консоли MPlayer";
LogForm.BClose.Caption:="Закрыть";
HelpForm.Caption:="Помощь о клавиатуре";
HelpForm.HelpText.Text:=
"Клавиши навигации:"^M^J+
"Space"^I"Вперёд/Пауза"^M^J+
"Right"^I"Вперёд на 10 секунд"^M^J+
"Left"^I"Назад на 10 секунд"^M^J+
"Up"^I"Вперёд на 1 минуту"^M^J+
"Down"^I"Назад на 1 минуту"^M^J+
"PgUp"^I"Вперёд на 10 минут"^M^J+
"PgDn"^I"Назад на 10 минут"^M^J+
^M^J+
"Другие клавиши:"^M^J+
"O"^I"Toggle OSD"^M^J+
"F"^I"На весь экран"^M^J+
"Q"^I"Выйти немедленно"^M^J+
"9/0"^I"Регулировка громкости"^M^J+
"-/+"^I"Регулировка аудио/видео синхронизации"^M^J+
"1/2"^I"Регулировка яркости"^M^J+
"3/4"^I"Регулировка контраста"^M^J+
"5/6"^I"Регулировка оттенка"^M^J+
"7/8"^I"Регулировка насыщености"
;
HelpForm.BClose.Caption:="Закрыть";
AboutForm.Caption:="О MPUI";
AboutForm.BClose.Caption:="Закрыть";
LOCstr_VersionMPUI:="Версия MPUI: ";
LOCstr_VersionMPlayer:="Версия MPlayer: ";
with OptionsForm do begin
Caption:="Настройки";
BOK.Caption:="Да";
BApply.Caption:="Применить";
BSave.Caption:="Сохранить";
BClose.Caption:="Закрыть";
LAudioOut.Caption:="Драйвер воспроизведения звука";
CAudioOut.Items[0]:="(не декодировать звук)";
CAudioOut.Items[1]:="(не воспроизводить звук)";
LPostproc.Caption:="Постобработка";
CPostproc.Items[0]:="Выключена";
CPostproc.Items[1]:="Автоматическая";
CPostproc.Items[2]:="Лучшее качество";
LOCstr_AutoLocale:="(Автоопределение)";
CIndex.Caption:="Перестроить индекс файла при необходимости";
LParams.Caption:="Дополнительные параметры MPlayer:";
LHelp.Caption:="Help";
end;
{Added by Zhouck Andriy}
with ExtentionsForm do
begin
Caption := "Зарегистрировать типы видео";
BRegister.Caption := "Регистрировать";
← →
Андрей Жук © (2005-07-29 16:59) [10]
BClose.Caption := "Закрыть";
CheckBoxAVI.Caption := "Файлы AVI";
CheckBoxMPEG.Caption := "Файлы MPEG (mpg,mpe)";
CheckBoxASF.Caption := "Файлы ASF";
CheckBoxDAT.Caption := "DAT-файлы (файлы с Video-CD)";
CheckBoxWMV.Caption := "Файлы WMV";
end;
end;
begin
RegisterLocale("Русский",Activate,LANG_RUSSIAN);
end.
← →
oldman © (2005-07-29 17:00) [11]
> WondeRu © (29.07.05 16:50) [7]
НОРМАЛЬНЫЕ люди не спрашивают "каким путем можно пойти для перевода на иностранный язык уже написанного программного комплекса? Какую программу для этого лучше применять?". Имхо.
Не хочешь вести два проекта паралленльно - поставь кнопу "Язык" и на OnClick ба-а-альшим списком смену всех Caption.
А то, блин, применишь программу...
← →
Kerk © (2005-07-29 17:01) [12]oldman © (29.07.05 17:00) [11]
Присоединяюсь.
Тупая ветка.
← →
WondeRu © (2005-07-29 17:14) [13]Anatoly Podgoretsky © (29.07.05 16:56) [8]
угу
AxelBlack (29.07.05 16:04) [4]
Андрей Жук © (29.07.05 16:59) [9]
Спасибо!
← →
WondeRu © (2005-07-29 17:37) [14]Kerk © (29.07.05 17:01) [12]
Тупая ветка.
Твоих веток больше... средний бал тупости у них выше к сожалению...
← →
Kerk © (2005-07-29 17:41) [15]WondeRu © (29.07.05 17:37) [14]
Ты главное не плачь
← →
Lamer@fools.ua © (2005-07-29 17:54) [16]А вот и не подерётесь...
← →
oldman © (2005-07-29 17:58) [17]подеруться...
Но вот вопрос, кто кого первый дерет?
Это шутка!!!!!!!!!!!!!!!
← →
Nameless (2005-07-29 18:29) [18]> Kerk ©
Не знаю, как насчет тупости, а вот хамоватый подросток остается таковым во всех ветках
← →
Kerk © (2005-07-29 18:30) [19]Nameless (29.07.05 18:29) [18]
Молодец. Очень самокритично.
← →
Nameless (2005-07-29 18:40) [20]Kerk © (29.07.05 18:30) [19]
нее... это про тебя, дорогой. Я уже на подростка ну ни как не потяну
← →
Kerk © (2005-07-29 18:42) [21]Nameless (29.07.05 18:40) [20]
Старый маразматик? Совсем старый и совсем маразматик? Иди гуляй. Мне твое мнение обо мне не интересно.
На подростка я вроде тоже не тяну.
А ты мальчик или девочка? Или еще не определился?
← →
Джо © (2005-07-29 18:43) [22]
> [21] Kerk © (29.07.05 18:42)
> Старый маразматик?
Вот те на! А он причем?!
← →
Kerk © (2005-07-29 18:43) [23]Джо © (29.07.05 18:43) [22]
Вот те на! А он причем?!
Здесь не ник. Здесь по прямому смыслу
← →
iZEN © (2005-07-29 19:48) [24]WondeRu © (29.07.05 11:29).
Классическая задача Интернационализации и Локализации приложения в Java решается просто как два пальца об асфальт: строки заменяются вызовами функции с числовым идентификатором - используется карта (map) key=value под нужную локаль.
Для примера локализатор на два языка (русский и английский):и использование:
public class I18NResources {
public static final int ID_GAME_NEW = 0;
public static final int ID_GAME_OPTIONS = 1;
public static final int ID_GAME_HIGHSCORES = 2;
public static final int ID_GAME_INSTRUCTIONS = 3;
public static final int ID_GAME_ABOUT = 4;
public static final int ID_GAME_CONTINUE = 5;
public static final int ID_GAME_BACK = 6;
public static final int ID_GAME_MORE = 7;
public static final int ID_GAME_EXIT = 8;
public static final int ID_GAME_LEVEL = 9;
public static final int ID_GAME_SOUNDS = 10;
public static final int ID_GAME_VIBRA = 11;
public static final int ID_GAME_NAME = 12;
public static final int ID_GAME_START = 13;
public static final int ID_GAME_PAUSE = 14;
public static final int ID_GAME_OK = 15;
public static final int ID_GAME_CANCEL = 16;
public static final int ID_GAME_SPEED = 17;
/**
* List of supported locales.
* The strings are Nokia-specific values of the "microedition.locale" system property.
*/
private static final String[] supportedLocales = {"en", "ru-RU"};
/**
* NOTE: default language must be the first one for getString to work!
* Strings for each locale, indexed according to the contents of supportedLocales
*/
private static final String[][] strings = {
{"New game", "Settings", "High scores", "Instructions", "About",
"Continue", "Back", "More", "Exit", "Level", "Sounds", "Shakes",
"Launch Ball!", "Start", "Pause", "OK", "Cancel", "Speed"},
{"Новая игра", "Установки", "Рекорды", "Справка", "О программе",
"Продолжить", "Назад", "Далее", "Выход", "Уровень", "Звук",
"Вибра", "Запусти шарик!", "Старт", "Пауза", "ОК", "Отмена",
"Скорость"}};
/**
* Gets a string for the given key.
* @param key Integer key for string
* @return The string
*/
public static String getString(int key) {
String locale = System.getProperty("microedition.locale");
if (locale == null) {
locale = new String(""); //use empty instead of null
}
/* поиск индекса соответствия локали */
int localeIndex = -1;
for (int i = 0; i < supportedLocales.length; i++) {
/* if (locale.equals(supportedLocales[i])) {
* - такое работает не на всех устройствах.
* Поэтому лучше так:
*/
if (supportedLocales[i].startsWith(locale)) {
localeIndex = i;
break;
}
}
/* если не найдена подходящая локаль, используется первая из списка */
if (localeIndex == -1) { return strings[0][key]; }
return strings[localeIndex][key];
}
}Но может быть другая реализация с использованием внешних файлов локализации и формированием map"а с нужными ключами/значениями во время работы без инкапсуляции большого словаря в классе.
settingsGame = new Command(I18NResources.getString(I18NResources.ID_GAME_OPTIONS), Command.OK, 1);
exitGame = new Command(I18NResources.getString(I18NResources.ID_GAME_EXIT), Command.EXIT, 2);
startGame = new Command(I18NResources.getString(I18NResources.ID_GAME_START), Command.ITEM, 1);
← →
Anatoly Podgoretsky © (2005-07-29 22:28) [25]WondeRu © (29.07.05 17:14) [13]
Не задумывался об использовании ITE - все прозначно, твое дело локализация, остальное дело системы.
Главное не использовать текстовых констант и литералов, только resourcestring
← →
programania © (2005-07-29 23:25) [26]Все строковые константы "..." заменяются на t("...");
t-функция перевода просто последовательно ищет в массиве строк и заменяет.
для каждой формы вызывается:
PROCEDURE perewod(form1:tForm);
var i:integer; Temp: TComponent; s:string;
begin
with form1 do
for I := ComponentCount - 1 downto 0 do begin
Temp := Components[I];
if Temp is tButton then with tButton(Temp) do begin
s:=hint; hint:=t(s);
s:=caption; caption:=t(s);
end
//и т.д. для всех компонент какие есть
end;
Так можно переводить >1000 слов мгновенно и без перезагрузки программы
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 1.936 c