这个 rake 主要用来在rails中自动生成 config/locales/zh-CN.model.yml ,建好model后执行一下,主要为了提高工作效率用,写的比较简陋,呵呵,凑合着用哈先
#encoding: utf-8
#
# by: vkill vkill.net@gmail.com
# updated_at: 2011.6.6
# first, please install psych gem, YAML dump support Chinese
#
# usage:
# write it to Rails.root.join("lib/tasks/model_i18n_column.rake")
# >rake model:i18n_column
#
require 'find'
require 'fileutils'
require 'tmpdir'
namespace :model do
desc 'this is auto generate i18n.zh-CN.activerecord'
task :i18n_column => :environment do
t = {
"id" => '序号',
"type" => '类型',
"name" => '名称',
"state" => '状态',
"title" => '标题',
"content" => '正文',
"created_at" => '创建时间',
"updated_at" => '更新时间',
"user_id" => '用户id'
}
i18n_new = {
"zh-CN" => {
"activemodel" => {
"models" => {},
"attributes" => {}
},
"activerecord" => {
"models" => {},
"attributes" => {}
}
}
}
i18n_file = Rails.root.join("config/locales/zh-CN.model.yml").to_s
i18n_tmp = File.join(Dir.tmpdir, File.basename(i18n_file) + "_" + Time.now.strftime('%Y%m%d%H%M%S'))
i18n = YAML.load_file(i18n_file) || i18n_new
Find.find(Rails.root.join("app/models").to_s) do |path|
if FileTest.directory?(path)
if File.basename(path)[0] == ?.
Find.prune
else
next
end
else
require path
end
end
ObjectSpace.each_object(Class) do |k|
if k.ancestors.include?(ActiveRecord::Base)
if k.name != "ActiveRecord::Base" and !k.abstract_class?
if k.table_exists?
if k.column_names.include?('type') and k.subclasses.size > 0
next
end
#puts k.name
model = k.name.underscore
i18n_new["zh-CN"]["activerecord"]["models"][model] = i18n["zh-CN"]["activerecord"]["models"][model] || model
i18n_new["zh-CN"]["activerecord"]["attributes"][model] = i18n["zh-CN"]["activerecord"]["attributes"][model] || {}
k.column_names.each do |column|
if !i18n_new["zh-CN"]["activerecord"]["attributes"][model][column]
i18n_new["zh-CN"]["activerecord"]["attributes"][model][column] = t[column.to_s] || column.to_s
end
end
if enums = i18n["zh-CN"]["activerecord"]["attributes"][model]["enums"]
i18n_new["zh-CN"]["activerecord"]["attributes"][model]["enums"] = enums
end
end
end
end
end
FileUtils.cp(i18n_file, i18n_tmp)
require 'psych'
require 'yaml'
YAML::ENGINE.yamler= 'psych'
File.open(i18n_file, "wb") do |f|
f.write YAML.dump(i18n_new)
end
YAML::ENGINE.yamler= 'syck'
puts "updated #{i18n_file}, old file backup to #{i18n_tmp}"
end
end
2011.12.1 更新:
有个更好的方法,参见 https://github.com/vkill/i18n_attributes 这个gem
Last modified by vkill on2011/12/02 18:48
#encoding: utf-8
#
# by: vkill vkill.net@gmail.com
# updated_at: 2011.6.6
# first, please install psych gem, YAML dump support Chinese
#
# usage:
# write it to Rails.root.join("lib/tasks/model_i18n_column.rake")
# >rake model:i18n_column
#
require 'find'
require 'fileutils'
require 'tmpdir'
namespace :model do
desc 'this is auto generate i18n.zh-CN.activerecord'
task :i18n_column => :environment do
t = {
"id" => '序号',
"type" => '类型',
"name" => '名称',
"state" => '状态',
"title" => '标题',
"content" => '正文',
"created_at" => '创建时间',
"updated_at" => '更新时间',
"user_id" => '用户id'
}
i18n_new = {
"zh-CN" => {
"activemodel" => {
"models" => {},
"attributes" => {}
},
"activerecord" => {
"models" => {},
"attributes" => {}
}
}
}
i18n_file = Rails.root.join("config/locales/zh-CN.model.yml").to_s
i18n_tmp = File.join(Dir.tmpdir, File.basename(i18n_file) + "_" + Time.now.strftime('%Y%m%d%H%M%S'))
i18n = YAML.load_file(i18n_file) || i18n_new
Find.find(Rails.root.join("app/models").to_s) do |path|
if FileTest.directory?(path)
if File.basename(path)[0] == ?.
Find.prune
else
next
end
else
require path
end
end
ObjectSpace.each_object(Class) do |k|
if k.ancestors.include?(ActiveRecord::Base)
if k.name != "ActiveRecord::Base" and !k.abstract_class?
if k.table_exists?
if k.column_names.include?('type') and k.subclasses.size > 0
next
end
#puts k.name
model = k.name.underscore
i18n_new["zh-CN"]["activerecord"]["models"][model] = i18n["zh-CN"]["activerecord"]["models"][model] || model
i18n_new["zh-CN"]["activerecord"]["attributes"][model] = i18n["zh-CN"]["activerecord"]["attributes"][model] || {}
k.column_names.each do |column|
if !i18n_new["zh-CN"]["activerecord"]["attributes"][model][column]
i18n_new["zh-CN"]["activerecord"]["attributes"][model][column] = t[column.to_s] || column.to_s
end
end
if enums = i18n["zh-CN"]["activerecord"]["attributes"][model]["enums"]
i18n_new["zh-CN"]["activerecord"]["attributes"][model]["enums"] = enums
end
end
end
end
end
FileUtils.cp(i18n_file, i18n_tmp)
require 'psych'
require 'yaml'
YAML::ENGINE.yamler= 'psych'
File.open(i18n_file, "wb") do |f|
f.write YAML.dump(i18n_new)
end
YAML::ENGINE.yamler= 'syck'
puts "updated #{i18n_file}, old file backup to #{i18n_tmp}"
end
end
2011.12.1 更新:
有个更好的方法,参见 https://github.com/vkill/i18n_attributes 这个gem
Last modified by vkill on2011/12/02 18:48
网友评论(0):


