translator: add more translator languages (#1738)
This commit is contained in:
@@ -5,7 +5,7 @@ import { useAuth } from '@/context/AuthContext';
|
||||
import { useSettingsStore } from '@/store/settingsStore';
|
||||
import { useTranslation } from '@/hooks/useTranslation';
|
||||
import { useTranslator } from '@/hooks/useTranslator';
|
||||
import { TRANSLATED_LANGS } from '@/services/constants';
|
||||
import { TRANSLATOR_LANGS } from '@/services/constants';
|
||||
import { UseTranslatorOptions, getTranslators } from '@/services/translators';
|
||||
import Select from '@/components/Select';
|
||||
|
||||
@@ -13,11 +13,11 @@ const notSupportedLangs = [''];
|
||||
|
||||
const generateTranslatorLangs = () => {
|
||||
return Object.fromEntries(
|
||||
Object.entries(TRANSLATED_LANGS).filter(([code]) => !notSupportedLangs.includes(code)),
|
||||
Object.entries(TRANSLATOR_LANGS).filter(([code]) => !notSupportedLangs.includes(code)),
|
||||
);
|
||||
};
|
||||
|
||||
const TRANSLATOR_LANGS = generateTranslatorLangs();
|
||||
const translatorLangs = generateTranslatorLangs();
|
||||
|
||||
interface TranslatorPopupProps {
|
||||
text: string;
|
||||
@@ -47,9 +47,7 @@ const TranslatorPopup: React.FC<TranslatorPopupProps> = ({
|
||||
const [targetLang, setTargetLang] = useState(settings.globalReadSettings.translateTargetLang);
|
||||
const [provider, setProvider] = useState(settings.globalReadSettings.translationProvider);
|
||||
const [translation, setTranslation] = useState<string | null>(null);
|
||||
const [detectedSourceLang, setDetectedSourceLang] = useState<
|
||||
keyof typeof TRANSLATOR_LANGS | null
|
||||
>(null);
|
||||
const [detectedSourceLang, setDetectedSourceLang] = useState<string | null>(null);
|
||||
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
@@ -153,12 +151,12 @@ const TranslatorPopup: React.FC<TranslatorPopupProps> = ({
|
||||
onChange={handleSourceLangChange}
|
||||
options={[
|
||||
{ value: 'AUTO', label: _('Auto Detect') },
|
||||
...Object.entries(TRANSLATOR_LANGS)
|
||||
...Object.entries(translatorLangs)
|
||||
.sort((a, b) => a[1].localeCompare(b[1]))
|
||||
.map(([code, name]) => {
|
||||
const label =
|
||||
detectedSourceLang && sourceLang === 'AUTO' && code === 'AUTO'
|
||||
? `${TRANSLATOR_LANGS[detectedSourceLang] || detectedSourceLang} ` +
|
||||
? `${translatorLangs[detectedSourceLang] || detectedSourceLang} ` +
|
||||
_('(detected)')
|
||||
: name;
|
||||
return { value: code, label };
|
||||
@@ -178,7 +176,7 @@ const TranslatorPopup: React.FC<TranslatorPopupProps> = ({
|
||||
className='bg-gray-600 text-white/75'
|
||||
value={targetLang}
|
||||
onChange={handleTargetLangChange}
|
||||
options={Object.entries(TRANSLATOR_LANGS)
|
||||
options={Object.entries(translatorLangs)
|
||||
.sort((a, b) => a[1].localeCompare(b[1]))
|
||||
.map(([code, name]) => ({ value: code, label: name }))}
|
||||
/>
|
||||
|
||||
@@ -7,7 +7,7 @@ import { useReaderStore } from '@/store/readerStore';
|
||||
import { useTranslation } from '@/hooks/useTranslation';
|
||||
import { saveViewSettings } from '../../utils/viewSettingsHelper';
|
||||
import { getTranslators } from '@/services/translators';
|
||||
import { TRANSLATED_LANGS } from '@/services/constants';
|
||||
import { TRANSLATED_LANGS, TRANSLATOR_LANGS } from '@/services/constants';
|
||||
import { SettingsPanelPanelProp } from './SettingsDialog';
|
||||
import { useResetViewSettings } from '../../hooks/useResetSettings';
|
||||
import { saveAndReload } from '@/utils/reload';
|
||||
@@ -54,8 +54,7 @@ const LangPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterReset
|
||||
};
|
||||
};
|
||||
|
||||
const getLangOptions = () => {
|
||||
const langs = TRANSLATED_LANGS as Record<string, string>;
|
||||
const getLangOptions = (langs: Record<string, string>) => {
|
||||
const options = Object.entries(langs).map(([value, label]) => ({ value, label }));
|
||||
options.sort((a, b) => a.label.localeCompare(b.label));
|
||||
options.unshift({ value: '', label: _('System Language') });
|
||||
@@ -103,7 +102,7 @@ const LangPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterReset
|
||||
|
||||
const getCurrentTargetLangOption = () => {
|
||||
const value = translateTargetLang;
|
||||
const availableOptions = getLangOptions();
|
||||
const availableOptions = getLangOptions(TRANSLATOR_LANGS);
|
||||
return availableOptions.find((o) => o.value === value) || availableOptions[0]!;
|
||||
};
|
||||
|
||||
@@ -153,7 +152,7 @@ const LangPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterReset
|
||||
<Select
|
||||
value={getCurrentUILangOption().value}
|
||||
onChange={handleSelectUILang}
|
||||
options={getLangOptions()}
|
||||
options={getLangOptions(TRANSLATED_LANGS)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -200,7 +199,7 @@ const LangPanel: React.FC<SettingsPanelPanelProp> = ({ bookKey, onRegisterReset
|
||||
<Select
|
||||
value={getCurrentTargetLangOption().value}
|
||||
onChange={handleSelectTargetLang}
|
||||
options={getLangOptions()}
|
||||
options={getLangOptions(TRANSLATOR_LANGS)}
|
||||
disabled={!translationEnabled}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -658,6 +658,22 @@ export const TRANSLATED_LANGS = {
|
||||
'zh-TW': '正體中文',
|
||||
};
|
||||
|
||||
export const TRANSLATOR_LANGS: Record<string, string> = {
|
||||
...TRANSLATED_LANGS,
|
||||
no: 'Norsk',
|
||||
sv: 'Svenska',
|
||||
fi: 'Suomi',
|
||||
da: 'Dansk',
|
||||
cs: 'Čeština',
|
||||
hu: 'Magyar',
|
||||
ro: 'Română',
|
||||
bg: 'Български',
|
||||
hr: 'Hrvatski',
|
||||
lt: 'Lietuvių',
|
||||
sl: 'Slovenščina',
|
||||
sk: 'Slovenčina',
|
||||
};
|
||||
|
||||
export const SUPPORTED_LANGS: Record<string, string> = { ...TRANSLATED_LANGS, zh: '中文' };
|
||||
|
||||
export const SUPPORTED_LANGNAMES: Record<string, string> = Object.fromEntries(
|
||||
|
||||
@@ -30,6 +30,18 @@ export const normalizeToFullLang = (langCode: string): string => {
|
||||
ru: 'ru-RU',
|
||||
uk: 'uk-UA',
|
||||
th: 'th-TH',
|
||||
no: 'no-NO',
|
||||
sv: 'sv-SE',
|
||||
fi: 'fi-FI',
|
||||
da: 'da-DK',
|
||||
cs: 'cs-CZ',
|
||||
hu: 'hu-HU',
|
||||
ro: 'ro-RO',
|
||||
bg: 'bg-BG',
|
||||
hr: 'hr-HR',
|
||||
lt: 'lt-LT',
|
||||
sl: 'sl-SI',
|
||||
sk: 'sk-SK',
|
||||
zh: 'zh-Hans',
|
||||
'zh-cn': 'zh-Hans',
|
||||
'zh-tw': 'zh-Hant',
|
||||
|
||||
Reference in New Issue
Block a user