Поддержка мультиязычности в клиенте Lineage 2 - Страница 4 - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II > Обучающие статьи

Обучающие статьи Собрание статей, мануалов и гайдов помогающих в создании и администрировании сервера Lineage 2.
Описание темы:Возможность выбора языка в настройке игры.

Ответ
Опции темы
Непрочитано 12.05.2012, 13:01   #31
Пользователь

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

e-dat у меня уже на русском все ( мультиязык не стал ставить так как не выходит что то у меня )
вот что выходит ( при русификации )

клиент не видит русских названий
BUGOR вне форума Ответить с цитированием
Непрочитано 18.05.2012, 01:59   #32
Новичок

По умолчанию 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 - косяк кодировщика
Теперь в нашем Hex-editor'e заменяем отличающиеся байты.
Делается это примерно следующим образом:
в WinMerge находим отличающуюся строку, в ней отличающиеся байты.

запоминаем адрес строки (выделен на скрине), в старом файле переходим к нему в Hex-editor'e, в строке находим интересующий нас байт и переписываем (главное не перепутать старое с новым).
Последние строки файла не изменяем, т.к. они содержат ошибку, из-за которой и критует клиент.

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

Последний раз редактировалось Altum; 18.05.2012 в 02:48. Причина: Добавлено сообщение
Altum вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 05.02.2016, 16:45   #33
Аватар для BadStealth
Пользователь

По умолчанию 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 вопрос- после применения языка и перезахода в клиент- язык снова сбрасывается. Как сделать сохранение языка?

Последний раз редактировалось BadStealth; 05.02.2016 в 18:52.
BadStealth вне форума Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Режим разработчика в клиенте Lineage 2 PROGRAMMATOR Игровой клиент 87 26.12.2023 23:01
Поддержка клиента 1.5.1.14 RaZpiZdoS Серверная часть 6 16.04.2010 13:08
поддержка 1.5.1.9 XpyHDeL Серверная часть 11 15.02.2010 12:51
Поддержка квестов hardwar Lineage II 1 16.02.2009 15:03
Mu Web 0.3 rus, поддержка summoner'a lvs Веб обвязка 3 13.02.2009 15:51


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 17:52. Часовой пояс GMT +3.

Вверх