Last active
December 18, 2015 03:49
-
-
Save remvee/5720994 to your computer and use it in GitHub Desktop.
Rake task to sort i18n yaml keys
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| namespace :i18n do | |
| task :sort_keys do | |
| Dir[Rails.root + "config/locales/*.yml"].each do |fname| | |
| text = to_yaml(sort_by_key(YAML.load(File.read(fname)))).strip + "\n" | |
| File.open(fname, "w"){|fd| fd.write(text)} | |
| end | |
| end | |
| end | |
| def sort_by_key(m) | |
| case m | |
| when Hash | |
| m.keys.sort.map do |key| | |
| val = case m[key] | |
| when Hash | |
| sort_by_key(m[key]) | |
| when Array | |
| m[key].map{|v| sort_by_key(v)} | |
| else | |
| m[key] | |
| end | |
| {key => val} | |
| end.reduce(&:merge) | |
| else | |
| m | |
| end | |
| end | |
| def to_yaml(val, indent = "") | |
| nl = indent.size < 4 ? "\n\n" : "\n" | |
| case val | |
| when Hash | |
| val.map do |k,v| | |
| k = k.inspect if k =~ /\A(yes|no|true|false|on|off|null|\d.*|.*[^\w].*)\Z/i | |
| "#{nl}#{indent}#{k}: " + to_yaml(v, indent + " ") | |
| end.join | |
| when Array | |
| val.map do |v| | |
| "#{nl}#{indent}- " + to_yaml(v, indent + " ") | |
| end.join.gsub(/^( *- )\s+/m){$1} | |
| when String | |
| if val =~ /\n/ | |
| "|\n#{indent}" + val.split("\n").join("\n#{indent}") | |
| else | |
| val.inspect | |
| end | |
| when NilClass | |
| "null" | |
| when Symbol, Numeric, FalseClass, TrueClass | |
| val.inspect | |
| else | |
| raise ArgumentError, val.inspect | |
| end.gsub(/\s+$/, "") | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment