AleksCore Posted August 3, 2012 Share Posted August 3, 2012 Как лучше всего организовать? Чтобы игрок 1 раз выбрал при входе язык и все-все-все было на этом языке Link to comment
_Dark_ Posted August 3, 2012 Share Posted August 3, 2012 Либо с условием if(язык_игрока == 1) then -- end Либо создать отдельный ресурс, в нем сделать таблицу со всеми фразами, по одной таблице на каждый язык, затем просто использовать ее. Я так делаю. Link to comment
Other Languages Moderators Disinterpreter Posted August 3, 2012 Other Languages Moderators Share Posted August 3, 2012 Вариант с таблицей используют многие. Даже почти все сайтовые движки. Link to comment
_Dark_ Posted August 3, 2012 Share Posted August 3, 2012 Вариант с таблицей используют многие. Даже почти все сайтовые движки. Как раз наоборот. CMS не в счет. Link to comment
Flaker Posted August 3, 2012 Share Posted August 3, 2012 В ресурсе Mx_Master'а как рас есть возможность смены языка интерфейса. Советую его скачать и весь код проштудировать. Половина кода там это коментарии на русском языке, так что все должно быть понятно. Вот вобщем линк на ресурс: https://community.multitheftauto.com/index.php?p=resources&s=details&id=3984 Link to comment
AleksCore Posted August 3, 2012 Author Share Posted August 3, 2012 Большое спасибо! Буду смотреть код mx mastera Link to comment
Kernell Posted August 3, 2012 Share Posted August 3, 2012 Либо с условиемif(язык_игрока == 1) then -- end Жесть.. Вариант с таблицей самый оптимальный и разумный. languages = { russian = { "текст", "пример" }; english = { "text", "example" }; }; print( languages[ getElementData( thePlayer, 'language' ) ][ 1 ] ); -- Представим что getElementData возвращает строку с названием какого-то языка (russian/english) Link to comment
_Dark_ Posted August 3, 2012 Share Posted August 3, 2012 Либо с условием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
TwiX! Posted August 3, 2012 Share Posted August 3, 2012 самп убожество юзай идею mx_master'a Link to comment
_Vincent_ Posted August 3, 2012 Share Posted August 3, 2012 Омг ужас, делать разветвление с if каждый раз?) А если языков... десять? Link to comment
_Dark_ Posted August 3, 2012 Share Posted August 3, 2012 Омг ужас, делать разветвление с if каждый раз?)А если языков... десять? 10 раз. Выше уже есть решения. Link to comment
Kernell Posted August 3, 2012 Share Posted August 3, 2012 в web-фреймворках и прочих маленьких движках обычно используются константы, это решение не подходит для серверной части МТА, но подходит для клиентской. Link to comment
AleksCore Posted August 5, 2012 Author Share Posted August 5, 2012 В ресурсе Mx_Master'а как рас есть возможность смены языка интерфейса. Советую его скачать и весь код проштудировать. Половина кода там это коментарии на русском языке, так что все должно быть понятно.Вот вобщем линк на ресурс: https://community.multitheftauto.com/index.php?p=resources&s=details&id=3984 читал, читал код, но всё равно не до конца понял как это работает можете вкратце растолковать? (рабочий пример показать, маленький) В принципе, как я понял, languagesTools_c.lua можно себе скопировать (в свой ресурс). А дальше вот пробую, но ничего не выходит Link to comment
_Dark_ Posted August 5, 2012 Share Posted August 5, 2012 читал, читал код, но всё равно не до конца понял как это работает можете вкратце растолковать? (рабочий пример показать, маленький) В принципе, как я понял, languagesTools_c.lua можно себе скопировать (в свой ресурс). А дальше вот пробую, но ничего не выходит Я выше вам дал уже чуть ли не готовую систему. Link to comment
AleksCore Posted August 5, 2012 Author Share Posted August 5, 2012 (edited) читал, читал код, но всё равно не до конца понял как это работает можете вкратце растолковать? (рабочий пример показать, маленький) В принципе, как я понял, languagesTools_c.lua можно себе скопировать (в свой ресурс). А дальше вот пробую, но ничего не выходит Я выше вам дал уже чуть ли не готовую систему. ах да, ладно, буду пробовать что-то пока безуспешно.. ERROR: call: failed to call 'phrases:getPhrases' [string "?"] Edited August 5, 2012 by Guest Link to comment
_Dark_ Posted August 5, 2012 Share Posted August 5, 2012 ах да, ладно, буду пробовать что-то пока безуспешно.. ERROR: call: failed to call 'phrases:getPhrases' [string "?"] Я не говорил, что это можно просто так взять и использовать. Понятное дело, что нужно экспортировать эту функцию. Link to comment
AleksCore Posted August 5, 2012 Author Share Posted August 5, 2012 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
_Dark_ Posted August 5, 2012 Share Posted August 5, 2012 Скобки нельзя убирать... Это функция... Поэтому вторая ошибка. Link to comment
AleksCore Posted August 5, 2012 Author Share Posted August 5, 2012 Так тоже не работает 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
AleksCore Posted August 5, 2012 Author Share Posted August 5, 2012 пожалуйста, помогите, а Link to comment
_Dark_ Posted August 6, 2012 Share Posted August 6, 2012 У меня все работает идеально. Я не буду вам писать готовый ресурс, вы спросили "как лучше реализовать", вам дали ответы. Вы так никогда ничему не научитесь. Link to comment
Flaker Posted August 6, 2012 Share Posted August 6, 2012 Вот небольшое объяснение я написал. Почитай коментарии в коде, возможно что то прояснится: Задаем игроку язык: --При коннекте задаешь игроку элемент дата со значением языка, например английский --(Это нужно что б у игрока всегда был задан хоть какой нибудь язык) --Далее, если игрок потом указывает язык, просто изменяем елемент дату. 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
TheNormalnij Posted November 24, 2012 Share Posted November 24, 2012 У меня есть другая идея, которую сейчас пытаюсь реализовать (90% сделано). Суть в чем: есть ресурс '"MultiLang", другие клиентские ресурсы один раз обращаются к нему за таблицей с фразами, "MultiLang" при запросе проверяет файл в MultiLang/<имя-ресурса>/'lang' .. preffix .. '.txt' . Оттуда он составляет таблицу и return её. Минивопрос: как сделать, чтобы кириллица от туда читалась? UPD: 18:27 Вопрос снят, перечитал комменты к коду ) Link to comment
Flaker Posted November 24, 2012 Share Posted November 24, 2012 Да, по сути тоже самое... Я просто привел пример реализации... Еще вариант, кстати: Каждому клиенту, при выборе им языка, грузить XML файл, а затем из этого файла(С клиента) уже все читать... Так еще меньше нагрузки на сервер. Link to comment
TheNormalnij Posted November 25, 2012 Share Posted November 25, 2012 У меня интереснее, меньше мароки и черной работы тем, кто будет скрипт использовать for k, v in string.gmatch(buffer, "(%w+)=([а-яА-ЯёЁa-zA-Z0-9]+)") do t[k] = v end Мой скрипт не знает все имена переменных, он находит все возможные по типу "латиница и (или) цифры"="латиница и (или) кириллица и (или) цифры" Так мы получаем меньше нагрузки на мозг. UPD 12.50 Это хорошо работает с латиницей, с кириллицей опять не работает Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now