Jump to content

Мультиязычность на сервере


Recommended Posts

Либо с условием

if(язык_игрока == 1) then

--

end

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

Link to comment

В ресурсе Mx_Master'а как рас есть возможность смены языка интерфейса. Советую его скачать и весь код проштудировать. Половина кода там это коментарии на русском языке, так что все должно быть понятно.

Вот вобщем линк на ресурс: https://community.multitheftauto.com/index.php?p=resources&s=details&id=3984

Link to comment
Либо с условием

if(язык_игрока == 1) then

--

end

Жесть..

Вариант с таблицей самый оптимальный и разумный.

  
languages = 
{ 
    russian = 
    { 
        "текст", "пример" 
    }; 
     
    english = 
    { 
        "text", "example" 
    }; 
}; 
  
print( languages[ getElementData( thePlayer, 'language' ) ][ 1 ] ); -- Представим что getElementData возвращает строку с названием какого-то языка (russian/english) 
  

Link to comment
Либо с условием

if(язык_игрока == 1) then

--

end

Жесть..

Это не моя идея, это из SAMP'а. Там так принято.

  
if(HouseInfo[i][hPrice] > PlayerInfo[playerid][pCash]) 
{ 
if(PlayerLang[playerid] == 1) 
SendClientMessage(playerid,COLOR_GREY,"У тебя недостаточно денег для этого"); 
else 
SendClientMessage(playerid,COLOR_GREY,"You don't have enough cash for that"); 
return 1; 
} 
  
if(found == -1) 
{ 
if(PlayerLang[playerid] == 1) 
SendClientMessage(playerid,COLOR_WHITE,"Тебе нужно быть возле своего номера, чтобы перестать снимать его"); 
else 
SendClientMessage(playerid,COLOR_GREY,"You should be near your room to unrent it"); 
return 1; 
} 
  
  

:)

Я мультиязычность делал в своей CMS, если попытаться сконвертировать PHP -> MTASA Lua, то что-то вроде:

--[[ 
    Ресурс Phrases 
]] 
local Phrases = { 
    ['RU'] = {  
        ['you_arested'] = 'Вас арестовали!', 
        ['receive_money'] = 'Вы получили деньги!' 
    }, 
    ['EN'] = { 
        ['you_arested'] = "You're arested!", 
        ['receive_money'] = 'You received money!' 
    } 
} 
  
function getPhrases() return Phrases end 
  
--[[ 
    Другой ресурс 
]] 
local phrases = exports.Phrases:getPhrases() 
local lang = getElementData(player, "language") -- lang = RU 
  
outputChatBox(phrases[lang].you_arested) 
outputChatBox(phrases[lang].receive_money) 

Как-то так.

Link to comment

в web-фреймворках и прочих маленьких движках обычно используются константы, это решение не подходит для серверной части МТА, но подходит для клиентской.

Link to comment
В ресурсе Mx_Master'а как рас есть возможность смены языка интерфейса. Советую его скачать и весь код проштудировать. Половина кода там это коментарии на русском языке, так что все должно быть понятно.

Вот вобщем линк на ресурс: https://community.multitheftauto.com/index.php?p=resources&s=details&id=3984

читал, читал код, но всё равно не до конца понял как это работает :(

можете вкратце растолковать? (рабочий пример показать, маленький)

В принципе, как я понял, languagesTools_c.lua можно себе скопировать (в свой ресурс). А дальше вот пробую, но ничего не выходит

Link to comment
читал, читал код, но всё равно не до конца понял как это работает :(

можете вкратце растолковать? (рабочий пример показать, маленький)

В принципе, как я понял, languagesTools_c.lua можно себе скопировать (в свой ресурс). А дальше вот пробую, но ничего не выходит

Я выше вам дал уже чуть ли не готовую систему.

Link to comment
читал, читал код, но всё равно не до конца понял как это работает :(

можете вкратце растолковать? (рабочий пример показать, маленький)

В принципе, как я понял, languagesTools_c.lua можно себе скопировать (в свой ресурс). А дальше вот пробую, но ничего не выходит

Я выше вам дал уже чуть ли не готовую систему.

ах да, ладно, буду пробовать

что-то пока безуспешно..

ERROR: call: failed to call 'phrases:getPhrases' [string "?"]

Edited by Guest
Link to comment

ах да, ладно, буду пробовать

что-то пока безуспешно..

ERROR: call: failed to call 'phrases:getPhrases' [string "?"]

:|

Я не говорил, что это можно просто так взять и использовать.

Понятное дело, что нужно экспортировать эту функцию.

Link to comment

ERROR: call: failed to call 'phrases:getPhrases' [string "?"] -- эта ошибка пропала, когда убрал лишние(?) скобки тут:

local phrases = exports.Phrases:getPhrases 

сейчас только ошибка на счёт строки:

local lang = getElementData(player, "language") 

function arguments expected near 'local'

P.S. и да, я экспортировал функцию (в мета файле прописал)

Link to comment

Так тоже не работает

attempt to index local 'phrases' (a boolean value)

P.S. в ресурсе phrases прописал в мета: , всё правильно вроде же

ага.. возможно надо было на клиентской стороне это сделать, попробовал, но и там без ошибки не обошлось

attempt to index field "?" (a nil value)

это всё про эту строчку:

outputChatBox(phrases[lang].you_arested) 

Link to comment

У меня все работает идеально.

Я не буду вам писать готовый ресурс, вы спросили "как лучше реализовать", вам дали ответы.

Вы так никогда ничему не научитесь.

Link to comment

Вот небольшое объяснение я написал. Почитай коментарии в коде, возможно что то прояснится:

Задаем игроку язык:

  
--При коннекте задаешь игроку элемент дата со значением языка, например английский  
--(Это нужно что б у игрока всегда был задан хоть какой нибудь язык) 
--Далее, если игрок потом указывает язык, просто изменяем елемент дату. 
  
addEventHandler( "onPlayerJoin", root, --Задаем английский язык игроку, как только он зашел на сервер. 
    function () 
        setElementData(source, "lang", "Eng") 
    end 
) 
  
  

Ресурс с названием "MultiLangRes". В нем и содержится таблица со всеми фразами и тд...

--Ресурс с Названием "MultiLangRes" (Серверная часть) ( Не забываем перегнать в "UTF-8 без BOM" ) 
local Languages = { 
    ["Rus"] = { 
        ["you_arested"] = "Вас арестовали!", 
        ["receive_money"] = "Вы получили деньги!" 
    }; 
    ["Eng"] = { 
        ["you_arested"] = "You're arested!", 
        ["receive_money"] = "You received money!" 
    }; 
} 
  
  
function getTranslatedText(lang, row)  
--Аргумент lang это getElementData(player, "lang"), тоесть язык игрока! 
--Аргумент row это название колонки( например "you_arested" ) из которой получаем текст на языке игрока.  
    local curTranslated = Languages[lang][row] --Получаем переведенный текст 
    return curTranslated --Возвращаем переведенный текст 
     
    --Для тех кто будет придираться к моему коду: 
    --Да, можно сделать так: return Languages[lang][row], но мне нравится именно мой вариант, так как наиболее понятен! 
end 
--note: Если функция экспортируется только из серверной части, то ты можешь использовать ее только в серверной части! 
-- Да, ты можешь сделать экспорт с клиентской части, но [b][u]не просто дописав[/u][/b] эту фразу в meta.xml:  
  
  
  
  
  
--Meta.xml ресурса "MultiLangRes" 
function="getTranslatedText" type="server" /> --аргументы: (Язык Игрока, Название ключа таблицы)  
function="changeUsersLang" type="server" /> --аргументы: (Игрок, Название языка)  
  
  

Далее в другом ресурсе мы можем вывести игроку фразу на его языке:

--Пример такой функции: 
function enterVehicle ( theVehicle, seat, jacked ) --when a player enters a vehicle 
     
    outputChatBox( exports["MultiLangRes"]:getTranslatedText( getElementData(source, "lang"), "receive_money" ), source, 255,255,0 ) 
     
end 
addEventHandler ( "onPlayerVehicleEnter", getRootElement(), enterVehicle ) 

Вот как то так все это делается. Код не тестил, так что если ошибки или вопросы, пиши.

Link to comment
  • 3 months later...

У меня есть другая идея, которую сейчас пытаюсь реализовать (90% сделано). Суть в чем: есть ресурс '"MultiLang", другие клиентские ресурсы один раз обращаются к нему за таблицей с фразами, "MultiLang" при запросе проверяет файл в MultiLang/<имя-ресурса>/'lang' .. preffix .. '.txt' . Оттуда он составляет таблицу и return её. Минивопрос: как сделать, чтобы кириллица от туда читалась?

UPD: 18:27 Вопрос снят, перечитал комменты к коду )

Link to comment

Да, по сути тоже самое... Я просто привел пример реализации...

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

Так еще меньше нагрузки на сервер.

Link to comment

У меня интереснее, меньше мароки и черной работы тем, кто будет скрипт использовать

for k, v in string.gmatch(buffer, "(%w+)=([а-яА-ЯёЁa-zA-Z0-9]+)") do t[k] = v end 

Мой скрипт не знает все имена переменных, он находит все возможные по типу "латиница и (или) цифры"="латиница и (или) кириллица и (или) цифры"

Так мы получаем меньше нагрузки на мозг.

UPD 12.50 Это хорошо работает с латиницей, с кириллицей опять не работает :(

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...