vkill'blog

“技术本身没有太多价值,掌握了新的思考方式才是真的收获”

rake auto generate i18n.zh-CN.activerecord

21:52 , vkill
这个 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
类别:ruby & rails | Tags: , , , , , , | 0 条评论, 1879 次阅读
网友评论(0):
发表评论:

Nickname: 
Email:
Site URI: