Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

<p align="center">
<a href="README.md">English</a> ·
<a href="README.hi.md">हिन्दी</a> ·
<a href="README.zh-CN.md">中文</a> ·
<a href="README.fr.md">Français</a> ·
<a href="README.ja.md">日本語</a> ·
Expand Down
408 changes: 408 additions & 0 deletions README.hi.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

<p align="center">
<a href="README.md">English</a> ·
<a href="README.hi.md">हिन्दी</a> ·
<a href="README.zh-CN.md">中文</a> ·
<a href="README.fr.md">Français</a> ·
<a href="README.ja.md">日本語</a> ·
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

<p align="center">
<a href="README.md">English</a> ·
<a href="README.hi.md">हिन्दी</a> ·
<a href="README.zh-CN.md">中文</a> ·
<a href="README.fr.md">Français</a> ·
<a href="README.ja.md">日本語</a> ·
Expand Down
1 change: 1 addition & 0 deletions README.tr.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Sayfalarla sohbet etmenizi, görevleri otomatikleştirmenizi ve seçtiğiniz bir

<p align="center">
<a href="README.md">İngilizce</a> ·
<a href="README.hi.md">Hindçe</a> ·
<a href="README.zh-CN.md">Çince</a> ·
<a href="README.fr.md">Fransızca</a> ·
<a href="README.ja.md">Japonca</a> ·
Expand Down
1 change: 1 addition & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

<p align="center">
<a href="README.md">English</a> ·
<a href="README.hi.md">हिन्दी</a> ·
<a href="README.zh-CN.md">中文</a> ·
<a href="README.fr.md">Français</a> ·
<a href="README.ja.md">日本語</a> ·
Expand Down
47 changes: 31 additions & 16 deletions scripts/build-docs.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,28 @@ async function listHtmlFiles(dir) {
return files.sort();
}

// Guide navigation and footer per translated docs set. English pages live at
// the /docs/ root; Chinese and Hindi mirror it under /docs/zh/ and /docs/hi/.
const GUIDE_LANGUAGES = {
zh: { overview: '/docs/zh/', faq: '/docs/zh/faq/', faqLabel: '常见问题' },
hi: { overview: '/docs/hi/', faq: '/docs/hi/faq/', faqLabel: 'अक्सर पूछे जाने वाले सवाल' },
en: { overview: '/docs/', faq: '/docs/faq/', faqLabel: 'FAQ' },
};

function guideLanguageFor(normalizedPath) {
if (normalizedPath.includes('/web/docs/zh/')) return 'zh';
if (normalizedPath.includes('/web/docs/hi/')) return 'hi';
return 'en';
}

function withGuideNavigation(html, file) {
const normalized = file.replace(/\\/g, '/');
// FAQ pages have a page-specific topic rail instead of the guide index.
if (normalized.endsWith('/faq/index.html')) return html;

const isChinese = normalized.includes('/web/docs/zh/');
const overviewHref = isChinese ? '/docs/zh/' : '/docs/';
const faqHref = isChinese ? '/docs/zh/faq/' : '/docs/faq/';
const faqLabel = isChinese ? '常见问题' : 'FAQ';
const lang = guideLanguageFor(normalized);
const isEnglish = lang === 'en';
const { overview: overviewHref, faq: faqHref, faqLabel } = GUIDE_LANGUAGES[lang];
let generated = html;
if (!generated.includes(`href="${faqHref}"`)) {
const escapedOverview = overviewHref.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
Expand All @@ -50,7 +63,7 @@ function withGuideNavigation(html, file) {
}

const hasApocalypseModeNavigation = /<a href="\/docs\/apocalypse-mode\/"[^>]*>Apocalypse Mode<\/a>/.test(generated);
if (!isChinese && !hasApocalypseModeNavigation) {
if (isEnglish && !hasApocalypseModeNavigation) {
const safetyLink = /(<a href="\/docs\/safety\/"[^>]*>[^<]*<\/a>)/;
const withApocalypseMode = generated.replace(
safetyLink,
Expand All @@ -70,9 +83,8 @@ function withGuideNavigation(html, file) {
`<a href="${escapedCompanionHref}"[^>]*>${escapedCompanionLabel}<\\/a>`,
).test(generated);
if (!hasCompanionNavigation) {
const providersLink = isChinese
? /(<a href="\/docs\/zh\/providers\/"[^>]*>提供商与模型<\/a>)/
: /(<a href="\/docs\/providers\/"[^>]*>Providers &(?:amp;)? models<\/a>)/;
const providersHref = `${overviewHref}providers/`.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const providersLink = new RegExp(`(<a href="${providersHref}"[^>]*>[^<]*<\\/a>)`);
const withCompanion = generated.replace(
providersLink,
`$1<a href="${companionHref}">${companionLabel}</a>`,
Expand All @@ -86,7 +98,7 @@ function withGuideNavigation(html, file) {
// The WebBrain for websites guide gets its own group after "Use WebBrain",
// while the site shows that product (WEBSITES_LAUNCHED). English only.
const websitesGroup = /<div class="sidebar-group"><div class="sidebar-label">On your website<\/div><nav><a href="\/docs\/websites\/"[^>]*>WebBrain for websites<\/a><\/nav><\/div>/;
if (!isChinese && WEBSITES_LAUNCHED && !websitesGroup.test(generated)) {
if (isEnglish && WEBSITES_LAUNCHED && !websitesGroup.test(generated)) {
generated = generated.replace(
/(<a href="\/docs\/ollama\/"[^>]*>Ollama<\/a><\/nav>\s*<\/div>)/,
'$1<div class="sidebar-group"><div class="sidebar-label">On your website</div><nav><a href="/docs/websites/">WebBrain for websites</a></nav></div>',
Expand All @@ -103,12 +115,14 @@ function withDocsFooter(html, file, dictionaries) {
// The FAQ pages are built from web/build/faq-template.html, which already
// renders the footer in each FAQ's own language.
if (normalized.endsWith('/faq/index.html')) return html;
if (normalized.includes('/web/docs/zh/')) {
return withSiteFooter(html, dictionaries.zh, {
browserPath: '/zh/',
companionPath: '/companion/zh/',
docsPath: '/docs/zh/',
faqPath: '/docs/zh/faq/',
const lang = guideLanguageFor(normalized);
if (lang !== 'en') {
const { overview, faq } = GUIDE_LANGUAGES[lang];
return withSiteFooter(html, dictionaries[lang], {
browserPath: `/${lang}/`,
companionPath: `/companion/${lang}/`,
docsPath: overview,
faqPath: faq,
});
}
return withSiteFooter(html, dictionaries.en);
Expand All @@ -117,13 +131,14 @@ function withDocsFooter(html, file, dictionaries) {
async function main() {
const en = JSON.parse(await readFile(path.join(LOCALES_DIR, 'en.json'), 'utf8'));
const zh = { ...en, ...JSON.parse(await readFile(path.join(LOCALES_DIR, 'zh.json'), 'utf8')) };
const hi = { ...en, ...JSON.parse(await readFile(path.join(LOCALES_DIR, 'hi.json'), 'utf8')) };
const files = await listHtmlFiles(DOCS_DIR);
for (const file of files) {
const original = await readFile(file, 'utf8');
const generated = withDocsFooter(
withGuideNavigation(withPlausibleAnalytics(original), file),
file,
{ en, zh },
{ en, zh, hi },
);
const occurrences = generated.split(PLAUSIBLE_SCRIPT_URL).length - 1;
if (occurrences !== 1) {
Expand Down
6 changes: 3 additions & 3 deletions web/ar/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="canonical" href="https://webbrain.one/ar/">
<link rel="alternate" hreflang="en" href="https://webbrain.one/">
<link rel="alternate" hreflang="hi" href="https://webbrain.one/hi/">
<link rel="alternate" hreflang="es" href="https://webbrain.one/es/">
<link rel="alternate" hreflang="fr" href="https://webbrain.one/fr/">
<link rel="alternate" hreflang="tr" href="https://webbrain.one/tr/">
Expand All @@ -41,7 +42,6 @@
<link rel="alternate" hreflang="ms" href="https://webbrain.one/ms/">
<link rel="alternate" hreflang="tl" href="https://webbrain.one/tl/">
<link rel="alternate" hreflang="he" href="https://webbrain.one/he/">
<link rel="alternate" hreflang="hi" href="https://webbrain.one/hi/">
<link rel="alternate" hreflang="pt" href="https://webbrain.one/pt/">
<link rel="alternate" hreflang="vi" href="https://webbrain.one/vi/">
<link rel="alternate" hreflang="bn" href="https://webbrain.one/bn/">
Expand Down Expand Up @@ -4167,6 +4167,7 @@
<div class="language-picker" id="language-picker">
<select class="language-select-native" id="lang-dropdown" tabindex="-1" aria-hidden="true" data-current="ar">
<option value="en">English</option>
<option value="hi">हिन्दी</option>
<option value="zh">中文</option>
<option value="ar">العربية</option>
<option value="bn">বাংলা</option>
Expand All @@ -4175,7 +4176,6 @@
<option value="fr">Français</option>
<option value="de">Deutsch</option>
<option value="he">עברית</option>
<option value="hi">हिन्दी</option>
<option value="id">Bahasa Indonesia</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
Expand Down Expand Up @@ -5198,6 +5198,7 @@ <h3>انشر الكلمة، شارك الحبّ</h3>
<div class="wb-footer-languages">
<span>اختر اللغة</span>
<a href="/" hreflang="en" lang="en">English</a>
<a href="/hi/" hreflang="hi" lang="hi">हिन्दी</a>
<a href="/zh/" hreflang="zh" lang="zh">中文</a>
<a href="/ar/" hreflang="ar" lang="ar">العربية</a>
<a href="/bn/" hreflang="bn" lang="bn">বাংলা</a>
Expand All @@ -5206,7 +5207,6 @@ <h3>انشر الكلمة، شارك الحبّ</h3>
<a href="/fr/" hreflang="fr" lang="fr">Français</a>
<a href="/de/" hreflang="de" lang="de">Deutsch</a>
<a href="/he/" hreflang="he" lang="he">עברית</a>
<a href="/hi/" hreflang="hi" lang="hi">हिन्दी</a>
<a href="/id/" hreflang="id" lang="id">Bahasa Indonesia</a>
<a href="/ja/" hreflang="ja" lang="ja">日本語</a>
<a href="/ko/" hreflang="ko" lang="ko">한국어</a>
Expand Down
6 changes: 3 additions & 3 deletions web/bn/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="canonical" href="https://webbrain.one/bn/">
<link rel="alternate" hreflang="en" href="https://webbrain.one/">
<link rel="alternate" hreflang="hi" href="https://webbrain.one/hi/">
<link rel="alternate" hreflang="es" href="https://webbrain.one/es/">
<link rel="alternate" hreflang="fr" href="https://webbrain.one/fr/">
<link rel="alternate" hreflang="tr" href="https://webbrain.one/tr/">
Expand All @@ -41,7 +42,6 @@
<link rel="alternate" hreflang="ms" href="https://webbrain.one/ms/">
<link rel="alternate" hreflang="tl" href="https://webbrain.one/tl/">
<link rel="alternate" hreflang="he" href="https://webbrain.one/he/">
<link rel="alternate" hreflang="hi" href="https://webbrain.one/hi/">
<link rel="alternate" hreflang="pt" href="https://webbrain.one/pt/">
<link rel="alternate" hreflang="vi" href="https://webbrain.one/vi/">
<link rel="alternate" hreflang="bn" href="https://webbrain.one/bn/">
Expand Down Expand Up @@ -4167,6 +4167,7 @@
<div class="language-picker" id="language-picker">
<select class="language-select-native" id="lang-dropdown" tabindex="-1" aria-hidden="true" data-current="bn">
<option value="en">English</option>
<option value="hi">हिन्दी</option>
<option value="zh">中文</option>
<option value="ar">العربية</option>
<option value="bn">বাংলা</option>
Expand All @@ -4175,7 +4176,6 @@
<option value="fr">Français</option>
<option value="de">Deutsch</option>
<option value="he">עברית</option>
<option value="hi">हिन्दी</option>
<option value="id">Bahasa Indonesia</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
Expand Down Expand Up @@ -5198,6 +5198,7 @@ <h3>কথাটি ছড়িয়ে দিন, ভালবাসা ভ
<div class="wb-footer-languages">
<span>ভাষা নির্বাচন করুন</span>
<a href="/" hreflang="en" lang="en">English</a>
<a href="/hi/" hreflang="hi" lang="hi">हिन्दी</a>
<a href="/zh/" hreflang="zh" lang="zh">中文</a>
<a href="/ar/" hreflang="ar" lang="ar">العربية</a>
<a href="/bn/" hreflang="bn" lang="bn">বাংলা</a>
Expand All @@ -5206,7 +5207,6 @@ <h3>কথাটি ছড়িয়ে দিন, ভালবাসা ভ
<a href="/fr/" hreflang="fr" lang="fr">Français</a>
<a href="/de/" hreflang="de" lang="de">Deutsch</a>
<a href="/he/" hreflang="he" lang="he">עברית</a>
<a href="/hi/" hreflang="hi" lang="hi">हिन्दी</a>
<a href="/id/" hreflang="id" lang="id">Bahasa Indonesia</a>
<a href="/ja/" hreflang="ja" lang="ja">日本語</a>
<a href="/ko/" hreflang="ko" lang="ko">한국어</a>
Expand Down
24 changes: 21 additions & 3 deletions web/build/build.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -298,12 +298,14 @@ function faqUrlFor(locale) {
return `${SITE_ORIGIN}${faqPathFor(locale)}`;
}

const TRANSLATED_DOCS = { zh: '/docs/zh/', hi: '/docs/hi/' };

function docsPathFor(locale) {
return locale.code === 'zh' ? '/docs/zh/' : '/docs/';
return TRANSLATED_DOCS[locale.code] || '/docs/';
}

// The footer's no-JavaScript language list, in the language picker's order.
const FOOTER_LANGUAGE_ORDER = ['en', 'zh', 'ar', 'bn', 'nl', 'tl', 'fr', 'de', 'he', 'hi', 'id', 'ja', 'ko', 'ms', 'fa', 'pt', 'ru', 'es', 'th', 'tr', 'uk', 'vi'];
const FOOTER_LANGUAGE_ORDER = ['en', 'hi', 'zh', 'ar', 'bn', 'nl', 'tl', 'fr', 'de', 'he', 'id', 'ja', 'ko', 'ms', 'fa', 'pt', 'ru', 'es', 'th', 'tr', 'uk', 'vi'];

function validateFooterLanguageOrder() {
const codes = LOCALES.map((l) => l.code);
Expand Down Expand Up @@ -646,7 +648,7 @@ function applyTemplate(template, dict, locale, page = 'home') {
.replace(/\{\{sites_demo_site_id\}\}/g, SITES_DEMO_SITE_ID)
.replace(/\{\{home_title_size\}\}/g, homeTitleSize(dict))
.replace(/\{\{docs_url\}\}/g, docsUrl)
.replace(/\{\{docs_language_label\}\}/g, locale.code === 'zh' ? '中文' : 'EN')
.replace(/\{\{docs_language_label\}\}/g, locale.code === 'zh' ? '中文' : locale.code === 'hi' ? 'हिन्दी' : 'EN')
.replace(/\{\{faq_url\}\}/g, faqPathFor(locale))
.replace(/\{\{faq_canonical\}\}/g, faqUrlFor(locale))
.replace(/\{\{plausible_analytics\}\}/g, PLAUSIBLE_ANALYTICS)
Expand Down Expand Up @@ -814,6 +816,21 @@ async function main() {
{ loc: `${SITE_ORIGIN}/docs/zh/providers/` },
{ loc: `${SITE_ORIGIN}/docs/zh/easy-cli-proxy/`, alternates: 'easy-cli-proxy' },
{ loc: `${SITE_ORIGIN}/docs/zh/safety/` },
{ loc: `${SITE_ORIGIN}/docs/zh/apocalypse-mode/` },
{ loc: `${SITE_ORIGIN}/docs/zh/formats/` },
{ loc: `${SITE_ORIGIN}/docs/zh/mcp/` },
{ loc: `${SITE_ORIGIN}/docs/zh/lm-studio/` },
{ loc: `${SITE_ORIGIN}/docs/zh/ollama/` },
{ loc: `${SITE_ORIGIN}/docs/hi/` },
{ loc: `${SITE_ORIGIN}/docs/hi/settings/` },
{ loc: `${SITE_ORIGIN}/docs/hi/providers/` },
{ loc: `${SITE_ORIGIN}/docs/hi/easy-cli-proxy/`, alternates: 'easy-cli-proxy' },
{ loc: `${SITE_ORIGIN}/docs/hi/safety/` },
{ loc: `${SITE_ORIGIN}/docs/hi/apocalypse-mode/` },
{ loc: `${SITE_ORIGIN}/docs/hi/formats/` },
{ loc: `${SITE_ORIGIN}/docs/hi/mcp/` },
{ loc: `${SITE_ORIGIN}/docs/hi/lm-studio/` },
{ loc: `${SITE_ORIGIN}/docs/hi/ollama/` },
];
const sitemap = [
'<?xml version="1.0" encoding="UTF-8"?>',
Expand All @@ -826,6 +843,7 @@ async function main() {
const alts = u.alternates === 'easy-cli-proxy'
? [
` <xhtml:link rel="alternate" hreflang="en" href="${SITE_ORIGIN}/docs/easy-cli-proxy/"/>`,
` <xhtml:link rel="alternate" hreflang="hi" href="${SITE_ORIGIN}/docs/hi/easy-cli-proxy/"/>`,
` <xhtml:link rel="alternate" hreflang="zh" href="${SITE_ORIGIN}/docs/zh/easy-cli-proxy/"/>`,
` <xhtml:link rel="alternate" hreflang="x-default" href="${SITE_ORIGIN}/docs/easy-cli-proxy/"/>`,
].join('\n') + '\n'
Expand Down
2 changes: 1 addition & 1 deletion web/build/faq-template.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/favicon.png">
<script>try{document.documentElement.dataset.theme=localStorage.getItem('webbrain-theme')||'dark'}catch(_){}</script>
<link rel="stylesheet" href="/docs/assets/docs.css?v=20261028">
<link rel="stylesheet" href="/docs/assets/docs.css?v=20261106">
{{site_footer_styles}}
{{plausible_analytics}}
<script type="application/ld+json">
Expand Down
14 changes: 7 additions & 7 deletions web/build/languages.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
"dir": "ltr",
"isDefault": true
},
{
"code": "hi",
"bcp47": "hi-IN",
"label": "हिन्दी",
"dir": "ltr",
"isDefault": false
},
{
"code": "es",
"bcp47": "es-ES",
Expand Down Expand Up @@ -104,13 +111,6 @@
"dir": "rtl",
"isDefault": false
},
{
"code": "hi",
"bcp47": "hi-IN",
"label": "हिन्दी",
"dir": "ltr",
"isDefault": false
},
{
"code": "pt",
"bcp47": "pt-BR",
Expand Down
2 changes: 1 addition & 1 deletion web/build/template.html
Original file line number Diff line number Diff line change
Expand Up @@ -3770,6 +3770,7 @@
<div class="language-picker" id="language-picker">
<select class="language-select-native" id="lang-dropdown" tabindex="-1" aria-hidden="true" data-current="{{locale_code}}">
<option value="en">English</option>
<option value="hi">हिन्दी</option>
<option value="zh">中文</option>
<option value="ar">العربية</option>
<option value="bn">বাংলা</option>
Expand All @@ -3778,7 +3779,6 @@
<option value="fr">Français</option>
<option value="de">Deutsch</option>
<option value="he">עברית</option>
<option value="hi">हिन्दी</option>
<option value="id">Bahasa Indonesia</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
Expand Down
6 changes: 3 additions & 3 deletions web/de/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
<link rel="icon" type="image/png" href="/favicon.png">
<link rel="canonical" href="https://webbrain.one/de/">
<link rel="alternate" hreflang="en" href="https://webbrain.one/">
<link rel="alternate" hreflang="hi" href="https://webbrain.one/hi/">
<link rel="alternate" hreflang="es" href="https://webbrain.one/es/">
<link rel="alternate" hreflang="fr" href="https://webbrain.one/fr/">
<link rel="alternate" hreflang="tr" href="https://webbrain.one/tr/">
Expand All @@ -41,7 +42,6 @@
<link rel="alternate" hreflang="ms" href="https://webbrain.one/ms/">
<link rel="alternate" hreflang="tl" href="https://webbrain.one/tl/">
<link rel="alternate" hreflang="he" href="https://webbrain.one/he/">
<link rel="alternate" hreflang="hi" href="https://webbrain.one/hi/">
<link rel="alternate" hreflang="pt" href="https://webbrain.one/pt/">
<link rel="alternate" hreflang="vi" href="https://webbrain.one/vi/">
<link rel="alternate" hreflang="bn" href="https://webbrain.one/bn/">
Expand Down Expand Up @@ -4167,6 +4167,7 @@
<div class="language-picker" id="language-picker">
<select class="language-select-native" id="lang-dropdown" tabindex="-1" aria-hidden="true" data-current="de">
<option value="en">English</option>
<option value="hi">हिन्दी</option>
<option value="zh">中文</option>
<option value="ar">العربية</option>
<option value="bn">বাংলা</option>
Expand All @@ -4175,7 +4176,6 @@
<option value="fr">Français</option>
<option value="de">Deutsch</option>
<option value="he">עברית</option>
<option value="hi">हिन्दी</option>
<option value="id">Bahasa Indonesia</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
Expand Down Expand Up @@ -5198,6 +5198,7 @@ <h3>Verbreiten Sie es, teilen Sie die Liebe</h3>
<div class="wb-footer-languages">
<span>Sprache auswählen</span>
<a href="/" hreflang="en" lang="en">English</a>
<a href="/hi/" hreflang="hi" lang="hi">हिन्दी</a>
<a href="/zh/" hreflang="zh" lang="zh">中文</a>
<a href="/ar/" hreflang="ar" lang="ar">العربية</a>
<a href="/bn/" hreflang="bn" lang="bn">বাংলা</a>
Expand All @@ -5206,7 +5207,6 @@ <h3>Verbreiten Sie es, teilen Sie die Liebe</h3>
<a href="/fr/" hreflang="fr" lang="fr">Français</a>
<a href="/de/" hreflang="de" lang="de">Deutsch</a>
<a href="/he/" hreflang="he" lang="he">עברית</a>
<a href="/hi/" hreflang="hi" lang="hi">हिन्दी</a>
<a href="/id/" hreflang="id" lang="id">Bahasa Indonesia</a>
<a href="/ja/" hreflang="ja" lang="ja">日本語</a>
<a href="/ko/" hreflang="ko" lang="ko">한국어</a>
Expand Down
Loading
Loading