-
Notifications
You must be signed in to change notification settings - Fork 46
/
l10n.rake
128 lines (108 loc) · 4.75 KB
/
l10n.rake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# encoding: utf-8
namespace :l10n do
# flattens the yaml hash into 1 dimensional hash
def flatten(hash, namespace=nil)
flattened = {}
namespace = namespace + '.' if namespace
hash.each do |key, value|
if value.class == Hash
flattened.merge!(flatten(value, "#{namespace}#{key}"))
else
flattened["#{namespace}#{key}"] = value
end
end
return flattened
end
# given a nested hash and key as string, find the value
# key can be indicate nesting by being dot separated
def getValue(hash, key)
key.to_s.split('.').inject(hash) { |h, k| h[k] unless h.nil? }
end
# set a value in the hash given a string as key much like getValue
def setValue(hash, key, value)
subkeys = key.split('.')
lastkey = subkeys.pop
subhash = subkeys.inject(hash) do |h, k|
h[k] = {} if h[k].nil?
h[k]
end
subhash[lastkey] = value
end
desc "Determine diff of keys between two yml files. Call by keys_diff[filename1, filename2]"
task :keys_diff, :file1, :file2 do |t, args|
file1 = YAML::load(File.open(args[:file1]))
file2 = YAML::load(File.open(args[:file2]))
# ignore language designation, so start with first.second
file1_keys = flatten(file1.first.second).keys
file2_keys = flatten(file2.first.second).keys
puts "Keys in #{args[:file2]} that are missing in #{args[:file1]}:"
puts (file2_keys - file1_keys).sort
puts "\n\nKeys in #{args[:file1]} that are missing in #{args[:file2]}:"
puts (file1_keys - file2_keys).sort
end
desc "Convert CSV to YAML file, pass in CSV filename and output YAML filename"
task :csv_to_yaml, :lang, :csvfile, :yamlfile do |t, args|
require 'fastercsv'
phrases = {}
row_index = 0
FasterCSV.foreach(args[:csvfile], {:headers => :first_row, :return_headers => true, :encoding => 'u'}) do |row|
row_index += 1
# Skipping row if key has whitespace of if it is header row
if (row['key'].strip =~ /\s/) == nil && !row.header_row?
phrase = row[args[:lang]]
phrase = phrase.strip if phrase
setValue(phrases, "#{args[:lang]}.#{row['key']}", phrase)
else
puts "Skipping row ##{row_index}: #{row.to_csv[0..60]}"
end
end
File.open(args[:yamlfile], "w") do |f|
f.write("# DO NOT EDIT THIS FILE MANUALLY #\n")
f.write("# This file has been auto-generated from our Google Docs Spreadsheet.\n")
f.write(phrases.to_yaml)
end
end
task :get_english_yaml, :file1, :file2, :en_file do |t, args|
file1 = YAML::load(File.open(args[:file1]))
file2 = YAML::load(File.open(args[:file2]))
en = YAML::load(File.open(args[:en_file])).first.second
# ignore language designation, so start with first.second
file1_keys = flatten(file1.first.second).keys
file2_keys = flatten(file2.first.second).keys
newHash = {}
(file2_keys - file1_keys).each do |key|
value = getValue(en, key)
setValue(newHash, "#{file1.first.first}.#{key}", value)
end
puts newHash.to_yaml
end
desc "Convert a YAML file to CSV. Second parameter is secondary language to include, defaults to English."
task :yaml_to_csv, :language1, :language2 do |t, args|
require 'fastercsv'
args = {:language2 => 'en'}.merge(args)
path = Rails.root + "config/locales/allourideas/"
file1 = YAML::load(File.open(path + "#{args[:language1]}.yml"))
file2 = YAML::load(File.open(path + "#{args[:language2]}.yml"))
userfacing = YAML::load(File.open(path + "he.yml"))
hash1 = flatten(file1.first.second)
hash2 = flatten(file2.first.second)
userfacing_hash = flatten(userfacing.first.second)
csv_string = FasterCSV.generate do |csv|
csv << ["key", args[:language2], args[:language1]]
csv << ['Thank you for helping to internationalize allourideas.org. This spreadsheet has three columns. The first column is a "key". This column is for our code and you should not worry about it or change it. The second column is the English phrase that appears on the website. The final column is where you should add the appropriate phrase in your language.
Some of the strings will include "special characters" like "\n"; you should just ignore these special characters and change the text around them.
For example, the key
"X_votes_on_Y_ideas
has this representation in English
%{1}%{votes_count}%{_1} votes on %{2}%{ideas_count}%{_2} ideas
If you were translating to French you would write something like:
%{1}%{votes_count}%{_1} voix sur les %{2}%{ideas_count}%{_2} idées
Thank you again for your help. This process can be confusing, so please do not hesitate to ask questions.
']
(hash1.keys + (userfacing_hash.keys - hash1.keys)).sort.each do |key|
csv << [key, hash2[key], hash1[key]]
end
end
puts csv_string
end
end