Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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];
   }
}
и использование:
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);
Но может быть другая реализация с использованием внешних файлов локализации и формированием map"а с нужными ключами/значениями во время работы без инкапсуляции большого словаря в классе.


 
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
1-1122719203
Navi
2005-07-30 14:26
2005.08.21
Текст в 2 строки в TreeNode у TreeView


3-1121175516
syte_ser78
2005-07-12 17:38
2005.08.21
Процедура обновления БД


4-1120060152
Alex_Korn
2005-06-29 19:49
2005.08.21
Время создания ключа в реестре


3-1121320511
Kara
2005-07-14 09:55
2005.08.21
DBGrid и StringGrid


3-1121244254
Ирина
2005-07-13 12:44
2005.08.21
DBEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский