| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- module Jekyll
- @parsedlangs = {}
- def self.langs
- @parsedlangs
- end
- def self.setlangs(l)
- @parsedlangs = l
- end
- class Site
- alias :process_org :process
- def process
- if !self.config['baseurl']
- self.config['baseurl'] = ""
- end
- #Variables
- config['baseurl_root'] = self.config['baseurl']
- baseurl_org = self.config['baseurl']
- languages = self.config['languages']
- exclude_org = self.exclude
- dest_org = self.dest
- #Loop
- self.config['lang'] = self.config['default_lang'] = languages.first
- puts
- puts "Building site for default language: \"#{self.config['lang']}\" to: #{self.dest}"
- process_org
- languages.drop(1).each do |lang|
- # Build site for language lang
- @dest = @dest + "/" + lang
- self.config['baseurl'] = self.config['baseurl'] + "/" + lang
- self.config['lang'] = lang
-
- # exclude folders or files from beeing copied to all the language folders
- exclude_from_localizations = self.config['exclude_from_localizations'] || []
- @exclude = @exclude + exclude_from_localizations
- puts "Building site for language: \"#{self.config['lang']}\" to: #{self.dest}"
- process_org
- #Reset variables for next language
- @dest = dest_org
- @exclude = exclude_org
- self.config['baseurl'] = baseurl_org
- end
- Jekyll.setlangs({})
- puts 'Build complete'
- end
- alias :read_posts_org :read_posts
- def read_posts(dir)
- if dir == ''
- read_posts("_i18n/#{self.config['lang']}/")
- else
- read_posts_org(dir)
- end
- end
- end
- class LocalizeTag < Liquid::Tag
- def initialize(tag_name, key, tokens)
- super
- @key = key.strip
- end
- def render(context)
- if "#{context[@key]}" != "" #Check for page variable
- key = "#{context[@key]}"
- else
- key = @key
- end
- lang = context.registers[:site].config['lang']
- unless Jekyll.langs.has_key?(lang)
- puts "Loading translation from file #{context.registers[:site].source}/_i18n/#{lang}.yml"
- Jekyll.langs[lang] = YAML.load_file("#{context.registers[:site].source}/_i18n/#{lang}.yml")
- end
- translation = Jekyll.langs[lang].access(key) if key.is_a?(String)
- if translation.nil? or translation.empty?
- translation = Jekyll.langs[context.registers[:site].config['default_lang']].access(key)
- puts "Missing i18n key: #{lang}:#{key}"
- puts "Using translation '%s' from default language: %s" %[translation, context.registers[:site].config['default_lang']]
- end
- translation
- end
- end
- module Tags
- class LocalizeInclude < IncludeTag
- def render(context)
- if "#{context[@file]}" != "" #Check for page variable
- file = "#{context[@file]}"
- else
- file = @file
- end
- includes_dir = File.join(context.registers[:site].source, '_i18n/' + context.registers[:site].config['lang'])
- if File.symlink?(includes_dir)
- return "Includes directory '#{includes_dir}' cannot be a symlink"
- end
- if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./
- return "Include file '#{file}' contains invalid characters or sequences"
- end
- Dir.chdir(includes_dir) do
- choices = Dir['**/*'].reject { |x| File.symlink?(x) }
- if choices.include?(file)
- source = File.read(file)
- partial = Liquid::Template.parse(source)
- context.stack do
- context['include'] = parse_params(context) if @params
- contents = partial.render(context)
- site = context.registers[:site]
- ext = File.extname(file)
- converter = site.converters.find { |c| c.matches(ext) }
- contents = converter.convert(contents) unless converter.nil?
- contents
- end
- else
- "Included file '#{file}' not found in #{includes_dir} directory"
- end
- end
- end
- end
- end
- end
- unless Hash.method_defined? :access
- class Hash
- def access(path)
- ret = self
- path.split('.').each do |p|
- if p.to_i.to_s == p
- ret = ret[p.to_i]
- else
- ret = ret[p.to_s] || ret[p.to_sym]
- end
- break unless ret
- end
- ret
- end
- end
- end
- Liquid::Template.register_tag('t', Jekyll::LocalizeTag)
- Liquid::Template.register_tag('translate', Jekyll::LocalizeTag)
- Liquid::Template.register_tag('tf', Jekyll::Tags::LocalizeInclude)
- Liquid::Template.register_tag('translate_file', Jekyll::Tags::LocalizeInclude)
|