From c36002d85192a38ddc4418f477996d8f9fabb3f3 Mon Sep 17 00:00:00 2001 From: djoate <56777051+djoate@users.noreply.github.com> Date: Mon, 18 Nov 2019 00:09:19 +0000 Subject: [PATCH 01/25] Add jekyll-simple-i18n plugin with example Adds in support for https://github.com/signalapp/jekyll-simple-i18n. The plugin did not work with the github-pages gem, so github-pages was switched with jekyll (which is what the current i18n branch does anyway). --- .gitignore | 1 + Gemfile | 3 +- Gemfile.lock | 194 +------------------------- _config.yml | 3 +- _data/language_map.yml | 47 +++++++ _data/languages/en.yml | 13 ++ _data/languages/es.yml | 13 ++ _plugins/hreflang-tag.rb | 35 +++++ _plugins/translate-tag.rb | 38 +++++ _plugins/translated-page-generator.rb | 47 +++++++ _plugins/weblate-source-file.rb | 49 +++++++ index.html | 5 +- 12 files changed, 256 insertions(+), 192 deletions(-) create mode 100644 _data/language_map.yml create mode 100644 _data/languages/en.yml create mode 100644 _data/languages/es.yml create mode 100644 _plugins/hreflang-tag.rb create mode 100644 _plugins/translate-tag.rb create mode 100644 _plugins/translated-page-generator.rb create mode 100644 _plugins/weblate-source-file.rb diff --git a/.gitignore b/.gitignore index e6cb179f..4170d373 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ font/assets/ font/_sass/ font/.fontcustom-manifest.json assets/webfonts/ptio-font-preview.html +weblate-source-file.yml diff --git a/Gemfile b/Gemfile index 70f8d954..8410b95b 100644 --- a/Gemfile +++ b/Gemfile @@ -1,11 +1,12 @@ source "https://rubygems.org" # Install github-pages gem (https://jekyllrb.com/docs/github-pages/) -gem "github-pages", group: :jekyll_plugins +gem "jekyll", group: :jekyll_plugins # Plugins group :jekyll_plugins do # example: gem "jekyll-feed", "~> 0.6" + gem "jekyll-sitemap" end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/Gemfile.lock b/Gemfile.lock index 05594934..8ec995d9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,89 +1,16 @@ GEM remote: https://rubygems.org/ specs: - activesupport (4.2.11.1) - i18n (~> 0.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.6.0) - public_suffix (>= 2.0.2, < 4.0) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.11.1) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) colorator (1.1.0) - commonmarker (0.17.13) - ruby-enum (~> 0.5) concurrent-ruby (1.1.5) - dnsruby (1.61.3) - addressable (~> 2.5) em-websocket (0.5.1) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) - ethon (0.12.0) - ffi (>= 1.3.0) eventmachine (1.2.7) - execjs (2.7.0) - faraday (0.15.4) - multipart-post (>= 1.2, < 3) - ffi (1.11.1) + ffi (1.11.2) forwardable-extended (2.6.0) - gemoji (3.0.1) - github-pages (198) - activesupport (= 4.2.11.1) - github-pages-health-check (= 1.16.1) - jekyll (= 3.8.5) - jekyll-avatar (= 0.6.0) - jekyll-coffeescript (= 1.1.1) - jekyll-commonmark-ghpages (= 0.1.5) - jekyll-default-layout (= 0.1.4) - jekyll-feed (= 0.11.0) - jekyll-gist (= 1.5.0) - jekyll-github-metadata (= 2.12.1) - jekyll-mentions (= 1.4.1) - jekyll-optional-front-matter (= 0.3.0) - jekyll-paginate (= 1.1.0) - jekyll-readme-index (= 0.2.0) - jekyll-redirect-from (= 0.14.0) - jekyll-relative-links (= 0.6.0) - jekyll-remote-theme (= 0.3.1) - jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.5.0) - jekyll-sitemap (= 1.2.0) - jekyll-swiss (= 0.4.0) - jekyll-theme-architect (= 0.1.1) - jekyll-theme-cayman (= 0.1.1) - jekyll-theme-dinky (= 0.1.1) - jekyll-theme-hacker (= 0.1.1) - jekyll-theme-leap-day (= 0.1.1) - jekyll-theme-merlot (= 0.1.1) - jekyll-theme-midnight (= 0.1.1) - jekyll-theme-minimal (= 0.1.1) - jekyll-theme-modernist (= 0.1.1) - jekyll-theme-primer (= 0.5.3) - jekyll-theme-slate (= 0.1.1) - jekyll-theme-tactile (= 0.1.1) - jekyll-theme-time-machine (= 0.1.1) - jekyll-titles-from-headings (= 0.5.1) - jemoji (= 0.10.2) - kramdown (= 1.17.0) - liquid (= 4.0.0) - listen (= 3.1.5) - mercenary (~> 0.3) - minima (= 2.5.0) - nokogiri (>= 1.8.5, < 2.0) - rouge (= 2.2.1) - terminal-table (~> 1.4) - github-pages-health-check (1.16.1) - addressable (~> 2.3) - dnsruby (~> 1.60) - octokit (~> 4.0) - public_suffix (~> 3.0) - typhoeus (~> 1.3) - html-pipeline (2.12.0) - activesupport (>= 2) - nokogiri (>= 1.4) http_parser.rb (0.6.0) i18n (0.9.5) concurrent-ruby (~> 1.0) @@ -100,97 +27,12 @@ GEM pathutil (~> 0.9) rouge (>= 1.7, < 4) safe_yaml (~> 1.0) - jekyll-avatar (0.6.0) - jekyll (~> 3.0) - jekyll-coffeescript (1.1.1) - coffee-script (~> 2.2) - coffee-script-source (~> 1.11.1) - jekyll-commonmark (1.3.1) - commonmarker (~> 0.14) - jekyll (>= 3.7, < 5.0) - jekyll-commonmark-ghpages (0.1.5) - commonmarker (~> 0.17.6) - jekyll-commonmark (~> 1) - rouge (~> 2) - jekyll-default-layout (0.1.4) - jekyll (~> 3.0) - jekyll-feed (0.11.0) - jekyll (~> 3.3) - jekyll-gist (1.5.0) - octokit (~> 4.2) - jekyll-github-metadata (2.12.1) - jekyll (~> 3.4) - octokit (~> 4.0, != 4.4.0) - jekyll-mentions (1.4.1) - html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-optional-front-matter (0.3.0) - jekyll (~> 3.0) - jekyll-paginate (1.1.0) - jekyll-readme-index (0.2.0) - jekyll (~> 3.0) - jekyll-redirect-from (0.14.0) - jekyll (~> 3.3) - jekyll-relative-links (0.6.0) - jekyll (~> 3.3) - jekyll-remote-theme (0.3.1) - jekyll (~> 3.5) - rubyzip (>= 1.2.1, < 3.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) - jekyll-seo-tag (2.5.0) - jekyll (~> 3.3) jekyll-sitemap (1.2.0) jekyll (~> 3.3) - jekyll-swiss (0.4.0) - jekyll-theme-architect (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-cayman (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-dinky (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-hacker (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-leap-day (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-merlot (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-midnight (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-minimal (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-modernist (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-primer (0.5.3) - jekyll (~> 3.5) - jekyll-github-metadata (~> 2.9) - jekyll-seo-tag (~> 2.0) - jekyll-theme-slate (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-tactile (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-theme-time-machine (0.1.1) - jekyll (~> 3.5) - jekyll-seo-tag (~> 2.0) - jekyll-titles-from-headings (0.5.1) - jekyll (~> 3.3) jekyll-watch (2.2.1) listen (~> 3.0) - jemoji (0.10.2) - gemoji (~> 3.0) - html-pipeline (~> 2.2) - jekyll (~> 3.0) kramdown (1.17.0) liquid (4.0.0) listen (3.1.5) @@ -198,51 +40,27 @@ GEM rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) mercenary (0.3.6) - mini_portile2 (2.4.0) - minima (2.5.0) - jekyll (~> 3.5) - jekyll-feed (~> 0.9) - jekyll-seo-tag (~> 2.1) - minitest (5.11.3) - multipart-post (2.1.1) - nokogiri (1.10.4) - mini_portile2 (~> 2.4.0) - octokit (4.14.0) - sawyer (~> 0.8.0, >= 0.5.3) pathutil (0.16.2) forwardable-extended (~> 2.6) public_suffix (3.1.1) rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) - rouge (2.2.1) - ruby-enum (0.7.2) - i18n + rouge (3.11.0) ruby_dep (1.5.0) - rubyzip (1.2.3) safe_yaml (1.0.5) sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - sawyer (0.8.2) - addressable (>= 2.3.5) - faraday (> 0.8, < 2.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) - thread_safe (0.3.6) - typhoeus (1.3.1) - ethon (>= 0.9.0) - tzinfo (1.2.5) - thread_safe (~> 0.1) - unicode-display_width (1.6.0) PLATFORMS ruby DEPENDENCIES - github-pages + jekyll + jekyll-sitemap tzinfo-data BUNDLED WITH diff --git a/_config.yml b/_config.yml index 25a9c243..22468756 100644 --- a/_config.yml +++ b/_config.yml @@ -7,7 +7,8 @@ sass: style: compressed plugins: - jekyll-sitemap +plugins_dir: "./_plugins" sitemap: file: "/sitemap.xml" include: [".well-known"] -exclude: ["font", "vendor"] +exclude: ["font", "vendor","weblate-source-file.yml"] diff --git a/_data/language_map.yml b/_data/language_map.yml new file mode 100644 index 00000000..9deecc2f --- /dev/null +++ b/_data/language_map.yml @@ -0,0 +1,47 @@ +--- +af: "Afrikaans" +az: "Azərbaycanca" +bg: "Български" +ca: "Català" +cs: "Česky" +da: "Dansk" +de: "Deutsch" +el: "Ελληνικά" +en: "English" +es: "Español" +et: "esti" +fa: "فارسی" +fi: "suomi" +fil: "Pilipino" +fr: "Français" +ga: "Gaeilge" +hr: "Hrvatski" +hu: "Magyar" +id: "Bahasa Indonesia" +it: "Italiano" +ja: "日本語" +kk: "Қазақ" +ko: "한국어" +lt: "Lietuviškai" +lv: "Latviešu" +mk: "Македонски" +ms: "Bahasa Melayu" +nb: "Norsk" +nl: "Nederlands" +pl: "Polski" +pt_BR: "Português (br)" +pt_PT: "Português (pt)" +ro: "Română" +ru: "Pусский" +sk: "Slovenčina" +sl: "Slovenščina" +sr: "српски" +sv: "svensk" +sw: "Kiswahili" +th: "ภาษาไทย" +tr: "Türkçe" +uk: "Українська" +uz: "O'zbekcha" +vi: "Tiếng Việt" +zh_CN: "简体中文" +zh_TW: "繁體中文" diff --git a/_data/languages/en.yml b/_data/languages/en.yml new file mode 100644 index 00000000..05e6d46b --- /dev/null +++ b/_data/languages/en.yml @@ -0,0 +1,13 @@ +--- +sponsors: | + Sponsors + +new: | + New! + +showcase_your_brand_as_a_sponsor_of_privacytools_here_and_support_our_mission_of_creating_a_world_fre: | + Showcase your brand as a sponsor of PrivacyTools here and support our mission of creating a world free of mass surveillance! + +learn_more: | + Learn more... + diff --git a/_data/languages/es.yml b/_data/languages/es.yml new file mode 100644 index 00000000..56181882 --- /dev/null +++ b/_data/languages/es.yml @@ -0,0 +1,13 @@ +--- +sponsors: | + Patrocinadores + +new: | + Nuevo! + +showcase_your_brand_as_a_sponsor_of_privacytools_here_and_support_our_mission_of_creating_a_world_fre: | + Presente su marca como patrocinador de PrivacyTools aquí y apoye nuestra misión de crear un mundo libre de vigilancia masiva! + +learn_more: | + Conozca más... + diff --git a/_plugins/hreflang-tag.rb b/_plugins/hreflang-tag.rb new file mode 100644 index 00000000..4ebf3ab2 --- /dev/null +++ b/_plugins/hreflang-tag.rb @@ -0,0 +1,35 @@ +# Copyright 2019 Signal +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Jekyll + + class HreflangTag < Liquid::Tag + def initialize(tag_name, text, tokens) + super + end + + def render(context) + page = context.environments.first["page"] + site = context.registers[:site] + + if page["translate"] + dir = page["src_dir"].nil? ? page["dir"] : page["src_dir"] + hreflangs = %{} + + site.data["languages"].each_key do |language| + hreflangs << %{} + end + end + + hreflangs + end + end + +end + +Liquid::Template.register_tag('hreflang', Jekyll::HreflangTag) diff --git a/_plugins/translate-tag.rb b/_plugins/translate-tag.rb new file mode 100644 index 00000000..51fecec2 --- /dev/null +++ b/_plugins/translate-tag.rb @@ -0,0 +1,38 @@ +# Copyright 2019 Signal +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Jekyll + + class TranslateTag < Liquid::Tag + attr_reader :text, :weblate_id + + def initialize(tag_name, text, tokens) + super + @text = text.strip + @weblate_id = Weblate::ID.get(text) + end + + def render(context) + page_language = context.environments.first["page"]["language"] + site = context.registers[:site] + + if page_language.nil? + Weblate::SourceFile.add_entry(weblate_id, text) + + text + else + translated_string = site.data["languages"][page_language][weblate_id] + + translated_string.nil? ? text : translated_string.strip + end + end + end + +end + +Liquid::Template.register_tag('translate', Jekyll::TranslateTag) diff --git a/_plugins/translated-page-generator.rb b/_plugins/translated-page-generator.rb new file mode 100644 index 00000000..af47b983 --- /dev/null +++ b/_plugins/translated-page-generator.rb @@ -0,0 +1,47 @@ +# Copyright 2019 Signal +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Jekyll + + class TranslatedPage < Page + def initialize(site, base, dir, name) + @site, @base, @dir, @name = site, base, dir, name + + self.process(@name) + self.data ||= {} + end + end + + class TranslatedPageGenerator < Generator + def generate(site) + pages_to_translate = site.pages.select { |page| page.data["translate"] } + + pages_to_translate.each do |page| + page_title = page.data['title'] + page_title_weblate_id = Weblate::ID.get(page_title) + + Weblate::SourceFile.add_entry(page_title_weblate_id, page_title) + + site.data["languages"].each_key do |language| + translated_page = Jekyll::TranslatedPage.new(site, site.source, page.dir, page.name) + translated_page_title = site.data["languages"][language][page_title_weblate_id] + + translated_page.data = page.data.clone + translated_page.data['title'] = translated_page_title.nil? ? page_title : translated_page_title.strip + translated_page.data['permalink'] = "#{language}/#{page.dir}/#{page.name}" + translated_page.data['src_dir'] = page.dir + translated_page.data['language'] = language + translated_page.content = page.content + + site.pages << translated_page + end + end + end + end + +end diff --git a/_plugins/weblate-source-file.rb b/_plugins/weblate-source-file.rb new file mode 100644 index 00000000..d71fc994 --- /dev/null +++ b/_plugins/weblate-source-file.rb @@ -0,0 +1,49 @@ +# Copyright 2019 Signal +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +module Weblate + + class ID + def self.get(source_text) + source_text.nil? ? source_text : source_text.strip[0..100].gsub(/[^\w\d\s]/, '').tr(' ', '_').downcase + end + end + + class SourceFile + class << self + def add_entry(weblate_id, source_text) + unless id_already_exists?(weblate_id) or source_text.nil? + new_entry = <<-YAML +#{weblate_id}: | + #{source_text} + + YAML + + File.write(weblate_source_location, new_entry, mode: 'a') + end + end + + def id_already_exists?(weblate_id) + File.readlines(weblate_source_location).grep(/^#{weblate_id}: \|$/).any? + end + + def refresh + File.write(weblate_source_location, "---\n") + end + + def weblate_source_location + "#{__dir__}/../weblate-source-file.yml" + end + end + end + +end + +Jekyll::Hooks.register :site, :after_init do + Weblate::SourceFile.refresh +end diff --git a/index.html b/index.html index cdb2ba37..c004650a 100644 --- a/index.html +++ b/index.html @@ -1,14 +1,15 @@ --- layout: default +translate: true --- {% include sections/header.html %} {% include sections/resources.html %} -
Prefer the classic site? View a single-page layout.
+{% translate Prefer the classic site? View a single-page layout.%}
{% translate Prefer the classic site? View a single-page layout.%}
diff --git a/weblate-source-file.yml b/weblate-source-file.yml index ca5ddb55..93c6c75e 100644 --- a/weblate-source-file.yml +++ b/weblate-source-file.yml @@ -1,4 +1,7 @@ --- +Privacy_Tools: | + Privacy Tools + Prefer_the_classic_site?_View_a_singlepage_layout.: | Prefer the classic site? View a single-page layout. @@ -59,6 +62,3 @@ Prefer_the_classic_site?_View_a_singlepage_layout.: | Prefer_the_classic_site?_View_a_singlepage_layout.: | Prefer the classic site? View a single-page layout. -Prefer_the_classic_site?_View_a_singlepage_layout.: | - Prefer the classic site? View a single-page layout. - -- 2.49.0 From cab6bd18b81483e4c6f2a826ecdf1c2f18316538 Mon Sep 17 00:00:00 2001 From: djoate <56777051+djoate@users.noreply.github.com> Date: Mon, 18 Nov 2019 23:09:39 -0500 Subject: [PATCH 04/25] Add support for translating page.description --- _plugins/translated-page-generator.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_plugins/translated-page-generator.rb b/_plugins/translated-page-generator.rb index af47b983..73279ae8 100644 --- a/_plugins/translated-page-generator.rb +++ b/_plugins/translated-page-generator.rb @@ -24,15 +24,20 @@ module Jekyll pages_to_translate.each do |page| page_title = page.data['title'] page_title_weblate_id = Weblate::ID.get(page_title) + page_description = page.data['description'] + page_description_weblate_id = Weblate::ID.get(page_description) Weblate::SourceFile.add_entry(page_title_weblate_id, page_title) + Weblate::SourceFile.add_entry(page_description_weblate_id, page_description) site.data["languages"].each_key do |language| translated_page = Jekyll::TranslatedPage.new(site, site.source, page.dir, page.name) translated_page_title = site.data["languages"][language][page_title_weblate_id] + translated_page_description = site.data["languages"][language][page_description_weblate_id] translated_page.data = page.data.clone translated_page.data['title'] = translated_page_title.nil? ? page_title : translated_page_title.strip + translated_page.data['description'] = translated_page_description.nil? ? page_description : translated_page_description.strip translated_page.data['permalink'] = "#{language}/#{page.dir}/#{page.name}" translated_page.data['src_dir'] = page.dir translated_page.data['language'] = language -- 2.49.0 From 3abed603b5d5266cb7786470787d11f842c92c91 Mon Sep 17 00:00:00 2001 From: djoate <56777051+djoate@users.noreply.github.com> Date: Mon, 18 Nov 2019 23:10:33 -0500 Subject: [PATCH 05/25] Translate a part of providers page --- _data/languages/es.yml | 36 ++++++++++++++++++++++++++++++++++ pages/providers.html | 25 ++++++++++++------------ weblate-source-file.yml | 43 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 87 insertions(+), 17 deletions(-) diff --git a/_data/languages/es.yml b/_data/languages/es.yml index c35cc4fe..6efcd784 100644 --- a/_data/languages/es.yml +++ b/_data/languages/es.yml @@ -8,6 +8,9 @@ Prefer_the_classic_site?_View_a_singlepage_layout.: | Providers: | Proveedores +Theres_a_ton_of_people_providing_services_online._Discover_which_ones_you_should_avoid_and_our_recom: | + Hay un montón de gente que presta servicios en línea. Descubra cuáles debe evitar y nuestras recomendaciones para una variedad de servicios. + Discover_privacycentric_online_services_including_email_providers_VPN_operators_DNS_administrator: | Descubra servicios en línea centrados en la privacidad, incluyendo proveedores de correo electrónico, operadores de VPN, administradores de DNS y mucho más! @@ -56,3 +59,36 @@ Showcase_your_brand_as_a_sponsor_of_PrivacyTools_here_and_support_our_mission_of Learn_more...: | Aprenda más... +Services: | + Servicios + +Click_on_whatever_service_you_need_to_view_our_recommendations.: | + Haga clic en cualquier servicio que necesite para ver nuestras recomendaciones. + +Cloud_Storage: | + Servidor Cloud + +DNS: | + DNS + +Email: | + Correo electrónico + +Hosting: | + Alojamiento + +Pastebins: | + Pastebins + +Search_Engines: | + Motores de Búsqueda + +Social_Networks: | + Redes Sociales + +Social_News_Aggregators: | + Noticias Sociales Agregadores + +VPN: | + RPV + diff --git a/pages/providers.html b/pages/providers.html index e78f9a4a..f17d2f86 100644 --- a/pages/providers.html +++ b/pages/providers.html @@ -1,25 +1,26 @@ --- layout: page permalink: /providers/ -title: "Providers" +title: Providers description: "There's a ton of people providing services online. Discover which ones you should avoid and our recommendations for a variety of services." +translate: true --- -Click on whatever service you need to view our recommendations.
+{% translate Click on whatever service you need to view our recommendations.%}
{% translate Prefer the classic site? View a single-page layout.%}
+{% t Prefer the classic site? View a single-page layout.%}
{% translate Click on whatever service you need to view our recommendations.%}
+{% t Click on whatever service you need to view our recommendations.%}
This also affects Windows 10, but it doesn't expose this information or mitigation instructions as easily. MacOS users check How to enable full mitigation for Microarchitectural Data Sampling (MDS) vulnerabilities on Apple Support.
-When running a enough recent Linux kernel, you can check the CPU vulnerabilities it detects by tail -n +1 /sys/devices/system/cpu/vulnerabilities/*
. By using tail -n +1
instead of cat
, the file names are also visible.
When running a recent enough Linux kernel, you can check the CPU vulnerabilities it detects by tail -n +1 /sys/devices/system/cpu/vulnerabilities/*
. By using tail -n +1
instead of cat
, the file names are also visible.
In case you have an Intel CPU, you may notice "SMT vulnerable" display after running the tail
command. To mitigate this, disable hyper-threading from the UEFI/BIOS. You can also take the following mitigation steps below if your system/distribution uses GRUB and supports /etc/default/grub.d/
:
--
2.49.0
From b1d9d45167a729b263b00156870033d8314b6ee4 Mon Sep 17 00:00:00 2001
From: djoate <56777051+djoate@users.noreply.github.com>
Date: Sat, 23 Nov 2019 01:19:23 -0500
Subject: [PATCH 13/25] Add translate filter
---
_plugins/translate-filter.rb | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 _plugins/translate-filter.rb
diff --git a/_plugins/translate-filter.rb b/_plugins/translate-filter.rb
new file mode 100644
index 00000000..1634bfc6
--- /dev/null
+++ b/_plugins/translate-filter.rb
@@ -0,0 +1,21 @@
+module Jekyll
+ module TranslateFilter
+ def translate_text(input)
+ text = input.strip
+ weblate_id = Weblate::ID.get(input)
+ page_language = @context.environments.first["page"]["language"]
+ site = @context.registers[:site]
+ if page_language.nil?
+ Weblate::SourceFile.add_entry(weblate_id, text)
+
+ text
+ else
+ translated_string = site.data["languages"][page_language][weblate_id]
+
+ translated_string.nil? ? text : translated_string.strip
+ end
+ end
+ end
+end
+
+Liquid::Template.register_filter(Jekyll::TranslateFilter)
--
2.49.0
From f3d37915d74d42e2e3fef67b4be4d483b14a4b06 Mon Sep 17 00:00:00 2001
From: djoate <56777051+djoate@users.noreply.github.com>
Date: Sat, 23 Nov 2019 15:36:49 -0500
Subject: [PATCH 14/25] Add in translate page filter
---
_plugins/translate-filter.rb | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/_plugins/translate-filter.rb b/_plugins/translate-filter.rb
index 1634bfc6..8ceac24a 100644
--- a/_plugins/translate-filter.rb
+++ b/_plugins/translate-filter.rb
@@ -15,6 +15,16 @@ module Jekyll
translated_string.nil? ? text : translated_string.strip
end
end
+
+ def translate_page(page)
+ page_language = @context.environments.first["page"]["language"]
+ site = @context.registers[:site]
+ if page_language.nil?
+ page
+ else
+ "/#{page_language}#{page}"
+ end
+ end
end
end
--
2.49.0
From 72ec39fd0285e11573e1f9aa10d59d9f54a6e191 Mon Sep 17 00:00:00 2001
From: djoate <56777051+djoate@users.noreply.github.com>
Date: Sat, 23 Nov 2019 15:38:18 -0500
Subject: [PATCH 15/25] Stop using capture tags for card.html includes
---
_includes/card.html | 4 +--
_includes/sections/resources.html | 58 ++++++++++---------------------
weblate-source-file.yml | 25 ++++++-------
3 files changed, 32 insertions(+), 55 deletions(-)
diff --git a/_includes/card.html b/_includes/card.html
index a3b9803d..31ffe830 100644
--- a/_includes/card.html
+++ b/_includes/card.html
@@ -34,7 +34,7 @@
{% elsif include.font %}
{% endif %}
- {{include.description}}
+ {{include.description | translate_text }}
@@ -47,7 +47,7 @@
{% endif %}
{% elsif include.page %}
-
+
{% if include.moretext %}
{{include.moretext}}
{% else %}
diff --git a/_includes/sections/resources.html b/_includes/sections/resources.html
index 156fe857..baa8e79d 100644
--- a/_includes/sections/resources.html
+++ b/_includes/sections/resources.html
@@ -4,76 +4,56 @@
It's important for a website like {{ site.name }} to stay up-to-date. Keep an eye on software updates for the applications listed on our site. Follow recent news about providers that we recommend. We try our best to keep up, but we're not perfect and the internet is changing fast. If you find an error, or you think a provider should not be listed here, or a qualified service provider is missing, or a browser plugin is not the best choice anymore, or anything else... Talk to us please. You can also find us on our own Mastodon instance or on Matrix at This is a community project aiming to deliver the best information available to improve privacy online. Thank you for participating. This project needs you. {% t This is a community project aiming to deliver the best information available to improve privacy online. Thank you for participating. This project needs you. %}
{% if include.url %}
-
+
{% if include.website %}
{{include.website | translate_text }}
{% else %}
diff --git a/_includes/cardv2.html b/_includes/cardv2.html
index b9456050..b9122517 100644
--- a/_includes/cardv2.html
+++ b/_includes/cardv2.html
@@ -63,7 +63,7 @@
#general:privacytools.io
.{{include.title}}
+ {{include.title | translate_text}}
{% if include.badges %}
- {{ include.title }}
+ {{ include.title | translate_text }}
{% assign badges = include.badges | split:"|" %}
{% for badge in badges %}
{% assign badge_data = badge | split:":" %}
@@ -14,15 +14,15 @@
class="badge badge-{{color}}"
{% if tooltip %}
data-toggle="tooltip"
- title="{{ tooltip }}"
- > {{text}} {{ help_icon }}
+ title="{{ tooltip | translate_text }}"
+ > {{text | translate_text}} {{ help_icon }}
{% else %}
- > {{text}}
+ > {{text | translate_text}}
{% endif %}
{% endfor %}
{% else %}
- {{ include.title }}
+ {{ include.title | translate_text }}
{% endif %}
2 GB
12 €
- Accepted
+ No
Built-in
Yes
--
2.49.0
From 06322dc4a267e2d7200703236186181f77881046 Mon Sep 17 00:00:00 2001
From: Dawid Potocki 2 GB
$ 60
Accepted
- No
+ Built-in
Yes
--
2.49.0
From da3f267c964a1c14d59ee767e6b820ab9e70c818 Mon Sep 17 00:00:00 2001
From: Mikaela Suomalainen Domain Name System (DNS)
-
-{%
- include cardv2.html
- title="Njalla - Domain Registration"
- image="/assets/img/provider/Njalla.png"
- description="Njalla is a privacy-aware domain registration service based in Nevis that only needs your email or XMPP address in order to register a domain name for you. It is created by people from The Pirate Bay and IPredator VPN. Accepted payments: Bitcoin, Litecoin, Monero, DASH, Bitcoin Cash and PayPal."
- website="https://njal.la/"
- tor="http://njalladnspotetti.onion"
- forum="https://forum.privacytools.io/t/discussion-njalla/339"
-%}
-
-{%
- include cardv2.html
- title="DNSCrypt-Proxy - Tool"
- image="/assets/img/tools/DNSCrypt-Proxy.png"
- description="DNSCrypt-Proxy is a command-line DNS proxy with support for the encrypted DNS protocols, DNS over HTTPS and DNSCrypt. Can cache results to improve speed, and allows filtering, forwarding, and cloaking."
- website="https://github.com/jedisct1/dnscrypt-proxy/"
- forum="https://forum.privacytools.io/t/discussion-dnscrypt-proxy/1498"
- github="https://github.com/jedisct1/dnscrypt-proxy/"
- windows="https://github.com/jedisct1/dnscrypt-proxy/releases"
- linux=""
- mac="https://github.com/jedisct1/dnscrypt-proxy/releases"
- freebsd="https://www.freshports.org/dns/dnscrypt-proxy2/"
- openbsd="http://openports.se/net/dnscrypt-proxy"
- netbsd="http://pkgsrc.se/net/dnscrypt-proxy2"
- android=""
- ios=""
-%}
-
- Encrypted ICANN DNS Providers
+ Encrypted Domain Name System (DNS) Resolvers
- ICANN DNS Provider
+ DNS Provider
Server Locations
Privacy Policy
Type
@@ -570,7 +540,7 @@
dig +short txt qnamemintest.internet.nl
from the command-line (taken from this NLnet Labs presentation). If you are on Windows 10, run Resolve-DnsName -Type TXT -Name qnamemintest.internet.nl
from the PowerShell. You should see this display: "HOORAY - QNAME minimisation is enabled on your resolver :)!"
Worth Mentioning and Additional Information
+Software suggestions and Additional Information