Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Обучающие статьи (https://forum.zone-game.info/forumdisplay.php?f=180)
-   -   Поддержка мультиязычности в клиенте Lineage 2 (https://forum.zone-game.info/showthread.php?t=9887)

DreamTheater 28.08.2010 23:21

Поддержка мультиязычности в клиенте Lineage 2
 
Итак мануал о том как сделать мультиязычный клиент своими руками.

Для работы нам понадобится:
  1. L2EncDec.
  2. Любой hex-редактор. Лично я использовал Hex Workshop.
  3. Файлы русской локализации.

Для начала нужно составить список файлов, которые нам понадобятся. Для этого в любом файловом менеджере (проводник, Total Commander и т. п.) открываем папку с клиентом еврооффа и делаем поисковый запрос "*-e.*" (кавычки ставить не нужно).

Поиск покажет Вам все файлы с окончанием на "-e" - это и есть файлы с английской локализацией. Теперь нужно по полученному списку вынуть из клиента руоффа аналогичные файлы с окончанием "-ru".

Вся локализация заключается в файлах *.dat и Lineage2RU.ini, которые находятся в системной папке, файле L2Font-ru.utx в папке SysTextures и файлах русской озвучки в папке Voice.

Хочу заметить, что у русского клиента файлов локализации будет немного больше чем у оригинального. Это связано с тем что Иннова напихала в него какой-то отсебятины, которая с EU-клиентом работать все равно не будет, поэтому отбирайте только те файлы, которые будут парой -e/-ru.

Далее *.dat нужно будет пропатчить, как это сделать было написано множество раз, поэтому не будем вдаваться в подробности. Хочу только сказать, что лучше всего сперва проверить работоспособность нашего "ру-патча", чтобы удостовериться что все файлы читаются нормально и клиент работает с ними без ошибок.

После того как Вы разместили все русские файлы на своих местах в оригинальном клиенте можно приступать к самой интересной части.

Находим в системной папке клиента файл localization.ini и раскодируем его при помощи L2EncDec'а (кодировать обратно при этом не обязательно, клиент будет работать и так). Для того чтобы включить в клиенте выбор языка нужно поменять несколько параметров. После редактирования файл должен выглядеть примерно так:
Код:

[LanguageSet]
Language=2
1=English
2=Russian
EnableEngSelection=True

[English]
English_Code=e
English_Font=L2Font-e.SmallFont-e
English_Glyph=SmallFont-e.gly
English_Font2=L2Font-e.LargeFont-e
English_Glyph2=LargeFont-e.gly
English_Minimap=L2Font-e.Minimap.worldmap
English_LogoTexture=L2Font-e.start_logo-e
English_LoadingTexture=L2Font-e.loading02-e
English_MiniLogoTexture=L2Font-e.mini_logo-e
English_TownMap=L2Font-e.TownMap
English_ReplayLogoTexture=L2Font-e.Replay_logo-e

[Russian]
Russian_Code=ru
Russian_Font=L2Font-ru.SmallFont-ru
Russian_Glyph=SmallFont-ru.gly
Russian_Font2=L2Font-ru.LargeFont-ru
Russian_Glyph2=LargeFont-ru.gly
Russian_Minimap=L2Font-ru.Minimap.worldmap
Russian_LogoTexture=L2Font-ru.start_logo-ru
Russian_LoadingTexture=L2Font-ru.loading02-ru
Russian_MiniLogoTexture=L2Font-ru.mini_logo-ru
Russian_TownMap=L2Font-ru.TownMap
Russian_ReplayLogoTexture=L2Font-ru.Replay_logo-ru

Неиспользуемые языки и блоки можно удалить.

После данных манипуляций, если все было проделано правильно, в клиенте должна включиться опция выбора языка в настройках.

Во всей данной работе есть один недостаток - в настройках клиента русский язык будет отображаться как Japanese, но где наши танки не ходили :D

Раскодируем файл interface.u и открываем в hex-редакторе.

Так как файлы различных версий скорее всего отличаются смещениями, то писать конкретные адреса искомых байтов не вижу смысла. Тем не менее найти их довольно просто.

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

Enjoy :)

DreamTheater 30.08.2010 00:46

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Ах да, и еще... Все данные манипуляции могут привести к непредвиденным проблемам, например к таким как нестыковка путей к текстурам, в результате чего местами возникнут черные поля, или неожиданные критические ошибки клиента. Те кто понял основную идею и немного понимает структуру hex-кода разберется дальше сам. Желаю удачи в ломании :)

Ultimate 02.09.2010 14:59

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Проблемка, при загрузке после выбора чара, черный экран)) тобишь лоадинг скрина нету.как то поправимо?

DreamTheater 03.09.2010 02:28

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Цитата:

Сообщение от Ultimate (Сообщение 86353)
Проблемка, при загрузке после выбора чара, черный экран)) тобишь лоадинг скрина нету.как то поправимо?

Да, в файле interface.u заменить все L2Font-j на L2Font-e или L2Font-ru. Первый случай проще.

Ultimate 03.09.2010 08:57

Re: Поддержка мультиязычности в клиенте Lineage 2
 
оу, круто. кстати не обязательно же кодировать обратно файл.
и еще вопросик. в игре карта только на русском. Ни как не выходит на англ сделать. В файле локализации все верно путь прописан. =(

DreamTheater 03.09.2010 13:29

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Цитата:

Сообщение от Ultimate (Сообщение 86480)
оу, круто. кстати не обязательно же кодировать обратно файл.
и еще вопросик. в игре карта только на русском. Ни как не выходит на англ сделать. В файле локализации все верно путь прописан. =(

Дело в том, что в клиенте Эпилога, в зависимости от того какой сет выбран в файле localization.ini, всегда будут загружаться только звуки и текстуры языка по-умолчанию, независимо от выбранного в данный момент. На Фрее уже все в норме :)

simon 02.11.2010 00:02

Re: Поддержка мультиязычности в клиенте Lineage 2
 
хм чет не появляется выбор языка =\

Deazer 02.11.2010 00:07

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Интересная тема ! Спасибо

ma4o 30.03.2011 01:59

Re: Поддержка мультиязычности в клиенте Lineage 2
 
2DreamTheater

Мне вот интересно вставал вопрос чтобы в выпадающем меню сделать 3 языка.
Саму обработку кода я "вписал", но вот с выбором что-то никак. Выпадает всё равно 2, но там нет места чтобы воткнуть еще, и что-то немного "сложноватый" кусок.

Может есть какие идеи?

Plush_Hero 30.03.2011 02:25

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Спасибо . Статья очень хорошая ,время потраченное на чтение не прошло даром =) Хотя я больше придерживаюсь мнения что лучше выложить патчи под различные языки ибо все эти манипуляции жрут место на винте ,а следовательно и больше трафика при скачивании патча у игроков.

ma4o,

Код:

[LanguageSet]
Language=2
1=English
2=Russian
EnableEngSelection=True

Параметр Language смнени с 2 на 3 , ну или сколько у тя там языков и допиши нужный тебе . Например 3=Albanskiy.
Если не поможет значит в НЕХ надо лазить . На досуге пороюсь , отпишу если чтото найду.

ma4o 30.03.2011 02:48

Re: Поддержка мультиязычности в клиенте Lineage 2
 
2Plush_Hero
Ты немного не понял.
По порядку:
1. В локализейшн уже имеем настроенные 3 языка.
2. В папке систем и систекстурес уже все подготовлено.
(П.С. если менять через локализейшн то все 3 языка работают)
Далее.
3. Идем в файл локализейшн и включаем "EnableEngSelection=True"
Все прекрасно 2 языка в выборе есть (первый что мы выбрали, второй английский)
4. Беру файл interface.u и переписываю
Код:

bEnableEngSelection = IsEnableEngSelection();
        Language = GetLanguage();
        switch( Language )
        {
        case LANG_None:
                break;
        case LANG_English:
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Japanese" );
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Chinese(Taiwan)" );
                if( bEnableEngSelection )
                        class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
                else
                        class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
                break;
        case LANG_Japanese:
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Japanese" );
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Chinese(Taiwan)" );
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
                if( bEnableEngSelection )
                        class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
                else
                        class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
                break;
        case LANG_Taiwan:
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Chinese(Taiwan)" );
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Japanese" );
                class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
                if( bEnableEngSelection )
                        class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
                else
                        class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
                break;

П.С. Все смещения сохранил, всё работатет
Но в выборе языков все равно 2.
5. Нашел место в файле interface.u, которое дополнительно отвечет за вывод количества строк
Код:

Б$ «%  ROptionWnd.LanguageBox Korean  «&  ROptionWnd.LanguageBox English ?- e Џ  OptionWnd.LanguageBox ѕ Џ  
OptionWnd.LanguageBox 1
ш$ «&  ROptionWnd.LanguageBox English 1
·$ «'  ROptionWnd.LanguageBox Russian   «&  ROptionWnd.LanguageBox English Ћ- e Џ  OptionWnd.LanguageBox ґ Џ  
OptionWnd.LanguageBox 1
}$ «.  ROptionWnd.LanguageBox Ukrainian  «&  ROptionWnd.LanguageBox English T- e Џ  OptionWnd.LanguageBox z Џ  
OptionWnd.LanguageBox 1
9$ «$  ROptionWnd.LanguageBox China  «&  ROptionWnd.LanguageBox English - e Џ  OptionWnd.LanguageBox 6 Џ  
OptionWnd.LanguageBox 1
ф$ «#  ROptionWnd.LanguageBox Thai  «&  ROptionWnd.LanguageBox English Л- e Џ  OptionWnd.LanguageBox с Џ  
OptionWnd.LanguageBox 1
+$ «&  ROptionWnd.LanguageBox English 1

Так вот вопрос - как поправить второй кусок кода (сохраняя смещение) чтобы в выпадающем списке было 3 языка?

Plush_Hero 30.03.2011 05:40

Re: Поддержка мультиязычности в клиенте Lineage 2
 
ma4o,

Ну первый кусок вроде правильно переписал , сейчас просто нету клиента на руках , не могу глянуть полностью весь файл.

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

Сегодня вечером приду домой , гляну что там как , отпишу подробнее.

ma4o 30.03.2011 11:07

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Цитата:

Сообщение от Plush_Hero (Сообщение 115312)
ma4o,

Ну первый кусок вроде правильно переписал , сейчас просто нету клиента на руках , не могу глянуть полностью весь файл.

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

Сегодня вечером приду домой , гляну что там как , отпишу подробнее.

Могу весь файл скинуть, если это необходимо.

"Кракозябры" так они и есть там (я не стал "редактировать").

Добавлено через 3 минуты
И еще.
Если обратить внимание, то во втором куске кода как раз везде есть дополнительно написанный язык "English", так вот как раз он везде и есть в выпадающем списке.

Добавлено через 9 часов 35 минут
Апну.
Просто уже вечер, может появись у кого мысли.

Добавлено через 18 часов 19 минут
Уже прошли сутки, ничего новенького - жаль.

ma4o 31.03.2011 22:18

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Эхх, новый пост не делается и апнуть ни как.

Plush_Hero 01.04.2011 04:22

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Честно , я у себя поменял все так как писал я и у меня нормально работало и 4 и 3 языка. Чем тебе помочь даже не знаю . Я не ПХПшер =(

ma4o 01.04.2011 09:10

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Цитата:

Сообщение от Plush_Hero (Сообщение 115656)
Честно , я у себя поменял все так как писал я и у меня нормально работало и 4 и 3 языка. Чем тебе помочь даже не знаю . Я не ПХПшер =(

Давай сделаем так, можешь скинуть набор файлов localization.ini и Interface.u , и остальные необходимые файлы. Я попробую у себя всё это "запустить", или хотя бы намек на правку выпадающего списка до 4-х.

П.С. Ил всё же говорим про разные вещи. Мне бы скрин где выпадает 4-ре языка.

ma4o 15.04.2011 00:40

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Апчхи.

А то человек совсем куда-то пропал.

ma4o 07.05.2011 02:57

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Plush_Hero вернись, а то на форуме тебя уже месяц не было.

Gaikotsu 07.05.2011 12:38

Re: Поддержка мультиязычности в клиенте Lineage 2
 
кстати не советую делать мультиязычность такого вида в клиенте хф последней версии - начинаются проблемы с просмотром боев олли - критует (правда только если использовать для показа списка боев новый пакет из хф, если по старинке формировать обычный хтмл - все нормально). причина в том что в таком режиме клиент пытается читать данные по интерфейсу с несуществующими именами из ui.ugx.

ma4o 25.05.2011 03:01

Re: Поддержка мультиязычности в клиенте Lineage 2
 
2Gaikotsu
У тебя нет идей, или хотя бы времени глянуть 1 глазком?
Дело в том что все эти имена так же переписываются.
О ХФ пока разговора не идет, использую фрею.

kanadis 27.05.2011 12:10

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Очень интересно было почитать?
А на всех сборках действует?

linliss 27.05.2011 23:15

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Цитата:

Сообщение от kanadis (Сообщение 123854)
Очень интересно было почитать?
А на всех сборках действует?

написано мультиязычность клиента.. а он спрашиват про сервер...

ultra face palm! :facepalm::facepalm::facepalm::facepalm:

Shayne 16.07.2011 11:05

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Как правильно закодировать interface.u обратно? После кодировки при запуске клиента выдает крит... Пытался на фрее.

ma4o 23.07.2011 01:02

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Хех, столько времени, а идей все так и нет.

Raincast 15.10.2011 00:58

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Цитата:

Сообщение от Shayne (Сообщение 131561)
Как правильно закодировать interface.u обратно? После кодировки при запуске клиента выдает крит... Пытался на фрее.

+1 вер111 протоколоа, прога энк дек

у меня проблема другая, в хай 5 если сделать как указано на 1 странице в окне просмотра олимпиады квадратики вместо букв

Gaikotsu 15.10.2011 04:38

Re: Поддержка мультиязычности в клиенте Lineage 2
 
в хф что-то сильно намудрили со всем этим - еще и криты можно словить в некотрых местах если сделать такую мультиязычность.

так что я не мудрствуя сделал проще - клиент запускаю через лаунчер, а тот при запуске просто подменяет все нужные dat-файлы на dat-файлы с соотвествующим языком из отдельной папки и получается у меня та же мультиязычность, просто не настолько гибкая как выбор языка непосредственно в самом запущеном клиенте.


дел вобщем на полчасика-час в дельфе.

BUGOR 11.05.2012 12:33

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Дайте уже готовые файлы для клиента Interlude
а то что то не выходит
localization.ini
Цитата:

[LanguageSet]
Language=2 ( критует ) 1 ( только англ )
1=English
2=Russia
EnableEngSelection=true

gorodetskiy 11.05.2012 12:41

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Цитата:

Сообщение от BUGOR (Сообщение 187101)
Дайте уже готовые файлы для клиента Interlude
а то что то не выходит
localization.ini

Пальцем в небо...
EnableEngSelection=false не пробовали ?

BUGOR 11.05.2012 12:56

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Так же ....
может тогда поможете
если мульти не ставить: есть все файлы -е.dat под руофф
всё работает норм кроме отображения русских названий в файлах
zonename-e.dat
huntingzone-e.dat
При вкл функции Отображения названий локаций , вместо рус названий отображается только иконка перед названием локаций ( в центре экрана ).
с родными англ всё норм.

gorodetskiy 12.05.2012 11:30

Re: Поддержка мультиязычности в клиенте Lineage 2
 
скачайте систем ИТ с русскими датниками.
*-e.dat это английские датники.
*-ru.dat это русские датники

BUGOR 12.05.2012 13:01

Re: Поддержка мультиязычности в клиенте Lineage 2
 
e-dat у меня уже на русском все ( мультиязык не стал ставить так как не выходит что то у меня )
вот что выходит ( при русификации )
http://img341.imageshack.us/img341/3310/shot00012m.jpg
клиент не видит русских названий

Altum 18.05.2012 01:59

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Автору спасибо за статью, немножко дополню.

Разбирал файл в клиенте Gracia Epilogue

Насколько я понял, изменение самого "кода", например
Код:

switch( Language )
{
case LANG_None:
        break;
case LANG_Korean:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Korean" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_English:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
case LANG_Japanese:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Japanese" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Taiwan:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Chinese(Taiwan)" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Chinese:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "China" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Thai:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Thai" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Philippine:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
default:
        break;
}

ни к чему не ведет. Непонятно зачем эти исходники остались в файле, но они немного помогают понять суть этой части файла
Код:

..$.. .%...P..OptionWnd.LanguageBox..Korean... .&...P..OptionWnd.LanguageBox..English...l.-.r ........OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
..$.. .&...P..OptionWnd.LanguageBox..English......
..$.. .'...P..OptionWnd.LanguageBox..Japanese... .&...P..OptionWnd.LanguageBox..English...b.-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
Q.$.. .....P..OptionWnd.LanguageBox..Chinese(Taiwan)... .&...P..OptionWnd.LanguageBox..English...(.-.r . .......OptionWnd.LanguageBox...N.. .......OptionWnd.LanguageBox......
..$.. .$...P..OptionWnd.LanguageBox..China... .&...P..OptionWnd.LanguageBox..English.....-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
..$.. .#...P..OptionWnd.LanguageBox..Thai... .&...P..OptionWnd.LanguageBox..English.....-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
..$.. .&...P..OptionWnd.LanguageBox..English......

Очевидно, 2я часть - это неким образом скомпиллированная 1я часть файла. В ней и стоит поковыряться.

Добавить в список 3й язык пока не удалось, но особо и не старался.

То, что описано в 1м посте топика, позволяет задать русский язык вместо японского, затем переименовать его в "Russian". Но т.к. в клиенте могут быть (и есть) некоторые привязки к японскому языку, возникают разного рода ошибки и криты.

Чтобы их избежать, предлагаю такой вариант:
1) Исходное распределение языков по ID в файле localization.ini:
Код:

0=Korea
1=English
2=Japan
3=Taiwan
4=China
5=Thailand
6=Philippine
7=Indonesia
8=Russia

Как видим, русскому языку соответствует #8. Его и оставим (а вот если поставить русский язык, например, вместо корейского, возникнет любопытный побочный эффект :) ). Т.е. не будем ничего менять в этом файле:
Код:

[LanguageSet]
Language=8
0=Korea
1=English
2=Japan
3=Taiwan
4=China
5=Thailand
6=Philippine
7=Indonesia
8=Russia
EnableEngSelection=true

[Korea]
Korea_Code=k
Korea_Font=L2Font.SmallFont
Korea_Glyph=SmallFont.gly
Korea_Font2=L2Font.LargeFont
Korea_Glyph2=LargeFont.gly
Korea_Minimap=L2Font.Minimap.worldmap
Korea_LogoTexture=L2Font.start_logo-k
Korea_MiniLogoTexture=L2Font.mini_logo-k
Korea_TownMap=L2Font.TownMap
Korea_ReplayLogoTexture=L2Font.Replay_logo-k

[English]
English_Code=e
English_Font=L2Font-e.SmallFont-e
English_Glyph=SmallFont-e.gly
English_Font2=L2Font-e.LargeFont-e
English_Glyph2=LargeFont-e.gly
English_Minimap=L2Font-e.Minimap.worldmap
English_LogoTexture=L2Font-e.start_logo-e
English_LoadingTexture=L2Font-e.loading02-e
English_MiniLogoTexture=L2Font-e.mini_logo-e
English_TownMap=L2Font-e.TownMap
English_ReplayLogoTexture=L2Font-e.Replay_logo-e

[Japan]
Japan_Code=j
Japan_Font=L2Font-j.SmallFont-j
Japan_Glyph=SmallFont-j.gly
Japan_Font2=L2Font-j.LargeFont-j
Japan_Glyph2=LargeFont-j.gly
Japan_Minimap=L2Font-j.Minimap.worldmap
Japan_LogoTexture=L2Font-j.start_logo-j
Japan_LoadingTexture=L2Font-j.loading02-j
Japan_MiniLogoTexture=L2Font-j.mini_logo-j
Japan_TownMap=L2Font-j.TownMap
Japan_ReplayLogoTexture=L2Font-j.Replay_logo-j

[Taiwan]
Taiwan_Code=tw
Taiwan_Font=L2Font-tw.SmallFont-tw
Taiwan_Glyph=SmallFont-tw.gly
Taiwan_Font2=L2Font-tw.LargeFont-tw
Taiwan_Glyph2=LargeFont-tw.gly
Taiwan_Minimap=L2Font-tw.Minimap.worldmap
Taiwan_LogoTexture=L2Font-tw.start_logo-tw
Taiwan_LoadingTexture=L2Font-tw.loading02-tw
Taiwan_MiniLogoTexture=L2Font-tw.mini_logo-tw
Taiwan_TownMap=L2Font-tw.TownMap
Taiwan_ReplayLogoTexture=L2Font-tw.Replay_logo-tw

[China]
China_Code=cn
China_Font=L2Font-cn.SmallFont-cn
China_Glyph=SmallFont-cn.gly
China_Font2=L2Font-cn.LargeFont-cn
China_Glyph2=LargeFont-cn.gly
China_Minimap=L2Font-cn.Minimap.worldmap
China_LogoTexture=L2Font-cn.start_logo-cn
China_LoadingTexture=L2Font-cn.loading02-cn
China_MiniLogoTexture=L2Font-cn.mini_logo-cn
China_TownMap=L2Font-cn.TownMap
China_ReplayLogoTexture=L2Font-cn.Replay_logo-cn

[Thailand]
Thailand_Code=th
Thailand_Font=L2Font-th.SmallFont-th
Thailand_Glyph=SmallFont-th.gly
Thailand_Font2=L2Font-th.LargeFont-th
Thailand_Glyph2=LargeFont-th.gly
Thailand_Minimap=L2Font-th.Minimap.worldmap
Thailand_LogoTexture=L2Font-th.start_logo-th
Thailand_LoadingTexture=L2Font-th.loading02-th
Thailand_MiniLogoTexture=L2Font-th.mini_logo-th
Thailand_TownMap=L2Font-th.TownMap
Thailand_ReplayLogoTexture=L2Font-th.Replay_logo-th

[Philippine]
Philippine_Code=ph
Philippine_Font=L2Font-ph.SmallFont-ph
Philippine_Glyph=SmallFont-ph.gly
Philippine_Font2=L2Font-ph.LargeFont-ph
Philippine_Glyph2=LargeFont-ph.gly
Philippine_Minimap=L2Font-ph.Minimap.worldmap
Philippine_LogoTexture=L2Font-ph.start_logo-ph
Philippine_LoadingTexture=L2Font-ph.loading02-ph
Philippine_MiniLogoTexture=L2Font-ph.mini_logo-ph
Philippine_TownMap=L2Font-ph.TownMap
Philippine_ReplayLogoTexture=L2Font-ph.Replay_logo-ph

[Indonesia]
Indonesia_Code=id
Indonesia_Font=L2Font-id.SmallFont-id
Indonesia_Glyph=SmallFont-id.gly
Indonesia_Font2=L2Font-id.LargeFont-id
Indonesia_Glyph2=LargeFont-id.gly
Indonesia_Minimap=L2Font-id.Minimap.worldmap
Indonesia_LogoTexture=L2Font-id.start_logo-id
Indonesia_LoadingTexture=L2Font-id.loading02-id
Indonesia_MiniLogoTexture=L2Font-id.mini_logo-id
Indonesia_TownMap=L2Font-id.TownMap
Indonesia_ReplayLogoTexture=L2Font-id.Replay_logo-id

[Russia]
Russia_Code=ru
Russia_Font=L2Font-ru.SmallFont-ru
Russia_Glyph=SmallFont-ru.gly
Russia_Font2=L2Font-ru.LargeFont-ru
Russia_Glyph2=LargeFont-ru.gly
Russia_Minimap=L2Font-ru.Minimap.worldmap
Russia_LogoTexture=L2Font-ru.start_logo-ru
Russia_LoadingTexture=L2Font-ru.loading02-ru
Russia_MiniLogoTexture=L2Font-ru.mini_logo-ru
Russia_TownMap=L2Font-ru.TownMap
Russia_ReplayLogoTexture=L2Font-ru.Replay_logo-ru

;Petition Category setting
[CategoryNum]
Num=9

[Category1]
Title=696
LINK=pet_help_move.htm

[Category2]
Title=697
LINK=pet_help_recover.htm

[Category3]
Title=698
LINK=pet_help_bug.htm

[Category4]
Title=699
LINK=pet_help_quest.htm

[Category5]
Title=700
LINK=pet_help_report.htm

[Category6]
Title=701
LINK=pet_help_suggest.htm

[Category7]
Title=702
LINK=pet_help_game.htm

[Category8]
Title=703
LINK=pet_help_oprn.htm

2) Теперь нам нужно, чтобы для русского языка присутствовали элементы списка выбора языка.
Т.к. русского, увы, в исходнике нет, выберем любой другой язык, для которого устанавливается 2 элемента в списке.
Таких языков у нас 5: LANG_Korean, LANG_Japanese, LANG_Taiwan, LANG_Chinese, LANG_Thai.

3) Выберем язык, вместо которого воткнем русский. Пусть это будет все тот же Японский. Теперь идем в скомпиллированную часть.
Нас интересует кусок, относящийся непосредственно к японскому языку
Код:

..$.. .'...P..OptionWnd.LanguageBox..Japanese... .&...P..OptionWnd.LanguageBox..English...b.-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
case LANG_Japanese:
class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Japanese" );
class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
if( bEnableEngSelection )
class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
else
class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );

много общего, не правда ли?)

Теперь всё, что нам нужно - заменить константу LANG_Japanese на соответствующую русскому, и заменить текст элемента списка "Japanese" на "Russian".

Второе не так сложно: просто заменяем Japanese на Russian+пробел (дабы сохранить количество символов)
получаем
Код:

..$.. .'...P..OptionWnd.LanguageBox..Russian ... .&...P..OptionWnd.LanguageBox..English...b.-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
Теперь перейдем, собственно, к ID языка в switch'e.

Не сложно заметить, чем отличаются начала строк
Код:

..$.. .%...P..OptionWnd.LanguageBox..Korean...
..$.. .&...P..OptionWnd.LanguageBox..English......
..$.. .'...P..OptionWnd.LanguageBox..Japanese...
Q.$.. .....P..OptionWnd.LanguageBox..Chinese(Taiwan)...
..$.. .$...P..OptionWnd.LanguageBox..China...
..$.. .#...P..OptionWnd.LanguageBox..Thai...
..$.. .&...P..OptionWnd.LanguageBox..English......

В 16-ричном виде начальные части строк (до OptionWnd) выглядят так:
Код:

95 03 24 01 12 20 AC 25 00 00 1B 50 01 1F
CC 03 24 02 12 20 AC 26 00 00 1B 50 01 1F
8B 04 24 03 12 20 AC 27 00 00 1B 50 01 1F
51 05 24 04 12 20 AC 2E 00 00 1B 50 01 1F
0D 06 24 05 12 20 AC 24 00 00 1B 50 01 1F
C8 06 24 06 12 20 AC 23 00 00 1B 50 01 1F
FF 06 24 07 12 20 AC 26 00 00 1B 50 01 1F

Конкретнее:
Цитата:

95 03 24 01 12 20 AC 25 00 00 1B 50 01 1F
CC 03 24 02 12 20 AC 26 00 00 1B 50 01 1F
8B 04 24 03 12 20 AC 27 00 00 1B 50 01 1F
51 05 24 04 12 20 AC 2E 00 00 1B 50 01 1F
0D 06 24 05 12 20 AC 24 00 00 1B 50 01 1F
C8 06 24 06 12 20 AC 23 00 00 1B 50 01 1F
FF 06 24 07 12 20 AC 26 00 00 1B 50 01 1F
Выделенные зеленым байты - смещение до конца оператора. На них влияет только размер строки с названием языка, поэтому для Korean это 25 (31+6), для English - 26 (31+7), для Japanese 27 (31+8) и т.д.

Выделенные красным - это то, что нас больше всего интересует. Это значения констант в switch операторе.
01 = Korean
02 = English
03 = Japanese
04 = Taiwan
...
Как видим, здесь отсутствуют пункты для Филиппин и России.
Т.к. мы решили заменить японский язык (а ему соответствует 3я строка), то в 3й строке меняем 03 на 09.

Теперь всё это дело сохраняем в Hex-editor'e.

4) При попытке закодировать файлик обратно, лично я поймал крит клиентом (файлы повреждены, и т.п....). Поэтому кодируем файлик в какой-либо другой файл. Например так l2encdec.exe -e 111 interface-d.u interface-new.u.
Теперь отрываем самый первый, чистый файл в Hex-editor'e, жмем "Export" и сохраняем как текстовый файл. Ту же операцию проделываем с новым (interface-new.u, или как вы его обозвали) файлом.
Пользуясь утилитой WinMerge (несложно найти в открытом доступе), открываем оба текстовых файла, находим отличающиеся строки.
Их будет, кажется, 3. Первой строке соответствует закодированный байт с ID нашего языка, 2 - переименованный Japanese -> Russian, 3 - косяк кодировщика :question:
Теперь в нашем Hex-editor'e заменяем отличающиеся байты.
Делается это примерно следующим образом:
в WinMerge находим отличающуюся строку, в ней отличающиеся байты.
http://img705.imageshack.us/img705/2852/36096084.png
запоминаем адрес строки (выделен на скрине), в старом файле переходим к нему в Hex-editor'e, в строке находим интересующий нас байт и переписываем (главное не перепутать старое с новым).
Последние строки файла не изменяем, т.к. они содержат ошибку, из-за которой и критует клиент.

Заменив интересующие нас места, сохраняем файлик и закидываем в клиент.

BadStealth 05.02.2016 16:45

Re: Поддержка мультиязычности в клиенте Lineage 2
 
Все ППЦ накипело- ребят кто может отзовитесь 3 дня пытаюсь сделать мультиязычным клиент скачивал ЕВРООФФ. Пытаясь перенести файлы с РУОФФ у меня просто клиент завершает работу- когда подключаю Русский в ini.
Еще огромная просьба объясните как и чем вы декодировали Interface.u. Я пытаюсь декодировать но у меня крокозяблы ну и вот эта часть кода
Код:

switch( Language )
{
case LANG_None:
        break;
case LANG_Korean:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Korean" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_English:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
case LANG_Japanese:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Japanese" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Taiwan:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Chinese(Taiwan)" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Chinese:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "China" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Thai:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "Thai" );
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        if( bEnableEngSelection )
                class'UIAPI_WINDOW'.static.EnableWindow( "OptionWnd.LanguageBox" );
        else
                class'UIAPI_WINDOW'.static.DisableWindow( "OptionWnd.LanguageBox" );
        break;
case LANG_Philippine:
        class'UIAPI_COMBOBOX'.static.AddString( "OptionWnd.LanguageBox", "English" );
        break;
default:
        break;
}

А вот этих строк нет
Код:

..$.. .%...P..OptionWnd.LanguageBox..Korean... .&...P..OptionWnd.LanguageBox..English...l.-.r ........OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
..$.. .&...P..OptionWnd.LanguageBox..English......
..$.. .'...P..OptionWnd.LanguageBox..Japanese... .&...P..OptionWnd.LanguageBox..English...b.-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
Q.$.. .....P..OptionWnd.LanguageBox..Chinese(Taiwan)... .&...P..OptionWnd.LanguageBox..English...(.-.r . .......OptionWnd.LanguageBox...N.. .......OptionWnd.LanguageBox......
..$.. .$...P..OptionWnd.LanguageBox..China... .&...P..OptionWnd.LanguageBox..English.....-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
..$.. .#...P..OptionWnd.LanguageBox..Thai... .&...P..OptionWnd.LanguageBox..English.....-.r . .......OptionWnd.LanguageBox...... .......OptionWnd.LanguageBox......
..$.. .&...P..OptionWnd.LanguageBox..English......

Объясните пожалуйста и если можно файлики раскодированный и обычный скиньте в архиве.
И напишите как закодить обратно- какую кодировку использовать.
Так же не откажусь от мультиязычной папки System.

Все для Epilogue 152 протокол.


Все наконец-то разобрался. Сам глупил- вместо разкодировщика использовал кодировщик и наоборот. Вот поэтому у меня и получалась каша.

Остался 1 вопрос- после применения языка и перезахода в клиент- язык снова сбрасывается. Как сделать сохранение языка?


Текущее время: 21:10. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot