From b5347d61777fa281d7d5848178e8070f262405f1 Mon Sep 17 00:00:00 2001 From: saber tabatabaee yazdi Date: Sat, 7 Feb 2026 15:49:56 +0330 Subject: [PATCH 01/18] feat: Add internationalization support for 10 languages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix hardcoded 'breadcrumbs' aria-label in SearchPage component - Add translation files for: French, German, Chinese, Arabic, Hebrew, Urdu, English, Portuguese, Russian, Japanese, and Persian - Support proper pluralization for RTL languages (Arabic, Hebrew, Urdu) - Enable full i18n support for search page UI elements - All strings now properly internationalized using Docusaurus translate() function Languages supported: - ��🇷 French (fr) - 🇩🇪 German (de) - 🇨🇳 Chinese (zh) - 🇸🇦 Arabic (ar) - 🇮🇱 Hebrew (he) - 🇵�� Urdu (ur) - 🇬🇧 English (en) - 🇵🇹 Portuguese (pt) - 🇷🇺 Russian (ru) - 🇯🇵 Japanese (ja) - 🇮🇷 Persian (fa) --- i18n/ar/theme.json | 38 +++++++++++++++++++++++++++ i18n/de/theme.json | 38 +++++++++++++++++++++++++++ i18n/en/theme.json | 38 +++++++++++++++++++++++++++ i18n/fa/theme.json | 38 +++++++++++++++++++++++++++ i18n/fr/theme.json | 38 +++++++++++++++++++++++++++ i18n/he/theme.json | 38 +++++++++++++++++++++++++++ i18n/ja/theme.json | 38 +++++++++++++++++++++++++++ i18n/pt/theme.json | 38 +++++++++++++++++++++++++++ i18n/ru/theme.json | 38 +++++++++++++++++++++++++++ i18n/ur/theme.json | 38 +++++++++++++++++++++++++++ i18n/zh/theme.json | 38 +++++++++++++++++++++++++++ lib/theme/SearchPage/index.js | 6 ++++- src/theme/SearchPage/index.tsx | 6 ++++- src/theme/SearchTranslations/index.ts | 2 +- 14 files changed, 429 insertions(+), 3 deletions(-) create mode 100644 i18n/ar/theme.json create mode 100644 i18n/de/theme.json create mode 100644 i18n/en/theme.json create mode 100644 i18n/fa/theme.json create mode 100644 i18n/fr/theme.json create mode 100644 i18n/he/theme.json create mode 100644 i18n/ja/theme.json create mode 100644 i18n/pt/theme.json create mode 100644 i18n/ru/theme.json create mode 100644 i18n/ur/theme.json create mode 100644 i18n/zh/theme.json diff --git a/i18n/ar/theme.json b/i18n/ar/theme.json new file mode 100644 index 0000000..08abbf2 --- /dev/null +++ b/i18n/ar/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "نتائج البحث عن \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "البحث في الوثائق", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "تم العثور على مستند واحد|تم العثور على {count} مستندات|تم العثور على {count} مستنداً|تم العثور على {count} مستند", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "اكتب عبارة البحث هنا", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "بحث", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "بحث بواسطة Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "لم يتم العثور على نتائج", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "جاري جلب النتائج الجديدة...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "مسار التنقل", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/de/theme.json b/i18n/de/theme.json new file mode 100644 index 0000000..6e11887 --- /dev/null +++ b/i18n/de/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "Suchergebnisse für \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "Dokumentation durchsuchen", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "Ein Dokument gefunden|{count} Dokumente gefunden", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "Suchbegriff hier eingeben", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "Suchen", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "Suche von Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "Keine Ergebnisse gefunden", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "Neue Ergebnisse werden abgerufen...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "Brotkrümel-Navigation", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/en/theme.json b/i18n/en/theme.json new file mode 100644 index 0000000..550a1d9 --- /dev/null +++ b/i18n/en/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "Search results for \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "Search the documentation", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "One document found|{count} documents found", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "Type your search here", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "Search", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "Search by Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "No results were found", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "Fetching new results...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "Breadcrumbs", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/fa/theme.json b/i18n/fa/theme.json new file mode 100644 index 0000000..01bf463 --- /dev/null +++ b/i18n/fa/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "نتایج جستجو برای \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "جستجو در مستندات", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "یک سند پیدا شد|{count} سند پیدا شد", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "عبارت خود را برای جستجو تایپ کنید", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "جستجو", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "جستجو توسط Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "هیچ نتیجه‌ای پیدا نشد", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "در حال دریافت نتایج جدید...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "مسیر راهنما", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/fr/theme.json b/i18n/fr/theme.json new file mode 100644 index 0000000..3a962d9 --- /dev/null +++ b/i18n/fr/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "Résultats de recherche pour \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "Rechercher dans la documentation", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "Un document trouvé|{count} documents trouvés", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "Tapez votre recherche ici", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "Rechercher", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "Recherche par Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "Aucun résultat trouvé", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "Récupération de nouveaux résultats...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "Fil d'Ariane", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/he/theme.json b/i18n/he/theme.json new file mode 100644 index 0000000..ae8d788 --- /dev/null +++ b/i18n/he/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "תוצאות חיפוש עבור \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "חיפוש בתיעוד", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "נמצא מסמך אחד|נמצאו {count} מסמכים|נמצאו {count} מסמכים|נמצאו {count} מסמכים", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "הקלד את החיפוש שלך כאן", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "חיפוש", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "חיפוש על ידי Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "לא נמצאו תוצאות", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "מאחזר תוצאות חדשות...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "ניווט פירורי לחם", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/ja/theme.json b/i18n/ja/theme.json new file mode 100644 index 0000000..acf0af2 --- /dev/null +++ b/i18n/ja/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "\"{query}\"の検索結果", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "ドキュメントを検索", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "1件のドキュメントが見つかりました|{count}件のドキュメントが見つかりました", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "ここに検索語を入力", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "検索", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "Typesenseによる検索", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "結果が見つかりませんでした", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "新しい結果を取得中...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "パンくずナビゲーション", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/pt/theme.json b/i18n/pt/theme.json new file mode 100644 index 0000000..6f43a89 --- /dev/null +++ b/i18n/pt/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "Resultados da busca para \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "Buscar na documentação", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "Um documento encontrado|{count} documentos encontrados|{count} documentos encontrados", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "Digite sua busca aqui", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "Buscar", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "Busca por Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "Nenhum resultado foi encontrado", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "Buscando novos resultados...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "Navegação por migalhas de pão", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/ru/theme.json b/i18n/ru/theme.json new file mode 100644 index 0000000..addb277 --- /dev/null +++ b/i18n/ru/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "Результаты поиска по запросу \"{query}\"", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "Поиск в документации", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "Найден {count} документ|Найдено {count} документа|Найдено {count} документов", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "Введите поисковый запрос здесь", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "Поиск", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "Поиск от Typesense", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "Результаты не найдены", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "Получение новых результатов...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "Навигационная цепочка", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/ur/theme.json b/i18n/ur/theme.json new file mode 100644 index 0000000..fbdd2e0 --- /dev/null +++ b/i18n/ur/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "\"{query}\" کی تلاش کے نتائج", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "دستاویزات تلاش کریں", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "ایک دستاویز ملی|{count} دستاویزات ملیں|{count} دستاویزات", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "اپنی تلاش یہاں لکھیں", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "تلاش کریں", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "Typesense کی طرف سے تلاش", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "کوئی نتیجہ نہیں ملا", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "نئے نتائج حاصل کیے جا رہے ہیں...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "روٹی کے چورے نیویگیشن", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/i18n/zh/theme.json b/i18n/zh/theme.json new file mode 100644 index 0000000..31efb41 --- /dev/null +++ b/i18n/zh/theme.json @@ -0,0 +1,38 @@ +{ + "theme.SearchPage.existingResultsTitle": { + "message": "搜索\"{query}\"的结果", + "description": "The search page title for non-empty query" + }, + "theme.SearchPage.emptyResultsTitle": { + "message": "搜索文档", + "description": "The search page title for empty query" + }, + "theme.SearchPage.documentsFound.plurals": { + "message": "找到1个文档|找到{count}个文档", + "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.SearchPage.inputPlaceholder": { + "message": "在此输入搜索内容", + "description": "The placeholder for search page input" + }, + "theme.SearchPage.inputLabel": { + "message": "搜索", + "description": "The ARIA label for search page input" + }, + "theme.SearchPage.typesenseLabel": { + "message": "由 Typesense 提供搜索", + "description": "The ARIA label for Typesense mention" + }, + "theme.SearchPage.noResultsText": { + "message": "未找到结果", + "description": "The paragraph for empty search result" + }, + "theme.SearchPage.fetchingNewResults": { + "message": "正在获取新结果...", + "description": "The paragraph for fetching new search results" + }, + "theme.SearchPage.breadcrumbs.ariaLabel": { + "message": "面包屑导航", + "description": "The ARIA label for breadcrumbs navigation" + } +} diff --git a/lib/theme/SearchPage/index.js b/lib/theme/SearchPage/index.js index 856369e..f45f14d 100644 --- a/lib/theme/SearchPage/index.js +++ b/lib/theme/SearchPage/index.js @@ -303,7 +303,11 @@ function SearchPageContent() { - {breadcrumbs.length > 0 && (