lib/bisu.rb in bisu-1.2.3 vs lib/bisu.rb in bisu-1.2.4

- old
+ new

@@ -1,40 +1,47 @@ require 'bisu/logger' require 'bisu/config' -require 'bisu/knowledge_base' -require 'bisu/translator' +require 'bisu/google_sheet' +require 'bisu/dictionary' +require 'bisu/localizer' require 'bisu/version' require 'optparse' module Bisu extend self - def run(opts) - options = command_line_options(opts) + def run(options) + options = command_line_options(options) if config = Bisu::Config.parse("translatable.yml") - kbase = Bisu::GoogleDriveKB.new(config[:sheet_id], config[:keys_column]) - translator = Bisu::Translator.new(kbase, config[:type]) + google_sheet = Bisu::GoogleSheet.new(config[:sheet_id], config[:keys_column]) + dictionary = Bisu::Dictionary.new(google_sheet.to_hash) + localizer = Bisu::Localizer.new(dictionary, config[:type]) config[:in].each do |in_path| config[:out].each do |out| - localize(translator, out[:locale], out[:kb_language], options[:default_language], in_path, out[:path] || config[:out_path]) + unless dictionary.has_language?(out[:kb_language]) + Logger.error("Unknown language #{out[:kb_language]}") + return false + end + + localize_file(localizer, out[:locale], out[:kb_language], options[:default_language], in_path, out[:path] || config[:out_path]) end end end Bisu::Logger.print_summary end private def command_line_options(options) - options = {} + opts_hash = {} opts_parser = OptionParser.new do |opts| opts.on("-d LANGUAGE", "--default LANGUAGE", "Language to use when there is no available translation") do |language| - options[:default_language] = language + opts_hash[:default_language] = language end opts.on_tail("-h", "--help", "Show this message") do puts opts exit @@ -43,25 +50,50 @@ opts.on_tail("-v", "--version", "Show version") do puts Bisu::VERSION exit end end + opts_parser.parse!(options) - opts_parser.parse!(ARGV) - options + opts_hash end - def localize(translator, locale, language, default_language, in_path, out_path) + def localize_file(localizer, locale, language, default_language, in_path, out_path) in_name = File.basename(in_path) out_name = in_name.gsub(/\.translatable$/, "") unless in_name.match /\.translatable$/ Logger.error("Expected .translatable file. Got '#{in_name}'") return false end out_path = out_path % { locale: locale, android_locale: locale.gsub("-", "-r"), out_name: out_name } - translator.translate(language, locale, in_path, out_path, default_language) + return false unless in_file = open_file(in_path, "r", true) + return false unless out_file = open_file(out_path, "w", false) + + Logger.info("Translating #{in_path} to #{language} > #{out_path}...") + + in_file.each_line do |line| + out_file.write(localizer.localize(line, language, locale, default_language)) + end + + out_file.flush + out_file.close + in_file.close + + true end + def open_file(file_name, method, should_exist) + if !File.file?(File.expand_path(file_name)) + if should_exist + Logger.error("File #{file_name} not found!") + return nil + else + FileUtils.mkdir_p(File.dirname(file_name)) + end + end + + File.open(File.expand_path(file_name), method) + end end