Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Перевод программы на иностранные языки   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.034 c
3-1121055385
zvb
2005-07-11 08:16
2005.08.21
что за файлы вида _QSQ2.DB?


1-1122976324
Aleksandr.
2005-08-02 13:52
2005.08.21
Есть ли возможность проверить, перекрыт ли абстрактный метод?


1-1122627071
MegaVolt
2005-07-29 12:51
2005.08.21
ListView+WinXP+GridLines+стрелочки вниз вверх=бяка :(


14-1122486854
VEG
2005-07-27 21:54
2005.08.21
Бесплатныле программы


14-1122694770
Vlad Oshin
2005-07-30 07:39
2005.08.21
наше дело правое Мы победим иеще г.СталинИВ изображен