feat: support pt-br language (#14567)

Co-authored-by: Bai <baijiangjie@gmail.com>
pull/14573/head
fit2bot 2024-12-03 17:11:08 +08:00 committed by GitHub
parent 7875777ed1
commit f8d11013fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 13040 additions and 90 deletions

View File

@ -3,6 +3,7 @@ import pycountry
from django.db import models
from django.utils.translation import gettext_lazy as _
from phonenumbers import PhoneMetadata
from common.utils import lazyproperty
ADMIN = 'Admin'
USER = 'User'
@ -72,7 +73,38 @@ class Language(models.TextChoices):
en = 'en', 'English'
zh_hans = 'zh-hans', '中文(简体)'
zh_hant = 'zh-hant', '中文(繁體)'
jp = 'ja', '日本語',
ja = 'ja', '日本語',
pt_br = 'pt-br', 'Português (Brasil)'
@classmethod
def get_code_mapper(cls):
code_mapper = {code: code for code, name in cls.choices}
code_mapper.update({
'zh': cls.zh_hans.value,
'zh-cn': cls.zh_hans.value,
'zh-tw': cls.zh_hant.value,
'zh-hk': cls.zh_hant.value,
})
return code_mapper
@classmethod
def to_internal_code(cls, code: str, default='en', with_filename=False):
code_mapper = cls.get_code_mapper()
code = code.lower()
code = code_mapper.get(code) or code_mapper.get(default)
if with_filename:
cf_mapper = {
cls.zh_hans.value: 'zh',
}
code = cf_mapper.get(code, code)
code = code.replace('-', '_')
return code
@classmethod
def get_other_codes(cls, code):
code_mapper = cls.get_code_mapper()
other_codes = [other_code for other_code, _code in code_mapper.items() if code == _code]
return other_codes
COUNTRY_CALLING_CODES = get_country_phone_choices()

View File

@ -11,7 +11,8 @@ class BaseTranslateManager:
SEPARATOR = "<SEP>"
LANG_MAPPER = {
'ja': 'Japanese',
'zh_hant': 'Traditional Chinese',
'zh_Hant': 'Traditional Chinese',
'pt_BR': 'Portuguese (Brazil)',
# 'en': 'English',
}

View File

@ -37,7 +37,6 @@ class CoreTranslateManager(BaseTranslateManager):
zh_dict = {entry.msgid: entry.msgstr for entry in po.translated_entries()}
for file_prefix, target_lang in self.LANG_MAPPER.items():
file_prefix = 'zh_Hant' if file_prefix == 'zh_hant' else file_prefix
po_file_path = os.path.join(self._dir, file_prefix, 'LC_MESSAGES', 'django.po')
trans_po = polib.pofile(po_file_path)
need_trans_dict = self.get_need_trans_dict(zh_dict, trans_po)

View File

@ -36,6 +36,7 @@ class OtherTranslateManager(BaseTranslateManager):
zh_dict = self.load_json_as_dict()
for file_prefix, target_lang in self.LANG_MAPPER.items():
file_prefix = file_prefix.lower()
other_dict = self.load_json_as_dict(file_prefix)
need_trans_dict = self.get_need_trans_dict(zh_dict, other_dict)
print(f'{GREEN}Translate: {self.dir_name} {file_prefix} need to translate '

77
apps/i18n/chen/pt_br.json Normal file
View File

@ -0,0 +1,77 @@
{
"ACLRejectError": "Este comando não é permitido ser executado",
"AffectedRows": "Linhas afetadas",
"AlreadyFirstPageError": "Já é a primeira página",
"AlreadyLastPageError": "Já é a última página",
"Cancel": "Cancelar",
"ChangeContextError": "Falha ao alternar o contexto",
"CommandReview": "Revisão de Comando",
"CommandReviewMessage": "O comando que você digitou precisa ser revisado antes de executar, gostaria de iniciar a solicitação de revisão?",
"CommandReviewRejectBy": "O comando de revisão foi recusado por %s",
"CommandReviewTimeoutError": "Tempo limite para revisão de comando",
"CommandWarningDialogMessage": "O comando que você está tentando executar tem riscos, um aviso será enviado para o administrador. Deseja continuar?",
"Confirm": "Confirmar",
"ConnectError": "Falha na conexão",
"ConnectSuccess": "Conectado com sucesso",
"Connected": "Conectado",
"CopyNotAllowed": "Cópia não permitida, por favor contate o administrador para liberar a permissão!",
"Current": "Atual",
"DatabaseExplorer": "Navegador de Banco de Dados",
"DatabaseProperties": "Propriedades da fonte de dados",
"DriverClass": "Classe do driver",
"DriverVersion": "Versão do driver",
"ErrorMessage": "Mensagem de erro",
"ExecuteError": "Falha na execução",
"ExecuteSuccess": "Execução bem-sucedida",
"ExecutionCanceled": "Execução cancelada",
"ExportALL": "Exportar todos os dados",
"ExportAll": "Exportar tudo",
"ExportCurrent": "Exportar página atual",
"ExportData": "Exportar dados",
"FetchError": "Falha ao obter os dados",
"FormatHotKey": "Formatar (Ctrl + L)",
"InitializeDatasource": "Inicializar fonte de dados",
"InitializeDatasourceFailed": "Falha ao inicializar a fonte de dados",
"InitializingDatasourceMessage": "Inicializando a fonte de dados, por favor aguarde...",
"JDBCURL": "URL JDBC",
"LogOutput": "Log de saída",
"Name": "Nome",
"NewQuery": "Nova consulta",
"NoPermissionError": "Não tem permissão para executar esta Action",
"NumRow": "{num} linhas",
"Open": "Aberto",
"OverMaxIdleTimeError": "Esta sessão foi encerrada pois o tempo ocioso foi maior que %d minutos",
"OverMaxSessionTimeError": "Esta sessão foi encerrada por ter excedido %d horas",
"ParseError": "Falha ao processar",
"PasteNotAllowed": "Colagem não permitida, por favor contate o administrador para liberar a permissão!",
"PermissionAlreadyExpired": "Autorização expirada",
"PermissionExpiredDialogMessage": "A autorização expirou, a sessão expira em dez minutos, por favor entre em contato com o administrador para renovação",
"PermissionExpiredDialogTitle": "A autorização expirou",
"PermissionsExpiredOn": "As permissões associadas a esta sessão expiraram em %s",
"Properties": "Propriedades",
"Refresh": "Atualizar",
"Run": "Executar",
"RunHotKey": "Executar (Ctrl + Enter)",
"RunSelected": "Executar selecionado",
"Save": "Salvar",
"SaveSQL": "Salve o SQL",
"SaveSucceed": "Salvo com sucesso",
"SelectSQL": "Selecionar SQL",
"SessionClosedBy": "A sessão foi fechada por %s",
"SessionFinished": "A sessão terminou",
"SessionLockedError": "A sessão atual está bloqueada, não é possível continuar com o comando",
"SessionLockedMessage": "Esta sessão foi bloqueada por %s, não é possível continuar com a ação",
"SessionUnlockedMessage": "Esta sessão foi desbloqueada por %s, comandos agora podem ser executados",
"ShowProperties": "Propriedades",
"StopHotKey": "Parar (Ctrl + C)",
"Submit": "Submeter",
"Total": "Total",
"Type": "Escrever",
"User": "Usuário",
"UserCancelCommandReviewError": "O usuário cancelou a revisão do comando",
"Version": "Versão",
"ViewData": "Ver dados",
"WaitCommandReviewMessage": "Solicitação de revisão enviada, aguarde os resultados da revisão",
"Warning": "Aviso",
"initializingDatasourceFailedMessage": "Falha na conexão, verifique se a configuração de conexão do banco de dados está correta"
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,103 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-12-03 15:44+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: static/js/jumpserver.js:264
msgid "Update is successful!"
msgstr ""
#: static/js/jumpserver.js:266
msgid "An unknown error occurred while updating.."
msgstr ""
#: static/js/jumpserver.js:339
msgid "Not found"
msgstr ""
#: static/js/jumpserver.js:341
msgid "Server error"
msgstr ""
#: static/js/jumpserver.js:343 static/js/jumpserver.js:381
#: static/js/jumpserver.js:383
msgid "Error"
msgstr ""
#: static/js/jumpserver.js:349 static/js/jumpserver.js:390
msgid "Delete the success"
msgstr ""
#: static/js/jumpserver.js:356
msgid "Are you sure about deleting it?"
msgstr ""
#: static/js/jumpserver.js:360 static/js/jumpserver.js:401
msgid "Cancel"
msgstr ""
#: static/js/jumpserver.js:362 static/js/jumpserver.js:403
msgid "Confirm"
msgstr ""
#: static/js/jumpserver.js:381
msgid ""
"The organization contains undeleted information. Please try again after "
"deleting"
msgstr ""
#: static/js/jumpserver.js:383
msgid ""
"Do not perform this operation under this organization. Try again after "
"switching to another organization"
msgstr ""
#: static/js/jumpserver.js:397
msgid ""
"Please ensure that the following information in the organization has been "
"deleted"
msgstr ""
#: static/js/jumpserver.js:398
msgid ""
"User list、User group、Asset list、Domain list、Admin user、System user、"
"Labels、Asset permission"
msgstr ""
#: static/js/jumpserver.js:647
msgid "Unknown error occur"
msgstr ""
#: static/js/jumpserver.js:899
msgid "Password minimum length {N} bits"
msgstr ""
#: static/js/jumpserver.js:900
msgid "Must contain capital letters"
msgstr ""
#: static/js/jumpserver.js:901
msgid "Must contain lowercase letters"
msgstr ""
#: static/js/jumpserver.js:902
msgid "Must contain numeric characters"
msgstr ""
#: static/js/jumpserver.js:903
msgid "Must contain special characters"
msgstr ""

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-09-24 11:05+0800\n"
"POT-Creation-Date: 2024-12-03 15:44+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -15,60 +15,65 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:35:03 | https://zhconvert.org\n"
"X-ZhConverter: 繁化姬 dict-74c8d060-r1048 @ 2024/04/07 18:35:03 | https://"
"zhconvert.org\n"
#: static/js/jumpserver.js:259
#: static/js/jumpserver.js:264
msgid "Update is successful!"
msgstr "更新成功"
#: static/js/jumpserver.js:261
#: static/js/jumpserver.js:266
msgid "An unknown error occurred while updating.."
msgstr "更新時發生未知錯誤"
#: static/js/jumpserver.js:324 static/js/jumpserver.js:362
#: static/js/jumpserver.js:364
#: static/js/jumpserver.js:339
msgid "Not found"
msgstr ""
#: static/js/jumpserver.js:341
msgid "Server error"
msgstr ""
#: static/js/jumpserver.js:343 static/js/jumpserver.js:381
#: static/js/jumpserver.js:383
msgid "Error"
msgstr "錯誤"
#: static/js/jumpserver.js:324
msgid "Being used by the asset, please unbind the asset first."
msgstr "正在被資產使用中,請先解除資產綁定"
#: static/js/jumpserver.js:330 static/js/jumpserver.js:371
#: static/js/jumpserver.js:349 static/js/jumpserver.js:390
msgid "Delete the success"
msgstr "刪除成功"
#: static/js/jumpserver.js:337
#: static/js/jumpserver.js:356
msgid "Are you sure about deleting it?"
msgstr "你確定刪除嗎 ?"
#: static/js/jumpserver.js:341 static/js/jumpserver.js:382
#: static/js/jumpserver.js:360 static/js/jumpserver.js:401
msgid "Cancel"
msgstr "取消"
#: static/js/jumpserver.js:343 static/js/jumpserver.js:384
#: static/js/jumpserver.js:362 static/js/jumpserver.js:403
msgid "Confirm"
msgstr "確認"
#: static/js/jumpserver.js:362
#: static/js/jumpserver.js:381
msgid ""
"The organization contains undeleted information. Please try again after "
"deleting"
msgstr "組織中包含未刪除資訊,請刪除後重試"
#: static/js/jumpserver.js:364
#: static/js/jumpserver.js:383
msgid ""
"Do not perform this operation under this organization. Try again after "
"switching to another organization"
msgstr "請勿在此組織下執行此操作,切換到其他組織後重試"
#: static/js/jumpserver.js:378
#: static/js/jumpserver.js:397
msgid ""
"Please ensure that the following information in the organization has been "
"deleted"
msgstr "請確保組織內的以下資訊已刪除"
#: static/js/jumpserver.js:379
#: static/js/jumpserver.js:398
msgid ""
"User list、User group、Asset list、Domain list、Admin user、System user、"
"Labels、Asset permission"
@ -76,84 +81,70 @@ msgstr ""
"用戶列表、用戶組、資產列表、網域列表、特權用戶、系統用戶、標籤管理、資產授權"
"規則"
#: static/js/jumpserver.js:416
msgid "Loading"
msgstr "載入中"
#: static/js/jumpserver.js:417
msgid "Search"
msgstr "搜索"
#: static/js/jumpserver.js:420
#, javascript-format
msgid "Selected item %d"
msgstr "選中 %d 項"
#: static/js/jumpserver.js:424
msgid "Per page _MENU_"
msgstr "每頁 _MENU_"
#: static/js/jumpserver.js:425
msgid ""
"Displays the results of items _START_ to _END_; A total of _TOTAL_ entries"
msgstr "顯示第 _START_ 至 _END_ 項結果; 總共 _TOTAL_ 項"
#: static/js/jumpserver.js:428
msgid "No match"
msgstr "沒有匹配項"
#: static/js/jumpserver.js:429
msgid "No record"
msgstr "沒有記錄"
#: static/js/jumpserver.js:582
#: static/js/jumpserver.js:647
msgid "Unknown error occur"
msgstr "出現未知錯誤"
#: static/js/jumpserver.js:838
#: static/js/jumpserver.js:899
msgid "Password minimum length {N} bits"
msgstr "密碼最小長度 {N} 位"
#: static/js/jumpserver.js:839
#: static/js/jumpserver.js:900
msgid "Must contain capital letters"
msgstr "必須包含大寫字母"
#: static/js/jumpserver.js:840
#: static/js/jumpserver.js:901
msgid "Must contain lowercase letters"
msgstr "必須包含小寫字母"
#: static/js/jumpserver.js:841
#: static/js/jumpserver.js:902
msgid "Must contain numeric characters"
msgstr "必須包含數字字元"
#: static/js/jumpserver.js:842
#: static/js/jumpserver.js:903
msgid "Must contain special characters"
msgstr "必須包含特殊字元"
#: static/js/jumpserver.js:984
msgid "Export failed"
msgstr "匯出失敗"
#~ msgid "Being used by the asset, please unbind the asset first."
#~ msgstr "正在被資產使用中,請先解除資產綁定"
#: static/js/jumpserver.js:1001
msgid "Import Success"
msgstr "匯入成功"
#~ msgid "Loading"
#~ msgstr "載入中"
#: static/js/jumpserver.js:1006
msgid "Update Success"
msgstr "更新成功"
#~ msgid "Search"
#~ msgstr "搜索"
#: static/js/jumpserver.js:1007
msgid "Count"
msgstr "數量"
#, javascript-format
#~ msgid "Selected item %d"
#~ msgstr "選中 %d 項"
#: static/js/jumpserver.js:1035
msgid "Import failed"
msgstr "匯入失敗"
#~ msgid "Per page _MENU_"
#~ msgstr "每頁 _MENU_"
#: static/js/jumpserver.js:1040
msgid "Update failed"
msgstr "更新失敗"
#~ msgid ""
#~ "Displays the results of items _START_ to _END_; A total of _TOTAL_ entries"
#~ msgstr "顯示第 _START_ 至 _END_ 項結果; 總共 _TOTAL_ 項"
#: static/js/plugins/moment/moment.min.js:6
msgid "\n"
msgstr ""
#~ msgid "No match"
#~ msgstr "沒有匹配項"
#~ msgid "No record"
#~ msgstr "沒有記錄"
#~ msgid "Export failed"
#~ msgstr "匯出失敗"
#~ msgid "Import Success"
#~ msgstr "匯入成功"
#~ msgid "Update Success"
#~ msgstr "更新成功"
#~ msgid "Count"
#~ msgstr "數量"
#~ msgid "Import failed"
#~ msgstr "匯入失敗"
#~ msgid "Update failed"
#~ msgstr "更新失敗"

75
apps/i18n/koko/pt_br.json Normal file
View File

@ -0,0 +1,75 @@
{
"ActionPerm": "Permissões de ação",
"Cancel": "Cancelar",
"Clone Connect": "Copiar janela",
"Close All Tabs": "Fechar tudo",
"Close Current Tab": "Fechar a atual",
"Confirm": "Confirmar",
"ConfirmBtn": "Confirmar",
"Connect": "Conectar",
"CopyLink": "Copiar link e código",
"CopyShareURLSuccess": "Cópia de endereço compartilhado bem sucedida",
"CreateLink": "Criar link para compartilhar",
"CreateSuccess": "Criado com sucesso",
"Custom Setting": "Configurações personalizadas",
"DownArrow": "Seta para baixo",
"Download": "Baixar",
"DownloadSuccess": "Download bem-sucedido",
"EndFileTransfer": "Transferência de arquivo concluída",
"ExceedTransferSize": "Excede o tamanho máximo de transferência",
"Expand": "Expandir",
"ExpiredTime": "Período de validade",
"GetShareUser": "Digite o nome de usuário",
"Hotkeys": "Atalhos",
"InputVerifyCode": "Por favor, insira o código de verificação",
"JoinShare": "Junte-se ao compartilhamento",
"JoinedWithSuccess": "Adicionado com sucesso",
"KubernetesManagement": "Kubernetes 管理",
"LeaveShare": "Sair do compartilhamento",
"LeftArrow": "Seta para trás",
"LinkAddr": "Endereço do link",
"Minute": "Minutos",
"Minutes": "Minutos",
"MustOneFile": "Só pode escolher um arquivo",
"MustSelectOneFile": "É necessário selecionar um arquivo",
"NoLink": "Sem endereço",
"OnlineUsers": "Pessoas online",
"Paste": "Colar",
"PauseSession": "Pausar esta sessão",
"PermissionExpired": "Permissão expirada",
"PermissionValid": "Permissão válida",
"ReadOnly": "Somente leitura",
"Reconnect": "Reconectar",
"Refresh": "Atualizar",
"Remove": "Remover",
"RemoveShareUser": "Você foi removido da sessão compartilhada",
"RemoveShareUserConfirm": "Tem certeza de que deseja remover este usuário?",
"ResumeSession": "Restaurar esta sessão",
"RightArrow": "Seta para frente",
"Search": "Pesquisar",
"SelectAction": "Por favor, selecione",
"SelectTheme": "Por favor, selecione um tema",
"Self": "Eu",
"Settings": "Configurações",
"Share": "Compartilhar",
"ShareUser": "Compartilhar usuário",
"ShareUserHelpText": "Sem usuário selecionado, permitindo que todos se juntem",
"Sync": "Sincronizar",
"SyncUserPreferenceFailed": "Falha na configuração de sincronização",
"SyncUserPreferenceSuccess": "Configurações sincronizadas com sucesso",
"Theme": "Tema",
"ThemeColors": "Cor do tema",
"ThemeConfig": "Tema",
"UpArrow": "Seta para cima",
"Upload": "Upload",
"UploadEnd": "O upload foi concluído, aguarde o processamento subsequente",
"UploadStart": "Início do upload",
"UploadSuccess": "Upload bem sucedido",
"UploadTips": "Arraste o arquivo para cá ou clique para fazer o upload",
"UploadTitle": "Enviar arquivo",
"User": "Usuário",
"VerifyCode": "Código de verificação",
"WaitFileTransfer": "Aguarde o fim da transferência do arquivo",
"WebSocketClosed": "WebSocket foi fechado",
"Writable": "Editável"
}

View File

@ -177,9 +177,8 @@
"AverageTimeCost": "平均所要時間",
"AwaitingMyApproval": "私の承認待ち",
"Azure": "Azure(中国)",
"Azure_Int": "アジュール(インターナショナル)",
"AzureKeyVault": "Azure vault",
"HashicorpVault": "HCP vault",
"Azure_Int": "アジュール(インターナショナル)",
"Backup": "バックアップ",
"BackupAccountsHelpText": "アカウント情報を外部にバックアップする。外部システムに保存するかメールを送信することもできます、セクション方式をサポートしています",
"BadConflictErrorMsg": "更新中です、しばらくお待ちください",
@ -593,6 +592,7 @@
"Hardware": "ハードウェア情報",
"HardwareInfo": "ハードウェア情報",
"HasImportErrorItemMsg": "インポートに失敗した項目があります、左側の x をクリックして失敗原因を確認し、テーブルを編集した後、失敗した項目を再度インポートできます",
"HashicorpVault": "HCP vault",
"Help": "ヘルプ",
"HelpDocumentTip": "ウェブサイトのナビゲーションバーのURLを変更できます ヘルプ -> ドキュメント",
"HelpSupportTip": "ウェブサイトのナビゲーションバーのURLを変更できます。ヘルプ->サポート",
@ -746,9 +746,11 @@
"LogsAudit": "ログ監査",
"Lowercase": "小文字",
"LunaSetting": "Luna 設定",
"MFAAllUsers": "グローバル有効化:全ユーザー",
"MFAErrorMsg": "MFAエラー、確認してください",
"MFAOfUserFirstLoginPersonalInformationImprovementPage": "多要素認証を有効にしてアカウントをより安全にします。<br/>有効化後、次回のログイン時に多要素認証のバインディングプロセスに入るでしょう。また、(個人情報->速やかに変更->多要素設定を変更)で直接バインディングすることもできます!",
"MFAOfUserFirstLoginUserGuidePage": "あなたと会社の安全を保つために、アカウント、パスワード、鍵などの重要な機密情報を適切に管理してください。(例:複雑なパスワードの設定、そして多要素認証の有効化)<br/> メール、携帯電話番号、WeChat等の個人情報は、ユーザー認証とプラットフォーム内部でのメッセージ通知にのみ使用されます。",
"MFAOnlyAdminUsers": "グローバル有効化:管理者のみ",
"MIN_LENGTH_ERROR": "パスワードの長さは少なくとも {0} 文字でなければなりません",
"MailRecipient": "メール受信者",
"MailSend": "メール送信",
@ -1461,4 +1463,4 @@
"forceEnableMFAHelpText": "強制的に有効化すると、ユーザーは自分で無効化することができません。",
"removeWarningMsg": "削除してもよろしいですか",
"setVariable": "パラメータ設定"
}
}

1427
apps/i18n/lina/pt_br.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -238,9 +238,8 @@
"AverageTimeCost": "平均花費時間",
"AwaitingMyApproval": "待我審批",
"Azure": "Azure (中國)",
"Azure_Int": "Azure (國際)",
"AzureKeyVault": "Azure vault",
"HashicorpVault": "HCP vault",
"Azure_Int": "Azure (國際)",
"Backup": "備份",
"BackupAccountsHelpText": "備份帳號資訊至外部。可以儲存到外部系統或寄送郵件,支援分段方式",
"BadConflictErrorMsg": "正在刷新中,請稍後再試",
@ -751,6 +750,7 @@
"HardwareInfo": "硬體資訊",
"HasImportErrorItemMsg": "存在匯入失敗項,點擊左側 x 檢視失敗原因,點擊表格編輯後,可以繼續匯入失敗項",
"HasRead": "是否已讀",
"HashicorpVault": "HCP vault",
"Help": "幫助",
"HighLoad": "較高",
"HistoricalSessionNum": "歷史會話數",
@ -955,10 +955,12 @@
"LunaSetting": "Luna 設定",
"LunaSettingUpdate": "Luna 配置設置",
"MFA": "MFA",
"MFAAllUsers": "全球啟用:所有用戶",
"MFAConfirm": "MFA 認證",
"MFAErrorMsg": "MFA錯誤請檢查",
"MFAOfUserFirstLoginPersonalInformationImprovementPage": "啟用多因子認證,使帳號更加安全。<br/> 啟用之後您將會在下次登入時進入多因子認證綁定流程;您也可以在(個人資訊->快速修改->更改多因子設置)中直接綁定!",
"MFAOfUserFirstLoginUserGuidePage": "為了保護您和公司的安全,請妥善保管您的帳戶、密碼和金鑰等重要敏感資訊;(如:設置複雜密碼,並啟用多因子認證)<br/> 信箱、手機號碼、微信等個人資訊,僅作為用戶認證和平台內部消息通知使用。",
"MFAOnlyAdminUsers": "全球啟用:僅管理員",
"MFARequireForSecurity": "為了安全請輸入MFA",
"MFAVerify": "驗證 MFA",
"MIN_LENGTH_ERROR": "密碼最小長度 {0} 位",
@ -2299,4 +2301,4 @@
"week": "周",
"weekOf": "周的星期",
"wildcardsAllowed": "允許的通配符"
}
}

83
apps/i18n/lion/pt_br.json Normal file
View File

@ -0,0 +1,83 @@
{
"ActionPerm": "Permissões de ação",
"AutoFit": "Adaptação automática",
"Cancel": "Cancelar",
"ClearDone": "Limpeza concluída",
"Clipboard": "Área de transferência",
"Close": "Fechar",
"ConfirmBtn": "Confirmar",
"Connecting": "Conectando",
"CopyLink": "Copiar link e código de verificação",
"CopyShareURLSuccess": "Cópia do endereço compartilhado com sucesso",
"CreateLink": "Criar link de compartilhamento",
"CreateSuccess": "Criação bem sucedida",
"Display": "Exibir",
"ErrTitle": "Conexão anormal",
"ExpiredTime": "Período de validade",
"Files": "文件管理",
"GetShareUser": "Digite o nome de usuário",
"GuaErrClientUnauthorized": "Erro de autenticação de nome de usuário e senha, falha no login",
"GuaErrSessionConflict": "Devido a um conflito com outra conexão, o servidor de area de trabalho remota fechou esta conexão. Por favor, tente novamente mais tarde.",
"GuaErrUnSupport": "Esta ação foi proibida",
"GuaErrUpStreamTimeout": "Servidor de area de trabalho remota não responde",
"GuaErrUpstreamNotFound": "Não foi possível conectar ao servidor de desktop remoto (rede inacessível | erro de política de segurança)",
"GuacamoleErrAccessDenied": "O acesso à conexão remota foi negado",
"GuacamoleErrActiveSessionTimeLimitExceeded": "O tempo de atividade da conexão remota excedeu o limite",
"GuacamoleErrAuthenticationFailure": "Falha na autenticação da conexão remota",
"GuacamoleErrConnectionFailed": "Falha na conexão remota",
"GuacamoleErrCredentialsExpired": "Credenciais de conexão remota expiradas",
"GuacamoleErrDNSLookupFailed": "Consulta DNS da conexão remota falhou",
"GuacamoleErrDisconnected": "Conexão remota desconectada",
"GuacamoleErrDisconnectedByOtherConnection": "A conexão remota foi interrompida por outra conexão",
"GuacamoleErrForciblyDisconnected": "A conexão remota foi forçada a desconectar",
"GuacamoleErrIdleSessionTimeLimitExceeded": "O tempo ocioso da conexão remota excedeu o limite",
"GuacamoleErrInsufficientPrivileges": "Permissões do usuário de conexão remota insuficientes",
"GuacamoleErrLoggedOff": "O usuário da conexão remota já se desconectou",
"GuacamoleErrManuallyDisconnected": "Conexão remota desconectada manualmente",
"GuacamoleErrManuallyLoggedOff": "O usuário de conexão remota foi desconectado manualmente",
"GuacamoleErrSSLTLSConnectionFailed": "A conexão SSL/TLS da conexão remota falhou.",
"GuacamoleErrSecurityNegotiationFailed": "Falha na negociação de segurança da conexão remota",
"GuacamoleErrServerRefusedConnection": "O servidor de conexão remota recusou a conexão",
"GuacamoleErrServerRefusedConnectionBySecurityType": "A conexão remota foi recusada pelo servidor, possivelmente o tipo de segurança não corresponde",
"GuacamoleErrUnsupportedCredentialTypeRequested": "Tipo de credencial de conexão remota não suportado",
"GuacamoleErrUpstreamError": "Ocorreu um erro no servidor de conexão remota",
"JMSErrAPIFailed": "Ocorreu um erro com a API principal",
"JMSErrAuthUser": "Usuário não autenticado",
"JMSErrBadParams": "Erro de parâmetro de solicitação",
"JMSErrDisconnected": "A conexão da conversa foi desconectada",
"JMSErrGatewayFailed": "Falha na conexão do gateway",
"JMSErrGuacamoleServer": "Incapaz de se conectar ao servidor Guacamole",
"JMSErrIdleTimeOut": "Excedeu o tempo máximo ocioso de {PLACEHOLDER} minutos, conexão interrompida",
"JMSErrMaxSession": "Excedido o tempo máximo de sessão de {PLACEHOLDER} horas, desconectado",
"JMSErrNoSession": "Sessão não encontrada",
"JMSErrPermission": "Sem permissão para conexão",
"JMSErrPermissionExpired": "A autorização expirou, desconectando",
"JMSErrRemoveShareUser": "Você foi removido da sessão compartilhada",
"JMSErrTerminatedByAdmin": "管理 terminou a sessão",
"JoinShare": "Participar do compartilhamento",
"LeaveShare": "Deixar compartilhamento",
"LinkAddr": "Link do endereço",
"Minute": "Minutos",
"Minutes": "Minutos",
"OK": "Confirmar",
"Password": "Senha",
"PauseSession": "Pausing a sessão",
"ReadOnly": "Somente leitura",
"RemoveShareUserConfirm": "Tem certeza de que deseja remover este usuário?",
"RequireParams": "Parâmetros obrigatórios",
"ResumeSession": "Restaurar sessão",
"SelectAction": "Por favor, selecione",
"Settings": "Configurações",
"Share": "Compartilhar",
"ShareUser": "Compartilhar usuário",
"ShareUserHelpText": "Nenhum usuário selecionado, permitindo que todos se juntem",
"Shortcuts": "Atalhos",
"Skip": "Ignorar",
"Submit": "Enviar",
"UploadFile": "Upload de arquivo",
"UploadSuccess": "Upload bem-sucedido",
"Username": "Nome de usuário",
"VerifyCode": "Código de verificação",
"WebSocketError": "Falha na conexão WebSocket, por favor verifique a rede",
"Writable": "Leitura e escrita"
}

225
apps/i18n/luna/pt_br.json Normal file
View File

@ -0,0 +1,225 @@
{
"ACL reject login asset": "O login foi recusado, a razão é a restrição da política de controle de acesso",
"Account info": "Informações da Conta",
"Account not found": "Conta não encontrada",
"Account: ": "Conta: {{value}}",
"Action: ": " Ação: ",
"Advanced option": "Opções avançadas",
"All sessions": "Todas as sessões",
"Applet": "Aplicações Remotas",
"Applet connect method": "Forma de conexão de aplicativos remotos",
"Are you sure to reconnect it?(RDP not support)": " Tem certeza que deseja reconectar? (RDP não é suportado) ",
"Asset disabled": " Este ativo foi desativado, por favor entre em contato com o administrador ",
"Asset not found or You have no permission to access it, please refresh asset tree": "Não foi possível encontrar o bem ou você não tem permissão para acessá-lo, por favor, atualize a árvore de ativos",
"Asset tree loading method": " Configurar forma de carregamento da árvore de ativos ",
"Asset: ": "Ativo: {{value}}",
"Assignees": "Atendente",
"Automatic login next": "Login Automático na Próxima Vez (Clique com o botão direito na conexão do ativo para escolher novamente)",
"Backspace as Ctrl+H": " Terminal Character Backspace As Ctrl+H ",
"Batch actions": "Operações em Lote",
"Batch connect": "Conexão em massa",
"Belgian French keyboard layout": " Francês Belga (Azerty) ",
"CLI": "Linha de Comando",
"CLI font size": "Tamanho da fonte do terminal de caracteres",
"Cancel": "Cancelar",
"Charset": "Conjunto de caracteres",
"Checkbox": "Seleção múltipla",
"Choose a User": " Selecionar um Usuário ",
"Click to copy": "Clique para copiar",
"Client": "Cliente",
"Clone Connect": "Copiar Janela",
"Close": "Fechar",
"Close All Tabs": "Fechar tudo",
"Close Current Tab": "Feche o atual",
"Close Left Tabs": "Fechar à esquerda",
"Close Other Tabs": "Fechar outros",
"Close Right Tabs": " Fechar à direita",
"Close split connect": "Fechar divisão de tela",
"Command": "Comando",
"Command Line": "Linha de Comando",
"Command line": " Conectar To Line Command ",
"CommandBar": "Barra de comandos",
"Confirm": "Confirmar",
"Connect": "Conectar",
"Connect checked": "Conecte selecionado",
"Connect command line": "Conectar linha de comando",
"Connect method": "Forma de conexão",
"Copied": "Copiado",
"Copy link": "Copiar link",
"Current online": "Online Atual",
"Current session": "Sessão Atual",
"DarkBlue": "Deep Blue",
"Database": "Banco de Dados",
"Database connect info": "Informações de Conexão do Banco de Dados",
"Database disabled": "Este tipo de conexão não é suportado, por favor, contate o administrador",
"Database info": "Informações da Base de Dados",
"Database token help text": "O tipo de token do banco de dados será armazenado em cache por 5 minutos, o que significa que após o uso do token, ele não será imediatamente invalidado, mas somente 5 minutos após o cliente desconectar, esse token será completamente invalidado",
"Databases": "Banco de Dados",
"Default": "Padrão",
"Directly": "Nome do usuário especifica a propriedade e conta de conexão",
"Disable auto completion": "Desativar Auto-completar",
"Disconnect": "Desconectar",
"Disfavor": " Desfavoritar ",
"Do not close this page": "Não feche esta página",
"Document": " Documento ",
"Don't prompt again": "Não mostrar novamente",
"Download": "Baixar",
"Download the latest client": "Baixar o cliente mais recente",
"Driver redirect": "Montagem de Disco",
"Expand": "Expandir",
"Expand all": "Expandir Tudo",
"Expand all asset": "Expanda todos os ativos abaixo do nó",
"Expire time": "Tempo de Expiração",
"Failed to open address": "Falha ao abrir o endereço",
"Favorite": "Favoritos",
"File Manager": "Arquivo 管理",
"Fold": "Dobrar",
"Fold all": "Dobrar tudo",
"Force refresh": " Atualização Forçada",
"Found": "Descobrir",
"French keyboard layout": "Francês (Azerty)",
"Full Screen": "Exibir em tela cheia",
"Full screen": "Tela cheia",
"GUI": "Gráfico",
"General": "Configurações Básicas",
"Help": "Ajuda",
"Help or download": "Menu de Ajuda → Download",
"Help text": " Descrição ",
"Hide left manager": "Ocultar Barra Lateral Esquerda",
"Host": "Host",
"Info": "Aviso",
"InstallClientMsg": "O cliente JumpServer não está instalado, deseja baixá-lo e instalá-lo agora?",
"Japanese keyboard layout": " Japonês (Qwerty) ",
"Keyboard keys": "Option + Shift + Esquerdo / Direito",
"Keyboard layout": "Layout de Teclado",
"Keyboard switch session": "Alternar sessão → Teclas de atalho",
"Kubernetes": "Kubernetes",
"Language": "Idioma",
"Last login": "Último login",
"Launch Program": "Iniciar programa",
"LeftInfo": " Clicar no histórico de comandos permite uma rápida localização do vídeo ",
"Load tree async": " Carregamento Assíncrono da Árvore de Ativo ",
"Loading": "Carregando",
"Log out": "Sair da conta",
"Login reminder": "Alerta de login",
"Login review approved": "Login aprovado, conectando aos ativos...",
"LoginExpireMsg": "O login atual excedeu o tempo limite, por favor, não feche a janela. Após o login na nova janela, será possível restaurar a página atual. Se não restaurar, por favor atualize a página.",
"Manual accounts": "Conta manual",
"MenuAccountTemplates": "Modelo de conta",
"Module": "Módulo",
"Multi Screen": " Exibição Multi-Tela ",
"My applications": " Meu Aplicativo ",
"My assets": "Meus ativos",
"Name": "Nome ",
"Native": "Cliente ",
"Need review for login asset": "Este login precisa de revisão manual, deseja continuar?",
"Need to use": "Precisa usar",
"No": "Não",
"No account available": "Não há contas disponíveis",
"No available connect method": "Nenhum método de conexão disponível",
"No matching found": "Sem correspondências",
"No permission": "Sem permissão",
"No protocol available": "Não há protocolos disponíveis",
"NoTabs": "Sem Janelas",
"Not quick command": "Não há comandos rápidos disponíveis",
"Open in new window": "Abrir em nova janela",
"Operator": "Operador",
"Password": "Senha",
"Password is token password on the table": "A senha é a Senha Token na tabela",
"Password is your password login to system": "A senha é a sua senha de login do sistema",
"Pause": "Pausar",
"Pause task has been send": "A ação de pausar tarefa foi enviada",
"Play List": "Lista de Reprodução",
"Please choose an account": " Por favor, selecione um usuário ",
"Please input password": "Por favor, insira a senha",
"Port": "Porta",
"Protocol": "Protocolo",
"Protocol: ": "Protocolo: {{value}}",
"RDP Client": "Cliente RDP",
"RDP File": "Arquivo RDP",
"RDP client options": "Opções do cliente RDP",
"RDP color quality": " Qualidade de cor RDP ",
"RDP resolution": "RDP Resolução",
"RDP smart size": "RDP Tamanho inteligente",
"Re-use for a long time after opening": "Após a ativação, essas informações de conexão podem ser usadas várias vezes por um longo período",
"Reconnect": "Reconectar",
"Refresh": "Atualizar",
"Remember password": "Lembrar senha",
"Remember select": "Lembre-se da seleção",
"RemoteApp": "Aplicativo remoto",
"Reselect connection method": "Você pode escolher novamente a forma de conexão",
"Resume": "Restaurar",
"Resume task has been send": "Restauração de tarefa enviada",
"Right click asset": " Botão direito no Ativo → Conectar ",
"Right click node": " Clique com o botão direito no nó → Expandir todos ",
"Right mouse quick paste": "Colar rápido com botão direito",
"Run it by client": "Executar usando o cliente",
"SQL Client": "Cliente SQL",
"Save command": " Salvar Comando ",
"Save success": "Salvamento bem-sucedido",
"Search": "Pesquisar",
"Select account": "Selecionar conta",
"Send command": "Enviar comando",
"Send text to all ssh terminals": "Enviar texto para todos os terminais ssh",
"Set reusable": "Iniciar reutilização",
"Setting": "Configurações",
"Settings or basic settings": "Menu 设置 → Configurações básicas",
"ShareSession": "Compartilhamento de sessão",
"Show left manager": "Mostrar Barra Lateral Esquerda",
"Skip": "Pular",
"Skip manual password": " Ignorar janela de senha manual ",
"Special accounts": "Conta Especial",
"Speed": "Velocidade",
"Split connect": "Conexão de tela dividida",
"Split connect number": "Uma sessão suporta no máximo 3 conexões de tela dividida",
"Split vertically": "Divisão vertical de tela",
"SplitVertical": "Divisão Vertical",
"Start Time: ": "Horário de Início: {{value}}",
"Stop": "Parar",
"Support": "Suporte",
"Swiss French keyboard layout": "Swiss French (Qwertz)",
"Switch to input command": "Alterne para inserir comandos",
"Switch to quick command": "Mudar para Comandos Rápidos",
"Tab List": "Lista de janelas",
"Tabs": "Janela",
"The connection method is invalid, please refresh the page": "Esse método de conexão não é válido, por favor atualize a página",
"Theme": "Tema",
"Ticket review approved for login asset": "A verificação de login desta vez foi aprovada, deseja conectar ao ativo?",
"Ticket review closed for login asset": "A verificação de login desta vez foi encerrada, não é possível conectar ao ativo",
"Ticket review pending for login asset": "Seu pedido de login foi enviado, aguardando revisão pelo aprovador, você também pode copiar o link e enviar para ele",
"Ticket review rejected for login asset": "O login desta vez foi recusado, não é possível se conectar ao recurso",
"Tips": "Dica",
"Token expired": "Token Expirou, Por Favor Reconecte",
"Tool download": "Download da ferramenta",
"Turkey keyboard layout": "Turkish-Q (Qwerty)",
"Type tree": "Tipo de árvore",
"UK English keyboard layout": "Ingles do Reino Unido (Qwerty)",
"US English keyboard layout": "Inglês dos EUA (Qwerty)",
"User": " Usuário ",
"User: ": "Usuário: {{value}}",
"Username": "Nome de usuário",
"Username@Domain": "Nome de usuário@Domínio AD",
"Users": "Usuário",
"Using token": "Usar Token",
"View": "Visualização",
"Viewer": "Visualizar Pessoa",
"VirtualApp": "Aplicação virtual",
"Web Terminal": "Terminal web",
"Website": "Site oficial",
"With secret accounts": "Conta Gerida",
"Yes": "Sim",
"asset": "Ativos",
"cols": "Número de Colunas",
"confirm": "Confirme",
"connect info": " Informação de Conexão ",
"connectDisabledTipsMethodDisabled": "Dica: nenhuma aplicação remota eficaz foi encontrada, os recursos atuais não podem ser conectados, por favor, contate o administrador para tratar disso",
"connectDisabledTipsNoAccount": "Dica: Não foi possível encontrar uma conta autorizada válida, o recurso atual não pode se conectar, por favor, entre em contato com o administrador para lidar com isso",
"connectDisabledTipsNoConnectMethod": "Aviso: Nenhum método de conexão válido encontrado, o recurso atual não pode ser conectado, por favor, contate o administrador para lidar com isso",
"download": "Baixar",
"recordingIsBeingDownloaded": "O vídeo está sendo baixado, por favor aguarde",
"rows": " Número de Linhas ",
"start time": "Hora de início",
"success": " Sucesso",
"system user": "Usuário do Sistema",
"user": "Usuário"
}

View File

@ -7,6 +7,8 @@ from rest_framework.generics import RetrieveAPIView
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from common.const.choices import Language
class ComponentI18nApi(RetrieveAPIView):
base_path = 'locale'
@ -26,9 +28,9 @@ class ComponentI18nApi(RetrieveAPIView):
for file in files:
if not file.endswith('.json'):
continue
_lang = file.split('.')[0]
lang = file.split('.')[0]
with open(safe_join(component_dir, file), 'r') as f:
data[_lang] = json.load(f)
data[lang] = json.load(f)
self.lang_data[name] = data
return data
@ -36,11 +38,11 @@ class ComponentI18nApi(RetrieveAPIView):
name = kwargs.get('name')
lang = request.query_params.get('lang')
data = self.get_component_translations(name)
if lang:
lang = lang if lang in data.keys() else 'en'
data = data.get(lang) or {}
code = Language.to_internal_code(lang, with_filename=True)
data = data.get(code) or {}
flat = request.query_params.get('flat', '1')
if flat == '0':
# 这里要使用原始的 lang, lina 会 merge
data = {lang: data}
return Response(data)

View File

@ -29,7 +29,8 @@ class OpenPublicSettingApi(generics.RetrieveAPIView):
"LANGUAGES": [
{
'name': title,
'code': code
'code': code,
'other_codes': Language.get_other_codes(code),
}
for code, title in Language.choices
]