lib/gettext/tools.rb in fair-gettext-2.0.1 vs lib/gettext/tools.rb in fair-gettext-2.0.2

- old
+ new

@@ -1,41 +1,41 @@ =begin tools.rb - Utility functions - + Copyright (C) 2005-2008 Masao Mutoh - + You may redistribute it and/or modify it under the same license terms as Ruby or LGPL. =end - + require 'rbconfig' if /mingw|mswin|mswin32/ =~ RUBY_PLATFORM ENV['PATH'] = %w(bin lib).collect{|dir| "#{Config::CONFIG["prefix"]}\\lib\\GTK\\#{dir};" }.join('') + ENV['PATH'] end - + require 'gettext/tools/rgettext' require 'gettext/tools/rmsgfmt' require 'gettext/runtime/mofile' require 'fileutils' - + module GetText bindtextdomain "rgettext" - + BOM_UTF8 = [0xef, 0xbb, 0xbf].pack("c3") - + # Currently, GNU msgmerge doesn't accept BOM. # This mesthod remove the UTF-8 BOM from the po-file. def remove_bom(path) #:nodoc: bom = IO.read(path, 3) if bom == BOM_UTF8 data = IO.read(path)[3..-1] File.open(path, "w") {|f| f.write(data)} end end - + # Merges two Uniforum style .po files together. # # *Note* This function requires "msgmerge" tool included in GNU GetText. So you need to install GNU GetText. # # The def.po file is an existing PO file with translations which will be taken @@ -56,11 +56,11 @@ # * Returns: self def msgmerge(defpo, refpo, app_version, options={}) verbose = options.delete(:verbose) puts "msgmerge called" if verbose $stderr.print defpo + " " - + content = merge_po_files(defpo,refpo,options.delete(:msgmerge),verbose) if content.empty? # report failure failed_filename = refpo + "~" @@ -74,11 +74,11 @@ File.open(defpo, "w") {|f|f.write(content)} end self end - + # Creates mo-files using #{po_root}/#{lang}/*.po an put them to # #{targetdir}/#{targetdir_rule}/. # # This is a convenience function of GetText.rmsgfmt for multiple target files. # * options: options as a Hash. @@ -86,21 +86,21 @@ # * po_root: the root directory of po-files. # * mo_root: the target root directory where the mo-files are stored. # * mo_path_rule: the target directory for each mo-files. def create_mofiles(options = {}) options = {:po_root => "./po"}.merge(options) - + Dir.glob(File.join(options[:po_root], "*/*.po")) do |po_file| mo_file = mo_file_from_po_file(po_file,options) $stderr.print %Q[#{po_file} -> #{mo_file} ... ] if options[:verbose] FileUtils.mkdir_p(File.dirname(mo_file)) rmsgfmt(po_file, mo_file) $stderr.puts "Done." if options[:verbose] end end - - + + # At first, this creates the #{po_root}/#{domainname}.pot file using GetText.rgettext. # In the second step, this updates(merges) the #{po_root}/#{domainname}.pot and all of the # #{po_root}/#{lang}/#{domainname}.po files under "po_root" using "msgmerge". # # *Note* "msgmerge" tool is included in GNU GetText. So you need to install GNU GetText. @@ -118,78 +118,85 @@ # :verbose - true to show verbose messages. default is false. # # Example: GetText.update_pofiles("myapp", Dir.glob("lib/*.rb"), "myapp 1.0.0", :verbose => true) def update_pofiles(textdomain, files, app_version, options = {}) puts options.inspect if options[:verbose] - - #write found messages to tmp.pot + + #write found messages to tmp.pot and private_tmp.pot temp_pot = "tmp.pot" - rgettext(files, temp_pot) - - #merge tmp.pot and existing pot + private_temp_pot = "private_tmp.pot" + rgettext(files, temp_pot, private_temp_pot) + + #merge tmp.pot and private_tmp.pot with existing pot po_root = options.delete(:po_root) || "po" FileUtils.mkdir_p(po_root) msgmerge("#{po_root}/#{textdomain}.pot", temp_pot, app_version, options.dup) - + msgmerge("#{po_root}/private_#{textdomain}.pot", private_temp_pot, app_version, options.dup) + #update local po-files only_one_language = options.delete(:lang) if only_one_language msgmerge("#{po_root}/#{only_one_language}/#{textdomain}.po", temp_pot, app_version, options.dup) + msgmerge("#{po_root}/#{only_one_language}/private_#{textdomain}.po", private_temp_pot, app_version, options.dup) else Dir.glob("#{po_root}/*/#{textdomain}.po") do |po_file| msgmerge(po_file, temp_pot, app_version, options.dup) end + Dir.glob("#{po_root}/*/private_#{textdomain}.po") do |po_file| + msgmerge(po_file, private_temp_pot, app_version, options.dup) + end end - + File.delete(temp_pot) + File.delete(private_temp_pot) end - + private - + # Merge 2 po files, using msgmerge def merge_po_files(po_a,po_b,msgmerge_options=[],verbose=false) return File.read(po_b) unless FileTest.exist? po_a - + cmd = ENV["MSGMERGE_PATH"] || "msgmerge" ensure_command_exists(cmd) - + remove_bom(po_a) - + cmd_params = array_to_cli_options(msgmerge_options) to_run = "#{cmd} #{cmd_params} #{po_a} #{po_b}" puts "\nrunning #{to_run}" if verbose `#{to_run}` end - + # convert an array of String/Symbol to cli options def array_to_cli_options(array) [*array].map do |o| o.kind_of?(Symbol) ? "--#{o}".gsub('_','-') : o.to_s end.join(' ') end - + def ensure_command_exists(cmd) `#{cmd} --help` unless $? && $?.success? raise _("`%{cmd}' can not be found. \nInstall GNU Gettext then set PATH or MSGMERGE_PATH correctly.") % {:cmd => cmd} end end - + # where lies the mo file for a given po_file # generare directory unless it exists def mo_file_from_po_file(po_file,options) options = { :mo_root => "./data/locale", :mo_path_rule => "%{lang}/LC_MESSAGES" }.merge(options) lang, textdomain = %r[/([^/]+?)/(.*)\.po].match(po_file[options[:po_root].size..-1]).to_a[1,2] - + mo_dir_rule = File.join(options[:mo_root], options[:mo_path_rule]) mo_dir = mo_dir_rule % {:lang => lang} File.join(mo_dir, "#{textdomain}.mo") end end - + if __FILE__ == $0 GetText.update_pofiles("foo", ARGV, "foo 1.1.0") -end +end \ No newline at end of file