Skip to content

Commit e83231d

Browse files
committed
feat(i18n): localize MermaidDiagram, SpecsLayout, and ThemeToggle components; update translation files for error handling and sidebar actions
1 parent f2554e2 commit e83231d

File tree

12 files changed

+58
-101
lines changed

12 files changed

+58
-101
lines changed

packages/ui-vite/src/components/MermaidDiagram.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useEffect, useRef, useState } from 'react';
22
import mermaid from 'mermaid';
3+
import { useTranslation } from 'react-i18next';
34

45
interface MermaidDiagramProps {
56
chart: string;
@@ -28,6 +29,7 @@ export function MermaidDiagram({ chart, className = '' }: MermaidDiagramProps) {
2829
const [svg, setSvg] = useState<string>('');
2930
const [error, setError] = useState<string | null>(null);
3031
const [id] = useState(generateId);
32+
const { t } = useTranslation(['common', 'errors']);
3133

3234
useEffect(() => {
3335
if (!chart || !ref.current) return;
@@ -46,7 +48,8 @@ export function MermaidDiagram({ chart, className = '' }: MermaidDiagramProps) {
4648
setSvg(svg);
4749
} catch (err) {
4850
console.error('Mermaid rendering error:', err);
49-
setError(err instanceof Error ? err.message : 'Failed to render diagram');
51+
const fallback = t('mermaid.renderError', { ns: 'errors' });
52+
setError(err instanceof Error ? err.message : fallback);
5053
}
5154
};
5255

@@ -57,7 +60,7 @@ export function MermaidDiagram({ chart, className = '' }: MermaidDiagramProps) {
5760
return (
5861
<div className={`border border-destructive rounded-lg p-4 ${className}`}>
5962
<div className="text-sm text-destructive">
60-
<strong>Mermaid Diagram Error:</strong>
63+
<strong>{t('mermaid.title', { ns: 'errors' })}</strong>
6164
<pre className="mt-2 text-xs overflow-auto">{error}</pre>
6265
</div>
6366
</div>
@@ -67,13 +70,13 @@ export function MermaidDiagram({ chart, className = '' }: MermaidDiagramProps) {
6770
if (!svg) {
6871
return (
6972
<div className={`border rounded-lg p-4 ${className}`}>
70-
<div className="text-sm text-muted-foreground">Loading diagram...</div>
73+
<div className="text-sm text-muted-foreground">{t('mermaid.loading', { ns: 'errors' })}</div>
7174
</div>
7275
);
7376
}
7477

7578
return (
76-
<div
79+
<div
7780
ref={ref}
7881
className={`mermaid-diagram border rounded-lg p-4 overflow-auto ${className}`}
7982
dangerouslySetInnerHTML={{ __html: svg }}

packages/ui-vite/src/components/SpecsLayout.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import { useState } from 'react';
22
import { Outlet } from 'react-router-dom';
33
import { Button } from '@leanspec/ui-components';
4+
import { useTranslation } from 'react-i18next';
45
import { SpecsNavSidebar } from './SpecsNavSidebar';
56

67
export function SpecsLayout() {
78
const [mobileOpen, setMobileOpen] = useState(false);
9+
const { t } = useTranslation('common');
810

911
return (
1012
<div className="flex h-full relative">
1113
<SpecsNavSidebar mobileOpen={mobileOpen} onMobileOpenChange={setMobileOpen} />
1214
<div className="flex-1 min-w-0 overflow-y-auto h-[calc(100vh-3.5rem)]">
1315
<div className="lg:hidden sticky top-14 z-20 flex items-center justify-between bg-background/95 backdrop-blur border-b px-3 py-2 mb-4">
14-
<span className="text-sm font-semibold">Specifications</span>
16+
<span className="text-sm font-semibold">{t('specsNavSidebar.title')}</span>
1517
<Button size="sm" variant="outline" onClick={() => setMobileOpen(true)}>
16-
Open sidebar
18+
{t('actions.openSidebar')}
1719
</Button>
1820
</div>
1921
<Outlet />

packages/ui-vite/src/components/ThemeToggle.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { Sun, Moon } from 'lucide-react';
22
import { useTheme } from '../contexts';
33
import { Button } from '@leanspec/ui-components';
4+
import { useTranslation } from 'react-i18next';
45

56
export function ThemeToggle() {
67
const { setTheme, resolvedTheme } = useTheme();
78
const isDark = resolvedTheme === 'dark';
9+
const { t } = useTranslation('common');
810

911
const toggleTheme = () => setTheme(isDark ? 'light' : 'dark');
1012

@@ -13,7 +15,7 @@ export function ThemeToggle() {
1315
variant="ghost"
1416
size="icon"
1517
onClick={toggleTheme}
16-
aria-label="Toggle theme"
18+
aria-label={t('theme.toggleTheme')}
1719
className="relative h-9 w-9"
1820
>
1921
<Sun className="h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />

packages/ui-vite/src/locales/en/common.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656
"next": "Next",
5757
"loading": "Loading...",
5858
"search": "Search",
59-
"backToTop": "Back to top"
59+
"backToTop": "Back to top",
60+
"openSidebar": "Open sidebar"
6061
},
6162
"spec": {
6263
"spec": "Spec",

packages/ui-vite/src/locales/en/errors.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,10 @@
1111
"pageError": {
1212
"title": "Something went wrong",
1313
"description": "The page failed to render."
14+
},
15+
"mermaid": {
16+
"title": "Mermaid diagram error",
17+
"renderError": "Failed to render diagram",
18+
"loading": "Loading diagram..."
1419
}
1520
}

packages/ui-vite/src/locales/zh-CN/common.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@
5757
"next": "下一步",
5858
"loading": "加载中...",
5959
"search": "搜索",
60-
"backToTop": "返回顶部"
60+
"backToTop": "返回顶部",
61+
"openSidebar": "打开侧边栏"
6162
},
6263
"spec": {
6364
"spec": "Spec",

packages/ui-vite/src/locales/zh-CN/errors.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,10 @@
1111
"pageError": {
1212
"title": "页面出现错误",
1313
"description": "页面渲染失败。"
14+
},
15+
"mermaid": {
16+
"title": "Mermaid 图表错误",
17+
"renderError": "渲染图表失败",
18+
"loading": "正在加载图表..."
1419
}
1520
}

packages/ui/src/locales/en/common.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@
5656
"next": "Next",
5757
"loading": "Loading...",
5858
"search": "Search",
59-
"backToTop": "Back to top"
59+
"backToTop": "Back to top",
60+
"openSidebar": "Open sidebar"
6061
},
6162
"spec": {
6263
"spec": "Spec",

packages/ui/src/locales/en/errors.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,10 @@
1111
"pageError": {
1212
"title": "Something went wrong",
1313
"description": "The page failed to render."
14+
},
15+
"mermaid": {
16+
"title": "Mermaid diagram error",
17+
"renderError": "Failed to render diagram",
18+
"loading": "Loading diagram..."
1419
}
1520
}

packages/ui/src/locales/zh-CN/common.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@
5757
"next": "下一步",
5858
"loading": "加载中...",
5959
"search": "搜索",
60-
"backToTop": "返回顶部"
60+
"backToTop": "返回顶部",
61+
"openSidebar": "打开侧边栏"
6162
},
6263
"spec": {
6364
"spec": "Spec",

0 commit comments

Comments
 (0)