Всем привет, сидите на рефордже, но ваша карта поддерживает только 1 язык? Не беда - всё проще чем вы думаете.
Авто определение языка
Если мне не изменяет память, то возможность локализации подвезли в 1.29+ а конкретно функцию BlzGetLocale() она автоматически считывает язык батлнет клиента и может иметь следующие значения:
"ruRU" - русский
"enUS" - английский
В этом случае игроку ничего даже выбирать не придётся, но рассмотрим все способы, как это использовать и разумеется с примерами
Функция L()
На мой взгляд это самый простейший способ, и я остановился на нём
function L(ru, en)
if en=="" then
en=ru
end
return BlzGetLocale()=="ruRU" and ru or en
end
и пример использования:
print(L("Русский текст", "English Text"))
В любую функцию, где должен быть текст, мы подставляем L("русский","Другой язык"), если другой язык не указан, то текст всё равно будет русским, однако помните, что не у всех иностранцев стоит кириллица, скорее всего они просто увидят пустые сроки вместо нашего, как они говорят "dog language" или "monkey language". Хотя в варкрафте к нам относятся хорошо, но это уже другая тема для разговора...
if ... else
Способ аналогичный верхнему, можно даже совместить с BlzGetLocale() или менять язык через выбор диалога
Создаём массив языков, циклом или ручками
Создаём массив языков, циклом или ручками
local ls = "Текст по умолчанию"
if GetLocalPlayer() == GetTriggerPlayer() then
if lang == 1 then
ls = "Текст изменён на язык 1"
else
ls = "Текст изменён на язык 2"
end
end
print(ls) -- подставляем ls в нужном месте например в игровых сообщениях, описании фрейма, плавающем тексте
Или второй вариант, можно делать локализованные модели, например чтобы табличка над таверной была переведена
langPlayer = { 1, 1, 1, 2 } -- Первые 3 игрока русский язык, последний - иной, заполняется как угодно, например стартовый диалогом или локалью
local langModel = "enter"
if langPlayer[GetPlayerId(GetLocalPlayer())] == 1 then
langModel="pathToRUModel"
else
langModel = "pathToENGModel"
end
AddSpecialEffect(langModel, x, y)
Для каждого игрока будет своя локализованная модель эффекта
Через WTS строки
Как только вы создаёте карту в ней появляется папка с названием _Locales
ruRU.w3mod
zhCN.w3mod
enUS.w3mod
dede.w3mod
kokr.w3mod
и куча других
Внутри каждой папки есть war3map.wts, многие замечали, что англоязычные карты не отображают текст в нашей русской локале вообще, потому что war3map.wts заполнена только в enUS.w3mod
Простейший пример как это использовать, можно разово прогнать просто файл через переводчик
Простейший пример как это использовать, можно разово прогнать просто файл через переводчик
STRING 132
// Items: I000 (Healing Rune), Name (Name)
{
Восстанавливающая руна
}
а на китайском это вот так
STRING 132
// Items: I000 (Healing Rune), Name (Name)
{
治疗符文
}
Как видите, это вообще автозаполнение из РО, кстати первые 2 способа для РО не очень удобно применять, там есть заморочки, придётся нагружать карту лишним кодом BlzSetAbilityExtendedTooltip
А чтобы это использовать вне РО например в описании фреймов или вывод текста на экран достаточно написать
А чтобы это использовать вне РО например в описании фреймов или вывод текста на экран достаточно написать
print("TRIGSTR_132")
Опять же, весьма неудобно ибо придётся подглядывать в WTS и смотреть, а что же у тебя там в 465 строке
Это уже на ваш, выбор...
Это уже на ваш, выбор...
Примеры локализованных карт, что мне известны
xgm.guru/p/samurowars через wts
xgm.guru/p/wc3/peonrpg2 через locale
xgm.guru/p/wc3/castlerevival через locale
xgm.guru/p/wc3/killmypeon через if
xgm.guru/p/wc3/blood-arena определите сами (Это домашнее задание)
Ред. Берги
Ред. AntNo
StringList
{
WELCOME_USER_MSG "Welcome $p",
}
Файл (*.toc), в котором указан путь к *.fdf файлу, загруженный соответствующей функцией (BlzLoadTOCFile)