chore: Modify i18n initialization method

This commit is contained in:
ssongliu 2025-12-17 12:03:43 +08:00
parent d9579901fe
commit 9235f73ec4
13 changed files with 69 additions and 31 deletions

View file

@ -194,13 +194,13 @@ func (u *ScriptService) Sync(req dto.OperateByTaskID) error {
if global.CONF.Base.IsOffLine { if global.CONF.Base.IsOffLine {
return nil 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 { if err != nil {
global.LOG.Errorf("create sync task failed %v", err) global.LOG.Errorf("create sync task failed %v", err)
return 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) versionUrl := fmt.Sprintf("%s/scripts/version.txt", global.CONF.RemoteURL.ResourceURL)
_, versionRes, err := req_helper.HandleRequestWithProxy(versionUrl, http.MethodGet, constant.TimeOut20s) _, versionRes, err := req_helper.HandleRequestWithProxy(versionUrl, http.MethodGet, constant.TimeOut20s)
if err != nil { if err != nil {

View file

@ -51,6 +51,7 @@ const (
TaskUpgrade = "TaskUpgrade" TaskUpgrade = "TaskUpgrade"
TaskAddNode = "TaskAddNode" TaskAddNode = "TaskAddNode"
TaskSync = "TaskSync" TaskSync = "TaskSync"
TaskSyncForNode = "TaskSyncForNode"
TaskRsync = "TaskRsync" TaskRsync = "TaskRsync"
TaskInstallCluster = "TaskInstallCluster" TaskInstallCluster = "TaskInstallCluster"
TaskCreateCluster = "TaskCreateCluster" TaskCreateCluster = "TaskCreateCluster"

View file

@ -3,14 +3,12 @@ package i18n
import ( import (
"embed" "embed"
"fmt" "fmt"
"os/exec"
"strings" "strings"
"sync"
"sync/atomic" "sync/atomic"
"github.com/1Panel-dev/1Panel/core/app/repo" "github.com/1Panel-dev/1Panel/core/app/repo"
"github.com/1Panel-dev/1Panel/core/global" "github.com/1Panel-dev/1Panel/core/global"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/nicksnyder/go-i18n/v2/i18n" "github.com/nicksnyder/go-i18n/v2/i18n"
"golang.org/x/text/language" "golang.org/x/text/language"
@ -140,22 +138,9 @@ func UseI18n() gin.HandlerFunc {
} }
func Init() { func Init() {
initOnce.Do(func() { if bundle == nil {
bundle = i18n.NewBundle(language.Chinese) initBundle()
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")
}
dbLang := getLanguageFromDBInternal() dbLang := getLanguageFromDBInternal()
if dbLang == "" { if dbLang == "" {
dbLang = defaultLang dbLang = defaultLang
@ -163,15 +148,19 @@ func Init() {
SetCachedDBLanguage(dbLang) SetCachedDBLanguage(dbLang)
global.I18n = i18n.NewLocalizer(bundle, dbLang) global.I18n = i18n.NewLocalizer(bundle, dbLang)
})
} }
func UseI18nForCmd(lang string) { func UseI18nForCmd(lang string) {
if bundle == nil { if bundle == nil {
Init() initBundle()
} }
if lang == "" { if lang == "" {
langFrom1pctl := getLanguageFrom1pctl()
if langFrom1pctl == "" {
lang = defaultLang lang = defaultLang
} else {
lang = langFrom1pctl
}
} }
global.I18nForCmd = i18n.NewLocalizer(bundle, lang) global.I18nForCmd = i18n.NewLocalizer(bundle, lang)
} }
@ -219,9 +208,20 @@ func getLanguageFromDBInternal() string {
} }
return lang 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 cachedDBLang atomic.Value
var initOnce sync.Once
func GetLanguage() string { func GetLanguage() string {
if v := cachedDBLang.Load(); v != nil { if v := cachedDBLang.Load(); v != nil {
@ -236,3 +236,20 @@ func SetCachedDBLanguage(lang string) {
} }
cachedDBLang.Store(lang) 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")
}
}

View file

@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} failed: {{ .err }}"
TaskInstall: "Install" TaskInstall: "Install"
TaskUpgrade: "Upgrade" TaskUpgrade: "Upgrade"
TaskSync: 'Synchronize' TaskSync: 'Synchronize'
TaskSyncForNode: "Sync Node Data"
TaskBackup: "Backup" TaskBackup: "Backup"
SuccessStatus: "{{ .name }} succeeded" SuccessStatus: "{{ .name }} succeeded"
FailedStatus: "{{ .name }} failed {{ .err }}" FailedStatus: "{{ .name }} failed {{ .err }}"
@ -112,6 +113,7 @@ Skip: "Skip errors and continue..."
#script #script
ScriptLibrary: "Script Library" ScriptLibrary: "Script Library"
RemoteScriptLibrary: "Remote Script Library"
ScriptSyncSkip: "Current script library is already the latest version!" ScriptSyncSkip: "Current script library is already the latest version!"
DownloadData: "Downloading script library file data.yaml" DownloadData: "Downloading script library file data.yaml"
DownloadPackage: "Downloading script library package" DownloadPackage: "Downloading script library package"

View file

@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} falló: {{ .err }}"
TaskInstall: "Instalar" TaskInstall: "Instalar"
TaskUpgrade: "Actualizar" TaskUpgrade: "Actualizar"
TaskSync: 'Sincronizar' TaskSync: 'Sincronizar'
TaskSyncForNode: "Sincronizar Datos del Nodo"
TaskBackup: "Respaldar" TaskBackup: "Respaldar"
SuccessStatus: "{{ .name }} correcta" SuccessStatus: "{{ .name }} correcta"
FailedStatus: "{{ .name }} fallida {{ .err }}" FailedStatus: "{{ .name }} fallida {{ .err }}"
@ -112,6 +113,7 @@ Skip: "Omitir errores y continuar..."
#script #script
ScriptLibrary: "Biblioteca de scripts" ScriptLibrary: "Biblioteca de scripts"
RemoteScriptLibrary: "Biblioteca de Scripts Remota"
ScriptSyncSkip: "¡La biblioteca de scripts ya está en la última versión!" ScriptSyncSkip: "¡La biblioteca de scripts ya está en la última versión!"
DownloadData: "Descargando archivo de datos de la biblioteca de scripts data.yaml" DownloadData: "Descargando archivo de datos de la biblioteca de scripts data.yaml"
DownloadPackage: "Descargando paquete de la biblioteca de scripts" DownloadPackage: "Descargando paquete de la biblioteca de scripts"

View file

@ -104,6 +104,7 @@ SubTaskFailed: "{{ .name }} 失敗: {{ .err }}"
TaskInstall: "インストール" TaskInstall: "インストール"
TaskUpgrade: "アップグレード" TaskUpgrade: "アップグレード"
TaskSync: '同期' TaskSync: '同期'
TaskSyncForNode: "ノードデータを同期"
TaskBackup: "バックアップ" TaskBackup: "バックアップ"
SuccessStatus: "{{ .name }} 成功" SuccessStatus: "{{ .name }} 成功"
FailedStatus: "{{ .name }} 失敗 {{ .err }}" FailedStatus: "{{ .name }} 失敗 {{ .err }}"
@ -113,6 +114,7 @@ Skip: "エラーを無視して続行..."
#script #script
ScriptLibrary: "スクリプトライブラリ" ScriptLibrary: "スクリプトライブラリ"
RemoteScriptLibrary: "リモートスクリプトライブラリ"
ScriptSyncSkip: "現在のスクリプトライブラリは最新バージョンです!" ScriptSyncSkip: "現在のスクリプトライブラリは最新バージョンです!"
DownloadData: "スクリプトライブラリファイル data.yaml をダウンロード中" DownloadData: "スクリプトライブラリファイル data.yaml をダウンロード中"
DownloadPackage: "スクリプトライブラリパッケージをダウンロード中" DownloadPackage: "スクリプトライブラリパッケージをダウンロード中"

View file

@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} 실패: {{ .err }}"
TaskInstall: "설치" TaskInstall: "설치"
TaskUpgrade: "업그레이드" TaskUpgrade: "업그레이드"
TaskSync: '동기화' TaskSync: '동기화'
TaskSyncForNode: "노드 데이터 동기화"
TaskBackup: "백업" TaskBackup: "백업"
SuccessStatus: "{{ .name }} 성공" SuccessStatus: "{{ .name }} 성공"
FailedStatus: "{{ .name }} 실패 {{ .err }}" FailedStatus: "{{ .name }} 실패 {{ .err }}"
@ -112,6 +113,7 @@ Skip: "오류 무시하고 계속..."
#script #script
ScriptLibrary: "스크립트 라이브러리" ScriptLibrary: "스크립트 라이브러리"
RemoteScriptLibrary: "원격 스크립트 라이브러리"
ScriptSyncSkip: "현재 스크립트 라이브러리가 이미 최신 버전입니다!" ScriptSyncSkip: "현재 스크립트 라이브러리가 이미 최신 버전입니다!"
DownloadData: "스크립트 라이브러리 파일 data.yaml 다운로드 중" DownloadData: "스크립트 라이브러리 파일 data.yaml 다운로드 중"
DownloadPackage: "스크립트 라이브러리 패키지 다운로드 중" DownloadPackage: "스크립트 라이브러리 패키지 다운로드 중"

View file

@ -98,6 +98,7 @@ SubTaskFailed: "{{ .name }} gagal: {{ .err }}"
TaskInstall: "Pasang" TaskInstall: "Pasang"
TaskUpgrade: "Kemas kini" TaskUpgrade: "Kemas kini"
TaskSync: 'Selaraskan' TaskSync: 'Selaraskan'
TaskSyncForNode: "Segerakan Data Nod"
TaskBackup: "Sandaran" TaskBackup: "Sandaran"
SuccessStatus: "{{ .name }} berjaya" SuccessStatus: "{{ .name }} berjaya"
FailedStatus: "{{ .name }} gagal {{ .err }}" FailedStatus: "{{ .name }} gagal {{ .err }}"
@ -107,6 +108,7 @@ Skip: "Abaikan ralat dan teruskan..."
#script #script
ScriptLibrary: "Pustaka Skrip" ScriptLibrary: "Pustaka Skrip"
RemoteScriptLibrary: "Pustaka Skrip Jauh"
ScriptSyncSkip: "Pustaka skrip semasa sudah versi terkini!" ScriptSyncSkip: "Pustaka skrip semasa sudah versi terkini!"
DownloadData: "Muat turun fail pustaka skrip data.yaml" DownloadData: "Muat turun fail pustaka skrip data.yaml"
DownloadPackage: "Muat turun pakej pustaka skrip" DownloadPackage: "Muat turun pakej pustaka skrip"

View file

@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} falhou: {{ .err }}"
TaskInstall: "Instalar" TaskInstall: "Instalar"
TaskUpgrade: "Atualizar" TaskUpgrade: "Atualizar"
TaskSync: 'Sincronizar' TaskSync: 'Sincronizar'
TaskSyncForNode: "Sincronizar Dados do Nó"
TaskBackup: "Backup" TaskBackup: "Backup"
SuccessStatus: "{{ .name }} bem-sucedido" SuccessStatus: "{{ .name }} bem-sucedido"
FailedStatus: "{{ .name }} falhou {{ .err }}" FailedStatus: "{{ .name }} falhou {{ .err }}"
@ -112,6 +113,7 @@ Skip: "Ignorar erros e continuar..."
#script #script
ScriptLibrary: "Biblioteca de Scripts" ScriptLibrary: "Biblioteca de Scripts"
RemoteScriptLibrary: "Biblioteca de Scripts Remota"
ScriptSyncSkip: "A biblioteca de scripts atual já é a versão mais recente!" ScriptSyncSkip: "A biblioteca de scripts atual já é a versão mais recente!"
DownloadData: "Baixando arquivo data.yaml da biblioteca de scripts" DownloadData: "Baixando arquivo data.yaml da biblioteca de scripts"
DownloadPackage: "Baixando pacote da biblioteca de scripts" DownloadPackage: "Baixando pacote da biblioteca de scripts"

View file

@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} не удалось: {{ .err }}"
TaskInstall: "Установить" TaskInstall: "Установить"
TaskUpgrade: "Обновить" TaskUpgrade: "Обновить"
TaskSync: 'Синхронизация' TaskSync: 'Синхронизация'
TaskSyncForNode: "Синхронизировать Данные Узла"
TaskBackup: "Резервная копия" TaskBackup: "Резервная копия"
SuccessStatus: "{{ .name }} успешно" SuccessStatus: "{{ .name }} успешно"
FailedStatus: "{{ .name }} не удалось {{ .err }}" FailedStatus: "{{ .name }} не удалось {{ .err }}"
@ -112,6 +113,7 @@ Skip: "Пропустить ошибки и продолжить..."
#script #script
ScriptLibrary: "Библиотека скриптов" ScriptLibrary: "Библиотека скриптов"
RemoteScriptLibrary: "Удаленная Библиотека Скриптов"
ScriptSyncSkip: "Текущая библиотека скриптов уже является последней версией!" ScriptSyncSkip: "Текущая библиотека скриптов уже является последней версией!"
DownloadData: "Загрузка файла библиотеки скриптов data.yaml" DownloadData: "Загрузка файла библиотеки скриптов data.yaml"
DownloadPackage: "Загрузка архива библиотеки скриптов" DownloadPackage: "Загрузка архива библиотеки скриптов"

View file

@ -102,6 +102,7 @@ SubTaskFailed: "{{ .name }} başarısız: {{ .err }}"
TaskInstall: "Kurulum" TaskInstall: "Kurulum"
TaskUpgrade: "Yükseltme" TaskUpgrade: "Yükseltme"
TaskSync: 'Senkronize' TaskSync: 'Senkronize'
TaskSyncForNode: "Düğüm Verilerini Senkronize Et"
TaskBackup: "Yedekleme" TaskBackup: "Yedekleme"
SuccessStatus: "{{ .name }} başarılı" SuccessStatus: "{{ .name }} başarılı"
FailedStatus: "{{ .name }} başarısız {{ .err }}" FailedStatus: "{{ .name }} başarısız {{ .err }}"
@ -111,6 +112,7 @@ Skip: "Hataları atla ve devam et..."
#script #script
ScriptLibrary: "Betik Kütüphanesi" ScriptLibrary: "Betik Kütüphanesi"
RemoteScriptLibrary: "Uzak Komut Dosyası Kütüphanesi"
ScriptSyncSkip: "Mevcut betik kütüphanesi zaten en son sürüm!" ScriptSyncSkip: "Mevcut betik kütüphanesi zaten en son sürüm!"
DownloadData: "Betik kütüphanesi dosyası data.yaml indiriliyor" DownloadData: "Betik kütüphanesi dosyası data.yaml indiriliyor"
DownloadPackage: "Betik kütüphanesi paketi indiriliyor" DownloadPackage: "Betik kütüphanesi paketi indiriliyor"

View file

@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} 失敗: {{ .err }}"
TaskInstall: "安裝" TaskInstall: "安裝"
TaskUpgrade: "升級" TaskUpgrade: "升級"
TaskSync: "同步" TaskSync: "同步"
TaskSyncForNode: "同步節點數據"
TaskBackup: "備份" TaskBackup: "備份"
SuccessStatus: "{{ .name }} 成功" SuccessStatus: "{{ .name }} 成功"
FailedStatus: "{{ .name }} 失敗 {{ .err }}" FailedStatus: "{{ .name }} 失敗 {{ .err }}"
@ -112,6 +113,7 @@ Skip: "忽略錯誤並繼續..."
#script #script
ScriptLibrary: "腳本庫" ScriptLibrary: "腳本庫"
RemoteScriptLibrary: "遠端腳本庫"
ScriptSyncSkip: "目前腳本庫已是最新版本!" ScriptSyncSkip: "目前腳本庫已是最新版本!"
DownloadData: "下載腳本庫文件 data.yaml" DownloadData: "下載腳本庫文件 data.yaml"
DownloadPackage: "下載腳本庫壓縮檔" DownloadPackage: "下載腳本庫壓縮檔"

View file

@ -103,6 +103,7 @@ SubTaskFailed: "{{ .name }} 失败: {{ .err }}"
TaskInstall: "安装" TaskInstall: "安装"
TaskUpgrade: "升级" TaskUpgrade: "升级"
TaskSync: "同步" TaskSync: "同步"
TaskSyncForNode: "同步节点数据"
TaskBackup: "备份" TaskBackup: "备份"
SuccessStatus: "{{ .name }} 成功" SuccessStatus: "{{ .name }} 成功"
FailedStatus: "{{ .name }} 失败 {{ .err }}" FailedStatus: "{{ .name }} 失败 {{ .err }}"
@ -112,6 +113,7 @@ Skip: "忽略错误并继续..."
#script #script
ScriptLibrary: "脚本库" ScriptLibrary: "脚本库"
RemoteScriptLibrary: "远程脚本库"
ScriptSyncSkip: "检查到当前脚本库已是最新版本!" ScriptSyncSkip: "检查到当前脚本库已是最新版本!"
DownloadData: "下载脚本库文件 data.yaml" DownloadData: "下载脚本库文件 data.yaml"
DownloadPackage: "下载脚本库压缩包" DownloadPackage: "下载脚本库压缩包"