Add i18n support with language selector on login page (#1410)

* feat: add i18n support with language selector on login page

Co-Authored-By: Junyan Qin <Chin> <rockchinq@gmail.com>

* feat: complete i18n implementation for all webui components

Co-Authored-By: Junyan Qin <Chin> <rockchinq@gmail.com>

* feat: complete all hardcoded text

* feat: dynamic label i18n

* fix: lint errors

* fix: lint errors

* delete sh fils

* fix: edit model dialog title

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Junyan Qin <Chin> <rockchinq@gmail.com>
This commit is contained in:
devin-ai-integration[bot]
2025-05-13 22:39:19 +08:00
committed by GitHub
parent 91cd8cf380
commit 2bf94539bd
25 changed files with 898 additions and 233 deletions

View File

@@ -31,6 +31,8 @@ import {
verticalListSortingStrategy,
} from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import { useTranslation } from 'react-i18next';
import { i18nObj } from '@/i18n/I18nProvider';
interface PluginSortDialogProps {
open: boolean;
@@ -75,6 +77,7 @@ export default function PluginSortDialog({
onOpenChange,
onSortComplete,
}: PluginSortDialogProps) {
const { t } = useTranslation();
const [sortedPlugins, setSortedPlugins] = useState<PluginCardVO[]>([]);
const [isLoading, setIsLoading] = useState(false);
@@ -84,7 +87,7 @@ export default function PluginSortDialog({
value.plugins.map((plugin) => {
return new PluginCardVO({
author: plugin.author,
description: plugin.description.zh_CN,
description: i18nObj(plugin.description),
enabled: plugin.enabled,
name: plugin.name,
version: plugin.version,
@@ -146,12 +149,12 @@ export default function PluginSortDialog({
httpClient
.reorderPlugins(reorderElements)
.then(() => {
toast.success('插件排序成功');
toast.success(t('plugins.pluginSortSuccess'));
onSortComplete();
onOpenChange(false);
})
.catch((err) => {
toast.error('排序失败:' + err.message);
toast.error(t('plugins.pluginSortError') + err.message);
})
.finally(() => {
setIsLoading(false);
@@ -162,11 +165,11 @@ export default function PluginSortDialog({
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="w-[700px] max-h-[80vh] p-0 flex flex-col">
<DialogHeader className="px-6 pt-6 pb-0">
<DialogTitle></DialogTitle>
<DialogTitle>{t('plugins.pluginSort')}</DialogTitle>
</DialogHeader>
<div className="flex-1 overflow-y-auto px-6 py-0">
<p className="text-sm text-gray-500 mb-4">
{t('plugins.pluginSortDescription')}
</p>
<DndContext
sensors={sensors}
@@ -194,10 +197,10 @@ export default function PluginSortDialog({
onClick={() => onOpenChange(false)}
disabled={isLoading}
>
{t('common.cancel')}
</Button>
<Button onClick={handleSave} disabled={isLoading}>
{isLoading ? '保存中...' : '保存'}
{isLoading ? t('common.saving') : t('common.save')}
</Button>
</DialogFooter>
</DialogContent>