From 9235f73ec4d006a5f156d749c038f8bb49d7f13f Mon Sep 17 00:00:00 2001 From: ssongliu Date: Wed, 17 Dec 2025 12:03:43 +0800 Subject: [PATCH] chore: Modify i18n initialization method --- core/app/service/script_library.go | 4 +- core/app/task/task.go | 1 + core/i18n/i18n.go | 75 ++++++++++++++++++------------ core/i18n/lang/en.yaml | 2 + core/i18n/lang/es-ES.yaml | 2 + core/i18n/lang/ja.yaml | 2 + core/i18n/lang/ko.yaml | 2 + core/i18n/lang/ms.yaml | 2 + core/i18n/lang/pt-BR.yaml | 2 + core/i18n/lang/ru.yaml | 2 + core/i18n/lang/tr.yaml | 2 + core/i18n/lang/zh-Hant.yaml | 2 + core/i18n/lang/zh.yaml | 2 + 13 files changed, 69 insertions(+), 31 deletions(-) diff --git a/core/app/service/script_library.go b/core/app/service/script_library.go index 95562d3ca..1ae24607f 100644 --- a/core/app/service/script_library.go +++ b/core/app/service/script_library.go @@ -194,13 +194,13 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error { if global.CONF.Base.IsOffLine { return nil } - syncTask, err := task.NewTaskWithOps(i18n.GetMsgByKey("ScriptLibrary"), task.TaskSync, task.TaskScopeScript, req.TaskID, 0) + syncTask, err := task.NewTaskWithOps(i18n.GetMsgByKey("RemoteScriptLibrary"), task.TaskSync, task.TaskScopeScript, req.TaskID, 0) if err != nil { global.LOG.Errorf("create sync task failed %v", err) return err } - syncTask.AddSubTask(task.GetTaskName(i18n.GetMsgByKey("ScriptLibrary"), task.TaskSync, task.TaskScopeScript), func(t *task.Task) (err error) { + syncTask.AddSubTask(task.GetTaskName(i18n.GetMsgByKey("RemoteScriptLibrary"), task.TaskSync, task.TaskScopeScript), func(t *task.Task) (err error) { versionUrl := fmt.Sprintf("%s/scripts/version.txt", global.CONF.RemoteURL.ResourceURL) _, versionRes, err := req_helper.HandleRequestWithProxy(versionUrl, http.MethodGet, constant.TimeOut20s) if err != nil { diff --git a/core/app/task/task.go b/core/app/task/task.go index 108a56fcb..1a75f862c 100644 --- a/core/app/task/task.go +++ b/core/app/task/task.go @@ -51,6 +51,7 @@ const ( TaskUpgrade = "TaskUpgrade" TaskAddNode = "TaskAddNode" TaskSync = "TaskSync" + TaskSyncForNode = "TaskSyncForNode" TaskRsync = "TaskRsync" TaskInstallCluster = "TaskInstallCluster" TaskCreateCluster = "TaskCreateCluster" diff --git a/core/i18n/i18n.go b/core/i18n/i18n.go index c8a84ed1b..b80f58ebd 100644 --- a/core/i18n/i18n.go +++ b/core/i18n/i18n.go @@ -3,14 +3,12 @@ package i18n import ( "embed" "fmt" + "os/exec" "strings" - "sync" "sync/atomic" "github.com/1Panel-dev/1Panel/core/app/repo" - "github.com/1Panel-dev/1Panel/core/global" - "github.com/gin-gonic/gin" "github.com/nicksnyder/go-i18n/v2/i18n" "golang.org/x/text/language" @@ -140,38 +138,29 @@ func UseI18n() gin.HandlerFunc { } func Init() { - initOnce.Do(func() { - bundle = i18n.NewBundle(language.Chinese) - bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal) + if bundle == nil { + initBundle() + } + dbLang := getLanguageFromDBInternal() + if dbLang == "" { + dbLang = defaultLang + } + SetCachedDBLanguage(dbLang) - isSuccess := true - for _, file := range langFiles { - if _, err := bundle.LoadMessageFileFS(fs, file); err != nil { - fmt.Printf("[i18n] load language file %s failed: %v\n", file, err) - isSuccess = false - } - } - - if !isSuccess { - panic("[i18n] failed to init language files, See log above for details") - } - - dbLang := getLanguageFromDBInternal() - if dbLang == "" { - dbLang = defaultLang - } - SetCachedDBLanguage(dbLang) - - global.I18n = i18n.NewLocalizer(bundle, dbLang) - }) + global.I18n = i18n.NewLocalizer(bundle, dbLang) } func UseI18nForCmd(lang string) { if bundle == nil { - Init() + initBundle() } if lang == "" { - lang = defaultLang + langFrom1pctl := getLanguageFrom1pctl() + if langFrom1pctl == "" { + lang = defaultLang + } else { + lang = langFrom1pctl + } } global.I18nForCmd = i18n.NewLocalizer(bundle, lang) } @@ -219,9 +208,20 @@ func getLanguageFromDBInternal() string { } return lang } +func getLanguageFrom1pctl() string { + cmd := exec.Command("bash", "-c", "grep '^LANGUAGE=' /usr/local/bin/1pctl | cut -d'=' -f2") + stdout, err := cmd.CombinedOutput() + if err != nil { + panic(err) + } + info := strings.ReplaceAll(string(stdout), "\n", "") + if len(info) == 0 || info == `""` { + panic("error `LANGUAGE` find in /usr/local/bin/1pctl") + } + return info +} var cachedDBLang atomic.Value -var initOnce sync.Once func GetLanguage() string { if v := cachedDBLang.Load(); v != nil { @@ -236,3 +236,20 @@ func SetCachedDBLanguage(lang string) { } cachedDBLang.Store(lang) } + +func initBundle() { + bundle = i18n.NewBundle(language.Chinese) + bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal) + + isSuccess := true + for _, file := range langFiles { + if _, err := bundle.LoadMessageFileFS(fs, file); err != nil { + fmt.Printf("[i18n] load language file %s failed: %v\n", file, err) + isSuccess = false + } + } + + if !isSuccess { + panic("[i18n] failed to init language files, See log above for details") + } +} diff --git a/core/i18n/lang/en.yaml b/core/i18n/lang/en.yaml index 6579df3fa..ee9ed593b 100644 --- a/core/i18n/lang/en.yaml +++ b/core/i18n/lang/en.yaml @@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} failed: {{ .err }}" TaskInstall: "Install" TaskUpgrade: "Upgrade" TaskSync: 'Synchronize' +TaskSyncForNode: "Sync Node Data" TaskBackup: "Backup" SuccessStatus: "{{ .name }} succeeded" FailedStatus: "{{ .name }} failed {{ .err }}" @@ -112,6 +113,7 @@ Skip: "Skip errors and continue..." #script ScriptLibrary: "Script Library" +RemoteScriptLibrary: "Remote Script Library" ScriptSyncSkip: "Current script library is already the latest version!" DownloadData: "Downloading script library file data.yaml" DownloadPackage: "Downloading script library package" diff --git a/core/i18n/lang/es-ES.yaml b/core/i18n/lang/es-ES.yaml index f4dff0f45..5860b213b 100644 --- a/core/i18n/lang/es-ES.yaml +++ b/core/i18n/lang/es-ES.yaml @@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} falló: {{ .err }}" TaskInstall: "Instalar" TaskUpgrade: "Actualizar" TaskSync: 'Sincronizar' +TaskSyncForNode: "Sincronizar Datos del Nodo" TaskBackup: "Respaldar" SuccessStatus: "{{ .name }} correcta" FailedStatus: "{{ .name }} fallida {{ .err }}" @@ -112,6 +113,7 @@ Skip: "Omitir errores y continuar..." #script ScriptLibrary: "Biblioteca de scripts" +RemoteScriptLibrary: "Biblioteca de Scripts Remota" ScriptSyncSkip: "¡La biblioteca de scripts ya está en la última versión!" DownloadData: "Descargando archivo de datos de la biblioteca de scripts data.yaml" DownloadPackage: "Descargando paquete de la biblioteca de scripts" diff --git a/core/i18n/lang/ja.yaml b/core/i18n/lang/ja.yaml index fe2d19913..5f51e44e6 100644 --- a/core/i18n/lang/ja.yaml +++ b/core/i18n/lang/ja.yaml @@ -104,6 +104,7 @@ SubTaskFailed: "{{ .name }} 失敗: {{ .err }}" TaskInstall: "インストール" TaskUpgrade: "アップグレード" TaskSync: '同期' +TaskSyncForNode: "ノードデータを同期" TaskBackup: "バックアップ" SuccessStatus: "{{ .name }} 成功" FailedStatus: "{{ .name }} 失敗 {{ .err }}" @@ -113,6 +114,7 @@ Skip: "エラーを無視して続行..." #script ScriptLibrary: "スクリプトライブラリ" +RemoteScriptLibrary: "リモートスクリプトライブラリ" ScriptSyncSkip: "現在のスクリプトライブラリは最新バージョンです!" DownloadData: "スクリプトライブラリファイル data.yaml をダウンロード中" DownloadPackage: "スクリプトライブラリパッケージをダウンロード中" diff --git a/core/i18n/lang/ko.yaml b/core/i18n/lang/ko.yaml index 2508f1a47..1c849fa1d 100644 --- a/core/i18n/lang/ko.yaml +++ b/core/i18n/lang/ko.yaml @@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} 실패: {{ .err }}" TaskInstall: "설치" TaskUpgrade: "업그레이드" TaskSync: '동기화' +TaskSyncForNode: "노드 데이터 동기화" TaskBackup: "백업" SuccessStatus: "{{ .name }} 성공" FailedStatus: "{{ .name }} 실패 {{ .err }}" @@ -112,6 +113,7 @@ Skip: "오류 무시하고 계속..." #script ScriptLibrary: "스크립트 라이브러리" +RemoteScriptLibrary: "원격 스크립트 라이브러리" ScriptSyncSkip: "현재 스크립트 라이브러리가 이미 최신 버전입니다!" DownloadData: "스크립트 라이브러리 파일 data.yaml 다운로드 중" DownloadPackage: "스크립트 라이브러리 패키지 다운로드 중" diff --git a/core/i18n/lang/ms.yaml b/core/i18n/lang/ms.yaml index ff83d57ed..33cd08d0d 100644 --- a/core/i18n/lang/ms.yaml +++ b/core/i18n/lang/ms.yaml @@ -98,6 +98,7 @@ SubTaskFailed: "{{ .name }} gagal: {{ .err }}" TaskInstall: "Pasang" TaskUpgrade: "Kemas kini" TaskSync: 'Selaraskan' +TaskSyncForNode: "Segerakan Data Nod" TaskBackup: "Sandaran" SuccessStatus: "{{ .name }} berjaya" FailedStatus: "{{ .name }} gagal {{ .err }}" @@ -107,6 +108,7 @@ Skip: "Abaikan ralat dan teruskan..." #script ScriptLibrary: "Pustaka Skrip" +RemoteScriptLibrary: "Pustaka Skrip Jauh" ScriptSyncSkip: "Pustaka skrip semasa sudah versi terkini!" DownloadData: "Muat turun fail pustaka skrip data.yaml" DownloadPackage: "Muat turun pakej pustaka skrip" diff --git a/core/i18n/lang/pt-BR.yaml b/core/i18n/lang/pt-BR.yaml index 2b30d717f..b73371e3e 100644 --- a/core/i18n/lang/pt-BR.yaml +++ b/core/i18n/lang/pt-BR.yaml @@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} falhou: {{ .err }}" TaskInstall: "Instalar" TaskUpgrade: "Atualizar" TaskSync: 'Sincronizar' +TaskSyncForNode: "Sincronizar Dados do Nó" TaskBackup: "Backup" SuccessStatus: "{{ .name }} bem-sucedido" FailedStatus: "{{ .name }} falhou {{ .err }}" @@ -112,6 +113,7 @@ Skip: "Ignorar erros e continuar..." #script ScriptLibrary: "Biblioteca de Scripts" +RemoteScriptLibrary: "Biblioteca de Scripts Remota" ScriptSyncSkip: "A biblioteca de scripts atual já é a versão mais recente!" DownloadData: "Baixando arquivo data.yaml da biblioteca de scripts" DownloadPackage: "Baixando pacote da biblioteca de scripts" diff --git a/core/i18n/lang/ru.yaml b/core/i18n/lang/ru.yaml index d2e80b8ed..88d8afdfd 100644 --- a/core/i18n/lang/ru.yaml +++ b/core/i18n/lang/ru.yaml @@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} не удалось: {{ .err }}" TaskInstall: "Установить" TaskUpgrade: "Обновить" TaskSync: 'Синхронизация' +TaskSyncForNode: "Синхронизировать Данные Узла" TaskBackup: "Резервная копия" SuccessStatus: "{{ .name }} успешно" FailedStatus: "{{ .name }} не удалось {{ .err }}" @@ -112,6 +113,7 @@ Skip: "Пропустить ошибки и продолжить..." #script ScriptLibrary: "Библиотека скриптов" +RemoteScriptLibrary: "Удаленная Библиотека Скриптов" ScriptSyncSkip: "Текущая библиотека скриптов уже является последней версией!" DownloadData: "Загрузка файла библиотеки скриптов data.yaml" DownloadPackage: "Загрузка архива библиотеки скриптов" diff --git a/core/i18n/lang/tr.yaml b/core/i18n/lang/tr.yaml index 0390bb2e5..84e9a3838 100644 --- a/core/i18n/lang/tr.yaml +++ b/core/i18n/lang/tr.yaml @@ -102,6 +102,7 @@ SubTaskFailed: "{{ .name }} başarısız: {{ .err }}" TaskInstall: "Kurulum" TaskUpgrade: "Yükseltme" TaskSync: 'Senkronize' +TaskSyncForNode: "Düğüm Verilerini Senkronize Et" TaskBackup: "Yedekleme" SuccessStatus: "{{ .name }} başarılı" FailedStatus: "{{ .name }} başarısız {{ .err }}" @@ -111,6 +112,7 @@ Skip: "Hataları atla ve devam et..." #script ScriptLibrary: "Betik Kütüphanesi" +RemoteScriptLibrary: "Uzak Komut Dosyası Kütüphanesi" ScriptSyncSkip: "Mevcut betik kütüphanesi zaten en son sürüm!" DownloadData: "Betik kütüphanesi dosyası data.yaml indiriliyor" DownloadPackage: "Betik kütüphanesi paketi indiriliyor" diff --git a/core/i18n/lang/zh-Hant.yaml b/core/i18n/lang/zh-Hant.yaml index 818b6e4ed..fb2165f06 100644 --- a/core/i18n/lang/zh-Hant.yaml +++ b/core/i18n/lang/zh-Hant.yaml @@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} 失敗: {{ .err }}" TaskInstall: "安裝" TaskUpgrade: "升級" TaskSync: "同步" +TaskSyncForNode: "同步節點數據" TaskBackup: "備份" SuccessStatus: "{{ .name }} 成功" FailedStatus: "{{ .name }} 失敗 {{ .err }}" @@ -112,6 +113,7 @@ Skip: "忽略錯誤並繼續..." #script ScriptLibrary: "腳本庫" +RemoteScriptLibrary: "遠端腳本庫" ScriptSyncSkip: "目前腳本庫已是最新版本!" DownloadData: "下載腳本庫文件 data.yaml" DownloadPackage: "下載腳本庫壓縮檔" diff --git a/core/i18n/lang/zh.yaml b/core/i18n/lang/zh.yaml index 46ec18d9c..dbf90f777 100644 --- a/core/i18n/lang/zh.yaml +++ b/core/i18n/lang/zh.yaml @@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} 失败: {{ .err }}" TaskInstall: "安装" TaskUpgrade: "升级" TaskSync: "同步" +TaskSyncForNode: "同步节点数据" TaskBackup: "备份" SuccessStatus: "{{ .name }} 成功" FailedStatus: "{{ .name }} 失败 {{ .err }}" @@ -112,6 +113,7 @@ Skip: "忽略错误并继续..." #script ScriptLibrary: "脚本库" +RemoteScriptLibrary: "远程脚本库" ScriptSyncSkip: "检查到当前脚本库已是最新版本!" DownloadData: "下载脚本库文件 data.yaml" DownloadPackage: "下载脚本库压缩包"