mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
feat(ui): improve types for language picker
Makes it impossible to miss a language or typo.
This commit is contained in:
parent
c979cf5ecc
commit
e8095b73ae
@ -3,44 +3,46 @@ import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
|
|||||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
|
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
|
||||||
import { languageChanged } from 'features/system/store/systemSlice';
|
import { languageChanged } from 'features/system/store/systemSlice';
|
||||||
|
import type { Language } from 'features/system/store/types';
|
||||||
import { isLanguage } from 'features/system/store/types';
|
import { isLanguage } from 'features/system/store/types';
|
||||||
|
import { map } from 'lodash-es';
|
||||||
import { memo, useCallback, useMemo } from 'react';
|
import { memo, useCallback, useMemo } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
|
const optionsObject: Record<Language, string> = {
|
||||||
|
ar: 'العربية',
|
||||||
|
az: 'Azərbaycan dili',
|
||||||
|
de: 'Deutsch',
|
||||||
|
en: 'English',
|
||||||
|
es: 'Español',
|
||||||
|
fi: 'Suomi',
|
||||||
|
fr: 'Français',
|
||||||
|
he: 'עִבְֿרִית',
|
||||||
|
hu: 'Magyar Nyelv',
|
||||||
|
it: 'Italiano',
|
||||||
|
ja: '日本語',
|
||||||
|
ko: '한국어',
|
||||||
|
nl: 'Nederlands',
|
||||||
|
pl: 'Polski',
|
||||||
|
pt: 'Português',
|
||||||
|
pt_BR: 'Português do Brasil',
|
||||||
|
ru: 'Русский',
|
||||||
|
sv: 'Svenska',
|
||||||
|
tr: 'Türkçe',
|
||||||
|
ua: 'Украї́нська',
|
||||||
|
zh_CN: '简体中文',
|
||||||
|
zh_Hant: '漢語',
|
||||||
|
};
|
||||||
|
|
||||||
|
const options = map(optionsObject, (label, value) => ({ label, value }));
|
||||||
|
|
||||||
export const SettingsLanguageSelect = memo(() => {
|
export const SettingsLanguageSelect = memo(() => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const language = useAppSelector((s) => s.system.language);
|
const language = useAppSelector((s) => s.system.language);
|
||||||
const options = useMemo(
|
|
||||||
() => [
|
|
||||||
{ label: 'العربية', value: 'ar' },
|
|
||||||
{ label: 'Azərbaycan dili', value: 'az' },
|
|
||||||
{ label: 'Deutsch', value: 'de' },
|
|
||||||
{ label: 'English', value: 'en' },
|
|
||||||
{ label: 'Español', value: 'es' },
|
|
||||||
{ label: 'Suomi', value: 'fi' },
|
|
||||||
{ label: 'Français', value: 'fr' },
|
|
||||||
{ label: 'עִבְֿרִית', value: 'he' },
|
|
||||||
{ label: 'Magyar Nyelv', value: 'hu' },
|
|
||||||
{ label: 'Italiano', value: 'it' },
|
|
||||||
{ label: '日本語', value: 'ja' },
|
|
||||||
{ label: '한국어', value: 'ko' },
|
|
||||||
{ label: 'Nederlands', value: 'nl' },
|
|
||||||
{ label: 'Polski', value: 'pl' },
|
|
||||||
{ label: 'Português', value: 'pt' },
|
|
||||||
{ label: 'Português do Brasil', value: 'pt_BR' },
|
|
||||||
{ label: 'Русский', value: 'ru' },
|
|
||||||
{ label: 'Svenska', value: 'sv' },
|
|
||||||
{ label: 'Türkçe', value: 'tr' },
|
|
||||||
{ label: 'Украї́нська', value: 'ua' },
|
|
||||||
{ label: '简体中文', value: 'zh_CN' },
|
|
||||||
{ label: '漢語', value: 'zh_Hant' },
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
);
|
|
||||||
const isLocalizationEnabled = useFeatureStatus('localization').isFeatureEnabled;
|
const isLocalizationEnabled = useFeatureStatus('localization').isFeatureEnabled;
|
||||||
|
|
||||||
const value = useMemo(() => options.find((o) => o.value === language), [language, options]);
|
const value = useMemo(() => options.find((o) => o.value === language), [language]);
|
||||||
|
|
||||||
const onChange = useCallback<ComboboxOnChange>(
|
const onChange = useCallback<ComboboxOnChange>(
|
||||||
(v) => {
|
(v) => {
|
||||||
|
@ -17,21 +17,27 @@ export type DenoiseProgress = {
|
|||||||
|
|
||||||
export const zLanguage = z.enum([
|
export const zLanguage = z.enum([
|
||||||
'ar',
|
'ar',
|
||||||
'nl',
|
'az',
|
||||||
'en',
|
|
||||||
'fr',
|
|
||||||
'de',
|
'de',
|
||||||
|
'en',
|
||||||
|
'es',
|
||||||
|
'fi',
|
||||||
|
'fr',
|
||||||
'he',
|
'he',
|
||||||
|
'hu',
|
||||||
'it',
|
'it',
|
||||||
'ja',
|
'ja',
|
||||||
'ko',
|
'ko',
|
||||||
|
'nl',
|
||||||
'pl',
|
'pl',
|
||||||
'pt_BR',
|
|
||||||
'pt',
|
'pt',
|
||||||
|
'pt_BR',
|
||||||
'ru',
|
'ru',
|
||||||
|
'sv',
|
||||||
|
'tr',
|
||||||
|
'ua',
|
||||||
'zh_CN',
|
'zh_CN',
|
||||||
'es',
|
'zh_Hant',
|
||||||
'uk',
|
|
||||||
]);
|
]);
|
||||||
export type Language = z.infer<typeof zLanguage>;
|
export type Language = z.infer<typeof zLanguage>;
|
||||||
export const isLanguage = (v: unknown): v is Language => zLanguage.safeParse(v).success;
|
export const isLanguage = (v: unknown): v is Language => zLanguage.safeParse(v).success;
|
||||||
|
Loading…
Reference in New Issue
Block a user