Skip to content

Commit 915e8e7

Browse files
committed
refactor(FR-557): improve language option UX and refactor bug-prone code (#3536)
resolves #3086 ([FR-557](https://lablup.atlassian.net/browse/FR-557)) <!-- replace NNN, MMM with the GitHub issue number and the corresponding Jira issue number. --> <!-- Please precisely, concisely, and concretely describe what this PR changes, the rationale behind codes, and how it affects the users and other developers. --> **changes** * improve language option UX * refactor bug-prone code * update i18n |before|after| |-------|------| | ![CleanShot 2025-04-18 at 16.51.56@2x.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/xbCemO1RqqcSjEXCRK3p/acae3468-5f29-4668-b6ae-0edba12404f4.png) | ![CleanShot 2025-04-18 at 16.51.41@2x.png](https://graphite-user-uploaded-assets-prod.s3.amazonaws.com/xbCemO1RqqcSjEXCRK3p/788727c3-570c-4112-9ce9-4492fc00b350.png) | **Checklist:** (if applicable) - [ ] Documentation - [ ] Minium required manager version - [ ] Specific setting for review (eg., KB link, endpoint or how to setup) - [ ] Minimum requirements to check during review - [ ] Test case(s) to demonstrate the difference of before/after [FR-557]: https://lablup.atlassian.net/browse/FR-557?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
1 parent 1991987 commit 915e8e7

22 files changed

Lines changed: 75 additions & 32 deletions

react/src/pages/UserSettingsPage.tsx

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import {
99
} from '../hooks/useBAISetting';
1010
import { SettingOutlined } from '@ant-design/icons';
1111
import { useToggle } from 'ahooks';
12-
import { Button } from 'antd';
12+
import { Button, Typography } from 'antd';
1313
import Card from 'antd/es/card/Card';
14+
import _ from 'lodash';
1415
import { useState } from 'react';
1516
import { Trans, useTranslation } from 'react-i18next';
1617
import { StringParam, useQueryParam, withDefault } from 'use-query-params';
@@ -55,6 +56,39 @@ const UserPreferencesPage = () => {
5556
const [isOpenShellScriptEditModal, { toggle: toggleShellScriptEditModal }] =
5657
useToggle(false);
5758

59+
const languageOptions = [
60+
{ label: t('language.English'), value: 'en' },
61+
{ label: t('language.Korean'), value: 'ko' },
62+
{ label: t('language.Brazilian'), value: 'pt-BR' },
63+
{ label: t('language.Chinese'), value: 'zh-CN' },
64+
{
65+
label: t('language.Chinese (Simplified)'),
66+
value: 'zh-TW',
67+
},
68+
{ label: t('language.French'), value: 'fr' },
69+
{ label: t('language.Finnish'), value: 'fi' },
70+
{ label: t('language.German'), value: 'de' },
71+
{ label: t('language.Greek'), value: 'el' },
72+
{ label: t('language.Indonesian'), value: 'id' },
73+
{ label: t('language.Italian'), value: 'it' },
74+
{ label: t('language.Japanese'), value: 'ja' },
75+
{ label: t('language.Mongolian'), value: 'mn' },
76+
{ label: t('language.Polish'), value: 'pl' },
77+
{ label: t('language.Portuguese'), value: 'pt' },
78+
{ label: t('language.Russian'), value: 'ru' },
79+
{ label: t('language.Spanish'), value: 'es' },
80+
{ label: t('language.Thai'), value: 'th' },
81+
{ label: t('language.Turkish'), value: 'tr' },
82+
{ label: t('language.Vietnamese'), value: 'vi' },
83+
];
84+
let defaultLanguage = globalThis.navigator.language;
85+
defaultLanguage = _.includes(['zh-CN', 'zh-TW', 'pt-BR'], defaultLanguage)
86+
? defaultLanguage
87+
: defaultLanguage.split('-')[0];
88+
defaultLanguage =
89+
languageOptions.find((item) => item.value === defaultLanguage)?.value ??
90+
'en';
91+
5892
const settingGroups: Array<SettingGroup> = [
5993
{
6094
title: t('userSettings.Preferences'),
@@ -86,46 +120,34 @@ const UserPreferencesPage = () => {
86120
title: t('userSettings.Language'),
87121
description: t('userSettings.DescLanguage'),
88122
selectProps: {
89-
options: [
90-
{ label: t('language.OSDefault'), value: 'default' },
91-
{ label: t('language.English'), value: 'en' },
92-
{ label: t('language.Korean'), value: 'ko' },
93-
{ label: t('language.Brazilian'), value: 'pt-BR' },
94-
{ label: t('language.Chinese'), value: 'zh-CN' },
95-
{
96-
label: t('language.Chinese (Simplified)'),
97-
value: 'zh-TW',
98-
},
99-
{ label: t('language.French'), value: 'fr' },
100-
{ label: t('language.Finnish'), value: 'fi' },
101-
{ label: t('language.German'), value: 'de' },
102-
{ label: t('language.Greek'), value: 'el' },
103-
{ label: t('language.Indonesian'), value: 'id' },
104-
{ label: t('language.Italian'), value: 'it' },
105-
{ label: t('language.Japanese'), value: 'ja' },
106-
{ label: t('language.Mongolian'), value: 'mn' },
107-
{ label: t('language.Polish'), value: 'pl' },
108-
{ label: t('language.Portuguese'), value: 'pt' },
109-
{ label: t('language.Russian'), value: 'ru' },
110-
{ label: t('language.Spanish'), value: 'es' },
111-
{ label: t('language.Thai'), value: 'th' },
112-
{ label: t('language.Turkish'), value: 'tr' },
113-
{ label: t('language.Vietnamese'), value: 'vi' },
114-
],
123+
options: languageOptions.map((item) =>
124+
item.value === defaultLanguage
125+
? {
126+
...item,
127+
label: (
128+
<>
129+
{item.label}&nbsp;
130+
<Typography.Text type="secondary">
131+
({t('userSettings.Default')})
132+
</Typography.Text>
133+
</>
134+
),
135+
}
136+
: item,
137+
),
115138
showSearch: true,
116139
},
117-
defaultValue: 'default',
118-
value: selectedLanguage || 'default',
140+
defaultValue: defaultLanguage,
141+
value: selectedLanguage || defaultLanguage,
119142
setValue: setSelectedLanguage,
120143
onChange: (value) => {
121144
setSelectedLanguage(value);
122-
const defaultLanguage = globalThis.navigator.language.split('-')[0];
123145
const event = new CustomEvent('language-changed', {
124146
detail: {
125-
language: value === 'default' ? defaultLanguage : value,
147+
language: value,
126148
},
127149
});
128-
setLanguage(value === 'default' ? defaultLanguage : value);
150+
setLanguage(value);
129151
document.dispatchEvent(event);
130152
//@ts-ignore
131153
console.log(globalThis.backendaioptions.get('selected_language'));

resources/i18n/de.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,6 +1755,7 @@
17551755
"ConfigFilename": "Name der Konfigurationsdatei",
17561756
"CurrentSSHPublicKey": "Aktueller öffentlicher Schlüssel:",
17571757
"DarkMode": "Dunkler Modus",
1758+
"Default": "Standard",
17581759
"DescAutoLogout": "Melden Sie sich automatisch ab, wenn alle angemeldeten Seiten geschlossen sind, mit Ausnahme von sitzungsbasierten Seiten für Apps (z. B. Jupyter Notebook, Webterminal usw.)",
17591760
"DescAutomaticUpdateCheck": "Benachrichtigen, wenn eine neue Webui-Version veröffentlicht wird. <br /> Wenn das Internet instabil oder offline ist, wird diese Option automatisch deaktiviert. Sie können diesen Schalter umschalten, um die automatische Updateprüfung erneut zu starten.",
17601761
"DescBetaFeatures": "Verwenden Sie Betafunktionen für die Web-Benutzeroberfläche. <br /> Beta-Funktionen können instabil sein. Einige Betafunktionen werden möglicherweise nicht als offizielle Funktionen übernommen.",

resources/i18n/el.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,6 +1751,7 @@
17511751
"ConfigFilename": "Διαμόρφωση ονόματος αρχείου",
17521752
"CurrentSSHPublicKey": "Τρέχον δημόσιο κλειδί:",
17531753
"DarkMode": "Σκοτεινή λειτουργία",
1754+
"Default": "Αθέτηση",
17541755
"DescAutoLogout": "Αποσυνδεθείτε αυτόματα εάν όλες οι συνδεδεμένες σελίδες είναι κλειστές εκτός από τις σελίδες που προέρχονται από περίοδο σύνδεσης για εφαρμογές (π.χ. jupyter notebook, web terminal κ.λπ.)",
17551756
"DescAutomaticUpdateCheck": "Ειδοποίηση όταν κυκλοφορήσει μια νέα έκδοση webui. <br /> Όταν το Διαδίκτυο είναι ασταθές ή εκτός σύνδεσης, αυτή η επιλογή θα απενεργοποιηθεί αυτόματα. Μπορείτε να αλλάξετε αυτόν τον διακόπτη για να ξεκινήσετε ξανά τον έλεγχο αυτόματης ενημέρωσης.",
17561757
"DescBetaFeatures": "Χρησιμοποιήστε λειτουργίες beta για διεπαφή χρήστη Ιστού. <br /> Οι λειτουργίες beta ενδέχεται να είναι ασταθείς. Ορισμένες λειτουργίες beta ενδέχεται να μην υιοθετηθούν ως επίσημη λειτουργία.",

resources/i18n/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1763,6 +1763,7 @@
17631763
"ConfigFilename": "Config file name",
17641764
"CurrentSSHPublicKey": "Current public key: ",
17651765
"DarkMode": "Dark mode",
1766+
"Default": "Default",
17661767
"DescAutoLogout": "Log out automatically if all logined pages are closed except session originated pages for apps(e.g. jupyter notebook, web terminal, etc.)",
17671768
"DescAutomaticUpdateCheck": "Notify when a new webui version is released.<br />In where the Internet is unstable or offline, this option will be automatically turned off. You can toggle this switch to start the automatic update check again.",
17681769
"DescBetaFeatures": "Use beta features for Web UI.<br />Beta features may be unstable. Some beta features may not be adopted as official feature.",

resources/i18n/es.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,6 +1755,7 @@
17551755
"ConfigFilename": "Nombre del archivo de configuración",
17561756
"CurrentSSHPublicKey": "Clave pública actual:",
17571757
"DarkMode": "Modo oscuro",
1758+
"Default": "Por defecto",
17581759
"DescAutoLogout": "Cierre de sesión automático si se cierran todas las páginas de inicio de sesión, excepto las páginas de inicio de sesión para aplicaciones (p. ej., cuaderno jupyter, terminal web, etc.).",
17591760
"DescAutomaticUpdateCheck": "Notificar cuando se publique una nueva versión de webui.<br />En los casos en que Internet sea inestable o esté desconectado, esta opción se desactivará automáticamente. Puede activar este interruptor para iniciar la comprobación de actualización automática de nuevo.",
17601761
"DescBetaFeatures": "Utilice las funciones beta para la interfaz de usuario web.<br />Las funciones beta pueden ser inestables. Es posible que algunas funciones beta no se adopten como funciones oficiales.",

resources/i18n/fi.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1753,6 +1753,7 @@
17531753
"ConfigFilename": "Konfigurointitiedoston nimi",
17541754
"CurrentSSHPublicKey": "Nykyinen julkinen avain:",
17551755
"DarkMode": "Tumma tila",
1756+
"Default": "Laiminlyönti",
17561757
"DescAutoLogout": "Kirjaudu ulos automaattisesti, jos kaikki kirjautuneet sivut suljetaan, lukuun ottamatta sovellusten (esim. jupyter notebook, verkkopääte jne.) istunnon luomia sivuja.",
17571758
"DescAutomaticUpdateCheck": "Ilmoita, kun uusi webui-versio julkaistaan.<br />Jos Internet on epävakaa tai offline, tämä vaihtoehto kytkeytyy automaattisesti pois päältä. Voit vaihtaa tätä kytkintä käynnistääksesi automaattisen päivityksen tarkistuksen uudelleen.",
17581759
"DescBetaFeatures": "Käytä web-käyttöliittymän beta-ominaisuuksia.<br />Beta-ominaisuudet voivat olla epävakaita. Joitakin beta-ominaisuuksia ei ehkä hyväksytä viralliseksi ominaisuudeksi.",

resources/i18n/fr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1755,6 +1755,7 @@
17551755
"ConfigFilename": "Nom du fichier de configuration",
17561756
"CurrentSSHPublicKey": "Clé publique actuelle :",
17571757
"DarkMode": "Mode sombre",
1758+
"Default": "Défaut",
17581759
"DescAutoLogout": "Déconnectez-vous automatiquement si toutes les pages connectées sont fermées, à l'exception des pages d'origine de session pour les applications (par exemple, bloc-notes jupyter, terminal Web, etc.)",
17591760
"DescAutomaticUpdateCheck": "Avertir lorsqu'une nouvelle version de webui est publiée. <br /> Dans les cas où Internet est instable ou hors ligne, cette option sera automatiquement désactivée. Vous pouvez basculer ce commutateur pour relancer la vérification automatique des mises à jour.",
17601761
"DescBetaFeatures": "Utilisez les fonctionnalités bêta pour l'interface utilisateur Web. <br /> Les fonctionnalités bêta peuvent être instables. Certaines fonctionnalités bêta peuvent ne pas être adoptées comme fonctionnalité officielle.",

resources/i18n/id.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,6 +1754,7 @@
17541754
"ConfigFilename": "Nama file konfigurasi",
17551755
"CurrentSSHPublicKey": "Kunci publik saat ini: ",
17561756
"DarkMode": "Mode Gelap",
1757+
"Default": "Bawaan",
17571758
"DescAutoLogout": "Keluar secara otomatis jika semua halaman yang masuk ditutup kecuali halaman yang berasal dari sesi untuk aplikasi (mis. Jupyter notebook, terminal web, dll.)",
17581759
"DescAutomaticUpdateCheck": "Beri tahu saat versi UI web baru dirilis. <br /> Di mana Internet tidak stabil atau offline, opsi ini akan dimatikan secara otomatis. Anda dapat mengaktifkan opsi ini untuk memulai lagi pemeriksaan pembaruan otomatis.",
17591760
"DescBetaFeatures": "Gunakan fitur beta untuk UI Web. <br />Fitur beta mungkin tidak stabil. Beberapa fitur beta mungkin tidak diadopsi sebagai fitur resmi.",

resources/i18n/it.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,7 @@
17521752
"ConfigFilename": "Nome del file di configurazione",
17531753
"CurrentSSHPublicKey": "Chiave pubblica attuale:",
17541754
"DarkMode": "Modalità scura",
1755+
"Default": "Predefinito",
17551756
"DescAutoLogout": "Disconnettersi automaticamente se tutte le pagine di accesso vengono chiuse eccetto le pagine originate dalla sessione per le app (ad es.",
17561757
"DescAutomaticUpdateCheck": "Avvisa quando viene rilasciata una nuova versione di webui. <br /> Nei casi in cui Internet è instabile o offline, questa opzione verrà automaticamente disattivata. Puoi attivare questo interruttore per avviare nuovamente il controllo automatico degli aggiornamenti.",
17571758
"DescBetaFeatures": "Utilizza le funzionalità beta per l'interfaccia utente Web. <br /> Le funzionalità beta potrebbero essere instabili. Alcune funzionalità beta potrebbero non essere adottate come funzionalità ufficiali.",

resources/i18n/ja.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,6 +1754,7 @@
17541754
"ConfigFilename": "構成ファイル名",
17551755
"CurrentSSHPublicKey": "現在の公開鍵:",
17561756
"DarkMode": "ダークモード",
1757+
"Default": "デフォルト",
17571758
"DescAutoLogout": "アプリのセッション開始ページ(jupyterノートブック、Webターミナルなど)を除き、ログインしたすべてのページが閉じている場合は、自動的にログアウトします。",
17581759
"DescAutomaticUpdateCheck": "新しいwebuiバージョンがリリースされたときに通知します。 <br />インターネットが不安定またはオフラインの場合、このオプションは自動的にオフになります。このスイッチを切り替えると、自動更新チェックを再開できます。",
17591760
"DescBetaFeatures": "WebUIのベータ機能を使用します。 <br />ベータ機能が不安定な場合があります。一部のベータ機能は、公式機能として採用されない場合があります。",

0 commit comments

Comments
 (0)