From 994eb8db2a2f924aaf155070e41b86126c7175da Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 23 Sep 2025 15:13:31 -0700 Subject: [PATCH] feat(i18n): added japanese and german translations (#1428) * feat(changelog): added changelog * feat(i18n): added japanese and german translations * reordered --------- Co-authored-by: waleed --- .github/workflows/i18n.yml | 12 +++++- apps/docs/components/ui/language-dropdown.tsx | 43 ++++++++++++++----- apps/docs/i18n.json | 2 +- apps/docs/lib/i18n.ts | 2 +- 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/.github/workflows/i18n.yml b/.github/workflows/i18n.yml index c7806facf..bbaffbce4 100644 --- a/.github/workflows/i18n.yml +++ b/.github/workflows/i18n.yml @@ -55,7 +55,7 @@ jobs: with: token: ${{ secrets.GH_PAT }} commit-message: "feat(i18n): update translations" - title: "๐ŸŒ Auto-update translations" + title: "feat(i18n): update translations" body: | ## Summary Automated translation updates triggered by changes to documentation. @@ -76,8 +76,10 @@ jobs: ## Testing This PR includes automated translations for modified English documentation content: - ๐Ÿ‡ช๐Ÿ‡ธ Spanish (es) translations - - ๐Ÿ‡ซ๐Ÿ‡ท French (fr) translations + - ๐Ÿ‡ซ๐Ÿ‡ท French (fr) translations - ๐Ÿ‡จ๐Ÿ‡ณ Chinese (zh) translations + - ๐Ÿ‡ฏ๐Ÿ‡ต Japanese (ja) translations + - ๐Ÿ‡ฉ๐Ÿ‡ช German (de) translations **What reviewers should focus on:** - Verify translated content accuracy and context @@ -137,15 +139,21 @@ jobs: es_count=$(find content/docs/es -name "*.mdx" 2>/dev/null | wc -l || echo 0) fr_count=$(find content/docs/fr -name "*.mdx" 2>/dev/null | wc -l || echo 0) zh_count=$(find content/docs/zh -name "*.mdx" 2>/dev/null | wc -l || echo 0) + ja_count=$(find content/docs/ja -name "*.mdx" 2>/dev/null | wc -l || echo 0) + de_count=$(find content/docs/de -name "*.mdx" 2>/dev/null | wc -l || echo 0) es_percentage=$((es_count * 100 / en_count)) fr_percentage=$((fr_count * 100 / en_count)) zh_percentage=$((zh_count * 100 / en_count)) + ja_percentage=$((ja_count * 100 / en_count)) + de_percentage=$((de_count * 100 / en_count)) echo "### Coverage Statistics" >> $GITHUB_STEP_SUMMARY echo "- **๐Ÿ‡ฌ๐Ÿ‡ง English**: $en_count files (source)" >> $GITHUB_STEP_SUMMARY echo "- **๐Ÿ‡ช๐Ÿ‡ธ Spanish**: $es_count/$en_count files ($es_percentage%)" >> $GITHUB_STEP_SUMMARY echo "- **๐Ÿ‡ซ๐Ÿ‡ท French**: $fr_count/$en_count files ($fr_percentage%)" >> $GITHUB_STEP_SUMMARY echo "- **๐Ÿ‡จ๐Ÿ‡ณ Chinese**: $zh_count/$en_count files ($zh_percentage%)" >> $GITHUB_STEP_SUMMARY + echo "- **๐Ÿ‡ฏ๐Ÿ‡ต Japanese**: $ja_count/$en_count files ($ja_percentage%)" >> $GITHUB_STEP_SUMMARY + echo "- **๐Ÿ‡ฉ๐Ÿ‡ช German**: $de_count/$en_count files ($de_percentage%)" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY echo "๐Ÿ”„ **Auto-translation PR**: Check for new pull request with updated translations" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/apps/docs/components/ui/language-dropdown.tsx b/apps/docs/components/ui/language-dropdown.tsx index 8067c96f5..0a474a491 100644 --- a/apps/docs/components/ui/language-dropdown.tsx +++ b/apps/docs/components/ui/language-dropdown.tsx @@ -2,12 +2,14 @@ import { useEffect, useState } from 'react' import { Check, ChevronDown } from 'lucide-react' -import { useParams, usePathname } from 'next/navigation' +import { useParams, usePathname, useRouter } from 'next/navigation' const languages = { en: { name: 'English', flag: '๐Ÿ‡บ๐Ÿ‡ธ' }, es: { name: 'Espaรฑol', flag: '๐Ÿ‡ช๐Ÿ‡ธ' }, fr: { name: 'Franรงais', flag: '๐Ÿ‡ซ๐Ÿ‡ท' }, + de: { name: 'Deutsch', flag: '๐Ÿ‡ฉ๐Ÿ‡ช' }, + ja: { name: 'ๆ—ฅๆœฌ่ชž', flag: '๐Ÿ‡ฏ๐Ÿ‡ต' }, zh: { name: '็ฎ€ไฝ“ไธญๆ–‡', flag: '๐Ÿ‡จ๐Ÿ‡ณ' }, } @@ -15,6 +17,7 @@ export function LanguageDropdown() { const [isOpen, setIsOpen] = useState(false) const pathname = usePathname() const params = useParams() + const router = useRouter() const [currentLang, setCurrentLang] = useState(() => { const langFromParams = params?.lang as string @@ -56,9 +59,18 @@ export function LanguageDropdown() { newPath = `/${locale}${segments.length > 0 ? `/${segments.join('/')}` : '/introduction'}` } - window.location.href = newPath + router.push(newPath) } + useEffect(() => { + if (!isOpen) return + const onKey = (e: KeyboardEvent) => { + if (e.key === 'Escape') setIsOpen(false) + } + window.addEventListener('keydown', onKey) + return () => window.removeEventListener('keydown', onKey) + }, [isOpen]) + return (
))}
diff --git a/apps/docs/i18n.json b/apps/docs/i18n.json index dd89e3a0f..771a5158c 100644 --- a/apps/docs/i18n.json +++ b/apps/docs/i18n.json @@ -3,7 +3,7 @@ "version": 1.8, "locale": { "source": "en", - "targets": ["es", "fr", "zh"] + "targets": ["es", "fr", "zh", "ja", "de"] }, "buckets": { "mdx": { diff --git a/apps/docs/lib/i18n.ts b/apps/docs/lib/i18n.ts index cca7a57bd..cb9e75c15 100644 --- a/apps/docs/lib/i18n.ts +++ b/apps/docs/lib/i18n.ts @@ -2,7 +2,7 @@ import { defineI18n } from 'fumadocs-core/i18n' export const i18n = defineI18n({ defaultLanguage: 'en', - languages: ['en', 'es', 'fr', 'zh'], + languages: ['en', 'es', 'fr', 'de', 'ja', 'zh'], hideLocale: 'default-locale', parser: 'dir', })