diff options
Diffstat (limited to 'lib/tasks/gettext.rake')
| -rw-r--r-- | lib/tasks/gettext.rake | 70 | 
1 files changed, 65 insertions, 5 deletions
diff --git a/lib/tasks/gettext.rake b/lib/tasks/gettext.rake index 3f357213f..4df92b008 100644 --- a/lib/tasks/gettext.rake +++ b/lib/tasks/gettext.rake @@ -11,11 +11,7 @@ namespace :gettext do    desc "Update pot/po files for a theme."    task :find_theme => :environment do -    theme = ENV['THEME'] -    unless theme -        puts "Usage: Specify an Alaveteli-theme with THEME=[theme directory name]" -        exit(0) -    end +    theme = find_theme(ENV['THEME'])      load_gettext      msgmerge = Rails.application.config.gettext_i18n_rails.msgmerge      msgmerge ||= %w[--sort-output --no-location --no-wrap] @@ -28,6 +24,70 @@ namespace :gettext do       )     end +    desc 'Rewrite theme .po files into a consistent msgmerge format' +    task :clean_theme do +        theme = find_theme(ENV['THEME']) +        load_gettext + +        Dir.glob("#{ theme_locale_path(theme) }/*/app.po") do |po_file| +            GetText::msgmerge(po_file, po_file, 'alaveteli', +                              :msgmerge => [:sort_output, :no_location, :no_wrap]) +        end +   end + +   desc 'Update locale files with slightly changed English msgids using a csv file of old to new strings' +   task :update_msgids_from_csv do +       mapping_file = find_mapping_file(ENV['MAPPING_FILE']) +       mappings = {} +       CSV.parse(clean_csv_mapping_file(mapping_file)) do |csv_line| +           from,to = csv_line +           mappings[from] = to +       end +       Dir.glob("locale/**/app.po").each do |po_file| +           lang_mappings = mappings.clone +           lines = [] +           File.read(po_file).each_line do |line| +               /^msgid "(.*)"/ =~ line +               if $1 && mappings[$1] +                    lines << "msgid \"#{lang_mappings.delete($1)}\"" +                 else +                    lines << line +                end +           end +           puts "Mappings unused in #{po_file}: #{lang_mappings.keys}" unless lang_mappings.empty? +           File.open(po_file, "w") { |f| f.puts(lines) } +       end +   end + +   # Use a quote for quote-escaping as CSV errors on the \" with "Missing or stray quote" +   def clean_csv_mapping_file(file) +       data = '' +       File.foreach(file) do |line| +         data += line.gsub('\"', '""') +       end +       data +   end + +   def find_theme(theme) +       unless theme +           puts "Usage: Specify an Alaveteli-theme with THEME=[theme directory name]" +           exit(1) +       end +       theme +   end + +   def find_mapping_file(file) +       unless file +           puts "Usage: Specify a csv file mapping old to new strings with MAPPING_FILE=[file name]" +           exit(1) +       end +       unless File.exists?(file) +           puts "Error: MAPPING_FILE #{file} not found" +           exit(1) +       end +       file +   end +     def theme_files_to_translate(theme)         Dir.glob("{lib/themes/#{theme}/lib}/**/*.{rb,erb}")     end  | 
