🤔 Para Refletir : "Mudar não é fraqueza, pelo contrário, é um sinônimo de superação." - Ricky O Bardo

MS - Sistema de Multi-linguagem [VX Ace]

Colaboração Colaboração
Quod erat demonstrandum
Postagens
337
Bravecoins
1.156
[box class=calendar_today]
MS - Multi-Língua
[/box]
por Masked

[box class=calendar_today]Características[/box]O script carrega textos de um arquivo .ini externo e armazena eles, de forma a poderem ser usados depois. Esses textos são organizados usando as chaves do INI como nome dos textos e as seções como línguas.
Ex.:
Código:
[Portugues]
APPLE=maçã
GRAPE=uva

[English]
APPLE=apple
GRAPE=grape
Ele também adiciona um atalho \l[tag] que pode ser usado nas mensagens ou no nome de itens no database (itens incluem personagens e habilidades) e que é substituído pelo texto correspondente à tag em questão.

[box class=calendar_today]Instruções[/box]No script, nos comentários em verde


[box class=calendar_today]Script[/box]
Código:
#==============================================================================
# MBS - Multi-linguagem
#------------------------------------------------------------------------------
# por Masked
#==============================================================================
($imported ||= {})[:mbs_multi_language] = true
#==============================================================================
# ** MBS
#==============================================================================
module MBS
  #============================================================================
  # ** MultiLanguage
  #============================================================================
  module MultiLanguage
    #-------------------------------------------------------------------------
    # Configurações
    #-------------------------------------------------------------------------
    BASENAME  = 'Strings'   # Nome base dos arquivos
    SRC = ''                # Pasta onde fica o .ini
    DEST = 'Data'           # Pasta onde fica o .rvdata2
    SIZE = 2048             # Tamanho do buffer de leitura do .ini
    #-------------------------------------------------------------------------
    # * Funções da WinAPI
    #-------------------------------------------------------------------------
    @@api_get_profile_string  = Win32API.new('kernel32','GetPrivateProfileStringA','pppplp','l')
    @@api_get_profile_section = Win32API.new('kernel32','GetPrivateProfileSectionA','pplp','l')
    #-------------------------------------------------------------------------
    # * Variáveis
    #-------------------------------------------------------------------------
    @@cache = {}
    #-------------------------------------------------------------------------
    # * Transformação da string numa string UTF-8
    #     string : A string que será transformada em UTF-8
    #-------------------------------------------------------------------------
    def self.encode(string)
      string.unpack('C*').pack('U*')
    end
    #-------------------------------------------------------------------------
    # * Leitura de uma língua do arquivo .ini
    #     language : Língua a ser carregada
    #-------------------------------------------------------------------------
    def self.read_ini(language)
      section = ""
      buffer = "\0" * SIZE
      n = 0
      begin
        n = @@api_get_profile_section.call(language,buffer,SIZE,"#{Dir.pwd}/#{SRC}/#{BASENAME}.ini")
        section << encode(buffer[0...n])
      end while n == SIZE - 2
      lang = section.split("\0").select {|s|s.include?('=')}.inject({}) do |r, v|
        i = v.index('=')
        key = v[0...i]
        str = v[(i+1)..-1]
        r[key] = str
        r
      end
      @@cache[language] = lang
      return lang
    end
    #-------------------------------------------------------------------------
    # * Leitura de uma língua do arquivo .rvdata2
    #   [OPT] path : A pasta do arqiuvo .rvdata2
    #-------------------------------------------------------------------------
    def self.load_languages(path=DEST)
      @@cache = load_data("#{path}/#{BASENAME}.rvdata2")
    end
    #-------------------------------------------------------------------------
    # * Aquisição da língua padrão do jogo
    #-------------------------------------------------------------------------
    def self.default_lang
      buffer = "\0" * SIZE
      i = @@api_get_profile_string.call('Game','Language','Portugues',buffer,SIZE,"#{Dir.pwd}/Game.ini")
      buffer[0...i]
    end
    #-------------------------------------------------------------------------
    # * Aquisição da lista de línguas do jogo
    #-------------------------------------------------------------------------
    def self.languages
      buffer = "\0" * SIZE
      i = @@api_get_profile_string.call('Game','Languages','Portugues',buffer,SIZE,"#{Dir.pwd}/Game.ini")
      buffer[0...i].split(/\s*,\s*/)
    end
    #-------------------------------------------------------------------------
    # * Aquisição de uma tag em uma linguagem
    #     language : A língua da qual o texto será carregado
    #     tag      : O identificador do texto
    #-------------------------------------------------------------------------
    def self.load(language, tag)
      read_ini(language) unless @@cache.has_key?(language)
      return @@cache[language][tag]
    end
    #-------------------------------------------------------------------------
    # * Salvamento das línguas para o arquivo .rvdata2
    # [OPT] path : caminho da pasta d destino do arquivo .rvdata2
    #-------------------------------------------------------------------------
    def self.save_languages(path=DEST)
      languages.each do |lang|
        read_ini(lang)
      end
      Dir.mkdir(path) unless FileTest.directory?(path)
      save_data(@@cache, "#{path}/#{BASENAME}.rvdata2")
    end
    #-------------------------------------------------------------------------
    # * Limpamento do cache do módulo
    #-------------------------------------------------------------------------
    def self.clear
      @@cache.clear
    end
    #-------------------------------------------------------------------------
    # * Carregamento das línguas
    #-------------------------------------------------------------------------
    if FileTest.file?('Game.rgss3a')
      load_languages
      File.delete("#{SRC}/#{BASENAME}.ini")
    end
    #-------------------------------------------------------------------------
    # * Salvamento das línguas
    #-------------------------------------------------------------------------
    if $TEST && !FileTest.file?('Game.rgss3a')
      save_languages
    end
  end
end
#------------------------------------------------------------------------------
# * Definição da linguagem padrão
#------------------------------------------------------------------------------
$LANGUAGE = MBS::MultiLanguage.default_lang
#==============================================================================
# ** Kernel
#------------------------------------------------------------------------------
# Módulo geral, todos os métodos adicionados aqui podem ser usados em qualquer
# lugar
#==============================================================================
module Kernel
  #--------------------------------------------------------------------------
  # * Leitura de um texto do arquivo de língua
  #       name     : Nome do texto
  # [OPT] language : Língua da qual carregar o texto
  #--------------------------------------------------------------------------
  def load_string(name, language=$LANGUAGE)
    return MBS::MultiLanguage.load(language, name)
  end
end
#==============================================================================
# ** Window_Base
#------------------------------------------------------------------------------
# Classe das janelas do jogo
#==============================================================================
class Window_Base < Window
  if instance_methods.include?(:convert_escape_characters)
    #------------------------------------------------------------------------
    # * Alias
    #------------------------------------------------------------------------
    alias mbslang_convrt_scap_chars convert_escape_characters
    #------------------------------------------------------------------------
    # * Pré-conversão dos caracteres de controle
    #     text : texto a ser convertido
    #------------------------------------------------------------------------
    def convert_escape_characters(text)
      result = mbslang_convrt_scap_chars(text)
      result.gsub!(/\eL\[(.+)\]/i) {convert_escape_characters(load_string($1))}
      return result
    end
  end
end
#==============================================================================
# ** RPG::BaseItem
#==============================================================================
class RPG::BaseItem
  #--------------------------------------------------------------------------
  # * Alias
  #--------------------------------------------------------------------------
  alias mbslang_name name
  #--------------------------------------------------------------------------
  # * Aquisição do nome do item
  #--------------------------------------------------------------------------
  def name(*a,&b)
    mbslang_name(*a,&b).gsub(/\\L\[(.+)\]/i) {load_string($1)}
  end
end
Cole acima do Main

[box class=calendar_today]Créditos e Agradecimentos[/box]- a mim, por criar e disponibilizar




 
Nossa, isso ai <3 <3 SIIIM <3
Eu tava precisando disso, mas é tão complicado de usar KKKK
Pode ser usado comercialmente? Talvez eu use hehehe
 
Opa xD
Já disseram mesmo que é complicado, estou pensando em fazer uma versão usando só associações simples (tipo, a=Texto)

Pode sim, só dê os créditos o/
 
No meu caso, eu farei no meu jogo uma condição pra checar a língua:

if Português
> Texto
Else
> Text
end

Colocarei em cada evento HAHA Eu acho mais simples que essa loucura ai xD
Você poderia fazer um script pra checar isso, tipo um com tags tbm:
*chamar script*
=português

TEXTO

*chamar script*
=end
*chamar script*
=inglês

TEXT

*chamar script*
=end

Sei lá, algo do tipo kkk
Já vi algo parecido pela net ai, mas não lembro onde :v
 
[member=3]RyanKamos[/member]: Feito \o/
Simplifiquei bastante a configuração, agora ele também oferece suporte a itens do database.

Qualquer outra coisa pode avisar.
 
Lol, deixa eu ver se entendi:
Eu coloco textos para serem traduzidos no arquivo INI, daí se eu ativar uma switch em especial, os textos no jogo são traduzidos pra outra linguagem?
Se não é isso, me ajuda aí Masked, eu tô ansioso pra poder usar esse script no meu jogo Elkiria Land, sabe pra ele ter um acesso mais mundial

Valeu, falooooou!!
 
[member=124]AGS[/member]: Nope :p

O script funciona mais ou menos como um dicionário, você cria um arquivo INI e cria uma seção ([Seção]) para cada língua que quer usar no jogo, aí dentro de cada seção você define um valor pra uma chave (tipo APPLE) de usa essa chave pra carregar o texto com o script.
Tipo, você tem uma fala X num evento que quer traduzir dependendo da língua sendo usada, aí no arquivo INI:
Código:
[Portugues]
FalaX=Esta é a fala X em português

[English]
FalaX=This is the message X in english

E depois na fala do evento:
Código:
\l[FalaX]
Aí se $LANGUAGE tiver o valor 'Portugues' o evento fala 'Esta é a fala X em português' e se tiver o valor 'English' ele fala 'This is the message X in english'
 
Beleza Maskarado, entendi tudo! (Olhe que eu entendi tudo mesmo)
Vou fazer bom proveito do seu script cara, quem dera eu fosse tão inteligente como você! huahuhuahsuahsuahsuahshasashahsu
Enfim, daqui a uns dias você vai abrir uma escola aqui no Condado e eu vou ser um de seus alunos, já tô vendo!

Valeu, falooooou!!
 
Voltar
Topo