cirandas.net

ref: master

lib/tasks/gettext.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
#
# Added for Ruby-GetText-Package
#

require 'pathname'

require 'gettext/tools/task'
GetText::Tools::Task.define do |task|
  task.domain = 'noosfero'
  task.enable_po = true
  task.po_base_directory = 'po'
  task.mo_base_directory = 'locale'
  task.files = [
    "{app,lib}/**/*.{rb,rhtml,erb}",
    'config/initializers/*.rb',
    'public/*.html.erb',
    'public/designs/themes/{base,noosfero,profile-base}/*.{rhtml,html.erb}',
  ].map { |pattern| Dir.glob(pattern) }.flatten

  # installed, no po/ available
  if !File.directory?(task.po_base_directory)
    task.locales = Dir.chdir(task.mo_base_directory) { Dir.glob('*') }
  end
end

task 'gettext:mo:update' => :symlinkmo
task :symlinkmo do
  langmap = {
    'pt' => 'pt_BR',
  }
  root = Pathname.new(File.dirname(__FILE__) + '/../..').expand_path
  mkdir_p(root.join('locale'))
  Dir.glob(root.join('po/*/')).each do |dir|
    lang = File.basename(dir)
    orig_lang = langmap[lang] || lang
    mkdir_p(root.join('locale', "#{lang}", 'LC_MESSAGES'))
    ['iso_3166'].each do |domain|
      origin = "/usr/share/locale/#{orig_lang}/LC_MESSAGES/#{domain}.mo"
      target = root.join('locale', "#{lang}", 'LC_MESSAGES', "#{domain}.mo")
      if !File.symlink?(target)
        ln_sf origin, target
      end
    end
  end
end

Dir.glob('plugins/*').each do |plugindir|
  plugin = File.basename(plugindir)
  po_root = File.join(plugindir, 'po')
  next if Dir["#{po_root}/**/*.po"].empty?

  namespace "noosfero:plugin:#{plugin}" do
    GetText::Tools::Task.define do |task|
      task.domain = plugin
      task.enable_po = true
      task.po_base_directory = po_root
      task.mo_base_directory = File.join(plugindir, 'locale')
      task.files = Dir["#{plugindir}/**/*.{rb,html.erb}"]
    end

    task "gettext:po:cleanup" do
      plugin_pot = File.join(po_root, plugin + '.pot')
      if File.exists?(plugin_pot) && system("LANG=C msgfmt --statistics --output /dev/null #{plugin_pot} 2>&1 | grep -q '^0 translated messages.$'")
        rm_f plugin_pot
      end
      sh 'find', po_root, '-type', 'd', '-empty', '-delete'
    end

    task "gettext:po:update" do
      Rake::Task["noosfero:plugin:#{plugin}:gettext:po:cleanup"].invoke
    end
    task "gettext:mo:update" do
      Rake::Task["noosfero:plugin:#{plugin}:gettext:po:cleanup"].invoke
    end
  end

  task 'gettext:po:update' => "noosfero:plugin:#{plugin}:gettext:po:update"
  task 'gettext:mo:update' => "noosfero:plugin:#{plugin}:gettext:mo:update"
end

def checkpo(po_files)
  max = po_files.map(&:size).max
  po_files.each do |po|
    printf "%#{max}s: ", po
    system "msgfmt --statistics --output /dev/null " + po
  end
end

desc "checks core translation files"
task :checkpo do
  checkpo(Dir.glob('po/*/noosfero.po'))
end

languages = Dir.glob('po/*').select { |d| File.directory?(d) }.map { |d| File.basename(d) }
languages.each do |lang|
  desc "checks #{lang} translation files"
  task "checkpo:#{lang}" do
    checkpo(Dir.glob("po/#{lang}/*.po") + Dir.glob("plugins/*/po/#{lang}/*.po"))
  end
end

task :makemo => 'tmp/makemo.stamp'
file 'tmp/makemo.stamp' do |t|
  sh 'find po plugins/*/po -name "*.po" -exec touch "{}" ";"'
  Rake::Task['gettext:mo:update'].invoke
  touch t.name
end

task :updatepo => 'gettext:po:update' do
  Dir.glob('{po,plugins}/**/*.po').each do |po|
    sh "cp #{po} #{po}.tmp && msguniq -o #{po} #{po}.tmp && rm -f #{po}.tmp"
  end
end

# vim: ft=ruby