Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

HOW-TO: Многоязычный аддон / Multilangual addon


Рекомендуемые сообщения

HOW-TO: Многоязычный аддон (АО 1.1.02+)

Updated: 2011-02-17 (Пример локализации SampleLocalization_2011-02-17.zip исправлен для версии АО 2.0.03)

(This post will be translated to English later)

2jd4e29.jpg

Вместо вступления

Ещё одна глава пока ненаписанного учебника по созданию аддонов... :)

Так вот. Как нам всем известно, в АО не существует никакого встроенного, "прозрачного" механизма для поддержки локализаций в аддонах. А как хотелось бы!.. Именно сейчас настал тот момент, когда нужно действовать. Как мы уже не раз доказывали всему АО-сообществу, когда разработчики АО не идут навстречу к разработчикам аддонов, разработчики аддонов, как настоящие спартанцы, всё равно добиваются своего (даже если для этого, иногда, приходится что-то взломать)... Но это не тот случай, в этот раз ломать ничего не нужно :)

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

Принцип работы

В самом конце статьи, прицеплен ZIP с рабочим примером аддона.

Механизм этот состоит из функции, которая определяет локализацию клиента, и специально подготовленной для этого системы виджетов. Функция такая:

Code:
-- AO game Localization detection by SLA. Version 2011-02-10.

function GetGameLocalization()

local B = cartographer.GetMapBlocks()

local T = { rus="\203\232\227\224", eng="Holy Land", ger="Heiliges Land",

fra="Terre Sacr\233e", br="Terra Sagrada", jpn="\131\74\131\106\131\65" }

for b in B do for l,t in T do

if userMods.FromWString( cartographer.GetMapBlockInfo(B  ).name ) == t

then return l end; end; end; return "eng"

end

IMPORTANT: If you are reading this via "Google Translate", then DON'T copy this code from the browser (!!!) , because "Google Translate" have DAMAGED this code, it won't work! Instead, please take the correct code from "SampleLocalization" attachment below.

Функция возвращает string, значение которого одно из шести:

"rus" - Русский (Россия)

"eng" - Английский (Великобритания, США, Филиппины)

"ger" - Немецкий (Германия, Австрия)

"fra" - Французский (Франция)

"br" - Португальский (Бразилия)

"jpn" - Японский (Япония)

Ещё, в любой момент могут добавиться языки:

* Китайский

* Тайваньский

* Турецкий

* Корейский, наверное :)

Я выбрал именно такие "необычные" аббревиатуры языков потому, что точно такие же использованы в локализациях АО. Например, в файле global.cfg (недосягаемом из LUA-скриптов) есть переменная "localization" с одной из этих аббревиатур. И эти же аббревиатуры используются в названиях PAK-файлов локализаций (BaseLocrus.pak, BaseLoceng.pak, BaseLocger.pak, BaseLocfra.pak, BaseLocbr.pak, Baselocjpn.pak). И они же будут использоваться в методе локализаций, предложенном разработчиками игры в ModdingDocuments для АО 2.0 (ВАЖНО: система UI9 его пока НЕ поддерживает!).

Заметьте, эта функция написана полностью на латинице. Это нужно потому, что этой функцией, наверняка, будут пользоваться и наши иностранные колле. У них есть свои привычные кодировки текста, поэтому, чтобы ни у кого не было никаких проблем, функция написана в универсальной латинской кодировке.

Так вот, в TXT-файлах виджетов, которые нужно локализовать (их не так уж и много в аддонах), заменяем "статичные" тексты, например, на <r name="value"/>. То есть, заменяем

<body alignx="center">Это безумие! - Нет, это Спарта!</body>

на

<body alignx="center"><r name="value"/></body>

Далее, в файле AddonDesc.(UIAddon).xdb нужно вставить примерно такой блок:

Code:
<textsGroups>

<Item>

<groupName>rus</groupName>

<texts href="Locales/rus/Locale.(UIRelatedTexts).xdb#xpointer(/UIRelatedTexts)" />

</Item>

<Item>

<groupName>eng</groupName>

<texts href="Locales/eng/Locale.(UIRelatedTexts).xdb#xpointer(/UIRelatedTexts)" />

</Item>

</textsGroups>

Затем, создаём в корневой папке аддона структуру папок:

Code:
\ Locales

        \ rus

        \ eng

В каждую папку языка (rus и eng) кидаем абсолютно одинаковый файл Locale.(UIRelatedTexts).xdb, содержащий список всех "локализованных" TXT-файлов. Допустим, в этом примере, мы локализуем 2 виджета ("Widget1" и "Widget2") на 2 языках ("rus" и "eng"). Тогда файл будет такой:

Code:
<?xml version="1.0" encoding="UTF-8" ?>

<UIRelatedTexts>

<items>

<Item>

<name>Widget1</name>

<resource href="Widget1.txt" />

</Item>

<Item>

<name>Widget2</name>

<resource href="Widget2.txt" />

</Item>

</items>

</UIRelatedTexts>

Ну и конечно, закидываем сюда же все эти перечисленные TXT-файлы (в данном примере - Widget1.txt и Widget2.txt), внутри которых строки ("очищенные" от html-тегов) на том языке, которым названа папка. Естественно, все текстовые файлы, как всегда, должны быть в кодировке UTF-16LE (Notepad зовёт её просто "Unicode"). Все папки языков симметричны. То есть, в каждой папке одинаковый набор TXT-файлов, но с разным содержанием, например:

rus \ Widget1.txt:

Это безумие! - Нет, это Спарта!

eng \ Widget1.txt:

This is madness! - No, this is Sparta!

Кстати, для удобства, можно добавить в аддон ещё такую функцию:

Code:
function GetTextLocalized( strTextName )

return common.GetAddonRelatedTextGroup( localization ):GetText( strTextName )

end

Как пользоваться всем этим из LUA:

Code:
-- Где-то в начале аддона, обязательно объявляем локализацию по-умолчанию:

Global( "localization", "eng" )

-- ...Затем, продолжаем по событию EVENT_AVATAR_CREATED (не раньше! так требуется, начиная с AO 2.0.03)...

-- Определяем локализацию игры:

localization = GetGameLocalization()

-- Если такой локализации в нашем аддоне нет, то будем использовать английскую:

if not common.GetAddonRelatedTextGroup( localization ) then

localization = "eng"

end

-- Применяем локализацию ко всем виджетам:

Widget1:SetVal( "value", GetTextLocalized( "Widget1" ) )

Widget2:SetVal( "value", GetTextLocalized( "Widget2" ) )

Вот и всё.

У этой системы, несмотря на кажущуюся сложность, есть огромный плюс. Чтобы добавить новую локализацию, например, французскую, достаточно просто скопировать папку eng в fra, влезть в неё, и всего лишь попереводить слова в TXT-файлах, и всё! Там даже html-тегов нет, так что даже запороть ничего невозможно. Ну и вписать соответствующую секцию в <textsGroups> в файле AddonDesc.(UIAddon).xdb. Очень удобно, справится даже ребёнок.

Я буду редактировать эту статью, если что-то будет меняться с новыми патчами.

Кодировки текстов в разных языках

Если вы собираетесь хранить тексты локализаций в виде отдельных TXT-файлов (как это сделано в аддоне SampleLocalization, см. аттачмент), то ВСЕ строки во ВСЕХ языках должны быть записаны в одной-единственной кодировке - Unicode (UTF-16LE) - в этом случае, проблем НЕТ никаких :) Эта кодировка названа "Unicode" в MS Notepad, но в других редакторах, эта кодировка может называться, например, "UCS-2 Little Endian" (Notepad++) или "UTF-16LE" (EmEditor).

ВАЖНО: НЕ ПЕРЕПУТАЙТЕ С UTF-8, эту кодировку использовать нельзя!

Однако, если вы решили хранить тексты локализаций НЕ в TXT-файлах, а в Lua-файле, то знайте, что язык Lua НЕ умеет работать с юникодом, ни в каком виде. Lua поддерживает только 8-битные строки. Поэтому, у каждого языка есть своя кодировка, в которой должны быть сохранены строки его локализации:

Windows-1251 - Русский

Latin-1 - Английский

Windows-1252 - Немецкий, Французский, Португальский

Shift-JIS - Японский

SampleLocalization_2011-02-17.zip

Чтобы все могли сразу поиграться, вот живой аддон "SampleLocalization", сделанный из оригинального "SampleReactionHandler". Локализован на 6 языках. Проверено в русской и английской версиях. Вот он:

СКАЧАТЬ:

Ссылка на комментарий
Поделиться на другие сайты

(This place is reserved for english translation.)

(Место зарезервировано для английского перевода.)

Ссылка на комментарий
Поделиться на другие сайты

вместо функции GetGameLocalization() я думаю сделать кнопку с выбором языка =)

надо все-таки оставлять право выбора пользователю, особенно учитывая, что куча наших соотечественников играет за границей - им думаю будет удобнее оставить русский ;)

вопрос - если на западе выходит всего лишь версия 1.1 (которая у нас уже давно вышла), то будет ли у них работать этот способ с функцией common.GetAddonRelatedTextGroup(), так как она "появилась совсем недавно, только в АО 1.1.02.10" ?

upd: короче говоря - жду, когда проверишь на себе ))

а вообще, для GuildGui1b уже все сделал, но запускать боюсь %))

Ссылка на комментарий
Поделиться на другие сайты

Ребят, Я УЕХАЛ НА 4 ДНЯ ДО ВЕЧЕРА ВОСКРЕСЕНЬЯ.

Вот РАБОЧИЙ способ локализации. Нет времени писать что там внутри - посмотрите сами.

И ещё, я его написал на коленке, на чужом компьютере, в игре не проверял.

ПРОВЕРЬТЕ В РУССКОЙ И АНГЛИЙСКОЙ ВЕРСИИ.

EDIT: Аттачмент удалён, т.к. содержал ошибки, и не работал в игре.

Ссылка на комментарий
Поделиться на другие сайты

Я вернулся :)

Нашёл и исправил ошибки в том аттачменте, который был прицеплен в предыдущем сообщении. Полностью переписал первое сообщение этой темы.

НОВЫЙ СПОСОБ ЛОКАЛИЗАЦИИ НАХОДИТСЯ В САМОМ ВЕРХНЕМ СООБЩЕНИИ ЭТОЙ ТЕМЫ :)

Ну а на будущее, сохранил тот текст (и аттачмент), которые были написаны 2010-07-01 (которые будут работать в будущем, в АО 1.1.02), в ZIP-архив, чтобы не потерялись. Это для тех, кто хочет посмотреть, насколько изящнее будет выглядеть способ локализации для АО 1.1.02. Напоминаю, что СЕЙЧАС этот вариант бесполезен, т.к. в EU/US ввели не 1.1.02 (как я ожидал), а 1.1.00. А это значит, что функции userMods.ToWString() и common.GetAddonRelatedTextGroup() пока использовать нельзя. В аттачменте - README.RTF с удалённым вариантом статьи, и пример аддона, который пока работает только в русской версии. Вот они:

Ссылка на комментарий
Поделиться на другие сайты

почти так и сделал =)

правда, все равно смену языка через кнопку сделал

но так как до этого уже приделал вариант common.GetAddonRelatedTextGroup(), то решил не ломать все совсем, а сделал оба варианта ))

PS аддоны опять не возможно обновить - ошибку выдает..

пока, если интересно, можно тут посмотреть, что получилось: http://alloder.pro/upload/0/0/2mZvWdM8n4CIJiC.zip (GuildGui1b_r.31)

(не знаю, будет ли работать на евро-серверах)

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Carnifex,

Thank you very much for reporting this very important problem, and for doing even more research. Without your help this method didn't even worked! I have already fixed the article above, and its attachment. Also, DarkDPSMeter will be fixed today, together with some other improvements. Also, I will PM Vermin to fix localization detection in his addons (GuildGui1b and AnatomySelfDefence).

I even didn't knew, but this method was working only in Russian version... While English, German, French was always detected as English, because all 3 strings for those languages was wrong! As far as I remember, I took all those zone name translations from AllodsDatabase.com about 1 month ago. Today, all those zone names on AllodsDatabase.com have changed. Of course, I have tested it in Russian and English version. It worked in Russian version because it had correct Russian string, and worked in English version just because English is default language when language is not detected. This is why I didn't knew it was not actually working.

The correct MB[5].name is:

rus = Дальний Астрал

eng = Holy Land Archipelagos

deu = Archipele des Heiligen Landes

fra = Archipels de la Terre Sacrée

But since MB[5].name is too long in EN, DE, FR languages, I've decided to detect languages by MB[4].name - it is much shorter :) Here is how MB[4].name is called in all 4 languages:

rus = Святая Земля

eng = Holy Land

deu = Heiliges Land

fra = Terre Sacrée

Now the same info in Russian:

ПО-РУССКИ:

Carnifex, наш немецкий коллега, рапортировал и даже исследовал серьёзную проблему - этот метод определения локализации ДО СИХ ПОР НЕ РАБОТАЛ! =) Вернее, в немецкой и французской версиях, язык всегда определялся как английский. Такой вот неприятный, и неожиданный сюрприз. А всё потому, что на AllodsDatabase.com, где я взял локализованные названия зон, месяц назад эти названия были НЕПРАВИЛЬНЫЕ. Например, "Дальний Астрал", по-немецки, на самом деле НЕ "Weiter Astralraum", а "Archipele des Heiligen Landes". По-французски НЕ "Astral Lointain", а "Archipels de la Terre Sacrée". И по-английски НЕ "Far Astral", а "Holy Land Archipelagos". Сегодня эти названия там уже исправлены.

Но поскольку все эти названия зон слишком уж длинные, имхо, лучше определять язык по MB [4] .name:

rus = Святая Земля

eng = Holy Land

deu = Heiliges Land

fra = Terre Sacrée

Поэтому, статья вверху обновлена, и обновлён её аттачмент.

Чтобы исправить аддоны, использующие этот способ, нужно сделать всего 2 вещи:

1) В коде функции GetGameLocalization() поменять одну цифру (вместо MB[5] стало MB[4]):

Code:
local MBI = cartographer.GetMapBlockInfo( MB [4]  )

2) И, конечно, заменить четыре файла (rus.txt, eng.txt, ger.txt, fra.txt), на те, которые в обновлённом аттачменте к статье вверху - SampleLocalization-1.1.00_v2.zip.

Ссылка на комментарий
Поделиться на другие сайты

  • 5 недель спустя...

Вчера я придумал такой самый короткий способ определения версии, не требующий никаких TXT-ресурсов, только эта функция:

Code:
-- AO game localization detection by SLA. Version 2010-08-28.

function GetGameLocalization()

if not avatar.GetEmotes then return "eng" end -- AO 1.1.00

return ({ ["\255"] ="rus", ["\108"] ="eng", ["\105"] ="ger", ["\114"] ="fra"})

 [string.sub(userMods.FromWString(cartographer.GetMapBlockInfo(

cartographer.GetMapBlocks()[4] ).name),3,3)] or "eng"

end

Почти что brainfuck =)))))))))) Можно записать всё это в 1 строку, но уж очень длинная она получится :)

Это работает сейчас во всех версиях АО, но с одним недостатком - русской-то определяет как "rus", но все EU/US локализации сейчас определяет как "eng". Однако, что-то мне подсказывает, что через 2 дня, когда в EU/US выйдет 1.1.03 (?) (ну или, хотя бы, 1.1.01), эта функция начнёт нормально различать все 4 языка. Можно будет выкинуть её первую строку, и сделать этот способ основным вариантом определения локализации.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Вариант локализации без TXT-ресурсов. Работает только с версии 1.1.01 т.к. использует функцию userMods.ToWString

1. В коде задается строковая переменная - язык локализации (к примеру - Global( "Lclz", "rus" ))

Создается файл с локализуемыми строчками на 1 язык (к примеру Lrus.loc), с содержанием типа:

Code:

if Lclz == "rus" then

Global( "LStr", {

Str01= "Строка адын",

Tumba = "Тумба",

Yumba = "Юмба",

Green = "Зиленый",

Kolbosa = "Колбоса"

})

end

2. Название-путь к файлу (по сути это простой ЛУА-файл) прописывается в AddonDesc.(UIAddon).xdb в секции <ScriptFileRefs> после файла, в котором прописано определение языка локализации

Code:

    <ScriptFileRefs>

    <Item href="Settings.lua" />

    <Item href="Lrus.loc" />

    <Item href="Script01.lua" />

    <Item href="Script02.lua" />

  </ScriptFileRefs>

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

Например:

Code:

Global( "Lclz", "rus" )

Global( "LStr", {})

if Lclz == "rus" then

LStr = {

Str01= "Строка адын",

Tumba = "Тумба",

Yumba = "Юмба",

Green = "Зиленый",

Kolbosa = "Колбоса"

}

elseif Lclz == "eng" then

LStr = {

Str01= "String 01",

Tumba = "Tumba",

Yumba = "Yimba",

Green = "Green",

Kolbosa = "Kolbosa"

}

else  --язык по умолчанию

LStr = {

Str01= "Строка адын",

Tumba = "Тумба",

Yumba = "Юмба",

Green = "Зиленый",

Kolbosa = "Колбоса"

}

end

Код будет отрабатываться при каждом запуске аддона. Если нужно делать смену языка "на лету" - нужно помещать это все в отдельную функцию или делать двумерную таблицу, в которой будет сразу все

Функция GetTextLocalized () будет выглядеть так:

Code:
function GetTextLocalized( strTextName )

return LStr [strTextName ]  and userMods.ToWString(LStr [strTextName ] ) or common.GetEmptyWString()

end

Навеяно недоделаным способом локализации, используемом в AOIngameAddMan

Ссылка на комментарий
Поделиться на другие сайты

Обновлено первое сообщение темы, и ZIP с примером аддона.

Ну вот, наконец-то, в EU/US выходит АО 1.1.02, и этот способ создания многоязычного аддона СИЛЬНО УПРОЩАЕТСЯ =)

Теперь этот метод выглядит именно так, как всё и было задумано изначально.

@Nikon: Да, тоже хороший вариант, и теперь им тоже можно пользоваться, т.к. в EU/US появилась долгожданная функция userMods.ToWString() :)

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Хм.. с этим вариантом есть кое-какие траблы

LightDPS - обсуждение

Косяк разрабов? Или я что то не понимаю?

Ссылка на комментарий
Поделиться на другие сайты

Если локализация сделана через набор txt-файлов (как мы всегда делали до сих пор), то в тех файлах кодировка UTF-16LE, и она работает везде.

Если локализация сделана через lua-файл (как в LightDPS и AddonManager) то кодировка этого lua-файла ОБЯЗАНА быть 8-битной, иначе Lua не поймёт. То есть, русские строки в нём должны быть в кодировке Windows-1251, а все европейские в ISO 8859-1 (a.k.a. Windows-1252).

Дело в том, что Lua, сам по себе, юникод НЕ поддерживает, и его стандартный string - это восьмибитные строки. Чтобы ввести поддержку юникода, производители игр добавляют свои типы данных как userdata (в АО это - WString). А вот, как ведут себя созданные разработчиками игры функции ToWString() и FromWString() - это уже дело самих разработчиков, так как WString это их собственный тип данных. Скорее всего, в EU/US версиях АО, ToWString() использует в качестве 8-битной кодировки обычную ISO 8859-1 (а НЕ системную кодировку Виндовс). Использовалась бы системная - было бы нам счастье, так как она почти у всех у нас Windows-1251.

Что делать? Варианта всего 2, настоятельно рекомендую второй:

а) Не играться с локализациями, и пользоваться тем, что дано. В русской версии - русской, в английской - английской, и т.д.

б) Перевести всё в txt-файлы. Это окупится очень скоро, через неделю, когда выйдет патч Аллоды Онлайн 2.0, в которой будет штатный способ локализации аддонов, основанный на наборах txt-файлов. Так что, выбора-то и нет, переводи всё в txt.

Ссылка на комментарий
Поделиться на другие сайты

Нда... способ с луа-файлами несколько проще, чем тхт

Подожду уж тогда с неделю до выхода обновления

Кстати, в таком случае...

Функция userMods.ToWString() абсолютно бесполезна и ею нельзя пользоваться нигде, ни в каком аддоне

ЗЫ. Как же здорово все таки вообще не использовать свой текст в аддонах. Жаль не везде получается. Только в самых простых

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Fix for the problem, that the Russian client localisation is not correctly detected on russian clients running on an not russian operating system:

Code:
function GetGameLocalization()

return ({  ["?"]  ="rus",  ["\255"]  ="rus",  ["\108"]  ="eng",  ["\105"]  ="ger",  ["\114"]  ="fra"})

  [string.sub(userMods.FromWString(cartographer.GetMapBlockInfo(

cartographer.GetMapBlocks()[4]  ).name),3,3)] or "eng"

end

Ссылка на комментарий
Поделиться на другие сайты

Yes, but it will definitely break the language detection in future *Chinese* AO localization. Without this fix, Chinese will be detected as "eng", and with this fix Chinese will be detected as "rus" :(

Ссылка на комментарий
Поделиться на другие сайты

Quote:
Without this fix, Chinese will be detected as "eng", and with this fix Chinese will be detected as "rus" :(

this will happen on non Chinese opertion systems but on chinese operation system you have to find the slahcode for the letterpicture (not sure, that the zonename of the zone you have choosen will be longer than 4 pictures)^^
Ссылка на комментарий
Поделиться на другие сайты

Это все хорошо, но не забываем про пример SampleLocalization в каталоге SampleAddons ))

Ссылка на комментарий
Поделиться на другие сайты

Да да, только пока в EU/US не ввели патч 2.0 (а это будет к Новому Году), их способ локализации совершенно бесполезен, т.к. он сейчас не работает только в русской версии АО.

P.S. Они даже название содрали 1:1 - SampleLocalization x))

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
Quote:

Позавчера выяснилось (спасибо Carnifex), что gPotato преподнёс нам неожиданный сюрприз. Благодаря слишком пылкому энтузиазму локализаторов из gPotato, нам теперь придётся переделать функцию GetGameLocalization(), так как старая больше не работает. То есть, придётся обновить кучу аддонов...

На Европейских и Американских серверах, gPotato, открывая карту территории "Гипат" (только для тех игроков, которые до него дошли), зачем-то поставили блок карт (MapBlock) "Гипат" на НУЛЕВОЕ место (а НЕ на последнее, что было бы логично, и не нарушило бы существующий порядок), сместив весь список блоков карт на одну позицию вниз. То есть, получилась ситуация, когда порядок блоков карт больше не одинаковый у всех игроков в мире. На RU серверах порядок один (логичный), а на EU/US серверах - два варианта порядка (логичный и НЕлогичный), в зависимости от того, открыт ли игроку доступ в "Гипат".

Таким образом, более невозможно определять локализацию вот этой быстрой и компактной, СТАРОЙ функцией:

Code:
-- AO game localization detection by SLA. Version 2010-10-05.
function GetGameLocalization()
return ({ ["\255"] ="rus", ["\108"] ="eng", ["\105"] ="ger", ["\114"] ="fra"})
 [string.sub(userMods.FromWString(cartographer.GetMapBlockInfo(
cartographer.GetMapBlocks()[4] ).name),3,3)] or "eng"
end

Чтобы решить эту проблему раз и навсегда (с учётом возможного появления аналогичных проблем в будущих патчах от gPotato), пришлось переделать функцию GetGameLocalization() вот так:

Code:
-- AO game Localization detection by SLA. Version 2011-01-29.
function GetGameLocalization()
local B = cartographer.GetMapBlocks()
local T = { rus = "\209\226\255\242\224\255 \199\229\236\235\255",
eng = "Holy Land", ger = "Heiliges Land", fra = "Terre Sacr\233e" }
for b in B do for l,t in T do
if userMods.FromWString( cartographer.GetMapBlockInfo(B  ).name ) == t then return l end
end end; return "eng"
end

IMPORTANT: If you are reading this via "Google Translate", then DON'T copy this code from the browser (!!!) , because "Google Translate" have DAMAGED this code, it won't work! Instead, please take the correct code from here: SampleLocalization_2011-01-29.zip

Символы с ascii-кодами > 127, записаны в виде \кодов НАМЕРЕННО, во избежание возможных проблем при портировании функции, например, в Lua-файл в кодировке Latin-1. Кроме того, новый код стал универсальнее. Когда придёт время, можно будет легко вставить поддержку Китайской, Японской и других новых локализаций.

Как обычно, я обновил первое сообщение этой темы, и её аттачмент (SampleLocalization_2011-01-29.zip).

Разработчики аддонов! Если в ваших аддонах есть Немецкие и/или Французские локализации, то НЕОБХОДИМО обновить функцию GetGameLocalization() в этих аддонах. Если этого не сделать, то у Немецких и Французских игроков, дошедших до Гипата, язык вашего аддона ВНЕЗАПНО переключится на Английский.
Ссылка на комментарий
Поделиться на другие сайты

ОБНОВЛЕНИЕ 2011-02-05

Добавлена поддержка ЯПОНСКОЙ локализации! :)

Спасибо nine и Ciuine за это.

( Обсуждение и Японские скриншоты можно посмотреть здесь )

Соответственно, обновил первое сообщение темы, и её аттачмент "SampleLocalization".

Если вы собираетесь добавить Японскую локализацию в свои аддоны, то знайте, что в Японской АО, нет такого привычного нам шрифта "AllodsWest", вместо него, используется "Arial Unicode MS" (переименованный в Allods.ttf), и, судя по скриншотам, размер шрифта у них такой же, как и у нас. Это значит, в текстовых виджетах переделывать ничего НЕ придётся, с ними проблем быть не должно :)

При хранении текстов Японской локализации в виде набора TXT-файлов, кодировка такая же, как и в других языках - "Unicode". Однако, если вы храните тексты локализаций прямо в Lua-файле, то знайте, Японская 8-битная системная кодировка - Shift-JIS (Для конвертирования из юникода в Shift-JIS, используйте, например, MS Word. Копируйте в него Японский текст в юникоде, например, из Google.Translate, и сохраняйте как "Текстовый документ", выбрав при сохранении кодировку текста "Shift-JIS" - получится текст, совместимый с Lua.)

И кстати, Google.Translate довольно плох в переводе на Японский, поэтому, лучше всего доверить перевод японским игрокам. Если же приходится пользоваться Google.Translate, то лучше переводить на Японский С АНГЛИЙСКОГО (НЕ с Русского!), так как, оказывается, Google.Translate переводит с Русского на Японский через Английский язык (Русский -> Английский -> Японский), при этом, обычно теряется в два раза больше смысла Японского перевода, чем при прямом переводе с Английского (Английский -> Японский). Имейте это ввиду.

Ссылка на комментарий
Поделиться на другие сайты

ОБНОВЛЕНИЕ 2011-02-10

Добавлена поддержка ПОРТУГАЛЬСКОЙ локализации! :)

Соответственно, обновил первое сообщение темы, и её аттачмент "SampleLocalization".

При хранении текстов Португальской локализации в виде набора TXT-файлов, кодировка такая же, как и в других языках - "Unicode". Однако, если вы храните тексты локализаций прямо в Lua-файле, то знайте, Португальская 8-битная системная кодировка - Windows-1252 (такая же, как в Немецком и Французском языках).

Бразильские локализаторы нарушили традицию, выбрав 2-значную аббревиатуру страны "br" (а не 3-значную, как у всех остальных). Но, как я уже не раз говорил, у нас есть несколько причин, по которым, нам желательно использовать именно оригинальные аббревиатуры, поэтому:

"br" это Португальский :)

"br" is for Portuguese :)

Ссылка на комментарий
Поделиться на другие сайты

Оказывается, она прекрасно работает, просто теперь, после патча АО 2.0.03, пользоваться её можно ТОЛЬКО после события EVENT_AVATAR_CREATED. Если же, воспользоваться ею раньше (в Init(), например), то она НЕ сделает никакой ошибки, и просто вернёт "eng" (английский язык).

ПОДРОБНЕЕ ЗДЕСЬ:

Патч 2.0.03 - Ремонтируем аддоны

P.S.

ОБНОВЛЕНИЕ 2011-02-17

Демонстрационный аддон "SampleLocalization" исправлен для АО 2.0.03.

Ссылка на комментарий
Поделиться на другие сайты

а можно не по карте а по названию стата или здоровья перса.. хотя суть таже

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

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

Code:
---------------------------------------------------------------------------------------------------

-- Addon Manager Locales

---------------------------------------------------------------------------------------------------

Global( "L", nil )

---------------------------------------------------------------------------------------------------

local locales = {

rus = {

 [ "started" ]  = "запущена",

 [ "DB loaded" ]  = "БД загружена",

 [ "Stop" ]  = "Стоп",

 [ "unknown" ]  = "неизвестно",

 [ "i'm working" ]  = "я работаю",

 [ "i'm resting" ]  = "я отдыхаю",

 [ "i'm learning" ]  = "я обучаюсь",

 [ "i'm discarding" ]  = "я удаляю",

 [ "Err.00" ]  = "Ошибка?",

 [ "Err.01" ]  = "На стадии моего обучения - положите предметы в пустой слот инвентаря.",

 [ "Err.02" ]  = "А где же аукцион? Открой его! Либо эту вещь нельзя продать :(",

 [ "Err.03" ]  = "Ошибка при поиске лотов:",

 [ "Err.04" ]  = "Ошибка: окно аукциона закрыто",

},

eng = {

 [ "Err.00" ]  = "Error?",

 [ "Err.01" ]  = "At the stage of my training - put the items into empty inventory slot.",

 [ "Err.02" ]  = "Where is the auction? Open it! Either this item can't be sold :(",

 [ "Err.03" ]  = "Error when searching for lots:",

 [ "Err.04" ]  = "Error: Auction is closed",

},

ger = nil,

fra = nil,

}

---------------------------------------------------------------------------------------------------

-- AO game Localization detection by SLA. Version 2011-02-05.

-- edited by icreator 

local function GetGameLocalization()

local B = cartographer.GetMapBlocks()

local T = { rus="\203\232\227\224", eng="Holy Land",

ger="Heiliges Land", fra="Terre Sacr\233e", jpn="\131\74\131\106\131\65" }

for b in B do for l,t in T do

if userMods.FromWString( cartographer.GetMapBlockInfo(B    ).name ) == t

then return l end; end end; return "eng"

end

Ldata = locales [ GetGameLocalization() ]  --- or locales [ "eng" ] 

--- return localised text or origin text

L = function (txt)

return Ldata [txt]  or txt

end

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования