Class: Xlocalize::Executor

Inherits:
Object
  • Object
show all
Defined in:
lib/xlocalize/executor.rb

Instance Method Summary collapse

Instance Method Details

#download(wti, locales) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/xlocalize/executor.rb', line 91

def download(wti, locales)
  begin
    locales.each do |locale|
      puts "Downloading translations for #{locale}"
      translations = wti.pull(locale)
      
      out_list_of_translations_of_locale(wti, locale, translations).each do |out|
        File.open(out["path"], "w") do |file|
          file.write(out["content"])
          puts "Done saving #{out['path']}.".green
        end
      end
    end
  rescue => err
    puts err.to_s.red
  end
end

#export_master(wti, project, target, excl_prefix, master_lang) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/xlocalize/executor.rb', line 19

def export_master(wti, project, target, excl_prefix, master_lang)
  master_file_name = locale_file_name(master_lang)
  
  # hacky way to finish xcodebuild -exportLocalizations script, because
  # since Xcode7.3 & OS X Sierra script hangs even though it produces
  # xliff output
  # http://www.openradar.me/25857436
  File.delete(master_file_name) if File.exist?(master_file_name)
  system "xcodebuild -exportLocalizations -localizationPath ./ -project #{project} & sleep 0"
  while !File.exist?(master_file_name) do
    sleep(1)
  end

  purelyze(master_lang, target, excl_prefix, project)
  push_master_file(wti, master_lang, master_file_name)
end

#filename_from_xliff_provided_filename(file_name, locale) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/xlocalize/executor.rb', line 109

def filename_from_xliff_provided_filename(file_name, locale)
  parts = file_name.split('/')
  name = ""
  parts.each_with_index do |part, idx|
    name += "/" if idx > 0
    if part.end_with?(".lproj")
      name += "#{locale}.lproj"
    elsif idx+1 == parts.count
      # TODO: join all parts till the last '.'
      name += "#{part.split('.')[0]}.strings"
    else
      name += part
    end
  end
  return name
end

#import(locales) ⇒ Object



161
162
163
164
165
166
167
168
# File 'lib/xlocalize/executor.rb', line 161

def import(locales)
  puts 'Importing translations' if $VERBOSE
  locales.each do |locale|
    import_xliff(locale)
    import_plurals_if_needed(locale)
    puts "Done #{locale}".green if $VERBOSE
  end
end

#import_plurals_if_needed(locale) ⇒ Object



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/xlocalize/executor.rb', line 142

def import_plurals_if_needed(locale)
  plurals_fname = "#{locale}_plurals.yaml"
  return if !File.exist?(plurals_fname)
  plurals_yml = YAML.load_file(plurals_fname)
  plurals_yml[locale].each do |fname, trans_units|
    content = {}
    trans_units.each do |key, vals|
      content[key] = {
        "NSStringLocalizedFormatKey" => "%\#@value@",
        "value" => vals.merge({
          "NSStringFormatSpecTypeKey" => "NSStringPluralRuleType",
          "NSStringFormatValueTypeKey" => "d"
        })
      }
    end
    File.open(fname, 'w') { |f| f.write content.to_plist }
  end
end

#import_xliff(locale) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/xlocalize/executor.rb', line 126

def import_xliff(locale)
  Nokogiri::XML(open("#{locale}.xliff")).xpath("//xmlns:file").each do |node|
    File.open(filename_from_xliff_provided_filename(node["original"], locale), "w") do |file|
      (node > "body > trans-unit").each do |trans_unit|
        key = trans_unit["id"]
        target = (trans_unit > "target").text
        note = (trans_unit > "note").text
        note = "(No Commment)" if note.length <= 0
        
        file.write "/* #{note} */\n"
        file.write "\"#{key}\" = #{target.inspect};\n\n"
      end
    end
  end
end

#locale_file_name(locale) ⇒ Object



15
16
17
# File 'lib/xlocalize/executor.rb', line 15

def locale_file_name(locale)
  return "#{locale}.xliff"
end

#out_list_of_translations_of_locale(wti, locale, translations) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/xlocalize/executor.rb', line 74

def out_list_of_translations_of_locale(wti, locale, translations)
  puts "Downloading translations for #{locale}"
  translations = wti.pull(locale)
  plurals_content = translations['plurals']

  out_list = [{
    "path" => "#{locale}.xliff",
    "content" => translations['xliff']
  }]
  out_list << {
    "path" => "#{locale}_plurals.yaml",
    "content" => plurals_content
  } if not plurals_content.nil?

  return out_list
end

#plurals_file_name(locale) ⇒ Object



11
12
13
# File 'lib/xlocalize/executor.rb', line 11

def plurals_file_name(locale)
  return locale_file_name(locale) << '_plurals.yml'
end

#purelyze(locale, target, excl_prefix, project) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/xlocalize/executor.rb', line 53

def purelyze(locale, target, excl_prefix, project)
  locale_file_name = locale_file_name(locale)
  doc = Nokogiri::XML(open(locale_file_name))

  puts "Removing all files not matching required targets" if $VERBOSE
  doc.filter_not_target_files(target)
  puts "Removing trans-unit's having reserverd prefix in their sources" if $VERBOSE
  doc.filter_trans_units(excl_prefix)
  puts "Filtering plurals" if $VERBOSE
  plurals = doc.filter_plurals(project)
  puts "Removing all files having no trans-unit elements after removal" if $VERBOSE
  doc.filter_empty_files

  puts "Writing modified XLIFF file to #{locale_file_name}" if $VERBOSE
  File.open(locale_file_name, 'w') { |f| f.write(doc.to_xml) }
  if !plurals.empty?
    puts "Writing plurals to plurals YAML file" if $VERBOSE
    File.open(plurals_file_name(locale), 'w') { |f| f.write({locale => plurals}.to_yaml) }
  end
end

#push_master_file(wti, master_lang, master_file_name) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/xlocalize/executor.rb', line 36

def push_master_file(wti, master_lang, master_file_name)
  # Pushing master file to WebtranslateIt
  begin
    puts "Uploading master file to WebtranslateIt"
    file = File.open(master_file_name, 'r')
    plurals_path = plurals_file_name(master_lang)
    plurals_file = File.exist?(plurals_path) ? File.open(plurals_path, 'r') : nil
    wti.push_master(file, plurals_file)
    puts "Done.".green
  rescue => err
    puts err.to_s.red
  ensure
    file.close unless file.nil?
    plurals_file.close unless plurals_file.nil?
  end if !wti.nil?
end