ソースを参照

Add i18n support for docs.

zhixin 11 年 前
コミット
1fd6c97464
38 ファイル変更272 行追加72 行削除
  1. 4 0
      docs/_config.yml
  2. 16 0
      docs/_i18n/en.yml
  3. 0 0
      docs/_i18n/en/documentation/column-options.md
  4. 0 0
      docs/_i18n/en/documentation/events.md
  5. 0 0
      docs/_i18n/en/documentation/localizations.md
  6. 0 0
      docs/_i18n/en/documentation/methods.md
  7. 0 0
      docs/_i18n/en/documentation/table-options.md
  8. 0 0
      docs/_i18n/en/examples/align.md
  9. 0 0
      docs/_i18n/en/examples/basic.md
  10. 0 0
      docs/_i18n/en/examples/card-view.md
  11. 0 0
      docs/_i18n/en/examples/columns.md
  12. 0 0
      docs/_i18n/en/examples/events.md
  13. 0 0
      docs/_i18n/en/examples/format.md
  14. 0 0
      docs/_i18n/en/examples/hide-header.md
  15. 0 0
      docs/_i18n/en/examples/methods.md
  16. 0 0
      docs/_i18n/en/examples/note.md
  17. 0 0
      docs/_i18n/en/examples/pagination.md
  18. 0 0
      docs/_i18n/en/examples/select.md
  19. 0 0
      docs/_i18n/en/examples/sort.md
  20. 0 0
      docs/_i18n/en/examples/style.md
  21. 0 0
      docs/_i18n/en/examples/toolbar.md
  22. 0 0
      docs/_i18n/en/extensions/editable.md
  23. 0 0
      docs/_i18n/en/faq/faq.md
  24. 0 0
      docs/_i18n/en/getting-started/download.md
  25. 0 0
      docs/_i18n/en/getting-started/grunt.md
  26. 0 0
      docs/_i18n/en/getting-started/translations.md
  27. 0 0
      docs/_i18n/en/getting-started/usage.md
  28. 0 0
      docs/_i18n/en/getting-started/whats-include.md
  29. 2 2
      docs/_includes/header.html
  30. 50 32
      docs/_includes/nav/main.html
  31. 2 2
      docs/_layouts/default.html
  32. 145 0
      docs/_plugins/multiple-languages.rb
  33. 17 0
      docs/assets/js/common.js
  34. 7 7
      docs/documentation.md
  35. 16 16
      docs/examples.md
  36. 3 3
      docs/extensions.md
  37. 3 3
      docs/faq.md
  38. 7 7
      docs/getting-started.md

+ 4 - 0
docs/_config.yml

@@ -10,6 +10,10 @@ highlighter: rouge
 # Permalinks
 permalink: pretty
 
+# Languages
+languages: ["en", "zh-cn", "fr"]
+languages_string: ["English", "Chinese", "French"]
+
 # Custom vars
 current_version: 1.5.0
 repo: https://github.com/wenzhixin/bootstrap-table

+ 16 - 0
docs/_i18n/en.yml

@@ -0,0 +1,16 @@
+pages:
+  getting_started:
+    title: "Getting started"
+    lead: "An overview of Bootstrap Table, how to download and use, basic templates, and more."
+  examples:
+    title: "Examples"
+    lead: "The examples of bootstrap table."
+  documentation:
+    title: "Documentation"
+    lead: "The documentation contains Table Properties, Column Properties, Events, Methods, and much more."
+  extensions:
+    title: "Extensions"
+    lead: "The extensions of bootstrap table."
+  faq:
+    title: "FAQ"
+    lead: "Frequently Asked Questions."

docs/_includes/documentation/column-options.md → docs/_i18n/en/documentation/column-options.md


docs/_includes/documentation/events.md → docs/_i18n/en/documentation/events.md


docs/_includes/documentation/localizations.md → docs/_i18n/en/documentation/localizations.md


docs/_includes/documentation/methods.md → docs/_i18n/en/documentation/methods.md


docs/_includes/documentation/table-options.md → docs/_i18n/en/documentation/table-options.md


docs/_includes/examples/align.md → docs/_i18n/en/examples/align.md


docs/_includes/examples/basic.md → docs/_i18n/en/examples/basic.md


docs/_includes/examples/card-view.md → docs/_i18n/en/examples/card-view.md


docs/_includes/examples/columns.md → docs/_i18n/en/examples/columns.md


docs/_includes/examples/events.md → docs/_i18n/en/examples/events.md


docs/_includes/examples/format.md → docs/_i18n/en/examples/format.md


docs/_includes/examples/hide-header.md → docs/_i18n/en/examples/hide-header.md


docs/_includes/examples/methods.md → docs/_i18n/en/examples/methods.md


docs/_includes/examples/note.md → docs/_i18n/en/examples/note.md


docs/_includes/examples/pagination.md → docs/_i18n/en/examples/pagination.md


docs/_includes/examples/select.md → docs/_i18n/en/examples/select.md


docs/_includes/examples/sort.md → docs/_i18n/en/examples/sort.md


docs/_includes/examples/style.md → docs/_i18n/en/examples/style.md


docs/_includes/examples/toolbar.md → docs/_i18n/en/examples/toolbar.md


docs/_includes/extensions/editable.md → docs/_i18n/en/extensions/editable.md


docs/_includes/faq/faq.md → docs/_i18n/en/faq/faq.md


docs/_includes/getting-started/download.md → docs/_i18n/en/getting-started/download.md


docs/_includes/getting-started/grunt.md → docs/_i18n/en/getting-started/grunt.md


docs/_includes/getting-started/translations.md → docs/_i18n/en/getting-started/translations.md


docs/_includes/getting-started/usage.md → docs/_i18n/en/getting-started/usage.md


docs/_includes/getting-started/whats-include.md → docs/_i18n/en/getting-started/whats-include.md


+ 2 - 2
docs/_includes/header.html

@@ -7,9 +7,9 @@
 
 <title>
   {% if page.layout == "home" %}
-    {{ page.title }}
+    {% t page.title %}
   {% else %}
-    {{ page.title }} &middot; Bootstrap Table
+    {% t page.title %} &middot; Bootstrap Table
   {% endif %}
 </title>
 

+ 50 - 32
docs/_includes/nav/main.html

@@ -1,35 +1,53 @@
 <header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
-  <div class="container">
-    <div class="navbar-header">
-      <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
-        <span class="sr-only">Toggle navigation</span>
-        <span class="icon-bar"></span>
-        <span class="icon-bar"></span>
-        <span class="icon-bar"></span>
-      </button>
-      <a href="../" class="navbar-brand">Bootstrap Table</a>
+    <div class="container">
+        <div class="navbar-header">
+            <button class="navbar-toggle collapsed" type="button" data-toggle="collapse"
+                    data-target=".bs-navbar-collapse">
+                <span class="sr-only">Toggle navigation</span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+                <span class="icon-bar"></span>
+            </button>
+            <a href="{{ site.baseurl }}/" class="navbar-brand">Bootstrap Table</a>
+        </div>
+        <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
+            <ul class="nav navbar-nav">
+                <li {% if page.slug == "getting-started" %} class="active"{% endif %}>
+                    <a href="{{ site.baseurl }}/getting-started/">Getting started</a>
+                </li>
+                <li {% if page.slug == "examples" %} class="active"{% endif %}>
+                    <a href="{{ site.baseurl }}/examples/">Examples</a>
+                </li>
+                <li {% if page.slug == "documentation" %} class="active"{% endif %}>
+                    <a href="{{ site.baseurl }}/documentation/">Documentation</a>
+                </li>
+                <li {% if page.slug == "extensions" %} class="active"{% endif %}>
+                    <a href="{{ site.baseurl }}/extensions/">Extensions</a>
+                </li>
+                <li {% if page.slug == "faq" %} class="active"{% endif %}>
+                    <a href="{{ site.baseurl }}/faq/">FAQ</a>
+                </li>
+                <li>
+                    <a href="{{ site.repo }}" target="_blank">GitHub</a>
+                </li>
+            </ul>
+            <ul class="nav navbar-nav navbar-right">
+                <!-- Localization -->
+                <li>
+                    <a href="javascript:void(0)" class="dropdown-toggle" data-toggle="dropdown">
+                        <span class="language">English</span> <span class="caret"></span>
+                    </a>
+                    <ul class="dropdown-menu">
+                        {% for language in site.languages %}
+                        <li data-language="{{ language }}">
+                            <a href="javascript:void(0)">
+                                {{ site.languages_string[forloop.index0] }}
+                            </a>
+                        </li>
+                        {% endfor %}
+                    </ul>
+                </li>
+            </ul>
+        </nav>
     </div>
-    <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
-      <ul class="nav navbar-nav">
-        <li{% if page.slug == "getting-started" %} class="active"{% endif %}>
-          <a href="../getting-started/">Getting started</a>
-        </li>
-        <li{% if page.slug == "examples" %} class="active"{% endif %}>
-          <a href="../examples/">Examples</a>
-        </li>
-        <li{% if page.slug == "documentation" %} class="active"{% endif %}>
-          <a href="../documentation/">Documentation</a>
-        </li>
-        <li{% if page.slug == "extensions" %} class="active"{% endif %}>
-          <a href="../extensions/">Extensions</a>
-        </li>
-        <li{% if page.slug == "faq" %} class="active"{% endif %}>
-          <a href="../faq/">FAQ</a>
-        </li>
-        <li>
-          <a href="{{ site.repo }}" target="_blank">GitHub</a>
-        </li>
-      </ul>
-    </nav>
-  </div>
 </header>

+ 2 - 2
docs/_layouts/default.html

@@ -13,8 +13,8 @@
     <!-- Docs page layout -->
     <div class="bs-docs-header" id="content">
       <div class="container">
-        <h1>{{ page.title }}</h1>
-        <p>{{ page.lead }}</p>
+        <h1>{% t page.title %}</h1>
+        <p>{% t page.lead %}</p>
       </div>
     </div>
 

+ 145 - 0
docs/_plugins/multiple-languages.rb

@@ -0,0 +1,145 @@
+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']
+      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
+        self.dest = self.dest + "/" + lang
+        self.config['baseurl'] = self.config['baseurl'] + "/" + lang
+        self.config['lang'] = lang
+        puts "Building site for language: \"#{self.config['lang']}\" to: #{self.dest}"
+        process_org
+
+        #Reset variables for next language
+        self.dest = dest_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)

+ 17 - 0
docs/assets/js/common.js

@@ -3,4 +3,21 @@ $(function () {
         .attr('target', '_blank')
         .addClass('edit-page-link')
         .text('Edit on GitHub');
+
+    // languages
+    $('[data-language]').each(function (i) {
+        var $this = $(this),
+            language = $this.data('language');
+
+        // default
+        if (i === 0) {
+            $this.addClass('active');
+        }
+
+        $this.find('a').attr('href', '/' + (language === 'en' ? '' : language));
+        if (location.href.indexOf(language) !== -1) {
+            $this.addClass('active').siblings().removeClass('active');
+            $('.language').text($(this).text());
+        }
+    });
 });

+ 7 - 7
docs/documentation.md

@@ -1,16 +1,16 @@
 ---
 layout: default
-title: Documentation
+title: pages.documentation.title
 slug: documentation
-lead: "The documentation contains Table Properties, Column Properties, Events, Methods, and much more."
+lead: pages.documentation.lead
 ---
 
-{% markdown documentation/table-options.md %}
+{% tf documentation/table-options.md %}
 
-{% markdown documentation/column-options.md %}
+{% tf documentation/column-options.md %}
 
-{% markdown documentation/events.md %}
+{% tf documentation/events.md %}
 
-{% markdown documentation/methods.md %}
+{% tf documentation/methods.md %}
 
-{% markdown documentation/localizations.md %}
+{% tf documentation/localizations.md %}

+ 16 - 16
docs/examples.md

@@ -1,34 +1,34 @@
 ---
 layout: default
-title: Examples
+title: pages.examples.title
 slug: examples
-lead: "The examples of bootstrap table."
+lead: pages.examples.lead
 ---
 
-{% markdown examples/note.md %}
+{% tf examples/note.md %}
 
-{% markdown examples/basic.md %}
+{% tf examples/basic.md %}
 
-{% markdown examples/style.md %}
+{% tf examples/style.md %}
 
-{% markdown examples/align.md %}
+{% tf examples/align.md %}
 
-{% markdown examples/sort.md %}
+{% tf examples/sort.md %}
 
-{% markdown examples/format.md %}
+{% tf examples/format.md %}
 
-{% markdown examples/hide-header.md %}
+{% tf examples/hide-header.md %}
 
-{% markdown examples/columns.md %}
+{% tf examples/columns.md %}
 
-{% markdown examples/card-view.md %}
+{% tf examples/card-view.md %}
 
-{% markdown examples/select.md %}
+{% tf examples/select.md %}
 
-{% markdown examples/toolbar.md %}
+{% tf examples/toolbar.md %}
 
-{% markdown examples/pagination.md %}
+{% tf examples/pagination.md %}
 
-{% markdown examples/events.md %}
+{% tf examples/events.md %}
 
-{% markdown examples/methods.md %}
+{% tf examples/methods.md %}

+ 3 - 3
docs/extensions.md

@@ -1,8 +1,8 @@
 ---
 layout: default
-title: Extensions
+title: pages.extensions.title
 slug: extensions
-lead: "The extensions of bootstrap table."
+lead: pages.extensions.lead
 ---
 
-{% markdown extensions/editable.md %}
+{% tf extensions/editable.md %}

+ 3 - 3
docs/faq.md

@@ -1,11 +1,11 @@
 ---
 layout: default
-title: FAQ
+title: pages.faq.title
 slug: faq
-lead: "Frequently Asked Questions."
+lead: pages.faq.lead
 ---
 
-{% markdown faq/faq.md %}
+{% tf faq/faq.md %}
 
 ---
 

+ 7 - 7
docs/getting-started.md

@@ -1,16 +1,16 @@
 ---
 layout: default
-title: Getting started
+title: pages.getting_started.title
 slug: getting-started
-lead: "An overview of Bootstrap Table, how to download and use, basic templates, and more."
+lead: pages.getting_started.lead
 ---
 
-{% markdown getting-started/download.md %}
+{% tf getting-started/download.md %}
 
-{% markdown getting-started/whats-include.md %}
+{% tf getting-started/whats-include.md %}
 
-{% markdown getting-started/grunt.md %}
+{% tf getting-started/grunt.md %}
 
-{% markdown getting-started/usage.md %}
+{% tf getting-started/usage.md %}
 
-{% markdown getting-started/translations.md %}
+{% tf getting-started/translations.md %}