Skip to content

Instantly share code, notes, and snippets.

@remvee
Last active December 18, 2015 03:49
Show Gist options
  • Select an option

  • Save remvee/5720994 to your computer and use it in GitHub Desktop.

Select an option

Save remvee/5720994 to your computer and use it in GitHub Desktop.
Rake task to sort i18n yaml keys
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