=begin
==============================================================================
■ Localizzazione del gioco di Holy87
versione 1.0.3
Difficoltà utente: ★★★
Licenza: CC. Chiunque può scaricare, modificare, distribuire e utilizzare
lo script nei propri progetti, sia amatoriali che commerciali. Vietata
l'attribuzione impropria.
==============================================================================
Questo script permette al gioco di essere multilingua! Si possono creare
file della lingua diversi per poter permettere ai giocatori di giocare alla
loro lingua madre.
==============================================================================
■ Compatibilità
DataManager -> alias load_normal_database
Bitmap -> alias initialize, draw_text
==============================================================================
■ Changelog
25/06/2015 -> v1.0.3
● È possibile interpolare stringhe semplici con stringhe localizzate, ad
esempio "{S: hello} Eric!" -> "Ciao Eric!"
● È possibile inserire più chiavi localizzate in una sola stringa, ad esempio
"{S: hello} {S: friends}" -> "Ciao amici"
23/06/2015 -> v1.0.2
● Risolto il bug per i due punti : nei messaggi
● Risolto il bug del tag nome eroe nei messaggi \n
● Risolto il glitch per la finestra delle scelte dei messaggi
07/06/2015 -> v1.0.1
● Ora se una stringa nella lingua selezionata non è stata trovata, prende
la stringa dalla lingua standard se c'è, altrimenti dalla lingua predefinita
invece di mostrare una stringa vuota.
● Altri bugfix
==============================================================================
■ Installazione e istruzioni
Installare questo script sotto Materials e prima del Main.
RICHIEDE IL MODULO DI SUPPORTO UNIVERSALE DI HOLY87.
Lo script delle opzioni di gioco, se presente, deve stare sopra di questo
script.
■ Istruzioni per come impostare il gioco
● Prima di tutto, creare la cartella Localization all'interno della
cartella principale del progetto. All'interno di questo bisogna creare
tanti file quante le lingue volute. Esempio: Voglio creare il file della
lingua italiana. Creo il file it.ini, dove it è il diminutivo di italiano
e ini è l'estensione del file (basta cambiare .txt in .ini). È importante
che la lingua abbia l'estensione del file scelta.
Apri il file, e la prima cosa da creare all'interno è un tag dove inserirci
le informazioni sulla lingua. Quindi
Language:Italiano
ID:1040
Language è la lingua mostrata nelle opzioni, mentre ID è l'ID della lingua
del sistema, in modo che se la lingua di Windows è impostata in Italiano,
il gioco partirà direttamente con la lingua italiana. Tutti i codici delle
lingue puoi trovarli a questa pagina
http://support.microsoft.com/kb/193080
https://msdn.microsoft.com/en-US/library/ee825488(v=cs.20).aspx
● La seconda cosa da fare è creare le stringhe che ci servono vengano messe
nel gioco. Crea il tag strings come abbiamo fatto con header. Ad esempio
greetings:Ciao!
defeat:Sei stato sconfitto.
È importante che le stringhe siano SULLA STESSA RIGA. Metti il simbolo \n
se vuoi che il testo vada a capo nel gioco.
● Nel gioco, metti il tag {S: NomeStringa} per sostituire il testo con la
stringa nell'appropriato file della lingua. Ad esempio, se in un messaggio
del gioco o in qualsiasi altra parte scriverai {S: greetings}, al momento
del gioco, se impostata la lingua italiana, il giocatore vedrà la scritta
Ciao! al posto del tag.
Funziona anche con gli oggetti del database e tutti gli script che hai
installato!
● In verità, c'è un altro modo per gli oggetti del database. Puoi creare
altri tag con header items, skills, ecc... contenenti le informazioni di
ogni elemento del database per attributi. Ad esempio, scrivendo
ID:1, name:Attacca, description:Attacca con l'arma equipaggiata; message1: attacca!
Il punto e virgola separa gli attributi. Per mostrare il ; nel gioco,
scrivi \;
La skill 1 del database avrà nome, descrizione e messaggio indicati nel
file della lingua. Una volta ultimato non resterà che modificare il file
per le altre lingue.
● E per le immagini?
Nel caso tu abbia delle immagini che mostrano un testo e vuoi mostrare
un'immagine differente a seconda della lingua selezionata, basterà mettere
più immagini con la differenza che nel nome finale metto _lingua.
Ad esempio, se ho un'immagine chiamata Nuvola.png nella cartella Pictures,
creo l'immagine Nuvola_it.png e Nuvola_fr.png nella stessa cartella.
Se il gioco ha la lingua italiana, quando andrò a caricare Nuvola vedrò
l'immagine Nuvola_it, mentre in francese Nuvola_en e in tutte le altre
lingue la classica Nuvola.
==============================================================================
=end
#==============================================================================
# ** SETTINGS
#------------------------------------------------------------------------------
# Imposta le opzioni dello script
#==============================================================================
module H87Localization
module Settings
#--------------------------------------------------------------------------
# * Lingua predefinita se non è installata quella del sistema
#--------------------------------------------------------------------------
DEFAULT_LANGUAGE = "en"
#--------------------------------------------------------------------------
# * Cartella dei file della lingua
#--------------------------------------------------------------------------
LANG_FOLDER = "Localization"
#--------------------------------------------------------------------------
# * Comando nelle opzioni
#--------------------------------------------------------------------------
OPTION_LANGUAGE = "{S: Lang_Option}"
#--------------------------------------------------------------------------
# * Descrizione del comando nelle opzioni
#--------------------------------------------------------------------------
OPTION_DESCRIPTION = "{S: Lang_Description}"
end
end
#---------------------------- FINE CONFIGURAZIONE ------------------------------
$imported = {} if $imported == nil
$imported["H87_Localization"] = true
#==============================================================================
# ** module H87Localization
#------------------------------------------------------------------------------
# Module for language-check processing.
#==============================================================================
module H87Localization
REG_EXCAPE = /\{S:[ ]+(.+?)\}/
#--------------------------------------------------------------------------
# * Gets a string. If it contains a reference to a localized strings, returns
# the localized strings. Otherwise, the string itself.
# str: string to check
#--------------------------------------------------------------------------
def self.check_localized_string(str)
DataManager.load_localization if $data_localization.nil?
r = REG_EXCAPE
return str.to_s.gsub(r){|s|get_localized_string($1) if s =~ r}
end
#--------------------------------------------------------------------------
# * Returns the selected language (if set by user or system default)
#--------------------------------------------------------------------------
def self.selected_system_language
DataManager.load_h87settings unless $game_settings
if $game_settings["sys_lang"].nil?
return default_game_language
else
return $game_settings["sys_lang"]
end
end
#--------------------------------------------------------------------------
# * Returns the default language if not setted by user
#--------------------------------------------------------------------------
def self.default_game_language
proper_l(system_language)
end
#--------------------------------------------------------------------------
# * Returns the Windows language.
#--------------------------------------------------------------------------
def self.system_language
code = Win.language
return default_language if lang_from_code(code).nil?
return lang_from_code(code)
end
#--------------------------------------------------------------------------
# * Checks if there is the language with sub-language, otherwise returns
# the traditional language
#--------------------------------------------------------------------------
def self.proper_l(lang)
if language_avaiable?(lang)
return lang
else
return dialet?(lang) ? proper_l(base_language(lang)) : default_language
end
end
#--------------------------------------------------------------------------
# * Returns the traditional language from the dialet.
# lang: language (i.e. "en-uk" -> "en")
#--------------------------------------------------------------------------
def base_language(lang)
return lang unless dialet?(lang)
return lang.split("-")[0]
end
#--------------------------------------------------------------------------
# * Returns the language short name (es. "en") from a code (es. 1033)
#--------------------------------------------------------------------------
def self.lang_from_code(code)
installed_languages.each do |language|
return language.short if language.id == code
end
return nil
end
#--------------------------------------------------------------------------
# * Return true if a language is installed
# lang: language short name
#--------------------------------------------------------------------------
def self.language_avaiable?(lang)
installed_languages.each do |language|
return true if lang == language.short
end
return false
end
#--------------------------------------------------------------------------
# * Return the language file name
# lang: language short name
#--------------------------------------------------------------------------
def self.language_file(lang)
language_folder+"/#{lang}.ini"
end
#--------------------------------------------------------------------------
# * Return the language files folder
#--------------------------------------------------------------------------
def self.language_folder
return Settings::LANG_FOLDER
end
#--------------------------------------------------------------------------
# * Return the default language when the player's language is not avaiable
#--------------------------------------------------------------------------
def self.default_language
Settings::DEFAULT_LANGUAGE
end
#--------------------------------------------------------------------------
# * Return true if the language is a traditional language or a sub-language.
# lang: language. I.E.: en-uk => true, en => false
#--------------------------------------------------------------------------
def self.dialet?(lang)
return lang =~ /[.]+\-[.]+/
end
#--------------------------------------------------------------------------
# * Return the avaiable languages list
#--------------------------------------------------------------------------
def self.installed_languages
@languages = check_installed_languages if @languages.nil?
return @languages
end
#--------------------------------------------------------------------------
# * Checks all the languages in language folder.
#--------------------------------------------------------------------------
def self.check_installed_languages
languages = []
Dir.foreach(language_folder) {|x|
next if x == "." or x == ".."
file_name = language_folder+"/"+x
next if File.directory?(file_name)
dl = Data_Localization.new
File.open(file_name,"r") do |file|
if dl.language_ok?(file.read)
short = File.basename(file_name,".*")
name = dl.lang_name
id = dl.lang_id
languages.push(Language.new(id, short, name))
end
end
}
return languages
end
#--------------------------------------------------------------------------
# * Return the Option hash (if Option Menu is installed)
#--------------------------------------------------------------------------
def self.create_option
{ :type => :variable,
:text => Settings::OPTION_LANGUAGE,
:help => Settings::OPTION_DESCRIPTION,
:var => "sys_lang",
:default => default_game_language,
:open_popup => true,
:method => :update_language,
:values => installed_languages_names
}
end
#--------------------------------------------------------------------------
# * Return the name of all avaiable languages
#--------------------------------------------------------------------------
def self.installed_languages_names
hash = {}
for language in installed_languages
hash[language.short] = language.name
end
return hash
end
#--------------------------------------------------------------------------
# * Return the proper string from a tag.
#--------------------------------------------------------------------------
def self.get_localized_string(string_id)
DataManager.load_localization unless $data_localization
return $data_localization.get_string(string_id)
end
end
#==============================================================================
# ** class Option
#------------------------------------------------------------------------------
# Loading language after selecting a new lang.
#==============================================================================
class Option
#--------------------------------------------------------------------------
# * Reload the language after selection
#--------------------------------------------------------------------------
def update_language(lang)
DataManager.load_localization unless $data_localization
$data_localization.load_language(lang)
end
end
#==============================================================================
# ** Bitmap
#------------------------------------------------------------------------------
# Methods for taking the right bitmap and draw proper text
#==============================================================================
class Bitmap
#--------------------------------------------------------------------------
# * Alias
#--------------------------------------------------------------------------
alias h87localization_dt draw_text unless $@
alias h87localization_init initialize unless $@
#--------------------------------------------------------------------------
# * Object initialization
#--------------------------------------------------------------------------
def initialize(*args)
if args[0].is_a?(String)
begin
DataManager.load_h87settings unless $game_settings
DataManager.load_localization unless $data_localization
args2 = args.clone
args2[0]+="_#{$game_settings["sys_lang"]}"
h87localization_init(*args2)
rescue
h87localization_init(*args)
end
else
h87localization_init(*args)
end
end
#--------------------------------------------------------------------------
# * draw_text
#--------------------------------------------------------------------------
def draw_text(*args)
a_index = args[0].is_a?(Rect) ? 1 : 4
args[a_index] = H87Localization.check_localized_string(args[a_index])
h87localization_dt(*args)
end
end
#==============================================================================
# ** class Object
#------------------------------------------------------------------------------
# Changing sprintf method
#==============================================================================
class Object
alias unlocalized_sprintf sprintf unless $@
#--------------------------------------------------------------------------
# * sprintf
#--------------------------------------------------------------------------
def sprintf(*args)
args[0]=H87Localization.check_localized_string(args[0])
unlocalized_sprintf(*args)
end
end
#==============================================================================
# ** class Language
#------------------------------------------------------------------------------
# A simple class for handling languages
#==============================================================================
class Language
#--------------------------------------------------------------------------
# * Public instance variables
#--------------------------------------------------------------------------
attr_accessor :id
attr_accessor :short
attr_accessor :name
#--------------------------------------------------------------------------
# * Object initialization
#--------------------------------------------------------------------------
def initialize(id, short, name)
@id = id.to_i
@short = short
@name = name
end
end
#==============================================================================
# ** module DataManager
#------------------------------------------------------------------------------
# For language loading
#==============================================================================
module DataManager
#--------------------------------------------------------------------------
# * alias
#--------------------------------------------------------------------------
class << self
alias h87loc_load_n_db load_normal_database
alias h87loc_load_b_db load_battle_test_database
end
# --------------------------------------------------------------------------
# * database loading
# --------------------------------------------------------------------------
def self.load_normal_database
h87loc_load_n_db
load_localization
end
# --------------------------------------------------------------------------
# * bt loading
# --------------------------------------------------------------------------
def self.load_battle_test_database
h87loc_load_b_db
load_localization if $data_localization.nil?
end
#--------------------------------------------------------------------------
# * language loading
#--------------------------------------------------------------------------
def self.load_localization
$data_localization = Data_Localization.new
$data_localization.load_language(H87Localization.selected_system_language)
end
end
#==============================================================================
# ** class Window_Base
#------------------------------------------------------------------------------
# Changing method for advanced text drawing
#==============================================================================
class Window_Base < Window
alias h87loc_dte draw_text_ex unless $@
#--------------------------------------------------------------------------
# * draw_text_ex
#--------------------------------------------------------------------------
def draw_text_ex(x, y, text)
h87loc_dte(x, y, H87Localization.check_localized_string(text))
end
end
#==============================================================================
# ** class Game_Message
#------------------------------------------------------------------------------
# Changing the text message
#==============================================================================
class Game_Message
alias h87loc_add add unless $@
#--------------------------------------------------------------------------
# * Add Text
#--------------------------------------------------------------------------
def add(text)
h87loc_add(H87Localization.check_localized_string(text))
end
end
#==============================================================================
# ** class Game_Interpreter
#------------------------------------------------------------------------------
# Game Interpreter class
#==============================================================================
class Game_Interpreter
alias h87loc_setup_choices setup_choices unless $@
#--------------------------------------------------------------------------
# * Alias method for setup_choices, makes the choice window fit the text.
#--------------------------------------------------------------------------
def setup_choices(params)
par0 = params.clone
par0[0].map! {|text| H87Localization.check_localized_string(text) }
h87loc_setup_choices(par0)
end
end
#==============================================================================
# ** class Data_Localization
#------------------------------------------------------------------------------
# Localization class for language and strings handling. Used in
# $data_localization instance.
#==============================================================================
class Data_Localization
#--------------------------------------------------------------------------
# * public instance variables
#--------------------------------------------------------------------------
attr_reader :lang_name
attr_accessor :language
#--------------------------------------------------------------------------
# * object initialization
#--------------------------------------------------------------------------
def initialize(lang = nil)
@strings = {}
load_language(lang, false) if lang
end
#--------------------------------------------------------------------------
# * language ID/code
#--------------------------------------------------------------------------
def lang_id
return @lang_id.to_i
end
#--------------------------------------------------------------------------
# * Checks if a game string contains a loalized string
#--------------------------------------------------------------------------
def parse_string(string)
H87Localization.check_localized_string(string)
end
#--------------------------------------------------------------------------
# * Takes a string from the loaded strings of the active language
#--------------------------------------------------------------------------
def get_string(string_id)
if @strings[string_id] != nil
return @strings[string_id].gsub(/\\n[^\[^<]/i,"\n")
else
println "String not found for value #{string_id}"
return string_from_other_languages(string_id, @language)
end
end
#--------------------------------------------------------------------------
# * Loads a new language
# lang_name: language short name
#--------------------------------------------------------------------------
def load_language(lang_name, database = true)
@language = lang_name
file = H87Localization.language_file(lang_name)
unless File.exist?(file)
println "Language file #{file} not found."
return
end
File.open(file, "r") do |content|
@readstring = content.read
end
if language_ok?(@readstring)
load_database(@readstring) if $data_system && database
load_strings(@readstring)
println "Language loaded: #{file}."
else
println "Cannot read the #{file} file."
return
end
end
#--------------------------------------------------------------------------
# * Returns true if the file is a language file
#--------------------------------------------------------------------------
def language_ok?(readstring)
return false unless readstring =~ category_regexp("header")
info = string_array($1)
begin
@lang_name = info["Language"]
@lang_id = info["ID"]
return true
rescue
return false
end
end
#--------------------------------------------------------------------------
# * Load the localized database from file
#--------------------------------------------------------------------------
def load_database(readstring)
load_items(readstring)
load_skills(readstring)
load_weapons(readstring)
load_armors(readstring)
load_enemies(readstring)
load_actors(readstring)
load_classes(readstring)
load_states(readstring)
load_terms(readstring)
end
#--------------------------------------------------------------------------
# * Load items array
#--------------------------------------------------------------------------
def load_items(readstring)
item_list = load_data(readstring, "items",:id, :name, :description)
change_array($data_items, item_list)
end
#--------------------------------------------------------------------------
# * Load skills array
#--------------------------------------------------------------------------
def load_skills(readstring)
item_list = load_data(readstring, "skills",:id, :name, :description,
:message1, :message2)
change_array($data_skills, item_list)
end
#--------------------------------------------------------------------------
# * load weapons array
#--------------------------------------------------------------------------
def load_weapons(readstring)
item_list = load_data(readstring, "weapons",:id, :name, :description)
change_array($data_weapons, item_list)
end
#--------------------------------------------------------------------------
# * load armors array
#--------------------------------------------------------------------------
def load_armors(readstring)
item_list = load_data(readstring, "armors",:id, :name, :description)
change_array($data_armors, item_list)
end
#--------------------------------------------------------------------------
# * load enemies array
#--------------------------------------------------------------------------
def load_enemies(readstring)
item_list = load_data(readstring, "enemies",:id, :name)
change_array($data_enemies, item_list)
end
#--------------------------------------------------------------------------
# * load actors array
#--------------------------------------------------------------------------
def load_actors(readstring)
item_list = load_data(readstring, "actors",:id, :name, :title, :description)
change_array($data_actors, item_list)
end
#--------------------------------------------------------------------------
# * load class array
#--------------------------------------------------------------------------
def load_classes(readstring)
item_list = load_data(readstring, "classes",:id, :name)
change_array($data_classes, item_list)
end
#--------------------------------------------------------------------------
# * load states array
#--------------------------------------------------------------------------
def load_states(readstring)
item_list = load_data(readstring, "states",:id, :name, :message1, :message2,
:message3, :message4)
change_array($data_states, item_list)
end
#--------------------------------------------------------------------------
# * load terms array
#--------------------------------------------------------------------------
def load_terms(readstring)
terms = $data_system.terms
basic = get_string_array(readstring, "basic")
params = get_string_array(readstring, "params")
etypes = get_string_array(readstring, "etypes")
commands = get_string_array(readstring, "commands")
set_terms(terms.basic, basic)
set_terms(terms.params, params)
set_terms(terms.etypes, etypes)
set_terms(terms.commands, commands)
end
#--------------------------------------------------------------------------
# * Takes a substring from the file depending from the ... tag
#--------------------------------------------------------------------------
def category_regexp(cat_name)
return /[.]*<#{cat_name}>(.*)<\/#{cat_name}>[.]*/im
end
#--------------------------------------------------------------------------
# * Load generic game strings
#--------------------------------------------------------------------------
def load_strings(readstring)
@strings = get_string_array(readstring, "strings")
end
#--------------------------------------------------------------------------
# * returns the string array
# readstring: file readed
# #header: string type
#--------------------------------------------------------------------------
def get_string_array(readstring, header)
if readstring =~ category_regexp(header)
return string_array($1)
end
end
#--------------------------------------------------------------------------
# * takes the proper string from file to array
#--------------------------------------------------------------------------
def set_terms(terms_array, term_hash)
return if term_hash.nil?
for i in 0..terms_array.size-1
next if term_hash[i.to_s].nil?
terms_array[i] = term_hash[i.to_s]
end
end
#--------------------------------------------------------------------------
# * strings array creation
#--------------------------------------------------------------------------
def string_array(text)
strings = {}
text.split(/[\r\n]+/).each do |string|
case string
when /[\s]*([^:.]*+)[\s]*:[\s]*(.+)[\s]*/i
key = $1
val = $2
key.gsub!(/[\t\n]/,""); val.gsub!(/[\t\n]/,"")
if strings[key].nil?
strings[key] = val
else
println "#{key} is defined twice!\n#{key}->#{strings[key]}\n#{$1}->#{val}"
end
end
end
return strings
end
#--------------------------------------------------------------------------
# * Return the regexp for taking a parameter
#--------------------------------------------------------------------------
def param_regexp
return /[\s]*(.+)[\s]*:(.+)[\s]*/i
end
#--------------------------------------------------------------------------
# * loads a data file to the system
#--------------------------------------------------------------------------
def load_data(*args)
readstring = args[0]
if readstring =~ category_regexp(args[1])
id = args[2]
text = $1
hash = {}
text.each_line do |line|
item = get_item_from_parameters(line)
next if item.empty? or item[id] == nil
idd = item[id].to_i
hash[idd] = {}
for i in 3..args.size-1
hash[idd][args[i]] = item[args[i]]
end
end
end
return hash
end
#--------------------------------------------------------------------------
# * Exchange the old array of the database from the new array
#--------------------------------------------------------------------------
def change_array(array, param_list)
return if param_list.nil?
param_list.each_pair do |key, params|
next if array[key].nil?
param_copy(array[key], params)
end
end
#--------------------------------------------------------------------------
# * Copy a parameter from the localized string to the old string
# params: param array
#--------------------------------------------------------------------------
def param_copy(item, params)
params.each_pair do |param, value|
next if value.nil?
val = value.gsub("\\n","\n")
eval("item.#{param.to_s} = val")
end
end
#--------------------------------------------------------------------------
# * Gets a item from ID
# line: ID
#--------------------------------------------------------------------------
def get_item_from_parameters(line)
item = {}
line.split(";").each do |param|
if param =~ param_regexp
key = $1; val = $2
key.gsub!(/[\t\n]/,""); val.gsub!(/[\t\n]/,"")
item[key.downcase.to_sym] = val
end
end
return item
end
#--------------------------------------------------------------------------
# * Dialet?
# lang: language short name
#--------------------------------------------------------------------------
def dialet?(lang)
return H87Localization.dialet?(lang)
end
#--------------------------------------------------------------------------
# * Loads a string from another language.
# string_id: string to load
# language: current language
#--------------------------------------------------------------------------
def string_from_other_languages(string_id, language)
if H87Localization.dialet?(language)
traditional = H87Localization.base_language(language)
return string_from_other_languages(string_id, traditional)
elsif language != H87Localization.default_language
return get_language_string(string_id, H87Localization.default_language)
else
return "?#{string_id}?"
end
end
#--------------------------------------------------------------------------
# * Gets a string from another language and stores it
#--------------------------------------------------------------------------
def get_language_string(string_id, language)
dl = Data_Localization.new(language)
@strings[string_id] = dl.get_string(string_id)
return @strings[string_id]
end
end
#--------------------------------------------------------------------------
# * Command to add the language selection from Settings menu.
#--------------------------------------------------------------------------
if $imported["H87_Options"]
H87Options.push_system_option(H87Localization.create_option)
end