[RLS] Einfache Quest Multi-übersetzung[Lua]

06/07/2017 17:00 BΣQЦIΣƬ#1
Hey,

da ich das ganze noch hier aufm Pc rum liegen hab, allerdings keine
Verwendung mehr dafür habe, teile ich es mit euch.

Mit Sicherheit gibt es schon einige Releases, mit denen ihr eure Quests
übersetzen könnt. Allerdings habe ich mich am GF System orientiert, um es
noch etwas strukturierter darzustelllen.

Aber genug erzählt ...

Den download findet ihr im Anhang.

How-To:

Als erstes geht ihr in die questlib.lua und bindet die translate.lua ein.

Sucht nach:

PHP Code:
dofile("locale/germany/quest/questing.lua"
und fügt darunter folgendes ein:

PHP Code:
dofile("locale/germany/quest/translate.lua"
Anschließend ladet ihr noch die translate.lua
in euer Quest-Verzeichniss hoch.

Nun müsst ihr in der account.account Tabelle noch eine spalte "lang" hinzufügen. (int)

Nun könnt ihr problemlos alle Quests auf beliebig viele Sprachen übersetzen.

Mit diesem System wäre es auch möglich für verschiedene sprachen komplett verschiedene Quests anzubieten :P

Hier noch eine Beispielquest:
PHP Code:
quest lang begin
    state start begin
        when login with get_lang
() == "none" begin
            send_letter
("Select Language")
        
end
        when button 
or info begin
            local lang 
get_lang()
            if 
lang == or lang == "none" then
                say_title
(quest_1[lang].title)
                
say("")
                
say(quest_1[lang].say_1)
                
say(quest_1[lang].say_2)
                
local s select(quest_1[lang].sel_1quest_1[lang].sel_2)
                if 
== 1 then
                    set_lang
("de")
                    
chat(quest_1[get_lang()].confirmLang)
                    
set_state("test")
                elseif 
== 2 then
                    set_lang
("en")
                    
chat(quest_1[get_lang()].confirmLang)
                    
set_state("test")
                
end
                send_letter
("Select Language")
            
end
        end
    end
    state test begin
        when login with get_lang
() == "de" or get_lang() == "en" begin
            send_letter
(quest_1[get_lang()].questname.title)
        
end
        when button 
or info begin
            say_title
(quest_1[get_lang()].questname.title)
            
say("")
            
say(quest_1[get_lang()].questname.text)
            
wait()
        
end
    end
end 
LG BΣQЦIΣƬ
06/07/2017 19:37 MaxChri#2
Ganz nett. :)

Vielleicht hilft dir das weiter, um noch besser zu coden. :D
[Only registered and activated users can see links. Click Here To Register...]
06/07/2017 22:07 VegaS ♆#3
  • This structure is very strange and does not look too good, but thanks for sharing.
  • Here is my quick method that should work just as well.

[Only registered and activated users can see links. Click Here To Register...]

Execute query on account (CTRL+Q):
Code:
ALTER TABLE `account`
ADD COLUMN `language` varchar(2) NOT NULL DEFAULT 'de' AFTER `login`;
Default language will be German if he not selected nothing first one, there not need to be things like "none" etc.

How to use:
translate.lua:
Code:
translate["en"].arena_manager = {}
translate["en"].arena_manager.say_title = "English!"
translate["de"].arena_manager = {}
translate["de"].arena_manager.say_title = "Federal Republic of Germany!"
translate["it"].arena_manager = {}
translate["it"].arena_manager.say_title = "The Italian Republic!"
Use in quest like:
Code:
say(translate[pc.get_language()].arena_manager.say_title)
Quest:
Code:
--[[
###########################
# QuestFunction:
	pc.set_language	-- Update the language of account;
	pc.get_language -- Returns: [1] lua_String: the account language;
###########################
]]
quest select_language begin
	state start begin
		when login begin
			send_letter("DBG: Select lang")
		end
		
		when button or info begin
			languageOptionDict = {
				{"en", "English"},
				{"it", "Italy"},
				{"de", "Deutschland"},
				{"es", "Spanish"},
				{"pl", "Poland"},
				{"hu", "Hungary"},
				{"tr", "Turkish"},
				{"ro", "Romania"},
				{"cz", "Czech Republic"},
				{"ru", "Russia"},
				{"nl", "Netherlands"},
				{"fr", "France"}
			}

			tabsDict = {}
			TYPE_LANG_INDEX = 1
			TYPE_LANG_DESC = 2

			for i = 1, table.getn(languageOptionDict) do
				table.insert(tabsDict, languageOptionDict[i][TYPE_LANG_DESC]) end

			table.insert(tabsDict, "Exit")

			say_title("Select the language:")
			local selKey = select_table(tabsDict)
			
			if selKey == table.getn(tabsDict) then
				return end
				
			langSelected = languageOptionDict[selKey][TYPE_LANG_INDEX]
			pc.set_language(langSelected)
			syschat(string.format("DBG: pc.set_language(%s) with success.", langSelected))
		end
	end
end
Quests function (source):
Code:
//@Src/Server/game/char.h
	public:
		void SetLanguage(const char* c_pszLang);
		const char* GetLanguage() const;

//@Src/Server/game/char.cpp
void CHARACTER::SetLanguage(const char* c_pszLang)
{
	DBManager::instance().Query("UPDATE account.account SET language = '%s' WHERE id = '%d'", c_pszLang, GetDesc()->GetAccountTable().id);
}

const char* CHARACTER::GetLanguage() const
{
	std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT language FROM account.account WHERE id = '%d'", GetDesc()->GetAccountTable().id));
	return mysql_fetch_row(pMsg->Get()->pSQLResult)[0];
}

//@Src/Server/game/questlua_pc.cpp
{ "set_language",		pc_set_language	},
{ "get_language",		pc_get_language	},

int pc_set_language(lua_State* L)
{
	LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
	if (!ch)
		return 0;

	if (!lua_isstring(L, 1))
	{
		sys_err("QUEST : wrong argument");
		return 0;
	}

	ch->SetLanguage(lua_tostring(L, 1));
	return 1;
}
	
int pc_get_language(lua_State* L)
{
	LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
	if (!ch)
		return 0;

	lua_pushstring(L, ch->GetLanguage());
	return 1;
}
06/08/2017 00:37 Trix.#4
Nice! :)

Liebe Grüße,
Trix.
06/08/2017 03:38 BΣQЦIΣƬ#5
Quote:
Originally Posted by VegaS ♆ View Post
  • This structure is very strange and does not look too good, but thanks for sharing.
  • Here is my quick method that should work just as well.

[Only registered and activated users can see links. Click Here To Register...]

Execute query on account (CTRL+Q):
Code:
ALTER TABLE `account`
ADD COLUMN `language` varchar(2) NOT NULL DEFAULT 'de' AFTER `login`;
Default language will be German if he not selected nothing first one, there not need to be things like "none" etc.

How to use:
translate.lua:
Code:
translate["en"].arena_manager = {}
translate["en"].arena_manager.say_title = "English!"
translate["de"].arena_manager = {}
translate["de"].arena_manager.say_title = "Federal Republic of Germany!"
translate["it"].arena_manager = {}
translate["it"].arena_manager.say_title = "The Italian Republic!"
Use in quest like:
Code:
say(translate[pc.get_language()].arena_manager.say_title)
Quest:
Code:
--[[
###########################
# QuestFunction:
	pc.set_language	-- Update the language of account;
	pc.get_language -- Returns: [1] lua_String: the account language;
###########################
]]
quest select_language begin
	state start begin
		when login begin
			send_letter("DBG: Select lang")
		end
		
		when button or info begin
			languageOptionDict = {
				{"en", "English"},
				{"it", "Italy"},
				{"de", "Deutschland"},
				{"es", "Spanish"},
				{"pl", "Poland"},
				{"hu", "Hungary"},
				{"tr", "Turkish"},
				{"ro", "Romania"},
				{"cz", "Czech Republic"},
				{"ru", "Russia"},
				{"nl", "Netherlands"},
				{"fr", "France"}
			}

			tabsDict = {}
			TYPE_LANG_INDEX = 1
			TYPE_LANG_DESC = 2

			for i = 1, table.getn(languageOptionDict) do
				table.insert(tabsDict, languageOptionDict[i][TYPE_LANG_DESC]) end

			table.insert(tabsDict, "Exit")

			say_title("Select the language:")
			local selKey = select_table(tabsDict)
			
			if selKey == table.getn(tabsDict) then
				return end
				
			langSelected = languageOptionDict[selKey][TYPE_LANG_INDEX]
			pc.set_language(langSelected)
			syschat(string.format("DBG: pc.set_language(%s) with success.", langSelected))
		end
	end
end
Quests function (source):
Code:
//@Src/Server/game/char.h
	public:
		void SetLanguage(const char* c_pszLang);
		const char* GetLanguage() const;

//@Src/Server/game/char.cpp
void CHARACTER::SetLanguage(const char* c_pszLang)
{
	DBManager::instance().Query("UPDATE account.account SET language = '%s' WHERE id = '%d'", c_pszLang, GetDesc()->GetAccountTable().id);
}

const char* CHARACTER::GetLanguage() const
{
	std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT language FROM account.account WHERE id = '%d'", GetDesc()->GetAccountTable().id));
	return mysql_fetch_row(pMsg->Get()->pSQLResult)[0];
}

//@Src/Server/game/questlua_pc.cpp
{ "set_language",		pc_set_language	},
{ "get_language",		pc_get_language	},

int pc_set_language(lua_State* L)
{
	LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
	if (!ch)
		return 0;

	if (!lua_isstring(L, 1))
	{
		sys_err("QUEST : wrong argument");
		return 0;
	}

	ch->SetLanguage(lua_tostring(L, 1));
	return 1;
}
	
int pc_get_language(lua_State* L)
{
	LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
	if (!ch)
		return 0;

	lua_pushstring(L, ch->GetLanguage());
	return 1;
}
Yea ok if you do it via Source ... but the script is about 4 Years old :D
so i just wanted to share it ...

but nice to do it in source :D
maybe its less core using

LG BΣQЦIΣƬ
06/08/2017 09:55 Yiv#6
Ihr könntet euch mal Metatables angucken, damit ist das wesentlich schneller umzusetzen (geht auch ohne Source).

Ansonsten: Sehr nervig, jedes mal mit get_lang dann zu arbeiten, aber im Grunde wird es funktionieren.

MfG