You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by wa...@apache.org on 2020/10/22 17:42:43 UTC
[openoffice-org] branch main updated: Templates files to be
translated
This is an automated email from the ASF dual-hosted git repository.
wave pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/openoffice-org.git
The following commit(s) were added to refs/heads/main by this push:
new 1924140 Templates files to be translated
1924140 is described below
commit 1924140a4b132d4f64bebd4347324524d0ad0544
Author: Dave Fisher <da...@davefisher.tech>
AuthorDate: Thu Oct 22 10:42:08 2020 -0700
Templates files to be translated
---
templates/FRAMEWORKS.txt | 30 ++++
templates/README.txt | 211 ++++++++++++++++++++++++++
templates/brand.html | 76 ++++++++++
templates/doctype.html | 1 +
templates/footer.html | 26 ++++
templates/html_page.html | 3 +
templates/navigator.html | 1 +
templates/single_narrative.html | 1 +
templates/skeleton.html | 29 ++++
templates/ssi.json | 325 ++++++++++++++++++++++++++++++++++++++++
10 files changed, 703 insertions(+)
diff --git a/templates/FRAMEWORKS.txt b/templates/FRAMEWORKS.txt
new file mode 100644
index 0000000..a0d89da
--- /dev/null
+++ b/templates/FRAMEWORKS.txt
@@ -0,0 +1,30 @@
+Observations about the suitability and challenges using various frameworks.
+
+(1) Pelican
+- Suitable for our Markdown, but we will need to rename all files - mdtext -> md
+- Has it's own methods for HTML which are not really compatible with our current methods.
+ We would need to write our own plugin and rename all of the htm and html files to a special prefix like aoo.
+
+Seems like a bad fit. Thumbs down.
+
+(2) JBake
+- Suitable for our Markdown, but will need to rename all files - mdtext -> md
+- Html and Htm will need to have a minimal piece of metadata inserted in order to call out the particular template.
+ See https://jbake.org/docs/2.6.5/#content_files and https://jbake.org/docs/2.6.5/#custom_templates
+
+- Assets and Content is separated so that all of our as is files should be in a sepearate tree.
+- We can obsolete directories without deleting the content via https://jbake.org/docs/2.6.5/#ignoring_files_and_directories
+
+This could be a good fit. Thumbs up.
+
+(3) Hugo
+- Go based.
+- Looks like a lot of rewrite.
+
+No opinion, but it looks like a steep learning curve
+
+(4) Jekyll
+- Ruby based
+- Suitable for our Markdown, but will need to rename all files - mdtext -> md
+- Unclear how we would handle the html parsing.
+
diff --git a/templates/README.txt b/templates/README.txt
new file mode 100644
index 0000000..b265d4a
--- /dev/null
+++ b/templates/README.txt
@@ -0,0 +1,211 @@
+Some thoughts and documentation.
+
+(1) SSI within the templates and produced html remains a good idea.
+
+(2) SSI directory structure could be replaced could be replaced by a json file.
+
+- footer is always the same.
+ Path to the footer file to include. Always the same.
+- doctype is always the same.
+ Path to the doctype file to use. Ought to eliminate this hack.
+- home is always the same.
+ The name to use for the first breadcrumb which will take you to "/".
+- brand for the top of the page.
+ Path to the brand file to include. Varies according the language site.
+- topnav for the upper navigation bar.
+ Path to the top nav menu to include. Varies according the language site.
+- leftnav is optional and special.
+ Path to a left nav menu to include. Varies according the language site or "project" site.
+- rightnav is optional and only used once for l10n where there is also a leftnav.
+ Path to a right nav menu to include. Varies according the language site or "project" site.
+
+(3) ssi.json is a directory of directories.
+
+Note this actitivty should also build the breadrcumb list. See (5)
+
+For each template key look up the subpath and then look for the ssi element name.
+If missing then go up a level on the subpath.
+
+e.g. if you are looking in "/api/some/deep/path/"
+then you look into "/api/some/deep/", "/api/some/", "/api/", and "/"
+
+ssi[path][key]
+
+For api:
+ "/api/": {
+ "leftnav":"/api/leftnav.html"
+ }
+ "/": {
+ "doctype":"/doctype.html",
+ "footer":"/footer.html",
+ "brand":"/brand.html",
+ "topnav":"/topnav.html",
+ "home":"home"
+ }
+
+
+For de:
+ "/de/product/": {
+ "leftnav":"/de/product/leftnav.html"
+ }
+ "/de/": {
+ "brand":"/de/brand.html",
+ "topnav":"/de/topnav.html"
+ }
+ "/": {
+ "doctype":"/doctype.html",
+ "footer":"/footer.html",
+ "brand":"/brand.html",
+ "topnav":"/topnav.html",
+ "home":"home"
+ }
+
+For xx:
+ "/xx/why/": {
+ "leftnav":"/xx/why/leftnav.html"
+ }
+ "/xx/product/": {
+ "leftnav":"/xx/product/leftnav.html"
+ }
+ "/xx/": {
+ "topnav":"/xx/topnav.html",
+ "brand":"/xx/brand.html"
+ }
+ "/": {
+ "doctype":"/doctype.html",
+ "footer":"/footer.html",
+ "brand":"/brand.html",
+ "topnav":"/topnav.html",
+ "home":"home"
+ }
+
+(4) List of templates:
+
+See lib/path.pm
+
+- brand.html
+ - brand.mdtext
+- footer.html
+ - footer.mdtext
+- doctype.html
+ - doctype.mdtext
+- navigator.html
+ - topnav.mdtext
+ - leftnav.mdtext
+ - rightnav.mdtext
+- html_page.html
+ - *.html
+ - *.htm
+ - extends skeleton.html
+ - replaces block content with content extracted from html
+- single_narrative.html
+ - *.mdtext thats not already covered by above.
+ - extends skeleton.html
+
+- skeleton.html
+ - this is the page design:
+
+<!--#include virtual="{{ ssi.headers.doctype }}" -->
+<html>
+<head>
+<link href="/css/ooo.css" rel="stylesheet" type="text/css">
+{% if head %}{{ head|safe }}{% else %}
+<title>{% block title %}{{ headers.title }}{% endblock %}</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+{% if headers.css %}<link href="{{ headers.css }}" rel="stylesheet" type="text/css">{% endif %}
+{% endif %}
+<!--#include virtual="/scripts/google-analytics.js" -->
+<!--#include virtual="/scripts/entourage.js" -->
+</head>
+<body{% if bodytag %} {{ bodytag|safe }}{% endif %}>
+<!--#include virtual="{{ ssi.headers.brand }}" -->
+ <div id="topbara">
+ {% if ssi.headers.topnav %}<!--#include virtual="{{ ssi.headers.topnav }}" -->{% endif %}
+ <div id="breadcrumbsa">{% block breaddcrumbs %}{{ breadcrumbs|safe }}{% endblock %}</div>
+ </div>
+ <div id="clear"></div>
+ {% if ssi.headers.leftnav %}<!--#include virtual="{{ ssi.headers.leftnav }}" -->{% endif %}
+ {% if ssi.headers.rightnav %}<!--#include virtual="{{ ssi.headers.rightnav }}" -->{% endif %}
+ <div id="content">
+ {% block legacy %}{% if ssi.headers.legacy %}<div class="legacy">{{ ssi.headers.legacy }}</div>{% endif %}{% endblock %}
+ {% block title %}{% if headers.title %}<h1 class="title">{{ headers.title }}</h1>{% endif %}{% endblock %}
+ {% block content %}{{ content|markdown }}{% endblock %}
+ </div>
+<!--#include virtual="{{ ssi.headers.footer }}" -->
+</body>
+</html>
+
+(5) Breadcrumbs
+
+sub breadcrumbs {
+ my @path = split m!/!, shift;
+ pop @path;
+ my @rv;
+ my $relpath = "";
+ for (@path) {
+ $relpath .= "$_/";
+ $_ ||= "home";
+ push @rv, qq(<a href="$relpath">$_</a>);
+ }
+ return join " » ", @rv;
+}
+
+Consider converting into an ul / li structure
+
+Combine with ssi processing.
+
+(6) HTML file rewriting.
+
+In lib/view.pm see the html_page function:
+
+The following match is done on the html source:
+
+ if ($args{content} =~ m!<head.*?>(.*?)</head>(?:.*?<body(.*?)>)?(.*?)(?:</body>|\Z)!si) {
+ @args{qw/head bodytag content/} = ($1, $2, $3);
+ }
+
+Head attributes are ignored.
+All head content is copied.
+Any body attributes are preserved.
+All of the body content is copied.
+
+If a python framework is used then suggest that re.find be used.
+
+(7) CSS
+
+/css/ooo.css - Skeleton css
+/css/exceptions.css - Original exceptions - Home page and downloads
+/css/home.css - Home page
+/css/styles.css - original css - Home page and Downloads
+
+Lots of css scattered throughout the site.
+
+Navigator inserted css which seems to be worthless.
+<style type="text/css">
+/* The following code is added by mdx_elementid.py
+ It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+ visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
+
+(8) Javascript
+
+/scripts/
+api.simile-widgets.org - used for stats time plots.
+entourage.js - ssi included tracking downloads somehow.
+google-analytics.js - ssi included
+jquery-1.11.2.min.js - upgrade?
+ooo.js
+sorttable.js - other copies used
+tableDecorate.js - other copies used
+
+scripts are not optimized and not really normalized.
+ssi including entourage.js on all pages is a little silly. It only makes sense on download pages.
+
+We need to determine google-analytics vs. ASF foundation policy.
+
diff --git a/templates/brand.html b/templates/brand.html
new file mode 100644
index 0000000..5607b29
--- /dev/null
+++ b/templates/brand.html
@@ -0,0 +1,76 @@
+ <div id="{{ headers.divid }}">
+ <div id="languagesdiv">
+ {% block language %}{% if headers.language %}{{ headers.language }}{% else %}Language{% endif %}:{% endblock %}
+ <select id="selectlanguage" onchange="javascript:location.href=location.protocol+'//'+location.host+'/'+this.value;">
+ <!-- Asturian --><option value="ast">Asturianu (ast)</option>
+ <!-- Catalan --><option value="ca">Català (ca)</option>
+ <!-- Czech --><option value="cs">Čeština (cs)</option>
+ <!-- Danish --><option value="da">Dansk (da)</option>
+ <!-- German --><option value="de">Deutsch (de)</option>
+ <!-- English [British]<option value="en-gb">English [British] (en-gb)</option> -->
+ <!-- English [US] --><option value="?redirect=soft" selected="selected">English (en)</option>
+ <!-- Spanish --><option value="es">Español (es)</option>
+ <!-- Basque --><option value="eu">Euskara (eu)</option>
+ <!-- French --><option value="fr">Français (fr)</option>
+ <!-- Scottish --><option value="gd">Gàidhlig (gd)</option>
+ <!-- Galician --><option value="gl">Galego (gl)</option>
+ <!-- Italian --><option value="it">Italiano (it)</option>
+ <!-- Lithuanian --><option value="lt">Lietuvių (lt)</option>
+ <!-- Hungarian --><option value="hu">Magyar (hu)</option>
+ <!-- Dutch --><option value="nl">Nederlands (nl)</option>
+ <!-- Norwegian --><option value="no">Norsk (no)</option>
+ <!-- Polish --><option value="pl">Polski (pl)</option>
+ <!-- Portuguese [Brazilian] --><option value="pt-br">Português [do Brasil] (pt-br)</option>
+ <!-- Portuguese [European] --><option value="pt">Português [Europeu] (pt)</option>
+ <!-- Slovak --><option value="sk">Slovenčina (sk)</option>
+ <!-- Slovenian --><option value="sl">Slovenščina (sl)</option>
+ <!-- Finnish --><option value="fi">Suomi (fi)</option>
+ <!-- Swedish --><option value="sv">Svenska (sv)</option>
+ <!-- Turkish --><option value="tr">Türkçe (tr)</option>
+ <!-- Vietnamese --><option value="vi">Tiếng Việt (vi)</option>
+ <!-- Greek --><option value="el">Ελληνικά (el)</option>
+ <!-- Bulgarian --><option value="bg">български език (bg)</option>
+ <!-- Russian --><option value="ru">Русский (ru)</option>
+ <!-- Serbian [Cyrillic] --><option value="sr">Cрпски [ћирилицом] (sr)</option>
+ <!-- Arabic <option value="ar">العربية (ar)</option> -->
+ <!-- Hebrew --><option value="he">עברית (he)</option>
+ <!-- Hindi --><option value="hi">हिन्दी (hi)</option>
+ <!-- Khmer --><option value="km">ភាសាខ្មែរ (km)</option>
+ <!-- Tamil --><option value="ta">தமிழ் (ta)</option>
+ <!-- Thai --><option value="th">ภาษาไทย (th)</option>
+ <!-- Chinese [simplified] --><option value="zh-cn">简体中文 (zh-cn)</option>
+ <!-- Chinese [traditional] --><option value="zh-tw">正體中文 (zh-tw)</option>
+ <!-- Japanese --><option value="ja">日本語 (ja)</option>
+ <!-- Korean --><option value="ko">한국어 (ko)</option>
+ </select>
+ <script>
+ var lang = "{{headers.selectedlang}}";
+ var dropdown = document.getElementById('selectlanguage');
+ var options = dropdown.options;
+ for( var i = 0; i < dropdown.options.length; i++ ) {
+ if( dropdown.options[ i ].value == lang ) {
+ dropdown.selectedIndex = i;
+ break;
+ }
+ }
+ </script>
+ </div>
+ <div id="bannerleft"><a title="Apache OpenOffice" href="/"><img id="ooo-logo" alt="{{ headers.name }}" src="/images/{{ headers.logo }}"/></a></div>
+ <div id="bannerright">
+ <div id="searchdiv">
+ <form id="cse-search-box-header" action="https://www.google.com/search" method="get">
+ <div>
+ <input type="hidden" name="domains" value="{{ headers.domain }}"/>
+ <input type="hidden" name="sitesearch" value="{{ headers.domain }}"/>
+ </div>
+ <div class="topsrchbox">
+ <input name="resultsPerPage" value="40" type="hidden"/>
+ <input name="q" id="query" type="text" title="search query"/>
+ <input name="Button" value="{{ headers.search }}" type="submit" class="topsrchbutton"/>
+ </div>
+ </form>
+ </div>
+ </div>
+ {% block tagline %}{% if headers.tagline %}<div id="bannercenter"><br/>{{ headers.tagline }}</div>{% endif %}{% endblock %}
+ </div>
+ {% block announce %}{% if headers.announce %}<div id="announce"><a href="{{ headers.announceurl }}" title="{{ headers.announcetip }}">{{ headers.announce }}</a></div>{% endif %}{% endblock %}
diff --git a/templates/doctype.html b/templates/doctype.html
new file mode 100644
index 0000000..7b88be0
--- /dev/null
+++ b/templates/doctype.html
@@ -0,0 +1 @@
+<!DOCTYPE {{ headers.doctype }}>
diff --git a/templates/footer.html b/templates/footer.html
new file mode 100644
index 0000000..f3b1866
--- /dev/null
+++ b/templates/footer.html
@@ -0,0 +1,26 @@
+ <div id="{{ headers.divid }}">
+ <div id="asfbanner">
+ <p><a href="https://www.apache.org/events/current-event.html"><img src="https://www.apache.org/events/current-event-234x60.png" alt="Apache Events" height="60" width="234" /></a></p>
+ </div>
+ <div id="poweredbya">
+ <p>
+ <a href="https://www.apache.org/">
+ <img src="/images/asf_logo_small.png" alt="Apache Software Foundation" height="76" width="188"/>
+ </a>
+ </p>
+ </div>
+ <div id="copyrighta">
+ <p style="text-align:center;">
+ <a href="/license.html">Copyright & License</a> |
+ <a href="/privacy.html">Privacy</a> |
+ <a href="/contact_us.html">Contact Us</a> |
+ <a href="/donations.html">Donate</a> |
+ <a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+ </p>
+ <p>
+ Apache and the Apache feather logo are trademarks of The Apache Software Foundation.
+ OpenOffice, OpenOffice.org and the seagull logo are registered trademarks of The Apache Software Foundation.
+ Other names appearing on the site may be trademarks of their respective owners.
+ </p>
+ </div>
+ </div>
diff --git a/templates/html_page.html b/templates/html_page.html
new file mode 100644
index 0000000..40148eb
--- /dev/null
+++ b/templates/html_page.html
@@ -0,0 +1,3 @@
+{% extends "skeleton.html" %}
+ {% block content %}{% autoescape off %}{{ content }}{% endautoescape %}{% endblock %}
+{$ endextends $}
diff --git a/templates/navigator.html b/templates/navigator.html
new file mode 100644
index 0000000..b2e744f
--- /dev/null
+++ b/templates/navigator.html
@@ -0,0 +1 @@
+<div id="{{ headers.divid }}">{% block content %}{{ content|markdown }}{% endblock %}</div>
diff --git a/templates/single_narrative.html b/templates/single_narrative.html
new file mode 100644
index 0000000..19d6b98
--- /dev/null
+++ b/templates/single_narrative.html
@@ -0,0 +1 @@
+{% extends "skeleton.html" %}
diff --git a/templates/skeleton.html b/templates/skeleton.html
new file mode 100644
index 0000000..a1f7b06
--- /dev/null
+++ b/templates/skeleton.html
@@ -0,0 +1,29 @@
+<!--#include virtual="{{ ssi.headers.doctype }}" -->
+<html>
+<head>
+<link href="/css/ooo.css" rel="stylesheet" type="text/css">
+{% if head %}{{ head|safe }}{% else %}
+<title>{% block title %}{{ headers.title }}{% endblock %}</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+{% if headers.css %}<link href="{{ headers.css }}" rel="stylesheet" type="text/css">{% endif %}
+{% endif %}
+<!--#include virtual="/scripts/google-analytics.js" -->
+<!--#include virtual="/scripts/entourage.js" -->
+</head>
+<body{% if bodytag %} {{ bodytag|safe }}{% endif %}>
+<!--#include virtual="{{ ssi.headers.brand }}" -->
+ <div id="topbara">
+ {% if ssi.headers.topnav %}<!--#include virtual="{{ ssi.headers.topnav }}" -->{% endif %}
+ <div id="breadcrumbsa">{% block breaddcrumbs %}{{ breadcrumbs|safe }}{% endblock %}</div>
+ </div>
+ <div id="clear"></div>
+ {% if ssi.headers.leftnav %}<!--#include virtual="{{ ssi.headers.leftnav }}" -->{% endif %}
+ {% if ssi.headers.rightnav %}<!--#include virtual="{{ ssi.headers.rightnav }}" -->{% endif %}
+ <div id="content">
+ {% block legacy %}{% if ssi.headers.legacy %}<div class="legacy">{{ ssi.headers.legacy }}</div>{% endif %}{% endblock %}
+ {% block title %}{% if headers.title %}<h1 class="title">{{ headers.title }}</h1>{% endif %}{% endblock %}
+ {% block content %}{{ content|markdown }}{% endblock %}
+ </div>
+<!--#include virtual="{{ ssi.headers.footer }}" -->
+</body>
+</html>
diff --git a/templates/ssi.json b/templates/ssi.json
new file mode 100644
index 0000000..15957e9
--- /dev/null
+++ b/templates/ssi.json
@@ -0,0 +1,325 @@
+{
+ "/": {
+ "doctype":"/doctype.html",
+ "footer":"/footer.html",
+ "brand":"/brand.html",
+ "topnav":"/topnav.html",
+ "home":"home"
+ }
+ "/sl/": {
+ "brand":"/sl/brand.html",
+ "topnav":"/sl/topnav.html"
+ }
+ "/sk/": {
+ "brand":"/sk/brand.html",
+ "topnav":"/sk/topnav.html"
+ }
+ "/kab/": {
+ "brand":"/kab/brand.html",
+ "topnav":"/kab/topnav.html"
+ }
+ "/pl/why/": {
+ "leftnav":"/pl/why/leftnav.html"
+ }
+ "/pl/product/": {
+ "leftnav":"/pl/product/leftnav.html"
+ }
+ "/pl/": {
+ "brand":"/pl/brand.html",
+ "topnav":"/pl/topnav.html"
+ }
+ "/l10n/": {
+ "topnav":"/l10n/topnav.html",
+ "leftnav":"/l10n/leftnav.html",
+ "rightnav":"/l10n/rightnav.html"
+ }
+ "/vi/": {
+ "brand":"/vi/brand.html",
+ "topnav":"/vi/topnav.html"
+ }
+ "/sv/product/": {
+ "leftnav":"/sv/product/leftnav.html"
+ }
+ "/sv/": {
+ "brand":"/sv/brand.html",
+ "topnav":"/sv/topnav.html"
+ }
+ "/he/why/": {
+ "leftnav":"/he/why/leftnav.html"
+ }
+ "/he/product/": {
+ "leftnav":"/he/product/leftnav.html"
+ }
+ "/he/": {
+ "topnav":"/he/topnav.html",
+ "brand":"/he/brand.html"
+ }
+ "/km/": {
+ "brand":"/km/brand.html",
+ "topnav":"/km/topnav.html"
+ }
+ "/hy/": {
+ "brand":"/hy/brand.html",
+ "topnav":"/hy/topnav.html"
+ }
+ "/why/": {
+ "leftnav":"/why/leftnav.html"
+ }
+ "/am/": {
+ "brand":"/am/brand.html",
+ "topnav":"/am/topnav.html"
+ }
+ "/da/why/": {
+ "leftnav":"/da/why/leftnav.html"
+ }
+ "/da/product/": {
+ "leftnav":"/da/product/leftnav.html"
+ }
+ "/da/": {
+ "brand":"/da/brand.html",
+ "topnav":"/da/topnav.html"
+ }
+ "/no/why/": {
+ "leftnav":"/no/why/leftnav.html"
+ }
+ "/no/product/": {
+ "leftnav":"/no/product/leftnav.html"
+ }
+ "/no/": {
+ "topnav":"/no/topnav.html",
+ "brand":"/no/brand.html"
+ }
+ "/ja/": {
+ "brand":"/ja/brand.html",
+ "topnav":"/ja/topnav.html"
+ }
+ "/el/": {
+ "brand":"/el/brand.html",
+ "topnav":"/el/topnav.html"
+ }
+ "/it/": {
+ "brand":"/it/brand.html",
+ "topnav":"/it/topnav.html"
+ }
+ "/om/": {
+ "brand":"/om/brand.html",
+ "topnav":"/om/topnav.html"
+ }
+ "/ca/": {
+ "brand":"/ca/brand.html",
+ "topnav":"/ca/topnav.html"
+ }
+ "/is/": {
+ "brand":"/is/brand.html",
+ "topnav":"/is/topnav.html"
+ }
+ "/cs/": {
+ "brand":"/cs/brand.html",
+ "topnav":"/cs/topnav.html"
+ }
+ "/ru/why/": {
+ "leftnav":"/ru/why/leftnav.html"
+ }
+ "/ru/": {
+ "brand":"/ru/brand.html"
+ "topnav":"/ru/topnav.html"
+ }
+ "/product/": {
+ "leftnav":"/product/leftnav.html"
+ }
+ "/zh-cn/": {
+ "brand":"/zh-cn/brand.html",
+ "topnav":"/zh-cn/topnav.html"
+ }
+ "/pt/why/": {
+ "leftnav":"/pt/why/leftnav.html"
+ }
+ "/pt/product/": {
+ "leftnav":"/pt/product/leftnav.html"
+ }
+ "/pt/": {
+ "topnav":"/pt/topnav.html",
+ "brand":"/pt/brand.html"
+ }
+ "/zh/": {
+ "brand":"/zh/brand.html",
+ "topnav":"/zh/topnav.html"
+ }
+ "/uk/": {
+ "brand":"/uk/brand.html",
+ "topnav":"/uk/topnav.html"
+ }
+ "/sr/": {
+ "brand":"/sr/brand.html",
+ "topnav":"/sr/topnav.html"
+ }
+ "/sr-latn/why/": {
+ "leftnav":"/sr-latn/why/leftnav.html"
+ }
+ "/sr-latn/product/": {
+ "leftnav":"/sr-latn/product/leftnav.html"
+ }
+ "/sr-latn/": {
+ "topnav":"/sr-latn/topnav.html",
+ "brand":"/sr-latn/brand.html"
+ }
+ "/zh-tw/": {
+ "brand":"/zh-tw/brand.html",
+ "topnav":"/zh-tw/topnav.html"
+ }
+ "/ar/": {
+ "brand":"/ar/brand.html",
+ "topnav":"/ar/topnav.html"
+ }
+ "/gl/": {
+ "brand":"/gl/brand.html",
+ "topnav":"/gl/topnav.html"
+ }
+ "/pt-br/": {
+ "brand":"/pt-br/brand.html",
+ "topnav":"/pt-br/topnav.html"
+ }
+ "/hu/why/": {
+ "leftnav":"/hu/why/leftnav.html"
+ }
+ "/hu/product/": {
+ "leftnav":"/hu/product/leftnav.html"
+ }
+ "/hu/": {
+ "brand":"/hu/brand.html",
+ "topnav":"/hu/topnav.html"
+ }
+ "/nl/why/": {
+ "leftnav":"/nl/why/leftnav.html"
+ }
+ "/nl/product/": {
+ "leftnav":"/nl/product/leftnav.html"
+ }
+ "/nl/": {
+ "brand":"/nl/brand.html",
+ "topnav":"/nl/topnav.html"
+ }
+ "/bg/": {
+ "brand":"/bg/brand.html",
+ "topnav":"/bg/topnav.html"
+ }
+ "/ast/": {
+ "brand":"/ast/brand.html",
+ "topnav":"/ast/topnav.html"
+ }
+ "/af/": {
+ "brand":"/af/brand.html",
+ "topnav":"/af/topnav.html"
+ }
+ "/hi/": {
+ "brand":"/hi/brand.html",
+ "topnav":"/hi/topnav.html"
+ }
+ "/api/": {
+ "leftnav":"/api/leftnav.html"
+ }
+ "/de/product/": {
+ "leftnav":"/de/product/leftnav.html"
+ }
+ "/de/": {
+ "brand":"/de/brand.html",
+ "topnav":"/de/topnav.html"
+ }
+ "/gd/": {
+ "brand":"/gd/brand.html",
+ "topnav":"/gd/topnav.html"
+ }
+ "/ko/product/": {
+ "leftnav":"/ko/product/leftnav.html"
+ }
+ "/ko/": {
+ "brand":"/ko/brand.html",
+ "topnav":"/ko/topnav.html"
+ }
+ "/fi/": {
+ "brand":"/fi/brand.html",
+ "topnav":"/fi/topnav.html"
+ }
+ "/fr/": {
+ "brand":"/fr/brand.html",
+ "topnav":"/fr/topnav.html"
+ }
+ "/es/producto/": {
+ "leftnav":"/es/producto/leftnav.html"
+ }
+ "/es/por-que/": {
+ "leftnav":"/es/por-que/leftnav.html"
+ }
+ "/es/participar/": {
+ "leftnav":"/es/participar/leftnav.html"
+ }
+ "/es/noticias/": {
+ "leftnav":"/es/noticias/leftnav.html"
+ }
+ "/es/": {
+ "brand":"/es/brand.html",
+ "topnav":"/es/topnav.html"
+ }
+ "/et/": {
+ "brand":"/et/brand.html",
+ "topnav":"/et/topnav.html"
+ }
+ "/lt/why/": {
+ "leftnav":"/lt/why/leftnav.html"
+ }
+ "/lt/product/": {
+ "leftnav":"/lt/product/leftnav.html"
+ }
+ "/lt/": {
+ "topnav":"/lt/topnav.html",
+ "brand":"/lt/brand.html"
+ }
+ "/eu/why/": {
+ "leftnav":"/eu/why/leftnav.html"
+ }
+ "/eu/product/": {
+ "leftnav":"/eu/product/leftnav.html"
+ }
+ "/eu/": {
+ "brand":"/eu/brand.html",
+ "topnav":"/eu/topnav.html"
+ }
+ "/sr-cyrl/why/": {
+ "leftnav":"/sr-cyrl/why/leftnav.html"
+ }
+ "/sr-cyrl/product/": {
+ "leftnav":"/sr-cyrl/product/leftnav.html"
+ }
+ "/sr-cyrl/": {
+ "topnav":"/sr-cyrl/topnav.html",
+ "brand":"/sr-cyrl/brand.html"
+ }
+ "/xx/why/": {
+ "leftnav":"/xx/why/leftnav.html"
+ }
+ "/xx/product/": {
+ "leftnav":"/xx/product/leftnav.html"
+ }
+ "/xx/": {
+ "topnav":"/xx/topnav.html",
+ "brand":"/xx/brand.html"
+ }
+ "/ta/": {
+ "brand":"/ta/brand.html",
+ "topnav":"/ta/topnav.html"
+ }
+ "/th/": {
+ "brand":"/th/brand.html",
+ "topnav":"/th/topnav.html"
+ }
+ "/tr/why/": {
+ "leftnav":"/tr/why/leftnav.html"
+ }
+ "/tr/product/": {
+ "leftnav":"/tr/product/leftnav.html"
+ }
+ "/tr/": {
+ "topnav":"/tr/topnav.ehtml",
+ "brand":"/tr/brand.html"
+ }
+}