mirror of
https://forgejo.xatacraft.ru/Sunshine/mkxp-sunshine.git
synced 2026-08-19 13:29:54 +00:00
151 lines
3.7 KiB
Ruby
151 lines
3.7 KiB
Ruby
# Classes for translating text similar to GNU gettext
|
|
# Translator class: translate text to another language
|
|
|
|
# for debug REMOVE BEFORE COMMITTING / BUILDING
|
|
# require "zlib"
|
|
|
|
class Language
|
|
FONT_WESTERN = 'Terminus (TTF)'
|
|
FONT_J = 'HigashiOme Gothic regular'
|
|
LANGUAGES = []
|
|
class << self
|
|
def set(lc)
|
|
dbg_print(lc.lang)
|
|
@data = nil
|
|
@tr = nil
|
|
script = nil
|
|
[lc.full.to_s, lc.lang.to_s].each do |name|
|
|
path = "Languages/#{name}.po"
|
|
dbg_print(path)
|
|
if FileTest.exist?(path)
|
|
load_pot(path)
|
|
loadFontMap
|
|
Font.default_name = @languageFontMap[name]
|
|
Journal.setLang(name)
|
|
dbg_print(Font.default_name)
|
|
break
|
|
end
|
|
end
|
|
reset_fonts(@text_sprites)
|
|
Oneshot.set_yes_no(tr('Yes'), tr('No'))
|
|
end
|
|
|
|
def load_pot(path)
|
|
msgid = nil
|
|
msgstr = nil
|
|
@data = Hash.new
|
|
if FileTest.exist?(path)
|
|
File.readlines(path).each do |line|
|
|
if line.start_with?("msgid ")
|
|
line = line[6..-1]
|
|
#unescape the string
|
|
eval("msgid = " + line)
|
|
elsif line.start_with?("msgstr ")
|
|
line = line[7..-1]
|
|
#unescape the string
|
|
eval("msgstr = " + line)
|
|
if !(msgid.nil? || msgid.empty?)
|
|
@data[Oneshot::crc32(msgid)] = msgstr
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# Translate some text
|
|
def tr(string)
|
|
#dbg_print(caller_locations(1, 1).first.tap{|loc| puts "#{loc.path}:#{loc.lineno}"})
|
|
if @data
|
|
rv = @data[Oneshot::crc32(string)] || string
|
|
else
|
|
rv = string
|
|
end
|
|
dbg_print(string + " -> " + rv)
|
|
return String.new(rv)
|
|
end
|
|
|
|
def loadFontMap
|
|
if !@fontMapLoaded
|
|
@languageFontMap = Hash.new
|
|
path = "Languages/language_fonts.ini"
|
|
if FileTest.exist?(path)
|
|
File.readlines(path).each do |line|
|
|
parts = line.split("=", 2)
|
|
if parts.length == 2
|
|
LANGUAGES.push(parts[0])
|
|
@languageFontMap[parts[0]] = parts[1].strip
|
|
end
|
|
end
|
|
end
|
|
@fontMapLoaded = true
|
|
end
|
|
end
|
|
|
|
# Turn all database items into translatable strings
|
|
def initialize_database
|
|
$data_actors.each do |i|
|
|
i.name = TrString.new(i.name) if i && !i.name.empty?
|
|
end
|
|
$data_items.each do |i|
|
|
if i && !i.name.empty?
|
|
i.name = TrString.new(i.name)
|
|
i.description = TrString.new(i.description)
|
|
end
|
|
end
|
|
end
|
|
|
|
def dbg_print(str)
|
|
# dbg = IO.new(STDERR.fileno)
|
|
# if str.nil?
|
|
# dbg.write("null\n")
|
|
# else
|
|
# dbg.write(str.to_s + "\n")
|
|
# end
|
|
# dbg.close()
|
|
end
|
|
|
|
def register_text_sprite(key, spr)
|
|
dbg_print(key)
|
|
if @text_sprites.nil?
|
|
@text_sprites = Hash.new()
|
|
end
|
|
@text_sprites[key] = spr
|
|
end
|
|
|
|
def reset_fonts(sprites)
|
|
if sprites.kind_of?(Array)
|
|
sprites.each do |spr|
|
|
if spr.kind_of?(Sprite) and !spr.disposed?
|
|
spr.bitmap.font.name = Font.default_name
|
|
end
|
|
end
|
|
elsif sprites.kind_of?(Hash)
|
|
sprites.each_value do |spr|
|
|
if spr.kind_of?(Sprite) and !spr.disposed?
|
|
spr.bitmap.font.name = Font.default_name
|
|
elsif spr.kind_of?(Bitmap) and !spr.disposed?
|
|
spr.font.name = Font.default_name
|
|
end
|
|
end
|
|
elsif sprites.kind_of?(Sprite) and not sprites.disposed?
|
|
sprites.bitmap.font.name = Font.default_name
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
# Translatable string
|
|
class TrString
|
|
def initialize(str)
|
|
@str = str
|
|
end
|
|
|
|
def to_str
|
|
Language.tr(@str)
|
|
end
|
|
alias :to_s :to_str
|
|
end
|
|
|
|
def tr(text)
|
|
TrString.new(text)
|
|
end
|