From eb71f3ed8f261004fc6f277524d3db961068e2eb Mon Sep 17 00:00:00 2001 From: Ildar Kamalov Date: Thu, 3 Jan 2019 12:55:15 +0300 Subject: [PATCH] Added Traditional Chinese Closes #510 --- client/src/__locales/es.json | 30 +++++- client/src/__locales/ja.json | 12 ++- client/src/__locales/pt-br.json | 6 +- client/src/__locales/zh-tw.json | 157 +++++++++++++++++++++++++++++++ client/src/helpers/constants.js | 4 + client/src/i18n.js | 4 + i18n.go | 1 + scripts/translations/download.js | 12 ++- 8 files changed, 219 insertions(+), 7 deletions(-) create mode 100644 client/src/__locales/zh-tw.json diff --git a/client/src/__locales/es.json b/client/src/__locales/es.json index eca42d22..7d28100e 100644 --- a/client/src/__locales/es.json +++ b/client/src/__locales/es.json @@ -1,4 +1,30 @@ { + "check_dhcp_servers": "Compruebe si hay servidores DHCP", + "save_config": "Guardar config", + "enabled_dhcp": "Servidor DHCP habilitado", + "disabled_dhcp": "Servidor DHCP deshabilitado", + "dhcp_title": "Servidor DHCP", + "dhcp_description": "Si su enrutador no proporciona la configuraci\u00f3n DHCP, puede utilizar el propio servidor DHCP incorporado de AdGuard.", + "dhcp_enable": "Habilitar servidor DHCP", + "dhcp_disable": "Deshabilitar el servidor DHCP", + "dhcp_not_found": "No se han encontrado servidores DHCP activos en la red. Es seguro habilitar el servidor DHCP incorporado.", + "dhcp_found": "Se encontraron servidores DHCP activos encontrados en la red. No es seguro habilitar el servidor DHCP incorporado.", + "dhcp_leases": "concesi\u00f3nes DHCP", + "dhcp_leases_not_found": "No se encontraron concesi\u00f3nes DHCP", + "dhcp_config_saved": "Configuraci\u00f3n del servidor DHCP guardada", + "form_error_required": "Campo obligatorio", + "form_error_ip_format": "Formato IPv4 no v\u00e1lido", + "form_error_positive": "Debe ser mayor que 0", + "dhcp_form_gateway_input": "IP de acceso", + "dhcp_form_subnet_input": "M\u00e1scara de subred", + "dhcp_form_range_title": "Rango de direcciones IP", + "dhcp_form_range_start": "Inicio de rango", + "dhcp_form_range_end": "Final de rango", + "dhcp_form_lease_title": "Tiempo de concesi\u00f3n DHCP (en segundos)", + "dhcp_form_lease_input": "duraci\u00f3n de la concesi\u00f3n", + "dhcp_interface_select": "Seleccione la interfaz DHCP", + "dhcp_hardware_address": "Direcci\u00f3n de hardware", + "dhcp_ip_addresses": "Direcciones IP", "back": "Atr\u00e1s", "dashboard": "Tablero de rendimiento", "settings": "Ajustes", @@ -89,6 +115,7 @@ "example_upstream_regular": "DNS regular (a trav\u00e9s de UDP)", "example_upstream_dot": "encriptado DNS-a-trav\u00e9s-de-TLS<\/a>", "example_upstream_doh": "encriptado DNS-a-trav\u00e9s-de-TLS<\/a>", + "example_upstream_sdns": "puedes usar DNS Stamps<\/a> para DNSCrypt<\/a> o DNS-over-HTTPS<\/a> resolutores", "example_upstream_tcp": "DNS regular (a trav\u00e9s de TCP)", "all_filters_up_to_date_toast": "Todos los filtros son actualizados", "updated_upstream_dns_toast": "Servidores DNS upstream actualizados", @@ -125,5 +152,6 @@ "found_in_known_domain_db": "Encontrado en la base de datos de dominios conocidos.", "category_label": "Categor\u00eda", "rule_label": "Regla", - "filter_label": "Filtro" + "filter_label": "Filtro", + "unknown_filter": "Filtro desconocido {{filterId}}" } \ No newline at end of file diff --git a/client/src/__locales/ja.json b/client/src/__locales/ja.json index 5af7af43..2a04ab30 100644 --- a/client/src/__locales/ja.json +++ b/client/src/__locales/ja.json @@ -1,5 +1,5 @@ { - "refresh_status": "\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u6700\u65b0\u306b\u3059\u308b", + "check_dhcp_servers": "DHCP\u30b5\u30fc\u30d0\u3092\u30c1\u30a7\u30c3\u30af\u3059\u308b", "save_config": "\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3059\u308b", "enabled_dhcp": "DHCP\u30b5\u30fc\u30d0\u3092\u6709\u52b9\u306b\u3057\u307e\u3057\u305f", "disabled_dhcp": "DHCP\u30b5\u30fc\u30d0\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f", @@ -8,6 +8,7 @@ "dhcp_enable": "DHCP\u30b5\u30fc\u30d0\u3092\u6709\u52b9\u306b\u3059\u308b", "dhcp_disable": "DHCP\u30b5\u30fc\u30d0\u3092\u7121\u52b9\u306b\u3059\u308b", "dhcp_not_found": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306b\u52d5\u4f5c\u3057\u3066\u3044\u308bDHCP\u30b5\u30fc\u30d0\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u5185\u8535\u3055\u308c\u305fDHCP\u30b5\u30fc\u30d0\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u5b89\u5168\u3067\u3059\u3002", + "dhcp_found": "\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306b\u6d3b\u52d5\u4e2d\u306eDHCP\u30b5\u30fc\u30d0\u3092\u898b\u3064\u3051\u307e\u3057\u305f\u3002\u5185\u81d3\u3055\u308c\u305fDHCP\u30b5\u30fc\u30d0\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u5b89\u5168\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002", "dhcp_leases": "DHCP\u5272\u5f53", "dhcp_leases_not_found": "DHCP\u5272\u5f53\u306f\u3042\u308a\u307e\u305b\u3093", "dhcp_config_saved": "DHCP\u30b5\u30fc\u30d0\u306e\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3057\u307e\u3057\u305f", @@ -21,6 +22,9 @@ "dhcp_form_range_end": "\u7bc4\u56f2\u306e\u7d42\u4e86", "dhcp_form_lease_title": "DHCP\u5272\u5f53\u6642\u9593\uff08\u79d2\u5358\u4f4d\uff09", "dhcp_form_lease_input": "\u5272\u5f53\u671f\u9593", + "dhcp_interface_select": "DHCP\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u306e\u9078\u629e", + "dhcp_hardware_address": "MAC\u30a2\u30c9\u30ec\u30b9", + "dhcp_ip_addresses": "IP\u30a2\u30c9\u30ec\u30b9", "back": "\u623b\u308b", "dashboard": "\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9", "settings": "\u8a2d\u5b9a", @@ -40,7 +44,7 @@ "disabled_protection": "\u4fdd\u8b77\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f", "refresh_statics": "\u7d71\u8a08\u30c7\u30fc\u30bf\u3092\u6700\u65b0\u306b\u3059\u308b", "dns_query": "DNS\u30af\u30a8\u30ea", - "blocked_by": "\u30d5\u30a3\u30eb\u30bf\u306b\u3088\u308a\u30d6\u30ed\u30c3\u30af\u3055\u308c\u305fDNS\u30af\u30a8\u30ea", + "blocked_by": "\u30d5\u30a3\u30eb\u30bf\u306b\u30d6\u30ed\u30c3\u30af\u3055\u308c\u305fDNS\u30af\u30a8\u30ea", "stats_malware_phishing": "\u30d6\u30ed\u30c3\u30af\u3055\u308c\u305f\u30de\u30eb\u30a6\u30a7\u30a2\uff0f\u30d5\u30a3\u30c3\u30b7\u30f3\u30b0", "stats_adult": "\u30d6\u30ed\u30c3\u30af\u3055\u308c\u305f\u30a2\u30c0\u30eb\u30c8\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8", "stats_query_domain": "\u6700\u3082\u554f\u5408\u305b\u3055\u308c\u305f\u30c9\u30e1\u30a4\u30f3", @@ -118,7 +122,7 @@ "dns_test_ok_toast": "\u6307\u5b9a\u3055\u308c\u305fDNS\u30b5\u30fc\u30d0\u306f\u6b63\u3057\u304f\u52d5\u4f5c\u3057\u3066\u3044\u307e\u3059", "dns_test_not_ok_toast": "\u30b5\u30fc\u30d0 \"{{key}}\": \u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u6b63\u3057\u304f\u5165\u529b\u3055\u308c\u3066\u3044\u308b\u304b\u3069\u3046\u304b\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044", "unblock_btn": "\u30d6\u30ed\u30c3\u30af\u89e3\u9664", - "block_btn": "\u30d6\u30ed\u30c3\u30af", + "block_btn": "\u30d6\u30ed\u30c3\u30af\u3059\u308b", "time_table_header": "\u6642\u523b", "domain_name_table_header": "\u30c9\u30e1\u30a4\u30f3\u540d", "type_table_header": "\u7a2e\u985e", @@ -149,5 +153,5 @@ "category_label": "\u30ab\u30c6\u30b4\u30ea", "rule_label": "\u30eb\u30fc\u30eb", "filter_label": "\u30d5\u30a3\u30eb\u30bf", - "unknown_filter": "\u4e0d\u660e\u306a\u30d5\u30a3\u30eb\u30bf {{filterId}}" + "unknown_filter": "\u4e0d\u660e\u306a\u30d5\u30a3\u30eb\u30bf {{filterId}}" } \ No newline at end of file diff --git a/client/src/__locales/pt-br.json b/client/src/__locales/pt-br.json index 1467b370..3b2b041b 100644 --- a/client/src/__locales/pt-br.json +++ b/client/src/__locales/pt-br.json @@ -1,5 +1,5 @@ { - "refresh_status": "Atualizar status", + "check_dhcp_servers": "Verifique se h\u00e1 servidores DHCP", "save_config": "Salvar configura\u00e7\u00e3o", "enabled_dhcp": "Servidor DHCP ativado", "disabled_dhcp": "Servidor DHCP desativado", @@ -8,6 +8,7 @@ "dhcp_enable": "Ativar servidor DHCP", "dhcp_disable": "Desativar servidor DHCP", "dhcp_not_found": "Nenhum servidor DHCP ativo foi encontrado na sua rede. \u00c9 seguro ativar o servidor DHCP integrado.", + "dhcp_found": "Nenhum servidor DHCP ativo foi encontrado na sua rede. N\u00e3o \u00e9 seguro ativar o servidor DHCP integrado.", "dhcp_leases": "Concess\u00f5es DHCP", "dhcp_leases_not_found": "Nenhuma concess\u00e3o DHCP encontrada", "dhcp_config_saved": "Salvar configura\u00e7\u00f5es do servidor DHCP", @@ -21,6 +22,9 @@ "dhcp_form_range_end": "Final da faixa", "dhcp_form_lease_title": "Tempo de concess\u00e3o do DHCP (em segundos)", "dhcp_form_lease_input": "Dura\u00e7\u00e3o da concess\u00e3o", + "dhcp_interface_select": "Selecione a interface DHCP", + "dhcp_hardware_address": "Endere\u00e7o de hardware", + "dhcp_ip_addresses": "Endere\u00e7o de IP", "back": "Voltar", "dashboard": "Painel", "settings": "Configura\u00e7\u00f5es", diff --git a/client/src/__locales/zh-tw.json b/client/src/__locales/zh-tw.json new file mode 100644 index 00000000..b5d9560e --- /dev/null +++ b/client/src/__locales/zh-tw.json @@ -0,0 +1,157 @@ +{ + "check_dhcp_servers": "\u6aa2\u67e5\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668", + "save_config": "\u5132\u5b58\u914d\u7f6e", + "enabled_dhcp": "\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668\u5df2\u88ab\u555f\u7528", + "disabled_dhcp": "\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668\u5df2\u88ab\u7981\u7528", + "dhcp_title": "\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668", + "dhcp_description": "\u5982\u679c\u60a8\u7684\u8def\u7531\u5668\u672a\u63d0\u4f9b\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u8a2d\u5b9a\uff0c\u60a8\u53ef\u4f7f\u7528AdGuard\u81ea\u8eab\u5167\u5efa\u7684DHCP\u4f3a\u670d\u5668\u3002", + "dhcp_enable": "\u555f\u7528\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668", + "dhcp_disable": "\u7981\u7528\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668", + "dhcp_not_found": "\u65bc\u7db2\u8def\u4e0a\u7121\u5df2\u767c\u73fe\u4e4b\u6709\u6548\u7684\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668\u3002\u555f\u7528\u5167\u5efa\u7684DHCP\u4f3a\u670d\u5668\u70ba\u5b89\u5168\u7684\u3002", + "dhcp_found": "\u65bc\u7db2\u8def\u4e0a\u5df2\u767c\u73fe\u4e4b\u6709\u6548\u7684\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668\u3002\u555f\u7528\u5167\u5efa\u7684DHCP\u4f3a\u670d\u5668\u70ba\u4e0d\u5b89\u5168\u7684\u3002", + "dhcp_leases": "\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u79df\u8cc3", + "dhcp_leases_not_found": "\u7121\u5df2\u767c\u73fe\u4e4b\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u79df\u8cc3", + "dhcp_config_saved": "\u5df2\u5132\u5b58\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4f3a\u670d\u5668\u914d\u7f6e", + "form_error_required": "\u5fc5\u586b\u7684\u6b04\u4f4d", + "form_error_ip_format": "\u7121\u6548\u7684IPv4\u683c\u5f0f", + "form_error_positive": "\u5fc5\u9808\u5927\u65bc0", + "dhcp_form_gateway_input": "\u9598\u9053 IP", + "dhcp_form_subnet_input": "\u5b50\u7db2\u8def\u906e\u7f69", + "dhcp_form_range_title": "IP\u4f4d\u5740\u7bc4\u570d", + "dhcp_form_range_start": "\u7bc4\u570d\u958b\u59cb", + "dhcp_form_range_end": "\u7bc4\u570d\u7d50\u675f", + "dhcp_form_lease_title": "\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u79df\u8cc3\u6642\u9593\uff08\u4ee5\u79d2\u6578\uff09", + "dhcp_form_lease_input": "\u79df\u8cc3\u6301\u7e8c\u6642\u9593", + "dhcp_interface_select": "\u9078\u64c7\u52d5\u614b\u4e3b\u6a5f\u8a2d\u5b9a\u5354\u5b9a\uff08DHCP\uff09\u4ecb\u9762", + "dhcp_hardware_address": "\u786c\u9ad4\u4f4d\u5740", + "dhcp_ip_addresses": "IP \u4f4d\u5740", + "back": "\u8fd4\u56de", + "dashboard": "\u5100\u8868\u677f", + "settings": "\u8a2d\u5b9a", + "filters": "\u904e\u6ffe\u5668", + "query_log": "\u67e5\u8a62\u8a18\u9304", + "faq": "\u5e38\u898b\u554f\u7b54\u96c6", + "version": "\u7248\u672c", + "address": "\u4f4d\u5740", + "on": "\u958b\u555f", + "off": "\u95dc\u9589", + "copyright": "\u7248\u6b0a", + "homepage": "\u9996\u9801", + "report_an_issue": "\u5831\u544a\u554f\u984c", + "enable_protection": "\u555f\u7528\u9632\u8b77", + "enabled_protection": "\u5df2\u555f\u7528\u9632\u8b77", + "disable_protection": "\u7981\u7528\u9632\u8b77", + "disabled_protection": "\u5df2\u7981\u7528\u9632\u8b77", + "refresh_statics": "\u91cd\u65b0\u6574\u7406\u7d71\u8a08\u8cc7\u6599", + "dns_query": "DNS \u67e5\u8a62", + "blocked_by": "\u5df2\u88ab\u904e\u6ffe\u5668\u5c01\u9396", + "stats_malware_phishing": "\u5df2\u5c01\u9396\u7684\u60e1\u610f\u8edf\u9ad4\/\u7db2\u8def\u91e3\u9b5a", + "stats_adult": "\u5df2\u5c01\u9396\u7684\u6210\u4eba\u7db2\u7ad9", + "stats_query_domain": "\u71b1\u9580\u5df2\u67e5\u8a62\u7684\u7db2\u57df", + "for_last_24_hours": "\u5728\u6700\u8fd1\u768424\u5c0f\u6642\u5167", + "no_domains_found": "\u7121\u5df2\u767c\u73fe\u4e4b\u7db2\u57df", + "requests_count": "\u8acb\u6c42\u7e3d\u6578", + "top_blocked_domains": "\u71b1\u9580\u5df2\u5c01\u9396\u7684\u7db2\u57df", + "top_clients": "\u71b1\u9580\u7528\u6236\u7aef", + "no_clients_found": "\u7121\u5df2\u767c\u73fe\u4e4b\u7528\u6236\u7aef", + "general_statistics": "\u4e00\u822c\u7684\u7d71\u8a08\u8cc7\u6599", + "number_of_dns_query_24_hours": "\u5728\u6700\u8fd1\u768424 \u5c0f\u6642\u5167\u5df2\u8655\u7406\u7684DNS\u67e5\u8a62\u4e4b\u6578\u91cf", + "number_of_dns_query_blocked_24_hours": "\u5df2\u88ab\u5ee3\u544a\u5c01\u9396\u904e\u6ffe\u5668\u548c\u4e3b\u6a5f\u5c01\u9396\u6e05\u55ae\u5c01\u9396\u7684DNS\u8acb\u6c42\u4e4b\u6578\u91cf", + "number_of_dns_query_blocked_24_hours_by_sec": "\u5df2\u88abAdGuard\u700f\u89bd\u5b89\u5168\u6a21\u7d44\u5c01\u9396\u7684DNS\u8acb\u6c42\u4e4b\u6578\u91cf", + "number_of_dns_query_blocked_24_hours_adult": "\u5df2\u5c01\u9396\u7684\u6210\u4eba\u7db2\u7ad9\u4e4b\u6578\u91cf", + "enforced_save_search": "\u5df2\u5f37\u5236\u57f7\u884c\u7684\u5b89\u5168\u641c\u5c0b", + "number_of_dns_query_to_safe_search": "\u5c0d\u65bc\u90a3\u4e9b\u5b89\u5168\u641c\u5c0b\u5df2\u88ab\u5f37\u5236\u57f7\u884c\u4e4b\u5c6c\u65bc\u641c\u5c0b\u5f15\u64ce\u7684DNS\u8acb\u6c42\u4e4b\u6578\u91cf", + "average_processing_time": "\u5e73\u5747\u7684\u8655\u7406\u6642\u9593", + "average_processing_time_hint": "\u65bc\u8655\u7406\u4e00\u9805DNS\u8acb\u6c42\u4e0a\u4ee5\u6beb\u79d2\uff08ms\uff09\u8a08\u4e4b\u5e73\u5747\u7684\u6642\u9593", + "block_domain_use_filters_and_hosts": "\u900f\u904e\u904e\u6ffe\u5668\u548c\u4e3b\u6a5f\u6a94\u6848\u5c01\u9396\u7db2\u57df", + "filters_block_toggle_hint": "\u60a8\u53ef\u5728\u904e\u6ffe\u5668<\/a>\u8a2d\u5b9a\u4e2d\u8a2d\u7f6e\u5c01\u9396\u898f\u5247\u3002", + "use_adguard_browsing_sec": "\u4f7f\u7528AdGuard\u700f\u89bd\u5b89\u5168\u7db2\u8def\u670d\u52d9", + "use_adguard_browsing_sec_hint": "AdGuard Home\u5c07\u6aa2\u67e5\u7db2\u57df\u662f\u5426\u88ab\u700f\u89bd\u5b89\u5168\u7db2\u8def\u670d\u52d9\u5217\u5165\u9ed1\u540d\u55ae\u3002\u5b83\u5c07\u4f7f\u7528\u53cb\u597d\u7684\u96b1\u79c1\u67e5\u627e\u61c9\u7528\u7a0b\u5f0f\u4ecb\u9762\uff08API\uff09\u4ee5\u57f7\u884c\u6aa2\u67e5\uff1a\u50c5\u57df\u540dSHA256\u96dc\u6e4a\u7684\u77ed\u524d\u7db4\u88ab\u50b3\u9001\u5230\u4f3a\u670d\u5668\u3002", + "use_adguard_parental": "\u4f7f\u7528AdGuard\u5bb6\u9577\u76e3\u63a7\u4e4b\u7db2\u8def\u670d\u52d9", + "use_adguard_parental_hint": "AdGuard Home\u5c07\u6aa2\u67e5\u7db2\u57df\u662f\u5426\u5305\u542b\u6210\u4eba\u8cc7\u6599\u3002\u5b83\u4f7f\u7528\u5982\u540c\u700f\u89bd\u5b89\u5168\u7db2\u8def\u670d\u52d9\u4e00\u6a23\u4e4b\u53cb\u597d\u7684\u96b1\u79c1\u61c9\u7528\u7a0b\u5f0f\u4ecb\u9762\uff08API\uff09\u3002", + "enforce_safe_search": "\u5f37\u5236\u57f7\u884c\u5b89\u5168\u641c\u5c0b", + "enforce_save_search_hint": "AdGuard Home\u53ef\u5728\u4ee5\u4e0b\u7684\u641c\u5c0b\u5f15\u64ce\uff1aGoogle\u3001YouTube\u3001Bing\u548cYandex\u4e2d\u5f37\u5236\u57f7\u884c\u5b89\u5168\u641c\u5c0b\u3002", + "no_servers_specified": "\u7121\u5df2\u660e\u78ba\u6307\u5b9a\u7684\u4f3a\u670d\u5668", + "no_settings": "\u7121\u8a2d\u5b9a", + "general_settings": "\u4e00\u822c\u7684\u8a2d\u5b9a", + "upstream_dns": "\u4e0a\u6e38\u7684DNS\u4f3a\u670d\u5668", + "upstream_dns_hint": "\u5982\u679c\u60a8\u4fdd\u7559\u8a72\u6b04\u4f4d\u7a7a\u767d\u7684\uff0cAdGuard Home\u5c07\u4f7f\u7528Cloudflare DNS<\/a>\u4f5c\u70ba\u4e0a\u6e38\u3002\u5c0d\u65bcDNS over TLS\u4f3a\u670d\u5668\u4f7f\u7528 tls:\/\/ \u524d\u7db4\u3002", + "test_upstream_btn": "\u6e2c\u8a66\u4e0a\u884c\u8cc7\u6599\u6d41", + "apply_btn": "\u5957\u7528", + "disabled_filtering_toast": "\u5df2\u7981\u7528\u904e\u6ffe", + "enabled_filtering_toast": "\u5df2\u555f\u7528\u904e\u6ffe", + "disabled_safe_browsing_toast": "\u5df2\u7981\u7528\u5b89\u5168\u700f\u89bd", + "enabled_safe_browsing_toast": "\u5df2\u555f\u7528\u5b89\u5168\u700f\u89bd", + "disabled_parental_toast": "\u5df2\u7981\u7528\u5bb6\u9577\u76e3\u63a7", + "enabled_parental_toast": "\u5df2\u555f\u7528\u5bb6\u9577\u76e3\u63a7", + "disabled_safe_search_toast": "\u5df2\u7981\u7528\u5b89\u5168\u641c\u5c0b", + "enabled_save_search_toast": "\u5df2\u555f\u7528\u5b89\u5168\u641c\u5c0b", + "enabled_table_header": "\u5df2\u555f\u7528\u7684", + "name_table_header": "\u540d\u7a31", + "filter_url_table_header": "\u904e\u6ffe\u5668\u7db2\u5740", + "rules_count_table_header": "\u898f\u5247\u7e3d\u6578", + "last_time_updated_table_header": "\u6700\u8fd1\u7684\u66f4\u65b0\u6642\u9593", + "actions_table_header": "\u884c\u52d5", + "delete_table_action": "\u522a\u9664", + "filters_and_hosts": "\u904e\u6ffe\u5668\u548c\u4e3b\u6a5f\u5c01\u9396\u6e05\u55ae", + "filters_and_hosts_hint": "AdGuard Home\u61c2\u5f97\u57fa\u672c\u7684\u5ee3\u544a\u5c01\u9396\u898f\u5247\u548c\u4e3b\u6a5f\u6a94\u6848\u8a9e\u6cd5\u3002", + "no_filters_added": "\u7121\u5df2\u52a0\u5165\u7684\u904e\u6ffe\u5668", + "add_filter_btn": "\u589e\u52a0\u904e\u6ffe\u5668", + "cancel_btn": "\u53d6\u6d88", + "enter_name_hint": "\u8f38\u5165\u540d\u7a31", + "enter_url_hint": "\u8f38\u5165\u7db2\u5740", + "check_updates_btn": "\u6aa2\u67e5\u66f4\u65b0", + "new_filter_btn": "\u65b0\u7684\u904e\u6ffe\u5668\u8a02\u95b1", + "enter_valid_filter_url": "\u8f38\u5165\u95dc\u65bc\u904e\u6ffe\u5668\u8a02\u95b1\u6216\u4e3b\u6a5f\u6a94\u6848\u4e4b\u6709\u6548\u7684\u7db2\u5740\u3002", + "custom_filter_rules": "\u81ea\u8a02\u7684\u904e\u6ffe\u898f\u5247", + "custom_filter_rules_hint": "\u65bc\u4e00\u884c\u4e0a\u8f38\u5165\u4e00\u500b\u898f\u5247\u3002\u60a8\u53ef\u4f7f\u7528\u5ee3\u544a\u5c01\u9396\u898f\u5247\u6216\u4e3b\u6a5f\u6a94\u6848\u8a9e\u6cd5\u3002", + "examples_title": "\u7bc4\u4f8b", + "example_meaning_filter_block": "\u5c01\u9396\u81f3example.org\u7db2\u57df\u53ca\u5176\u6240\u6709\u7684\u5b50\u7db2\u57df\u4e4b\u5b58\u53d6", + "example_meaning_filter_whitelist": "\u89e3\u9664\u5c01\u9396\u81f3example.org\u7db2\u57df\u53ca\u5176\u6240\u6709\u7684\u5b50\u7db2\u57df\u4e4b\u5b58\u53d6", + "example_meaning_host_block": "AdGuard Home\u73fe\u5728\u5c07\u5c0dexample.org\u7db2\u57df\u8fd4\u56de127.0.0.1\u4f4d\u5740\uff08\u4f46\u975e\u5176\u5b50\u7db2\u57df\uff09\u3002", + "example_comment": "! \u770b\uff0c\u4e00\u500b\u8a3b\u89e3", + "example_comment_meaning": "\u53ea\u662f\u4e00\u500b\u8a3b\u89e3", + "example_comment_hash": "# \u4e5f\u662f\u4e00\u500b\u8a3b\u89e3", + "example_upstream_regular": "\u4e00\u822c\u7684 DNS\uff08\u900f\u904eUDP\uff09", + "example_upstream_dot": "\u52a0\u5bc6\u7684 DNS-over-TLS<\/a>", + "example_upstream_doh": "\u52a0\u5bc6\u7684 DNS-over-HTTPS <\/a>", + "example_upstream_sdns": "\u60a8\u53ef\u4f7f\u7528\u5c0d\u65bc DNSCrypt<\/a> \u6216 DNS-over-HTTPS<\/a> \u89e3\u6790\u5668\u4e4b DNS \u6233\u8a18<\/a>", + "example_upstream_tcp": "\u4e00\u822c\u7684 DNS\uff08\u900f\u904eTCP\uff09", + "all_filters_up_to_date_toast": "\u6240\u6709\u7684\u904e\u6ffe\u5668\u5df2\u662f\u6700\u65b0\u7684", + "updated_upstream_dns_toast": "\u5df2\u66f4\u65b0\u4e0a\u6e38\u7684DNS\u4f3a\u670d\u5668", + "dns_test_ok_toast": "\u660e\u78ba\u6307\u5b9a\u7684DNS\u4f3a\u670d\u5668\u6b63\u78ba\u5730\u904b\u4f5c\u4e2d", + "dns_test_not_ok_toast": "\u4f3a\u670d\u5668 \"{{key}}\"\uff1a\u7121\u6cd5\u88ab\u4f7f\u7528\uff0c\u8acb\u6aa2\u67e5\u60a8\u5df2\u6b63\u78ba\u5730\u586b\u5beb\u5b83", + "unblock_btn": "\u89e3\u9664\u5c01\u9396", + "block_btn": "\u5c01\u9396", + "time_table_header": "\u6642\u9593", + "domain_name_table_header": "\u57df\u540d", + "type_table_header": "\u985e\u578b", + "response_table_header": "\u53cd\u61c9", + "client_table_header": "\u7528\u6236\u7aef", + "empty_response_status": "\u7a7a\u767d\u7684", + "show_all_filter_type": "\u986f\u793a\u6240\u6709", + "show_filtered_type": "\u986f\u793a\u5df2\u904e\u6ffe\u7684", + "no_logs_found": "\u7121\u5df2\u767c\u73fe\u4e4b\u8a18\u9304", + "disabled_log_btn": "\u7981\u7528\u8a18\u9304", + "download_log_file_btn": "\u4e0b\u8f09\u8a18\u9304\u6a94\u6848", + "refresh_btn": "\u91cd\u65b0\u6574\u7406", + "enabled_log_btn": "\u555f\u7528\u8a18\u9304", + "last_dns_queries": "\u6700\u8fd1\u76845000\u7b46DNS\u67e5\u8a62", + "previous_btn": "\u4e0a\u4e00\u9801", + "next_btn": "\u4e0b\u4e00\u9801", + "loading_table_status": "\u6b63\u5728\u8f09\u5165...", + "page_table_footer_text": "\u9801\u9762", + "of_table_footer_text": "\u4e4b", + "rows_table_footer_text": "\u5217", + "updated_custom_filtering_toast": "\u5df2\u66f4\u65b0\u81ea\u8a02\u7684\u904e\u6ffe\u898f\u5247", + "rule_removed_from_custom_filtering_toast": "\u898f\u5247\u5df2\u5f9e\u81ea\u8a02\u7684\u904e\u6ffe\u898f\u5247\u4e2d\u88ab\u79fb\u9664", + "rule_added_to_custom_filtering_toast": "\u898f\u5247\u5df2\u5f9e\u81ea\u8a02\u7684\u904e\u6ffe\u898f\u5247\u4e2d\u88ab\u52a0\u5165", + "query_log_disabled_toast": "\u67e5\u8a62\u8a18\u9304\u5df2\u88ab\u7981\u7528", + "query_log_enabled_toast": "\u67e5\u8a62\u8a18\u9304\u5df2\u88ab\u555f\u7528", + "source_label": "\u4f86\u6e90", + "found_in_known_domain_db": "\u5728\u5df2\u77e5\u7684\u57df\u540d\u8cc7\u6599\u5eab\u4e2d\u88ab\u767c\u73fe\u3002", + "category_label": "\u985e\u5225", + "rule_label": "\u898f\u5247", + "filter_label": "\u904e\u6ffe\u5668", + "unknown_filter": "\u672a\u77e5\u7684\u904e\u6ffe\u5668 {{filterId}}" +} \ No newline at end of file diff --git a/client/src/helpers/constants.js b/client/src/helpers/constants.js index f0b2aea7..fb7bbe64 100644 --- a/client/src/helpers/constants.js +++ b/client/src/helpers/constants.js @@ -55,4 +55,8 @@ export const LANGUAGES = [ key: 'ja', name: '日本語', }, + { + key: 'zh-tw', + name: '正體中文', + }, ]; diff --git a/client/src/i18n.js b/client/src/i18n.js index bd5f3832..27585b29 100644 --- a/client/src/i18n.js +++ b/client/src/i18n.js @@ -11,6 +11,7 @@ import fr from './__locales/fr.json'; import ja from './__locales/ja.json'; import sv from './__locales/sv.json'; import ptBR from './__locales/pt-br.json'; +import zhTW from './__locales/zh-tw.json'; const resources = { en: { @@ -37,6 +38,9 @@ const resources = { 'pt-BR': { translation: ptBR, }, + 'zh-TW': { + translation: zhTW, + }, }; i18n diff --git a/i18n.go b/i18n.go index 5b8ad62f..a69edf4e 100644 --- a/i18n.go +++ b/i18n.go @@ -21,6 +21,7 @@ var allowedLanguages = map[string]bool{ "ja": true, "sv": true, "pt-br": true, + "zh-tw": true, } func isLanguageAllowed(language string) bool { diff --git a/scripts/translations/download.js b/scripts/translations/download.js index 4afd06a4..9c786c6d 100644 --- a/scripts/translations/download.js +++ b/scripts/translations/download.js @@ -4,7 +4,17 @@ const crypto = require('crypto'); const requestPromise = require('request-promise'); const LOCALES_DIR = '../../client/src/__locales'; -const LOCALES_LIST = ['en', 'ru', 'vi', 'es', 'fr', 'ja', 'sv', 'pt-br']; +const LOCALES_LIST = [ + 'en', + 'ru', + 'vi', + 'es', + 'fr', + 'ja', + 'sv', + 'pt-br', + 'zh-tw', +]; /** * Hash content