annotate .svn/pristine/d3/d39d55792569592e631ccb43cfe454592c67567f.svn-base @ 1327:287f201c2802 redmine-2.2-integration

Add italic
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Wed, 19 Jun 2013 20:56:22 +0100
parents 038ba2d95de8
children
rev   line source
Chris@1296 1 desc 'Updates and checks locales against en.yml'
Chris@1296 2 task :locales do
Chris@1296 3 %w(locales:update locales:check_interpolation).collect do |task|
Chris@1296 4 Rake::Task[task].invoke
Chris@1296 5 end
Chris@1296 6 end
Chris@1296 7
Chris@1296 8 namespace :locales do
Chris@1296 9 desc 'Updates language files based on en.yml content (only works for new top level keys).'
Chris@1296 10 task :update do
Chris@1296 11 dir = ENV['DIR'] || './config/locales'
Chris@1296 12
Chris@1296 13 en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en']
Chris@1296 14
Chris@1296 15 files = Dir.glob(File.join(dir,'*.{yaml,yml}'))
Chris@1296 16 files.sort.each do |file|
Chris@1296 17 puts "Updating file #{file}"
Chris@1296 18 file_strings = YAML.load(File.read(file))
Chris@1296 19 file_strings = file_strings[file_strings.keys.first]
Chris@1296 20
Chris@1296 21 missing_keys = en_strings.keys - file_strings.keys
Chris@1296 22 next if missing_keys.empty?
Chris@1296 23
Chris@1296 24 puts "==> Missing #{missing_keys.size} keys (#{missing_keys.join(', ')})"
Chris@1296 25 lang = File.open(file, 'a')
Chris@1296 26
Chris@1296 27 missing_keys.each do |key|
Chris@1296 28 {key => en_strings[key]}.to_yaml.each_line do |line|
Chris@1296 29 next if line =~ /^---/ || line.empty?
Chris@1296 30 puts " #{line}"
Chris@1296 31 lang << " #{line}"
Chris@1296 32 end
Chris@1296 33 end
Chris@1296 34
Chris@1296 35 lang.close
Chris@1296 36 end
Chris@1296 37 end
Chris@1296 38
Chris@1296 39 desc 'Checks interpolation arguments in locals against en.yml'
Chris@1296 40 task :check_interpolation do
Chris@1296 41 dir = ENV['DIR'] || './config/locales'
Chris@1296 42 en_strings = YAML.load(File.read(File.join(dir,'en.yml')))['en']
Chris@1296 43 files = Dir.glob(File.join(dir,'*.{yaml,yml}'))
Chris@1296 44 files.sort.each do |file|
Chris@1296 45 puts "parsing #{file}..."
Chris@1296 46 file_strings = YAML.load(File.read(file))
Chris@1296 47 file_strings = file_strings[file_strings.keys.first]
Chris@1296 48
Chris@1296 49 file_strings.each do |key, string|
Chris@1296 50 next unless string.is_a?(String)
Chris@1296 51 string.scan /%\{\w+\}/ do |match|
Chris@1296 52 unless en_strings[key].nil? || en_strings[key].include?(match)
Chris@1296 53 puts "#{file}: #{key} uses #{match} not found in en.yml"
Chris@1296 54 end
Chris@1296 55 end
Chris@1296 56 end
Chris@1296 57 end
Chris@1296 58 end
Chris@1296 59
Chris@1296 60 desc <<-END_DESC
Chris@1296 61 Removes a translation string from all locale file (only works for top-level childless non-multiline keys, probably doesn\'t work on windows).
Chris@1296 62
Chris@1296 63 This task does not work on Ruby 1.8.6.
Chris@1296 64 You need to use Ruby 1.8.7 or later.
Chris@1296 65
Chris@1296 66 Options:
Chris@1296 67 key=key_1,key_2 Comma-separated list of keys to delete
Chris@1296 68 skip=en,de Comma-separated list of locale files to ignore (filename without extension)
Chris@1296 69 END_DESC
Chris@1296 70
Chris@1296 71 task :remove_key do
Chris@1296 72 dir = ENV['DIR'] || './config/locales'
Chris@1296 73 files = Dir.glob(File.join(dir,'*.yml'))
Chris@1296 74 skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil
Chris@1296 75 deletes = ENV['key'] ? Regexp.union(ENV['key'].split(',')) : nil
Chris@1296 76 # Ignore multiline keys (begin with | or >) and keys with children (nothing meaningful after :)
Chris@1296 77 delete_regex = /\A #{deletes}: +[^\|>\s#].*\z/
Chris@1296 78
Chris@1296 79 files.each do |path|
Chris@1296 80 # Skip certain locales
Chris@1296 81 (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips
Chris@1296 82 puts "Deleting selected keys from #{path}"
Chris@1296 83 orig_content = File.open(path, 'r') {|file| file.read}
Chris@1296 84 File.open(path, 'w') {|file| orig_content.each_line {|line| file.puts line unless line.chomp =~ delete_regex}}
Chris@1296 85 end
Chris@1296 86 end
Chris@1296 87
Chris@1296 88 desc <<-END_DESC
Chris@1296 89 Adds a new top-level translation string to all locale file (only works for childless keys, probably doesn\'t work on windows, doesn't check for duplicates).
Chris@1296 90
Chris@1296 91 Options:
Chris@1296 92 key="some_key=foo"
Chris@1296 93 key1="another_key=bar"
Chris@1296 94 key_fb="foo=bar" Keys to add in the form key=value, every option of the form key[,\\d,_*] will be recognised
Chris@1296 95 skip=en,de Comma-separated list of locale files to ignore (filename without extension)
Chris@1296 96 END_DESC
Chris@1296 97
Chris@1296 98 task :add_key do
Chris@1296 99 dir = ENV['DIR'] || './config/locales'
Chris@1296 100 files = Dir.glob(File.join(dir,'*.yml'))
Chris@1296 101 skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil
Chris@1296 102 keys_regex = /\Akey(\d+|_.+)?\z/
Chris@1296 103 adds = ENV.reject {|k,v| !(k =~ keys_regex)}.values.collect {|v| Array.new v.split("=",2)}
Chris@1296 104 key_list = adds.collect {|v| v[0]}.join(", ")
Chris@1296 105
Chris@1296 106 files.each do |path|
Chris@1296 107 # Skip certain locales
Chris@1296 108 (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips
Chris@1296 109 # TODO: Check for dupliate/existing keys
Chris@1296 110 puts "Adding #{key_list} to #{path}"
Chris@1296 111 File.open(path, 'a') do |file|
Chris@1296 112 adds.each do |kv|
Chris@1296 113 Hash[*kv].to_yaml.each_line do |line|
Chris@1296 114 file.puts " #{line}" unless (line =~ /^---/ || line.empty?)
Chris@1296 115 end
Chris@1296 116 end
Chris@1296 117 end
Chris@1296 118 end
Chris@1296 119 end
Chris@1296 120
Chris@1296 121 desc 'Duplicates a key. Exemple rake locales:dup key=foo new_key=bar'
Chris@1296 122 task :dup do
Chris@1296 123 dir = ENV['DIR'] || './config/locales'
Chris@1296 124 files = Dir.glob(File.join(dir,'*.yml'))
Chris@1296 125 skips = ENV['skip'] ? Regexp.union(ENV['skip'].split(',')) : nil
Chris@1296 126 key = ENV['key']
Chris@1296 127 new_key = ENV['new_key']
Chris@1296 128 abort "Missing key argument" if key.blank?
Chris@1296 129 abort "Missing new_key argument" if new_key.blank?
Chris@1296 130
Chris@1296 131 files.each do |path|
Chris@1296 132 # Skip certain locales
Chris@1296 133 (puts "Skipping #{path}"; next) if File.basename(path, ".yml") =~ skips
Chris@1296 134 puts "Adding #{new_key} to #{path}"
Chris@1296 135
Chris@1296 136 strings = File.read(path)
Chris@1296 137 unless strings =~ /^( #{key}: .+)$/
Chris@1296 138 puts "Key not found in #{path}"
Chris@1296 139 next
Chris@1296 140 end
Chris@1296 141 line = $1
Chris@1296 142
Chris@1296 143 File.open(path, 'a') do |file|
Chris@1296 144 file.puts(line.sub(key, new_key))
Chris@1296 145 end
Chris@1296 146 end
Chris@1296 147 end
Chris@1296 148
Chris@1296 149 desc 'Check parsing yaml by psych library on Ruby 1.9.'
Chris@1296 150
Chris@1296 151 # On Fedora 12 and 13, if libyaml-devel is available,
Chris@1296 152 # in case of installing by rvm,
Chris@1296 153 # Ruby 1.9 default yaml library is psych.
Chris@1296 154
Chris@1296 155 task :check_parsing_by_psych do
Chris@1296 156 begin
Chris@1296 157 require 'psych'
Chris@1296 158 parser = Psych::Parser.new
Chris@1296 159 dir = ENV['DIR'] || './config/locales'
Chris@1296 160 files = Dir.glob(File.join(dir,'*.yml'))
Chris@1296 161 files.sort.each do |filename|
Chris@1296 162 next if File.directory? filename
Chris@1296 163 puts "parsing #{filename}..."
Chris@1296 164 begin
Chris@1296 165 parser.parse File.open(filename)
Chris@1296 166 rescue Exception => e1
Chris@1296 167 puts(e1.message)
Chris@1296 168 puts("")
Chris@1296 169 end
Chris@1296 170 end
Chris@1296 171 rescue Exception => e
Chris@1296 172 puts(e.message)
Chris@1296 173 end
Chris@1296 174 end
Chris@1296 175 end