Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Поддержка мультиязычности в клиенте Lineage 2
#31
e-dat у меня уже на русском все ( мультиязык не стал ставить так как не выходит что то у меня )
вот что выходит ( при русификации )
[Изображение: shot00012m.jpg]
клиент не видит русских названий
Ответ
#32
Автору спасибо за статью, немножко дополню.

Разбирал файл в клиенте 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. Его и оставим (а вот если поставить русский язык, например, вместо корейского, возникнет любопытный побочный эффект Smile ). Т.е. не будем ничего менять в этом файле:
Код:
[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 находим отличающуюся строку, в ней отличающиеся байты.
[Изображение: 36096084.png]
запоминаем адрес строки (выделен на скрине), в старом файле переходим к нему в Hex-editor'e, в строке находим интересующий нас байт и переписываем (главное не перепутать старое с новым).
Последние строки файла не изменяем, т.к. они содержат ошибку, из-за которой и критует клиент.

Заменив интересующие нас места, сохраняем файлик и закидываем в клиент.
Ответ
#33
Все ППЦ накипело- ребят кто может отзовитесь 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 вопрос- после применения языка и перезахода в клиент- язык снова сбрасывается. Как сделать сохранение языка?
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Список анонсов Lineage 2 KateKate7912 8 7,871 05-04-2024, 09:02 PM
Последний пост: l2topru
  Ищу программиста на Lineage II high five Paul Nettle 0 729 08-08-2023, 08:27 AM
Последний пост: Paul Nettle
  L2VS.RU - Анонсы новых серверов Lineage 2 L2VS 0 114 12-24-2022, 09:12 PM
Последний пост: L2VS
  Lineage 2 PTS Server с нуля iCurious 21 39,358 02-03-2018, 06:01 PM
Последний пост: SevenWitches
  Создание рецепта для сервера Lineage II – Инструкция Casper 1 7,857 01-18-2012, 07:15 PM
Последний пост: Джол
  Полный гайд по замене Музыки в Lineage Plush_Hero 0 14,076 04-05-2011, 11:34 PM
Последний пост: Plush_Hero

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)