Jump to content

System MultiLanguage


Mário.
 Share

Recommended Posts

(O título está inglês para chamar mais atenção)

Ontem vi-me a falar sozinho na shoutbox e hoje cheguei a seguinte conclusão.

 

Ultimamente tenho andado um pouco viciado em PHP & HTML  e graças a isso, decidi meter na cabeça criar um sistema completo de multilinguagens em:

  • Site;
  • Client;
  • Serverside

 

No site está otimizado e bem estruturado mas no client e no serverside não estão bem exatamente da forma como eu quero e daí pedir-vos sugestões.

Esta é a forma como eu tenho feito:

PHP:

	$details = ip_details($real_ip);

	$country = $details->country;

	$current_country = array(
		'PT'	=>	'pt',
		'BR'	=>	'pt',
		'ES'	=>	'es',
		'DE'	=>	'ge',
		'GB'	=>	'en',
		'US'	=>	'en',
		'RO'	=>	'ro',
		'TR'	=>	'tr', // Ficará para depois
	);

 

Python:

# Add after:
		if app.ENABLE_LSM2_MULTI_LANGUAGE:			
			self.text = ConnectingDialog()
			self.text.SetText(localeInfo.CLIENT_RESTART)
			self.text.Close()
			
			# This was made in order to make some changes/upgrades in the system. You can simple edit if you want.
			self.flag = { 
				'LANG'	:	(
								"pt",	"en",	"ro",	"es",	"de",	"tr",
							)
				}
				
				#	This means:
				#	pt: 0
				#	en: 1
				#	...
			
			self.exe = "metin2client.exe" # Change the name for your metin2client.exe 
										  # If you use .bin, just change it to the directory of the patcher (ex: patcher.exe)
		
# Search for:
	def __ExitGame(self):
		app.Exit()
		
# Add after:
	if app.ENABLE_LSM2_MULTI_LANGUAGE:
		# I made this way because of the timer (It's kinda of stupid but I will change it on the next update)
		# Probably this is not the best code, but it works - not really an expert in python 

 

Tenho feito de forma a ser por tutorial pois estou a pensar em lançar o mesmo quando acabar.

 

Um print de como está no login:

image.thumb.png.235eb8469f6feb04a963a81078b711b7.png

 

 

O pedido agora é: Como devo de fazer o sistema? Por identificação de IP ou por algo como mudança de linguagem presente por quest  (sou bastante fã de LUA rs)?

 

Pedi já opiniões externas e debateram-se dizendo que se for IP acabará por a desvantagem de (por exemplo) ser impossível um português morar no estrangeiro e querer jogar na língua materna e é por essa razão que estou mais inclinado para fazer por quest (a minha ideia seria criar uma função como ch->GetLang que pudesse indicar a que linguagem ele tem de forma a poder ser mudado o locale_string/translate.lua/oxquiz.lua/.

 

Obrigado desde já pela atenção

 

  • Like 1
Link to comment
Share on other sites

a melhor opçao ate agora encontrada neste caso foi criar uma db na acout fazendo a mudança com o clik na flag porem me acausou muitas dores de cabeça , realmente , apos analizar a rubinum varias e varias vezes ocasialmente me espertou interesse mas é um trabalho muito grande para isso, o geito é comprar o systema do vegas ou esperar cair na net ele completo . e se algem tiver interece em desemvolver algo estou a disposiçao em ajudar pois é um dos sistemas que eu mais quiz até hoje

eu tenho um client com o sistema do rubinum mais eu nao recomendo pois esta faltando umas coisas .

Link to comment
Share on other sites

9 hours ago, trample said:

a melhor opçao ate agora encontrada neste caso foi criar uma db na acout fazendo a mudança com o clik na flag porem me acausou muitas dores de cabeça , realmente , apos analizar a rubinum varias e varias vezes ocasialmente me espertou interesse mas é um trabalho muito grande para isso, o geito é comprar o systema do vegas ou esperar cair na net ele completo . e se algem tiver interece em desemvolver algo estou a disposiçao em ajudar pois é um dos sistemas que eu mais quiz até hoje

eu tenho um client com o sistema do rubinum mais eu nao recomendo pois esta faltando umas coisas .

Isto é Metin2 e um sistema relativamente fácil de se fazer com os devidos conhecimentos, não faz sentido comprar a ninguém.

 

Respondendo ao tópico, concordo com a resposta do Tierri.

Link to comment
Share on other sites

Vou fazer offtopic só para dizer que Vegas não é developer nenhum especial. Tem muita mania, mas é bastante bom a  copiar coisas já existentes. Basta ver o código que ele faz.

Existem inúmeros sistemas multi-lingua, sendo que o primeiro a ir para a net foi derivado da leak do wom2.

Acho que cada um deve fazer as coisas por ele próprio, pois assim é que sistemas seguros são feitos.

Link to comment
Share on other sites

2 hours ago, trample said:

se é realmente facil , por que nao essiste na internet outro sistema ?

apesar que o sistema pode sim ser feito , porem precisa de pessoas no projeto deste sistema Com conhecimentos AB e Phyton , mas acho dificil , pois estava a procurar algem com conhecimentos em phyton para ajudar-me e ate agora nada .

Procurar uma pessoa para te ajudar em python, e encontrar pessoas que percebam de python são duas coisas totalmente diferente.

Existem por aí sistemas multi-linguas, mas o metin2 é um jogo a morrer em jogadores e devs. São poucos os que ocupam o seu tempo a desenvolver novos sistemas etc...

 

2 hours ago, Tierri Lopes said:

Vou fazer offtopic só para dizer que Vegas não é developer nenhum especial. Tem muita mania, mas é bastante bom a  copiar coisas já existentes. Basta ver o código que ele faz.

Existem inúmeros sistemas multi-lingua, sendo que o primeiro a ir para a net foi derivado da leak do wom2.

Acho que cada um deve fazer as coisas por ele próprio, pois assim é que sistemas seguros são feitos.

Não o conheço pessoalmente, mas já vi códigos dele e não são nada do outro mundo. Muitos dos sistemas são coisas fáceis de se fazer com um nível intermédio de conhecimentos.

Edited by Logic
Link to comment
Share on other sites

Citar

Existem por aí sistemas multi-linguas, mas o metin2 é um jogo a morrer em jogadores e devs. São poucos os que ocupam o seu tempo a desenvolver novos sistemas etc...

Concordo . eu nao percebo muito em phyton se fosse Ab ate iria numa boa , estou trabalhando num projeto a meses solo eu ja implementei tanta coisa e deixei tanta coisa de lado por chegar na area de phyton e nao conseguir resolver :/

Link to comment
Share on other sites

O problema é que o VegaS é "internacionalmente" conhecido e interpretam-no como o único capaz de fazer estes tipos de sistemas.

Vejo mesmo pessoas que chegam a dizer "nada é igual se fosse o vegas a fazer" o que respeito mas há que ter bom senso para saber que ele não é o único com competências.

Longe de mim comparar-me com ele, até porque há sistemas que ele criou e que eu implementei, mas chega de dar dickriding nele.

 

Continuando com o tópico, utilizei um pouco de tudo o que disseram:

  • Criei uma aba na tabela account onde estará a linguagem definida (ideia dada pelo @trample):image.thumb.png.21f252b2eb1253bc27c7ffa6de15bda8.png

Por default, todas as contas virão em inglês, sendo que assim que entrarem poderão escolher a linguagem.

 

  • As quests poderão ser facilmente modificadas pelo translate.lua (ideia dada pelo @AprendizM2):
snprintf(translateFileName, sizeof(translateFileName), "%s/translate_%s.lua", LocaleService_GetBasePath().c_str(), Language_GetBasePath().c_str());

Invés de fazer do_file na questlib, preferi fazer pela source criando um diretório para as linguagens: Language_GetBasePath

Com novas funções como pc.get_lang() que busca qual é a linguagem que temos inserido na base de dados, poderemos utilizar algo como isto:

quest language begin
	state start begin
		when login begin
			syschat(system[pc.get_lang].testing)
		end
	end
end


system = {}
system["pt"].testing = "Olá"
system["en"].testing = "Hi"

Esta forma de fazer é bastante simples e penso que deva de estar público em algum lugar.

 

  • Estou a trabalhar para deteção de IP utilizando o GeoLite2++ (ideia dada pelo @Tierri Lopes)
void CInputLogin::LoginByKey(LPDESC d, const char * data)
{
	TPacketCGLogin2 * pinfo = (TPacketCGLogin2 *) data;

	char login[LOGIN_MAX_LEN + 1];
	trim_and_lower(pinfo->login, login, sizeof(login));
	
	GeoLite2PP:DB db("/opt/stuff/GeoLite2-City.mmdb")
	std:string ip = db.get_field(d->GetHostName(), GeoLite2PP::VCStr {"country", "names", "geral"});
	
	sys_log(0, "Country: %s", ip); // Just a test to see the output
	
	const char * country = { "Portugal", "England", "Romenia", "Spanish", "Turkey", "Germany" };
	
	...
}

Ainda não está concluído, é apenas para terem uma ideia de como será feito a deteção (podem utilizar que não me importo).

 

 

Estou a pensar em como devo de fazer a identificação para o locale_string.txt, penso que serei capaz de remodelar por completo a forma como ela é estruturada e ser chamada como um ficheiro de lua (exemplo):

%s ±ºÁÖ Èĺ¸¿¡¼­ »èÁ¦ÇÏ¿´½À´Ï´Ù = "%s foi excluido como Candidato da Monarquia."

 

Link to comment
Share on other sites

Marcos chegou ao ponto onde eu quis debater > Perto de onde voce esta eu parei

Aonde voce relacionou quest com Multlocale é um problema .

Pensa comigo , na DB essiste uma aba Dizendo o nome da pasta que ela acessa para obter os recursos na inicializaçao do sever .

eu tive a ideia de criar outras pastas exemplo : polones , turk , pt, porem vai ter diversas pastas na inicializaçao do sever .

a intençao é fazer em que cada accout com o tipo de linguagem acessa a esta pasta .

assim nao essistirar multlocale  para mim era a forma correta .

gostei muito de ver voce empenhado nisso , eu tbn fiquei bucado de tempo me matando aqui , eu resolvi optar pelo sistema do vegas , nao pq ele e pika , e pelo conteudo que ele tem nas maos eu queria poder enxergar oque ele fez corretamente .

Link to comment
Share on other sites

4 horas atrás, trample disse:

Marcos chegou ao ponto onde eu quis debater > Perto de onde voce esta eu parei

Aonde voce relacionou quest com Multlocale é um problema .

Pensa comigo , na DB essiste uma aba Dizendo o nome da pasta que ela acessa para obter os recursos na inicializaçao do sever .

eu tive a ideia de criar outras pastas exemplo : polones , turk , pt, porem vai ter diversas pastas na inicializaçao do sever .

a intençao é fazer em que cada accout com o tipo de linguagem acessa a esta pasta .

assim nao essistirar multlocale  para mim era a forma correta .

gostei muito de ver voce empenhado nisso , eu tbn fiquei bucado de tempo me matando aqui , eu resolvi optar pelo sistema do vegas , nao pq ele e pika , e pelo conteudo que ele tem nas maos eu queria poder enxergar oque ele fez corretamente .

Mário*

 

Na verdade não há nenhum problema que tenha a ver com traduções de quest, pela forma que fiz (ou mesmo fazendo do_file pela questlib) não teria qualquer problema no que toca a isso, a aba que te referes é do common.locale mas não é necessário mudar de forma alguma porque poderás meter todas dentro da pasta /portugal (ou o nome qualquer que tenhas) e meteres de forma a que o jogador vá buscar certo .txt, tal como fiz com o mob_names:

Português:

image.thumb.png.fb9588de43823d2f50e58f82f7743c9c.png

 

Inglês:

image.thumb.png.94845facd3af481a55f1d5b95f1627d9.png

Link to comment
Share on other sites

3 minutes ago, Mário. said:

Mário*

 

Na verdade não há nenhum problema que tenha a ver com traduções de quest, pela forma que fiz (ou mesmo fazendo do_file pela questlib) não teria qualquer problema no que toca a isso, a aba que te referes é do common.locale mas não é necessário mudar de forma alguma porque poderás meter todas dentro da pasta /portugal (ou o nome qualquer que tenhas) e meteres de forma a que o jogador vá buscar certo .txt, tal como fiz com o mob_names:

Português:

image.thumb.png.fb9588de43823d2f50e58f82f7743c9c.png

 

Inglês:

image.thumb.png.94845facd3af481a55f1d5b95f1627d9.png

Tá ficando bom ! Hehe

Mario esse sistema será disponibilizado aos membros ou será vendido ?

se precisar de algo estou a disposicao

Link to comment
Share on other sites

Read from different locale_string can be doing without problem, also read item name when you pickup can be read from locale proto instead of DB...

I tried to add client part for flag and this is a problem for me.

 

Anyway...is not best solution use IP for determine language because IP sometime can be different...but nice work :1_grinning:

Link to comment
Share on other sites

Default: Inglês.
Selecionar no login (guardar no locale.cfg) - lembrar de dar reload aos modulos locale quando selecionado um novo idioma - e no handshake enviar o idioma escolhido para o servidor atualizar os dados do user (assim como o novo idioma).

Podes adicionar também o item_names.txt do servidor no client, e fazer com que este o carregue no momento em que os outros locale/*.txt são carregados (deste modo podes continuar a utilizar a função item.GetItemName() sem grandes alterações no python).

In-game podes optar por meter opção no Game Options, enviar um packet a pedir a mudança. 

Pela parte do servidor, ler vários locale_strings diferentes; e a parte quest, tbh não causa problemas nenhuns.

 

Este foi o planeamento e métodos que utilizei para desenvolver este sistema.

Link to comment
Share on other sites

3 horas atrás, PACI disse:

Default: Inglês.
Selecionar no login (guardar no locale.cfg) - lembrar de dar reload aos modulos locale quando selecionado um novo idioma - e no handshake enviar o idioma escolhido para o servidor atualizar os dados do user (assim como o novo idioma).

Podes adicionar também o item_names.txt do servidor no client, e fazer com que este o carregue no momento em que os outros locale/*.txt são carregados (deste modo podes continuar a utilizar a função item.GetItemName() sem grandes alterações no python).

In-game podes optar por meter opção no Game Options, enviar um packet a pedir a mudança. 

Pela parte do servidor, ler vários locale_strings diferentes; e a parte quest, tbh não causa problemas nenhuns.

 

Este foi o planeamento e métodos que utilizei para desenvolver este sistema.

 

O default encontra-se em inglês de momento.

De momento utilizo a opção de reiniciar o cliente por motivos de estética até conseguir ter um código perfeitamente aceitável. - Utilizo somente alguns ficheiros para a parte /locale/country sendo que o resto fica no default que é o pt.

A ideia do item_names e de meter nas opções é muito bem vinda mesmo, é algo que irei adaptar para o sistema.

O locale_string foi totalmente complicado para mim mas deixo já um obrigado ao @Sil3nce por me ter salvado.

 

Tens razão, a parte da quest não causa problemas nenhuns e torna-se super acessível para futuros usos.

Link to comment
Share on other sites

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
 Share

×
×
  • Create New...