# This script pulls translation files from Transifex and ensures they are in the format we need. # You need the Transifex client installed. # http://docs.transifex.com/developer/client/setup # # Don't use this script to create pull requests. Do translations in Transifex. The Discourse # team will pull them in. require 'open3' require 'psych' require 'set' require 'fileutils' require_relative '../lib/i18n/locale_file_walker' YML_DIRS = ['config/locales', 'plugins/poll/config/locales', 'plugins/discourse-details/config/locales', 'plugins/discourse-narrative-bot/config/locales', 'plugins/discourse-nginx-performance-report/config/locales', 'plugins/discourse-presence/config/locales'] YML_FILE_PREFIXES = ['server', 'client'] if `which tx`.strip.empty? puts '', 'The Transifex client needs to be installed to use this script.' puts 'Instructions are here: http://docs.transifex.com/client/setup/' puts '', 'On Mac:', '' puts ' sudo easy_install pip' puts ' sudo pip install transifex-client', '' exit 1 end if ARGV.include?('force') STDERR.puts 'Usage: ruby pull_translations.rb [languages]' STDERR.puts 'Example: ruby pull_translations.rb de it', '' exit 1 end def get_languages if ARGV.empty? Dir.glob(File.expand_path('../../config/locales/client.*.yml', __FILE__)) .map { |x| x.split('.')[-2] } else ARGV end end def yml_path(dir, prefix, language) path = "../../#{dir}/#{prefix}.#{language}.yml" File.expand_path(path, __FILE__) end def yml_path_if_exists(dir, prefix, language) path = yml_path(dir, prefix, language) File.exists?(path) ? path : nil end languages = get_languages.select { |x| x != 'en' }.sort # ensure that all locale files exists. tx doesn't create missing locale files during pull YML_DIRS.each do |dir| YML_FILE_PREFIXES.each do |prefix| next unless yml_path_if_exists(dir, prefix, 'en') languages.each do |language| filename = yml_path(dir, prefix, language) FileUtils.touch(filename) unless File.exists?(filename) end end end puts 'Pulling new translations...', '' command = "tx pull --mode=developer --language=#{languages.join(',')} --force" return_value = Open3.popen2e(command) do |_, stdout_err, wait_thr| while (line = stdout_err.gets) puts line end wait_thr.value end puts '' unless return_value.success? STDERR.puts 'Something failed. Check the output above.', '' exit return_value.exitstatus end YML_FILE_COMMENTS = <= next_line[/^\s*/].size # remove lines which have an empty value and are not followed # by a key on the next level lines[i] = nil end end end break if lines.compact!.nil? end File.open(filename, 'w+') do |f| f.puts(lines) end end YML_DIRS.each do |dir| YML_FILE_PREFIXES.each do |prefix| english_alias_data = get_english_alias_data(dir, prefix) languages.each do |language| filename = yml_path_if_exists(dir, prefix, language) if filename # The following methods were added to handle a bug in Transifex's yml. Should not be needed now. # fix_invalid_yml_keys(filename) # fix_invalid_yml(filename) # TODO check if this is still needed with recent Transifex changes # Nov 14, 2017: yup, still needed add_anchors_and_aliases(english_alias_data, filename) update_file_header(filename, language) end end end end