O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

MS - Sistema de Multi-linguagem

Iniciado por Brandt, 14/01/2015 às 19:22

14/01/2015 às 19:22 Última edição: 20/07/2015 às 14:50 por Masked
[box class=titlebg]
MS - Multi-Língua
[/box]
por Masked

[box class=titlebg]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: auto:0
[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=titlebg]Instruções[/box]No script, nos comentários em verde


[box class=titlebg]Script[/box]
Código: auto:0
#==============================================================================
# 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=titlebg]Créditos e Agradecimentos[/box]- a mim, por criar e disponibilizar
~ Masked

Ele voltou! rsrsrs

O Script é bem util para quem não quer se limitar apenas no território brasileiro, realmente é uma boa alternativa.

:.x.: Saudações Azulinas.

Caaaara, isso me será bem útil. O tenso mesmo é deixar concordância nas frases
depois da mudança de idioma xD
Mas bom script.
  :ok:

Mega atualização :)

  • Script refeito do zero
  • Forma de configuração simplificada, nada de precisar aprender uma linguagem de script /o/
  • Permite traduzir nomes de itens do database
  • Prevê a encriptação do projeto, assim ele funciona com projetos encriptados sem deixar os textos expostos
~ Masked