diff --git a/cmd/i18ntool/geni18n.go b/cmd/i18ntool/geni18n.go index a2a30dfe..4e146645 100644 --- a/cmd/i18ntool/geni18n.go +++ b/cmd/i18ntool/geni18n.go @@ -59,6 +59,9 @@ func getDomainFile(domain string) *os.File { } // If the file doesn't exist, create it. + if _, err := os.Stat(*outputDir); err != nil { + _ = os.MkdirAll(*outputDir, 0755) + } filePath := path.Join(*outputDir, domain+".po") f, err := os.OpenFile(filePath, os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { diff --git a/locale/en_US/LC_MESSAGES/koko.mo b/locale/en/LC_MESSAGES/koko.mo similarity index 100% rename from locale/en_US/LC_MESSAGES/koko.mo rename to locale/en/LC_MESSAGES/koko.mo diff --git a/locale/en_US/LC_MESSAGES/koko.po b/locale/en/LC_MESSAGES/koko.po similarity index 95% rename from locale/en_US/LC_MESSAGES/koko.po rename to locale/en/LC_MESSAGES/koko.po index 40679cac..29b814fd 100644 --- a/locale/en_US/LC_MESSAGES/koko.po +++ b/locale/en/LC_MESSAGES/koko.po @@ -169,8 +169,8 @@ msgstr "" #. lang.T #: pkg/handler/banner.go:40 -msgid "Chinese-English-Japanese switch" -msgstr "中文-English-日本語 switch" +msgid "language switch" +msgstr "" #. lang.T #: pkg/handler/banner.go:41 @@ -245,16 +245,35 @@ msgid "" "connect the asset." msgstr "" +#. lang.T +#. lang.T #. lang.T #. lang.T #. lang.T #: pkg/handler/direct_handler.go:460 pkg/handler/direct_handler.go:476 -#: pkg/handler/dispatch.go:139 +#: pkg/handler/dispatch.go:127 pkg/handler/dispatch.go:128 +#: pkg/handler/dispatch.go:153 +msgid "Tips: switch language by ID" +msgstr "" + +#. lang.T +#. lang.T +#: pkg/handler/dispatch.go:154 pkg/handler/dispatch.go:180 +msgid "Invalid ID" +msgstr "" + +#. lang.T +#: pkg/handler/dispatch.go:186 +msgid "Switch language successfully" +msgstr "" + +#. lang.T +#: pkg/handler/dispatch.go:197 msgid "Node: [ ID.Name(Asset amount) ]" msgstr "" #. lang.T -#: pkg/handler/dispatch.go:141 +#: pkg/handler/dispatch.go:199 msgid "Tips: Enter g+NodeID to display the host under the node, such as g1" msgstr "" @@ -554,3 +573,6 @@ msgstr "" #: pkg/proxy/tools.go:40 msgid "network is unreachable" msgstr "" + +#~ msgid "Chinese-English-Japanese switch" +#~ msgstr "中文-English-日本語 switch" diff --git a/locale/ja_JP/LC_MESSAGES/koko.mo b/locale/ja/LC_MESSAGES/koko.mo similarity index 100% rename from locale/ja_JP/LC_MESSAGES/koko.mo rename to locale/ja/LC_MESSAGES/koko.mo diff --git a/locale/ja_JP/LC_MESSAGES/koko.po b/locale/ja/LC_MESSAGES/koko.po similarity index 87% rename from locale/ja_JP/LC_MESSAGES/koko.po rename to locale/ja/LC_MESSAGES/koko.po index f0af95da..46dcaa39 100644 --- a/locale/ja_JP/LC_MESSAGES/koko.po +++ b/locale/ja/LC_MESSAGES/koko.po @@ -102,8 +102,8 @@ msgid "" "Face ACL is not supported yet. Please use the WebTerminal to connect the " "asset." msgstr "" -"該端末は顔認証アクセスルールをサポートしていません。資産に接続するにはWebTerminalをご利用くだ" -"さい" +"該端末は顔認証アクセスルールをサポートしていません。資産に接続するには" +"WebTerminalをご利用ください" #. lang.T #. lang.T @@ -180,8 +180,8 @@ msgstr "アセットとノードを更新する" #. lang.T #: pkg/handler/banner.go:40 -msgid "Chinese-English-Japanese switch" -msgstr "中文-English-日本語の切り替え" +msgid "language switch" +msgstr "言語切り替え" #. lang.T #: pkg/handler/banner.go:41 @@ -261,16 +261,35 @@ msgstr "" "顔認証はまだサポートされていません。資産に接続するにはWebTerminalをご利用くだ" "さい" +#. lang.T +#. lang.T #. lang.T #. lang.T #. lang.T #: pkg/handler/direct_handler.go:460 pkg/handler/direct_handler.go:476 -#: pkg/handler/dispatch.go:139 +#: pkg/handler/dispatch.go:127 pkg/handler/dispatch.go:128 +#: pkg/handler/dispatch.go:153 +msgid "Tips: switch language by ID" +msgstr "ヒント: IDで言語を切り替えます" + +#. lang.T +#. lang.T +#: pkg/handler/dispatch.go:154 pkg/handler/dispatch.go:180 +msgid "Invalid ID" +msgstr "無効なID" + +#. lang.T +#: pkg/handler/dispatch.go:186 +msgid "Switch language successfully" +msgstr "言語切り替え成功" + +#. lang.T +#: pkg/handler/dispatch.go:197 msgid "Node: [ ID.Name(Asset amount) ]" msgstr "ノード: [ID.Name(アセット量)]" #. lang.T -#: pkg/handler/dispatch.go:141 +#: pkg/handler/dispatch.go:199 msgid "Tips: Enter g+NodeID to display the host under the node, such as g1" msgstr "ヒント: g+ノードIDを入力してノードの下のホストを表示します。例えば: g1" @@ -586,68 +605,4 @@ msgstr "ネットワーク不通(ルーティング不通)" #. lang.T #: pkg/proxy/tools.go:40 msgid "network is unreachable" -msgstr "ネットワーク不通(ネットワーク不可)" - -#~ msgid "Get auth username failed" -#~ msgstr "認証トークンの取得に失敗しました" - -#~ msgid "Protocols" -#~ msgstr "プロトコル" - -#~ msgid "No found ssh protocol supported" -#~ msgstr "サポートされている ssh プロトコルが見つかりません" - -#, fuzzy -#~ msgid "the database" -#~ msgstr "データベースなし" - -#~ msgid "Cluster" -#~ msgstr "クラスター" - -#, fuzzy -#~ msgid "the kubernetes" -#~ msgstr "いいえ kubernetes" - -#~ msgid "the asset" -#~ msgstr "資産なし" - -#~ msgid "Tips: Enter system user ID and directly login" -#~ msgstr "ヒント:システムユーザーIDを入力して直接ログインする" - -#~ msgid "IP" -#~ msgstr "IP" - -#~ msgid "DBType" -#~ msgstr "データベースのタイプ" - -#~ msgid "DB Name" -#~ msgstr "データベース名" - -#~ msgid "No system user found." -#~ msgstr "システムユーザなし" - -#~ msgid "validate Login confirm err: Core Api failed" -#~ msgstr "検証ログオン再確認失敗:Core API異常" - -#~ msgid "Must be unique system user for %s" -#~ msgstr "唯一のシステムユーザーでなければなりません %s" - -#~ msgid "" -#~ "Enter ID number directly login the database, multiple search use // + " -#~ "field, such as: //16" -#~ msgstr "" -#~ "ヒント:データベースIDを入力して直接ログインする,二次検索の使用 // + " -#~ "フィールド,のように://192" - -#~ msgid "" -#~ "Enter ID number directly login the kubernetes, multiple search use // + " -#~ "field, such as: //16" -#~ msgstr "" -#~ "ヒント:KubernetesのIDを入力して直接ログインする,二次検索の使用 // + " -#~ "フィールド,のように://192" - -#~ msgid "The asset is inactive" -#~ msgstr "アセットは非アクティブです" - -#~ msgid "Command review is not currently supported" -#~ msgstr "コマンドレビューは現在サポートされていません" +msgstr "ネットワーク不通(ネットワーク不可)" \ No newline at end of file diff --git a/locale/pt_BR/LC_MESSAGES/koko.po b/locale/pt_BR/LC_MESSAGES/koko.po new file mode 100644 index 00000000..b8bea3f8 --- /dev/null +++ b/locale/pt_BR/LC_MESSAGES/koko.po @@ -0,0 +1,597 @@ +msgid "" +msgstr "" +"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" +"X-Generator: xgotext\n" + +#. lang.T +#: pkg/handler/app_database.go:11 +msgid "No Databases" +msgstr "Sem bancos de dados" + +#. lang.T +#: pkg/handler/app_k8s.go:15 +msgid "No kubernetes" +msgstr "Sem kubernetes" + +#. lang.T +#: pkg/handler/app_k8s.go:31 +msgid "Page: %d, Count: %d, Total Page: %d, Total Count: %d" +msgstr "Página: %d, Contagem: %d, Total de Páginas: %d, Total de Itens: %d" + +#. lang.T +#: pkg/handler/app_k8s.go:45 +msgid "" +"Enter ID number directly login, multiple search use // + field, such as: //16" +msgstr "" +"Dica: digite o número do ID para login direto, para busca múltipla use // + " +"campo, como: //192" + +#. lang.T +#: pkg/handler/app_k8s.go:46 +msgid "Page up: b\tPage down: n" +msgstr "Página anterior: b\tPágina seguinte: n" + +#. lang.T +#: pkg/handler/asset.go:43 +msgid "No Assets" +msgstr "Sem ativos" + +#. lang.T +#: pkg/handler/asset.go:55 +msgid "ID" +msgstr "ID" + +#. lang.T +#: pkg/handler/asset.go:56 +msgid "Name" +msgstr "Nome" + +#. lang.T +#: pkg/handler/asset.go:57 +msgid "Address" +msgstr "Endereço" + +#. lang.T +#: pkg/handler/asset.go:58 +msgid "Platform" +msgstr "Plataforma" + +#. lang.T +#: pkg/handler/asset.go:59 +msgid "Organization" +msgstr "Organização" + +#. lang.T +#: pkg/handler/asset.go:60 +msgid "Comment" +msgstr "Comentário" + +#. lang.T +#: pkg/handler/asset.go:174 +msgid "%s protocol client not installed." +msgstr "Cliente do protocolo %s não instalado." + +#. lang.T +#: pkg/handler/asset.go:177 +msgid "" +"Terminal does not support protocol %s, please use web terminal to access" +msgstr "" +"Este terminal não suporta o protocolo %s, por favor, use o terminal web para " +"acessar." + +#. lang.T +#: pkg/handler/asset.go:211 +msgid "Core API failed" +msgstr "Falha na Core API" + +#. lang.T +#: pkg/handler/asset.go:217 +msgid "ACL reject" +msgstr "" +"Login rejeitado devido às restrições da política de controle de acesso." + +#. lang.T +#: pkg/handler/asset.go:223 +msgid "" +"Face ACL is not supported yet. Please use the WebTerminal to connect the " +"asset." +msgstr "" +"As regras de acesso facial ainda não são suportadas. Por favor, use o " +"WebTerminal para conectar ao ativo." + +#. lang.T +#. lang.T +#: pkg/handler/asset.go:238 pkg/handler/asset.go:247 +msgid "Unknown error code: %s, detail: %s" +msgstr "Código de erro desconhecido: %s, detalhe: %s" + +#. lang.T +#: pkg/handler/asset.go:258 +msgid "get connect token err" +msgstr "Erro ao obter o token de conexão" + +#. lang.T +#: pkg/handler/asset_node.go:22 +msgid "%s node has no assets" +msgstr "O nó %s não possui ativos" + +#. lang.T +#: pkg/handler/banner.go:30 +msgid "Welcome to use JumpServer open source fortress system" +msgstr "Bem-vindo a usar o sistema de fortaleza JumpServer de código aberto" + +#. lang.T +#: pkg/handler/banner.go:32 +msgid "part IP, Hostname, Comment" +msgstr "parte IP, Nome do Host, Comentário" + +#. lang.T +#: pkg/handler/banner.go:32 +msgid "to search login if unique" +msgstr "pesquisar login (se único)" + +#. lang.T +#: pkg/handler/banner.go:33 +msgid "/ + IP, Hostname, Comment" +msgstr "/ + IP, Nome do Host, Comentário" + +#. lang.T +#: pkg/handler/banner.go:33 +msgid "to search, such as: /192.168" +msgstr "pesquisar, como: /192.168" + +#. lang.T +#: pkg/handler/banner.go:34 +msgid "display the assets you have permission" +msgstr "exibir os ativos aos quais você tem permissão" + +#. lang.T +#: pkg/handler/banner.go:35 +msgid "display the node that you have permission" +msgstr "exibir o nó ao qual você tem permissão" + +#. lang.T +#: pkg/handler/banner.go:36 +msgid "display the hosts that you have permission" +msgstr "exibir os hosts aos quais você tem permissão" + +#. lang.T +#: pkg/handler/banner.go:37 +msgid "display the databases that you have permission" +msgstr "exibir os bancos de dados aos quais você tem permissão" + +#. lang.T +#: pkg/handler/banner.go:38 +msgid "display the kubernetes that you have permission" +msgstr "exibir os Kubernetes aos quais você tem permissão" + +#. lang.T +#: pkg/handler/banner.go:39 +msgid "refresh your assets and nodes" +msgstr "atualizar seus ativos e nós" + +#. lang.T +#: pkg/handler/banner.go:40 +msgid "language switch" +msgstr "Mudança de idioma" + +#. lang.T +#: pkg/handler/banner.go:41 +msgid "print help" +msgstr "imprimir ajuda" + +#. lang.T +#: pkg/handler/banner.go:42 +msgid "exit" +msgstr "sair" + +#. lang.T +#: pkg/handler/banner.go:60 +msgid "\t%2d) Enter {{.GreenBoldColor}}%s{{.ColorEnd}} to %s.%s" +msgstr "\t%d) Digite {{.GreenBoldColor}}%s{{.ColorEnd}} para %s.%s" + +#. lang.T +#: pkg/handler/banner.go:85 +msgid "Announcement: " +msgstr "Anúncio:" + +#. lang.T +#: pkg/handler/direct_handler.go:272 +msgid "No Account found." +msgstr "Nenhuma conta encontrada." + +#. lang.T +#. lang.T +#. lang.T +#: pkg/handler/direct_handler.go:282 pkg/handler/direct_handler.go:283 +#: pkg/handler/direct_handler.go:284 +msgid "Username" +msgstr "Nome de Usuário" + +#. lang.T +#: pkg/handler/direct_handler.go:313 +msgid "Tips: Enter asset[%s] account ID" +msgstr "Dica: Digite o ID da conta do ativo[%s]" + +#. lang.T +#: pkg/handler/direct_handler.go:314 +msgid "Back: B/b" +msgstr "Voltar: B/b" + +#. lang.T +#. lang.T +#: pkg/handler/direct_handler.go:349 pkg/handler/direct_handler.go:350 +msgid "Hostname" +msgstr "Nome do Host" + +#. lang.T +#. lang.T +#. lang.T +#: pkg/handler/direct_handler.go:351 pkg/handler/direct_handler.go:352 +#: pkg/handler/direct_handler.go:381 +msgid "select one asset to login" +msgstr "selecione um ativo para fazer login" + +#. lang.T +#. lang.T +#: pkg/handler/direct_handler.go:395 pkg/handler/direct_handler.go:400 +msgid "not found matched username %s" +msgstr "não foi encontrado um nome de usuário correspondente %s" + +#. lang.T +#. lang.T +#. lang.T +#: pkg/handler/direct_handler.go:433 pkg/handler/direct_handler.go:439 +#: pkg/handler/direct_handler.go:445 +msgid "" +"Face verification is not supported yet. Please use the WebTerminal to " +"connect the asset." +msgstr "" +"A verificação facial ainda não é suportada. Por favor, use o WebTerminal " +"para conectar ao ativo." + +#. lang.T +#. lang.T +#. lang.T +#. lang.T +#. lang.T +#: pkg/handler/direct_handler.go:460 pkg/handler/direct_handler.go:476 +#: pkg/handler/dispatch.go:127 pkg/handler/dispatch.go:128 +#: pkg/handler/dispatch.go:153 +msgid "Tips: switch language by ID" +msgstr "Dica: mude o idioma pelo ID" + +#. lang.T +#. lang.T +#: pkg/handler/dispatch.go:154 pkg/handler/dispatch.go:180 +msgid "Invalid ID" +msgstr "ID inválido" + +#. lang.T +#: pkg/handler/dispatch.go:186 +msgid "Switch language successfully" +msgstr "Mudança de idioma bem-sucedida" + +#. lang.T +#: pkg/handler/dispatch.go:197 +msgid "Node: [ ID.Name(Asset amount) ]" +msgstr "Nó: [ ID.Nome(Quantidade de Ativos) ]" + +#. lang.T +#: pkg/handler/dispatch.go:199 +msgid "Tips: Enter g+NodeID to display the host under the node, such as g1" +msgstr "Dica: Digite g+NodeID para exibir o host sob o nó, como g1" + +#. lang.T +#: pkg/handler/interactive.go:68 +msgid "Connect idle more than %d minutes, disconnect" +msgstr "Conexão ociosa por mais de %d minutos, desconectar" + +#. lang.T +#: pkg/handler/interactive.go:202 +msgid "No account found." +msgstr "Nenhuma conta encontrada." + +#. lang.T +#. lang.T +#. lang.T +#. lang.T +#. lang.T +#. lang.T +#: pkg/handler/interactive.go:212 pkg/handler/interactive.go:213 +#: pkg/handler/interactive.go:214 pkg/handler/interactive.go:244 +#: pkg/handler/interactive.go:245 pkg/handler/interactive.go:271 +msgid "Select account exceed max retry times." +msgstr "Seleção de conta excedeu o número máximo de tentativas." + +#. lang.T +#: pkg/handler/interactive.go:282 +msgid "No protocol found." +msgstr "Nenhum protocolo encontrado." + +#. lang.T +#. lang.T +#: pkg/handler/interactive.go:291 pkg/handler/interactive.go:292 +msgid "Protocol" +msgstr "Protocolo" + +#. lang.T +#: pkg/handler/interactive.go:319 +msgid "Tips: Enter protocol ID" +msgstr "Dica: Digite o ID do protocolo" + +#. lang.T +#. lang.T +#: pkg/handler/interactive.go:320 pkg/handler/interactive.go:346 +msgid "Select protocol exceed max retry times." +msgstr "Seleção de protocolo excedeu o número máximo de tentativas." + +#. lang.T +#: pkg/handler/interactive.go:383 +msgid "Refresh done" +msgstr "Atualização concluída" + +#. lang.T +#: pkg/handler/login_confirm.go:39 +msgid "Need ACL review, continue? (y/n): " +msgstr "Requere revisão de ACL, continuar? (y/n): " + +#. lang.T +#: pkg/handler/login_confirm.go:54 +msgid "Cancel to login asset or max 3 retry" +msgstr "Cancelar o login do ativo ou atingir 3 tentativas" + +#. lang.T +#. lang.T +#: pkg/handler/login_confirm.go:68 pkg/handler/login_confirm.go:99 +msgid "Need ticket confirm to login, already send email to the reviewers" +msgstr "" +"É necessário confirmar o ticket para login, já enviamos um e-mail aos " +"revisores." + +#. lang.T +#: pkg/handler/login_confirm.go:100 +msgid "Ticket Reviewers: %s" +msgstr "Revisores do Ticket: %s" + +#. lang.T +#: pkg/handler/login_confirm.go:101 +msgid "Could copy website URL to notify reviewers: %s" +msgstr "Você pode copiar o endereço de revisão para notificar os revisores: %s" + +#. lang.T +#: pkg/handler/login_confirm.go:102 +msgid "Please waiting for the reviewers to confirm, enter q to exit. " +msgstr "Aguarde a confirmação dos revisores, digite q para sair." + +#. lang.T +#: pkg/handler/login_confirm.go:131 +msgid "Unknown status" +msgstr "Status desconhecido" + +#. lang.T +#: pkg/handler/login_confirm.go:135 +msgid "%s approved" +msgstr "%s aprovado" + +#. lang.T +#: pkg/handler/login_confirm.go:140 +msgid "%s rejected" +msgstr "%s rejeitado" + +#. lang.T +#: pkg/handler/login_confirm.go:144 +msgid "Cancel confirm" +msgstr "Cancelar confirmação" + +#. lang.T +#: pkg/handler/select_handler.go:201 +msgid "Search: %s" +msgstr "Buscar: %s" + +#. i18n.T +#: pkg/handler/server_ssh.go:222 +msgid "Must be unique asset for %s" +msgstr "Deve ser um ativo único para %s" + +#. i18n.T +#. i18n.T +#: pkg/handler/server_ssh.go:229 pkg/handler/server_ssh.go:251 +msgid "Must be unique account for %s" +msgstr "Deve ser uma conta única para %s" + +#. i18n.T +#: pkg/handler/server_ssh.go:259 +msgid "Must be auto login account for %s" +msgstr "Deve ser uma conta de login automático para %s" + +#. i18n.T +#. i18n.T +#: pkg/handler/server_ssh.go:680 pkg/handler/server_ssh.go:684 +msgid "No found asset" +msgstr "Nenhum ativo encontrado" + +#. i18n.T +#. i18n.T +#. i18n.T +#. lang.T +#: pkg/handler/server_ssh.go:713 pkg/handler/server_ssh.go:718 +#: pkg/handler/server_ssh.go:736 pkg/proxy/parser.go:230 +msgid "have no permission to upload file" +msgstr "Sem permissão para enviar arquivo" + +#. lang.T +#: pkg/proxy/parser.go:266 +msgid "" +"The command you executed is risky and an alert notification will be sent to " +"the administrator. Do you want to continue?[Y/N]" +msgstr "" +"O comando que você executou é arriscado e uma notificação de alerta será " +"enviada ao administrador. Deseja continuar?[Y/N]" + +#. lang.T +#: pkg/proxy/parser.go:283 +msgid "The command '%s' requires review. Continue or not [Y/n]?" +msgstr "O comando %s precisa de revisão, deseja continuar? [Y/N]" + +#. lang.T +#. lang.T +#. lang.T +#: pkg/proxy/parser.go:303 pkg/proxy/parser.go:310 pkg/proxy/parser.go:463 +msgid "Command `%s` is forbidden" +msgstr "O comando %s está proibido..." + +#. lang.T +#: pkg/proxy/parser.go:534 +msgid "have no permission to download file" +msgstr "Sem permissão para baixar arquivo" + +#. lang.T +#: pkg/proxy/parser.go:606 +msgid "" +"Please waiting for the reviewers to confirm command `%s`, cancel by CTRL+C " +"or CTRL+D." +msgstr "" +"Aguarde os revisores confirmarem o comando %s, cancele pressionando CTRL+C " +"ou CTRL+D." + +#. lang.T +#: pkg/proxy/parser.go:616 +msgid "" +"Need ticket confirm to execute command, already send email to the reviewers" +msgstr "" +"É necessário confirmar o bilhete para executar o comando, já enviamos um e-" +"mail aos revisores." + +#. lang.T +#. lang.T +#. lang.T +#. lang.T +#: pkg/proxy/parser.go:617 pkg/proxy/parser.go:618 pkg/proxy/server.go:58 +#: pkg/proxy/server.go:62 +msgid "" +"HandleTask does not support protocol %s, please use web terminal to access" +msgstr "" +"HandleTask não suporta o protocolo %s, por favor utilize o terminal web para " +"acessar." + +#. lang.T +#: pkg/proxy/server.go:70 +msgid "Account <%s> and asset <%s> protocol are inconsistent." +msgstr "A conta <%s> e o ativo <%s> apresentam um protocolo inconsistente." + +#. lang.T +#: pkg/proxy/server.go:102 +msgid "You don't have permission login %s" +msgstr "Você não tem permissão para fazer login em %s." + +#. lang.T +#: pkg/proxy/server.go:334 +msgid "You get auth token failed" +msgstr "Falha ao obter o token de autenticação." + +#. lang.T +#: pkg/proxy/server.go:345 +msgid "Get auth password failed" +msgstr "Falha ao obter a senha de autenticação." + +#. lang.T +#. lang.T +#: pkg/proxy/server.go:361 pkg/proxy/server.go:418 +msgid "Reuse SSH connections (%s@%s) [Number of connections: %d]" +msgstr "Reutilizando conexões SSH (%s@%s) [Número de conexões: %d]." + +#. lang.T +#: pkg/proxy/server.go:674 +msgid "Switched to %s" +msgstr "Trocado para %s." + +#. lang.T +#. lang.T +#: pkg/proxy/server.go:771 pkg/proxy/server.go:916 +msgid "Connect with api server failed" +msgstr "Falha ao conectar com o servidor API." + +#. lang.T +#: pkg/proxy/server.go:977 +msgid "Start domain gateway failed %s" +msgstr "Falha ao iniciar o gateway do domínio %s." + +#. lang.T +#. lang.T +#: pkg/proxy/server.go:985 pkg/proxy/server_options.go:108 +msgid "Manual" +msgstr "Manual" + +#. lang.T +#: pkg/proxy/server_options.go:110 +msgid "Dynamic" +msgstr "Dinâmico" + +#. lang.T +#: pkg/proxy/server_options.go:113 +msgid "Connecting to %s@%s" +msgstr "Conectando a %s@%s." + +#. lang.T +#: pkg/proxy/server_options.go:117 +msgid "Connecting to Database %s" +msgstr "Conectando ao banco de dados %s." + +#. lang.T +#: pkg/proxy/server_options.go:119 +msgid "Connecting to Kubernetes %s" +msgstr "Conectando ao Kubernetes %s." + +#. lang.T +#: pkg/proxy/server_options.go:121 +msgid "Connecting to Kubernetes %s container %s" +msgstr "Conectando ao contêiner %s do Kubernetes %s." + +#. lang.T +#: pkg/proxy/switch.go:328 +msgid "Session max time reached, disconnect" +msgstr "Tempo máximo da sessão alcançado, desconectando." + +#. lang.T +#. lang.T +#: pkg/proxy/switch.go:337 pkg/proxy/switch.go:344 +msgid "Permission has expired, disconnect" +msgstr "A permissão expirou, desconecte-se" + +#. lang.T +#: pkg/proxy/switch.go:354 +msgid "Terminated by admin %s" +msgstr "Conexão terminada pelo administrador %s" + +#. lang.T +#: pkg/proxy/tools.go:28 +msgid "Authentication failed" +msgstr "Falha na autenticação (nome de usuário ou senha incorretos)" + +#. lang.T +#: pkg/proxy/tools.go:31 +msgid "Connection refused" +msgstr "Rede indisponível (conexão recusada)" + +#. lang.T +#: pkg/proxy/tools.go:34 +msgid "i/o timeout" +msgstr "Rede indisponível (tempo limite de conexão)" + +#. lang.T +#: pkg/proxy/tools.go:37 +msgid "No route to host" +msgstr "Rede indisponível (roteamento indisponível)" + +#. lang.T +#: pkg/proxy/tools.go:40 +msgid "network is unreachable" +msgstr "Rede indisponível (rede inacessível)" + +#~ msgid "Chinese-English-Japanese switch" +#~ msgstr "alternância entre chinês-inglês-japonês" diff --git a/locale/zh_CN/LC_MESSAGES/koko.mo b/locale/zh/LC_MESSAGES/koko.mo similarity index 100% rename from locale/zh_CN/LC_MESSAGES/koko.mo rename to locale/zh/LC_MESSAGES/koko.mo diff --git a/locale/zh_CN/LC_MESSAGES/koko.po b/locale/zh/LC_MESSAGES/koko.po similarity index 82% rename from locale/zh_CN/LC_MESSAGES/koko.po rename to locale/zh/LC_MESSAGES/koko.po index b801c4b4..ff21a331 100644 --- a/locale/zh_CN/LC_MESSAGES/koko.po +++ b/locale/zh/LC_MESSAGES/koko.po @@ -184,8 +184,8 @@ msgstr "刷新最新的机器和节点信息" #. lang.T #: pkg/handler/banner.go:40 -msgid "Chinese-English-Japanese switch" -msgstr "中文-English-日本語语言切换" +msgid "language switch" +msgstr "语言切换" #. lang.T #: pkg/handler/banner.go:41 @@ -265,16 +265,35 @@ msgid "" "connect the asset." msgstr "该终端不支持人脸识别认证,请使用web终端登录" +#. lang.T +#. lang.T #. lang.T #. lang.T #. lang.T #: pkg/handler/direct_handler.go:460 pkg/handler/direct_handler.go:476 -#: pkg/handler/dispatch.go:139 +#: pkg/handler/dispatch.go:127 pkg/handler/dispatch.go:128 +#: pkg/handler/dispatch.go:153 +msgid "Tips: switch language by ID" +msgstr "提示:输入ID切换语言" + +#. lang.T +#. lang.T +#: pkg/handler/dispatch.go:154 pkg/handler/dispatch.go:180 +msgid "Invalid ID" +msgstr "无效ID" + +#. lang.T +#: pkg/handler/dispatch.go:186 +msgid "Switch language successfully" +msgstr "切换语言成功" + +#. lang.T +#: pkg/handler/dispatch.go:197 msgid "Node: [ ID.Name(Asset amount) ]" msgstr "节点:[ ID.名称(资产数量) ]" #. lang.T -#: pkg/handler/dispatch.go:141 +#: pkg/handler/dispatch.go:199 msgid "Tips: Enter g+NodeID to display the host under the node, such as g1" msgstr "提示:输入 g+节点ID 显示节点下主机,如: g1" @@ -601,113 +620,5 @@ msgstr "网络不通(路由不通)" msgid "network is unreachable" msgstr "网络不通(网络不可达)" -#, fuzzy -#~ msgid "Get auth username failed" -#~ msgstr "你获取认证令牌失败" - -#, fuzzy -#~ msgid "Protocols" -#~ msgstr "协议" - -#~ msgid "No found ssh protocol supported" -#~ msgstr "未支持 ssh 协议" - -#, fuzzy -#~ msgid "the database" -#~ msgstr "无数据库" - -#~ msgid "Cluster" -#~ msgstr "集群" - -#, fuzzy -#~ msgid "the kubernetes" -#~ msgstr "kubernetes" - -#~ msgid "the asset" -#~ msgstr "资产" - -#, fuzzy -#~ msgid "Tips: Enter system user ID and directly login" -#~ msgstr "提示:输入系统用户ID直接登录" - -#~ msgid "@INPUT" -#~ msgstr "手动用户" - -#~ msgid "@USER" -#~ msgstr "动态用户" - -#~ msgid "IP" -#~ msgstr "IP" - -#~ msgid "DBType" -#~ msgstr "数据库类型" - -#, fuzzy -#~ msgid "DB Name" -#~ msgstr "数据库名称" - -#~ msgid "No system user found." -#~ msgstr "没有系统用户" - -#~ msgid "validate Login confirm err: Core Api failed" -#~ msgstr "校验登录复核失败:Core API异常" - -#~ msgid "Must be unique system user for %s" -#~ msgstr "必须是唯一的系统用户 %s" - -#, fuzzy -#~ msgid "" -#~ "Enter ID number directly login the database, multiple search use // + " -#~ "field, such as: //16" -#~ msgstr "提示:输入数据库ID直接登录,二级搜索使用 // + 字段,如://192" - -#, fuzzy -#~ msgid "" -#~ "Enter ID number directly login the kubernetes, multiple search use // + " -#~ "field, such as: //16" -#~ msgstr "提示:输入Kubernetes的ID直接登录,二级搜索使用 // + 字段,如://192" - -#~ msgid "The asset is inactive" -#~ msgstr "该资产已禁用" - -#~ msgid "Command review is not currently supported" -#~ msgstr "此命令复核暂不支持" - -#~ msgid "Database %s protocol client not installed." -#~ msgstr "%s 协议的数据库客户端未安装" - -#, fuzzy -#~ msgid "System user <%s> and database <%s> protocol are inconsistent." -#~ msgstr "系统用户<%s>和资产<%s>协议不一致" - -#~ msgid "Create database session failed" -#~ msgstr "创建数据库会话失败" - -#~ msgid "Create DB domain gateway failed %s" -#~ msgstr "创建数据库网关失败%s" - -#, fuzzy -#~ msgid "System user <%s> and kubernetes <%s> protocol are inconsistent." -#~ msgstr "系统用户<%s>和kubernetes<%s>协议不一致" - -#, fuzzy -#~ msgid "Create k8s session failed" -#~ msgstr "创建Kubernetes会话失败" - -#, fuzzy -#~ msgid "Create k8s domain gateway failed %s" -#~ msgstr "创建Kubernetes网关失败%s" - -#~ msgid "Start k8s domain gateway failed %s" -#~ msgstr "启动kubernetes网关失败%s" - -#~ msgid "Connect asset %s error: %s" -#~ msgstr "连接资产 %s 发生错误:%s" - -#, fuzzy -#~ msgid "Database connect idle more than %d minutes, disconnect" -#~ msgstr "数据库连接空闲时间超过 %d 分钟,断开连接" - -#, fuzzy -#~ msgid "Database connection terminated by administrator" -#~ msgstr "管理员中断数据库连接" +#~ msgid "Chinese-English-Japanese switch" +#~ msgstr "中文-English-日本語语言切换" diff --git a/locale/zh_Hant/LC_MESSAGES/koko.po b/locale/zh_Hant/LC_MESSAGES/koko.po index 7612ef22..2b866d8e 100644 --- a/locale/zh_Hant/LC_MESSAGES/koko.po +++ b/locale/zh_Hant/LC_MESSAGES/koko.po @@ -184,8 +184,8 @@ msgstr "刷新最新的機器和節點資訊" #. lang.T #: pkg/handler/banner.go:40 -msgid "Chinese-English-Japanese switch" -msgstr "中文-English-日本語語言切換" +msgid "language switch" +msgstr "" #. lang.T #: pkg/handler/banner.go:41 @@ -265,16 +265,35 @@ msgid "" "connect the asset." msgstr "該終端不支持人臉識別認證,請使用網頁終端登錄" +#. lang.T +#. lang.T #. lang.T #. lang.T #. lang.T #: pkg/handler/direct_handler.go:460 pkg/handler/direct_handler.go:476 -#: pkg/handler/dispatch.go:139 +#: pkg/handler/dispatch.go:127 pkg/handler/dispatch.go:128 +#: pkg/handler/dispatch.go:153 +msgid "Tips: switch language by ID" +msgstr "提示:輸入ID切換語言" + +#. lang.T +#. lang.T +#: pkg/handler/dispatch.go:154 pkg/handler/dispatch.go:180 +msgid "Invalid ID" +msgstr "無效ID" + +#. lang.T +#: pkg/handler/dispatch.go:186 +msgid "Switch language successfully" +msgstr "切換語言成功" + +#. lang.T +#: pkg/handler/dispatch.go:197 msgid "Node: [ ID.Name(Asset amount) ]" msgstr "節點:[ ID.名稱(資產數量) ]" #. lang.T -#: pkg/handler/dispatch.go:141 +#: pkg/handler/dispatch.go:199 msgid "Tips: Enter g+NodeID to display the host under the node, such as g1" msgstr "提示:輸入 g+節點ID 顯示節點下主機,如: g1" @@ -599,115 +618,4 @@ msgstr "網路不通(路由不通)" #. lang.T #: pkg/proxy/tools.go:40 msgid "network is unreachable" -msgstr "網路不通(網路不可達)" - -#, fuzzy -#~ msgid "Get auth username failed" -#~ msgstr "你獲取認證令牌失敗" - -#, fuzzy -#~ msgid "Protocols" -#~ msgstr "協議" - -#~ msgid "No found ssh protocol supported" -#~ msgstr "未支持 ssh 協議" - -#, fuzzy -#~ msgid "the database" -#~ msgstr "無資料庫" - -#~ msgid "Cluster" -#~ msgstr "集群" - -#, fuzzy -#~ msgid "the kubernetes" -#~ msgstr "kubernetes" - -#~ msgid "the asset" -#~ msgstr "資產" - -#, fuzzy -#~ msgid "Tips: Enter system user ID and directly login" -#~ msgstr "提示:輸入系統用戶ID直接登入" - -#~ msgid "@INPUT" -#~ msgstr "手動用戶" - -#~ msgid "@USER" -#~ msgstr "動態用戶" - -#~ msgid "IP" -#~ msgstr "IP" - -#~ msgid "DBType" -#~ msgstr "資料庫類型" - -#, fuzzy -#~ msgid "DB Name" -#~ msgstr "資料庫名稱" - -#~ msgid "No system user found." -#~ msgstr "沒有系統用戶" - -#~ msgid "validate Login confirm err: Core Api failed" -#~ msgstr "校驗登入覆核失敗:Core API異常" - -#~ msgid "Must be unique system user for %s" -#~ msgstr "必須是唯一的系統用戶 %s" - -#, fuzzy -#~ msgid "" -#~ "Enter ID number directly login the database, multiple search use // + " -#~ "field, such as: //16" -#~ msgstr "提示:輸入資料庫ID直接登入,二級搜索使用 // + 欄位,如://192" - -#, fuzzy -#~ msgid "" -#~ "Enter ID number directly login the kubernetes, multiple search use // + " -#~ "field, such as: //16" -#~ msgstr "提示:輸入Kubernetes的ID直接登入,二級搜索使用 // + 欄位,如://192" - -#~ msgid "The asset is inactive" -#~ msgstr "該資產已禁用" - -#~ msgid "Command review is not currently supported" -#~ msgstr "此命令覆核暫不支持" - -#~ msgid "Database %s protocol client not installed." -#~ msgstr "%s 協議的資料庫用戶端未安裝" - -#, fuzzy -#~ msgid "System user <%s> and database <%s> protocol are inconsistent." -#~ msgstr "系統用戶<%s>和資產<%s>協議不一致" - -#~ msgid "Create database session failed" -#~ msgstr "創建資料庫會話失敗" - -#~ msgid "Create DB domain gateway failed %s" -#~ msgstr "創建資料庫網關失敗%s" - -#, fuzzy -#~ msgid "System user <%s> and kubernetes <%s> protocol are inconsistent." -#~ msgstr "系統用戶<%s>和kubernetes<%s>協議不一致" - -#, fuzzy -#~ msgid "Create k8s session failed" -#~ msgstr "創建Kubernetes會話失敗" - -#, fuzzy -#~ msgid "Create k8s domain gateway failed %s" -#~ msgstr "創建Kubernetes網關失敗%s" - -#~ msgid "Start k8s domain gateway failed %s" -#~ msgstr "啟動kubernetes網關失敗%s" - -#~ msgid "Connect asset %s error: %s" -#~ msgstr "連接資產 %s 發生錯誤:%s" - -#, fuzzy -#~ msgid "Database connect idle more than %d minutes, disconnect" -#~ msgstr "資料庫連接空閒時間超過 %d 分鐘,斷開連接" - -#, fuzzy -#~ msgid "Database connection terminated by administrator" -#~ msgstr "管理員中斷資料庫連接" +msgstr "網路不通(網路不可達)" \ No newline at end of file diff --git a/pkg/handler/banner.go b/pkg/handler/banner.go index 6aad1bd5..78647ed9 100644 --- a/pkg/handler/banner.go +++ b/pkg/handler/banner.go @@ -37,7 +37,7 @@ func (h *InteractiveHandler) displayBanner(sess io.ReadWriter, user string, term {instruct: "d", helpText: lang.T("display the databases that you have permission")}, {instruct: "k", helpText: lang.T("display the kubernetes that you have permission")}, {instruct: "r", helpText: lang.T("refresh your assets and nodes")}, - {instruct: "s", helpText: lang.T("Chinese-English-Japanese switch")}, + {instruct: "s", helpText: lang.T("language switch")}, {instruct: "?", helpText: lang.T("print help")}, {instruct: "q", helpText: lang.T("exit")}, } diff --git a/pkg/handler/dispatch.go b/pkg/handler/dispatch.go index 08f407d7..22bc2088 100644 --- a/pkg/handler/dispatch.go +++ b/pkg/handler/dispatch.go @@ -5,9 +5,11 @@ import ( "strconv" "strings" + "github.com/jumpserver/koko/pkg/common" "github.com/jumpserver/koko/pkg/i18n" "github.com/jumpserver/koko/pkg/jms-sdk-go/model" "github.com/jumpserver/koko/pkg/logger" + "github.com/jumpserver/koko/pkg/utils" ) func (h *InteractiveHandler) Dispatch() { @@ -120,13 +122,69 @@ func (h *InteractiveHandler) checkMaxIdleTime(checkChan <-chan bool) { func (h *InteractiveHandler) ChangeLang() { lang := i18n.NewLang(h.i18nLang) i18nLang := h.i18nLang - switch lang { - case i18n.EN: - i18nLang = i18n.ZH.String() - case i18n.ZH: - i18nLang = i18n.JA.String() - case i18n.JA: - i18nLang = i18n.EN.String() + allLangCodes := []i18n.LanguageCode{i18n.EN, i18n.ZH, i18n.ZHHant, i18n.JA, i18n.PtBr} + langs := []string{"English", "中文", "繁體中文", "日本語", "Português"} + idLabel := lang.T("ID") + nameLabel := lang.T("Name") + labels := []string{idLabel, nameLabel} + fields := []string{"ID", "Name"} + data := make([]map[string]string, len(langs)) + for i, j := range langs { + row := make(map[string]string) + row["ID"] = strconv.Itoa(i + 1) + row["Name"] = j + data[i] = row + } + w, _ := h.GetPtySize() + table := common.WrapperTable{ + Fields: fields, + Labels: labels, + FieldsSize: map[string][3]int{ + "ID": {0, 0, 5}, + "Name": {0, 8, 0}, + }, + Data: data, + TotalSize: w, + TruncPolicy: common.TruncMiddle, + } + table.Initial() + + h.term.SetPrompt("ID> ") + selectTip := lang.T("Tips: switch language by ID") + backTip := lang.T("Back: B/b") + for i := 0; i < 3; i++ { + utils.IgnoreErrWriteString(h.term, table.Display()) + utils.IgnoreErrWriteString(h.term, utils.WrapperString(selectTip, utils.Green)) + utils.IgnoreErrWriteString(h.term, utils.CharNewLine) + utils.IgnoreErrWriteString(h.term, utils.WrapperString(backTip, utils.Green)) + utils.IgnoreErrWriteString(h.term, utils.CharNewLine) + line, err := h.term.ReadLine() + if err != nil { + logger.Errorf("User %s switch language err %s", h.user.Name, err) + break + } + line = strings.TrimSpace(line) + switch strings.ToLower(line) { + case "q", "b", "quit", "exit", "back": + logger.Infof("User %s switch language exit", h.user.Name) + return + case "": + continue + } + if num, err2 := strconv.Atoi(line); err2 == nil { + if num > 0 && num <= len(allLangCodes) { + lang = allLangCodes[num-1] + i18nLang = lang.String() + break + } else { + utils.IgnoreErrWriteString(h.term, utils.WrapperString(lang.T("Invalid ID"), utils.Red)) + utils.IgnoreErrWriteString(h.term, utils.CharNewLine) + } + } + } + if i18nLang != h.i18nLang { + utils.IgnoreErrWriteString(h.term, utils.WrapperString(lang.T("Switch language successfully"), utils.Green)) + utils.IgnoreErrWriteString(h.term, utils.CharNewLine) } userLangGlobalStore.Store(h.user.ID, i18nLang) h.i18nLang = i18nLang diff --git a/pkg/i18n/i18n.go b/pkg/i18n/i18n.go index fb75dcde..a2cfe0cb 100644 --- a/pkg/i18n/i18n.go +++ b/pkg/i18n/i18n.go @@ -12,18 +12,13 @@ import ( func Initial() { cf := config.GetConf() localePath := path.Join(cf.RootPath, "locale") - if strings.HasPrefix(strings.ToLower(cf.LanguageCode), "en") { - gotext.Configure(localePath, "en_US", "koko") - } else if strings.HasPrefix(strings.ToLower(cf.LanguageCode), "ja") { - gotext.Configure(localePath, "ja_JP", "koko") - } else { - gotext.Configure(localePath, "zh_CN", "koko") - } + lowerCode := strings.ToLower(cf.LanguageCode) + gotext.Configure(localePath, lowerCode, "koko") setupLangMap(localePath) } func setupLangMap(localePath string) { - for _, code := range []LanguageCode{EN, ZH, JA} { + for _, code := range allLangCodes { enLocal := gotext.NewLocale(localePath, code.String()) enLocal.AddDomain("koko") langMap[code] = enLocal @@ -37,7 +32,10 @@ func NewLang(code string) LanguageCode { } else if strings.Contains(code, "ja") { return JA } - return ZH + if i18nCode, ok := i18nCodeMap[code]; ok { + return i18nCode + } + return EN } func T(s string) string { diff --git a/pkg/i18n/lang.go b/pkg/i18n/lang.go index ce491a2b..919e5cdc 100644 --- a/pkg/i18n/lang.go +++ b/pkg/i18n/lang.go @@ -5,15 +5,32 @@ import ( ) const ( - ZH LanguageCode = "zh_CN" - EN LanguageCode = "en_US" - JA LanguageCode = "ja_JP" + ZH LanguageCode = "zh" + EN LanguageCode = "en" + JA LanguageCode = "ja" + ZHHant LanguageCode = "zh_hant" + PtBr LanguageCode = "pt_br" ) var ( langMap = make(map[LanguageCode]*gotext.Locale) + + allLangCodes = []LanguageCode{ZH, EN, JA, ZHHant, PtBr} ) +var i18nCodeMap = map[string]LanguageCode{ + "zh": ZH, + "en": EN, + "ja": JA, + "pt-br": PtBr, + "pt_br": PtBr, + "pt": PtBr, + "zh-cn": ZH, + "zh-hans": ZH, + "zh-hant": ZHHant, + "zh_hant": ZHHant, +} + type LanguageCode string func (l LanguageCode) String() string { diff --git a/pkg/jms-sdk-go/service/jms_perm_node.go b/pkg/jms-sdk-go/service/jms_perm_node.go index 221e099d..f418b36f 100644 --- a/pkg/jms-sdk-go/service/jms_perm_node.go +++ b/pkg/jms-sdk-go/service/jms_perm_node.go @@ -2,6 +2,7 @@ package service import ( "fmt" + "github.com/jumpserver/koko/pkg/jms-sdk-go/model" ) diff --git a/utils/message.sh b/utils/message.sh index 679388ed..18c647a4 100755 --- a/utils/message.sh +++ b/utils/message.sh @@ -3,7 +3,7 @@ BASE_DIR=$(cd $(dirname $0);pwd) PROJECT_DIR=$(dirname ${BASE_DIR}) -LANG="zh_CN zh_Hant en_US ja_JP" +LANG="zh zh_Hant en ja pt_BR" DOMAIN=koko BIN=${PROJECT_DIR}/cmd/i18ntool/geni18n.go INPUT=pkg