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