diff --git a/handlers/i18n.go b/handlers/i18n.go
index db519e24..5cd48d1e 100644
--- a/handlers/i18n.go
+++ b/handlers/i18n.go
@@ -8,6 +8,7 @@ import (
"fmt"
"io/fs"
"net/http"
+ "slices"
"strings"
"time"
@@ -17,10 +18,13 @@ import (
"zgo.at/goatcounter/v2"
"zgo.at/guru"
"zgo.at/z18n/msgfile"
+ "zgo.at/zdb"
"zgo.at/zhttp"
+ "zgo.at/zhttp/mware"
"zgo.at/zlog"
"zgo.at/zstd/zfilepath"
"zgo.at/zstd/zfs"
+ "zgo.at/zstd/ztest"
)
type i18n struct {
@@ -42,6 +46,49 @@ func (h i18n) mount(r chi.Router) {
r.Post("/i18n", zhttp.Wrap(h.new))
r.Post("/i18n/set/{file}", zhttp.Wrap(h.set))
r.Post("/i18n/submit/{file}", zhttp.Wrap(h.submit))
+
+ a := r.With(mware.RequestLog(nil), requireAccess(goatcounter.AccessSuperuser))
+ a.Get("/i18n/manage", zhttp.Wrap(h.manage))
+}
+
+func (h i18n) manage(w http.ResponseWriter, r *http.Request) error {
+ var str []string
+ err := zdb.Select(r.Context(), &str, `select value from store where key like 'i18n-%'`)
+ if err != nil {
+ return err
+ }
+
+ all := make(goatcounter.OverrideTranslations, 0, len(str))
+ for _, a := range str {
+ var aa goatcounter.OverrideTranslations
+ err := aa.Decode(a)
+ if err != nil {
+ return err
+ }
+
+ for i, d := range aa {
+ t, err := d.File.TOML()
+ if err != nil {
+ return err
+ }
+ file, err := fs.ReadFile(goatcounter.Translations(r.Context()), d.Name)
+ aa[i].Diff = ztest.Diff(string(file), t)
+ if err != nil {
+ aa[i].Diff = fmt.Sprintf("%q doesn't exist", "i18n/"+d.Name)
+ }
+ aa[i].Diff = strings.ReplaceAll(aa[i].Diff, "-have ", "-cur ")
+ aa[i].Diff = strings.ReplaceAll(aa[i].Diff, "+want ", "+new ")
+ }
+
+ all = append(all, aa...)
+ }
+ slices.SortFunc(all, func(a, b goatcounter.OverrideTranslation) int { return strings.Compare(b.Updated, a.Updated) })
+ slices.SortFunc(all, func(a, b goatcounter.OverrideTranslation) int { return strings.Compare(a.Name, b.Name) })
+
+ return zhttp.Template(w, "i18n_manage.gohtml", struct {
+ Globals
+ Files goatcounter.OverrideTranslations
+ }{newGlobals(w, r), all})
}
func (h i18n) list(w http.ResponseWriter, r *http.Request) error {
diff --git a/i18n.go b/i18n.go
index 68d369b9..e431f644 100644
--- a/i18n.go
+++ b/i18n.go
@@ -94,6 +94,7 @@ type OverrideTranslation struct {
Name string `json:"name"`
Updated string `json:"updated"`
File msgfile.File `json:"file"`
+ Diff string `json:"diff"`
}
type OverrideTranslations []OverrideTranslation
@@ -122,7 +123,7 @@ func (o OverrideTranslations) encode() (string, error) {
return string(j), err
}
-func (o *OverrideTranslations) decode(data string) error {
+func (o *OverrideTranslations) Decode(data string) error {
var w wrap
err := json.Unmarshal([]byte(data), &w)
if err != nil {
@@ -148,7 +149,6 @@ func (o *OverrideTranslations) decode(data string) error {
return nil
}
-// Insert new.
func (o *OverrideTranslations) Insert(ctx context.Context) error {
t, err := o.encode()
if err != nil {
@@ -195,7 +195,7 @@ func (o *OverrideTranslations) Get(ctx context.Context, insert bool) error {
return errors.Wrap(err, "OverrideTranslations.Get")
}
- err = o.decode(string(data))
+ err = o.Decode(string(data))
if err != nil {
return errors.Wrap(err, "OverrideTranslations.List")
}
diff --git a/i18n/de-DE.toml b/i18n/de-DE.toml
index ea0b4b2a..d5587338 100644
--- a/i18n/de-DE.toml
+++ b/i18n/de-DE.toml
@@ -26,7 +26,7 @@
default = "löschen"
["button/delete-account"]
- default = "Konto, alle Websites, alle Daten löschen"
+ default = "Konto, alle Websites und alle Daten löschen"
["button/delete-all"]
default = "Ja, wirklich alles löschen!"
diff --git a/i18n/fr-FR.toml b/i18n/fr-FR.toml
index e1102191..a5bb581b 100644
--- a/i18n/fr-FR.toml
+++ b/i18n/fr-FR.toml
@@ -178,6 +178,9 @@
["data-collect/help/size"]
default = "Taille écran"
+["data-collect/help/user-agent"]
+ default = 'En-tête "User-Agent" pour obtenir le nom et la version du navigateur et du système.'
+
["data-collect/label/country"]
default = "Pays"
@@ -393,6 +396,7 @@ Martin
default = "Pays"
["header/locations-for"]
+ default = "Emplacements pour: %(country)"
["header/mfa"]
default = "Authentification multi-facteur"
@@ -407,6 +411,7 @@ Martin
default = "Nouveau"
["header/pagination-cursor"]
+ default = "Curseur de pagination"
["header/passwd-mfa"]
default = "Mot de passe & MFA"
@@ -459,7 +464,7 @@ Martin
default = "Token"
["header/toprefs"]
- default = "Principaux referrers"
+ default = "Principaux referers"
["header/tracking"]
default = "Suivi"
@@ -811,7 +816,7 @@ Nécessite un plan Personal Plus ou Business (vous êtes sur le plan \\"%(plan)\
default = "Code source"
["nav-dash/back"]
- default = "avant"
+ default = "reculer"
["nav-dash/by-day"]
default = "Vue par jour"
@@ -835,7 +840,7 @@ Nécessite un plan Personal Plus ou Business (vous êtes sur le plan \\"%(plan)\
default = "Impossible d'utiliser la vue horaire pour une période de plus de 90 jours"
["nav-dash/forward"]
- default = "après"
+ default = "avancer"
["nav-dash/half-year"]
default = "semestre"
@@ -934,7 +939,7 @@ Nécessite un plan Personal Plus ou Business (vous êtes sur le plan \\"%(plan)\
default = "Site ‘%(url)’ supprimé."
["notify/started-background-process"]
- default = "Démarrage en arrière-plan ; le traitement complet peut prendre de 10 à 20 secondes."
+ default = "Démarré en arrière-plan. Le traitement peut prendre 10-20 secondes avant de terminer."
["notify/user-added"]
default = "Utilisateur ‘%(email)’ ajouté."
@@ -956,7 +961,7 @@ Nécessite un plan Personal Plus ou Business (vous êtes sur le plan \\"%(plan)\
default = "Autres erreurs"
["p/api-intro"]
- default = "GoatCounter est livré avec une API limitée ; actuellement, vous pouvez compter les pages vues à partir de l'API, créer, supprimer et modifier des sites, et créer des exportations."
+ default = "GoatCounter inclut un API limité. Présentement, vous pouvez l'utiliser pour compter les pages vues, pour créer, supprimer et éditer vos sites, et pour exporter des données."
["p/change-code-request"]
diff --git a/i18n/pl-PL.toml b/i18n/pl-PL.toml
index be89c2e6..3f45f1df 100644
--- a/i18n/pl-PL.toml
+++ b/i18n/pl-PL.toml
@@ -86,7 +86,7 @@
default = "Zatwierdź"
["confirm/delete-user"]
- default = "Usuń %(email)?"
+ default = "Usunąć %(email)?"
["dashboard/day-ago"]
default = "%(n) dni temu"
@@ -170,14 +170,17 @@
default = "Nagłówek Referer i parametr kampanii"
["data-collect/help/region"]
- default = "Region, na przykład Texas, Bali, itd. Szczegóły różnią się w zależności od kraju."
+ default = "Region, na przykład Texas, Bali, itd. Poziom szczegółowości różnią się w zależności od kraju."
["data-collect/help/sessions"]
- default = "Śledź pojedynczych odwiedzających do 8 godzin; jeśli wyłączysz tę funkcję, to ktoś wciskając np. F5, aby ponownie załadować stronę, zostanie policzony jako 2 odsłony zamiast 1"
+ default = "Grupuj odsłony pojedynczego odwiedzającego na przestrzeni 8 godzin; jeśli wyłączysz tę funkcję, to ktoś wciskając np. F5, aby ponownie załadować stronę, zostanie policzony jako 2 odsłony zamiast 1"
["data-collect/help/size"]
default = "Rozmiar ekranu."
+["data-collect/help/user-agent"]
+ default = "Nagłówek User-Agent do zapisywania nazwy i wersji przeglądarki oraz systemu."
+
["data-collect/label/country"]
default = "Kraj"
@@ -342,7 +345,7 @@ Martin
default = "Pulpit"
["header/data-collection"]
- default = "Zbieranie danych"
+ default = "Zbierane dane"
["header/delete-account"]
default = "Usuń konto"
@@ -393,7 +396,7 @@ Martin
default = "Kraje"
["header/locations-for"]
- default = "Lokalizacje dla %(country)"
+ default = "%(country), regiony:"
["header/mfa"]
default = "Uwierzytelnianie wieloskładnikowe"
@@ -791,7 +794,7 @@ Weryfikacja odbywa się co 2 godziny.
default = "Ustaw z przeglądarki"
["link/settings"]
- default = "ustawienia"
+ default = "Ustawienia"
["link/show-more"]
default = "Pokaż więcej"
diff --git a/i18n/pt-BR.toml b/i18n/pt-BR.toml
index 494facb7..2fa5f577 100644
--- a/i18n/pt-BR.toml
+++ b/i18n/pt-BR.toml
@@ -5,7 +5,7 @@
maintainers = []
["button/add-new"]
- default = "Adicionar novo"
+ default = "Adicionar"
["button/add-user"]
default = "Adicionar novo usuário"
@@ -26,22 +26,22 @@
default = "excluir"
["button/delete-account"]
- default = "Excluir conta, todos os sites, e todos os dados"
+ default = "Excluir a conta, todos os sites e todos os dados"
["button/delete-all"]
- default = "Sim, exclua todos eles!"
+ default = "Sim, pode excluir tudo!"
["button/delete-everything"]
- default = "Sim, exclua tudo"
+ default = "Sim, excluir tudo"
["button/disable-mfa"]
- default = "Desabilitar MFA"
+ default = "Desativar MFA"
["button/edit"]
default = "Editar"
["button/enable-mfa"]
- default = "Habilitar MFA"
+ default = "Ativar MFA"
["button/forgot-password"]
default = "Esqueceu a senha?"
@@ -91,6 +91,7 @@
["dashboard/day-ago"]
["dashboard/future"]
+ default = "futuro"
["dashboard/month-ago"]
@@ -101,6 +102,7 @@
default = "Páginas"
["dashboard/pages/num-visits"]
+ default = "%(num-visits) de %(total-visits) de acessos exibidos"
["dashboard/pages/pageviews"]
default = "Visualizações de página"
@@ -112,6 +114,7 @@
default = "Estatísticas"
["dashboard/pages/stats-tooltip"]
+ default = "Cada barra representa 1/12 do período de tempo selecionado"
["dashboard/pages/title"]
default = "Título"
@@ -120,17 +123,19 @@
default = "Visualizações"
["dashboard/pages/visits"]
- default = "Visitas"
+ default = "Acessos"
["dashboard/today"]
default = "Hoje"
["dashboard/tooltip-event"]
+ default = "%(unique) cliques; %(clicks) total de cliques"
["dashboard/totals/header"]
default = "Totais"
["dashboard/totals/num-visits"]
+ default = "%(num-visits) acessos"
["dashboard/week-ago"]
@@ -138,16 +143,22 @@
default = "Ontem"
["data-collect/help/country"]
+ default = "Nome do país - por exemplo, Bélgica, Indonésia etc."
["data-collect/help/language"]
+ default = "Idiomas aceitos em Accept-Language"
["data-collect/help/referrer"]
["data-collect/help/region"]
+ default = "Região - por exemplo, Texas, Bali etc. Os detalhes podem variar conforme o país."
["data-collect/help/sessions"]
["data-collect/help/size"]
+ default = "Tamanho da tela."
+
+["data-collect/help/user-agent"]
["data-collect/label/country"]
default = "País"
@@ -168,8 +179,10 @@
default = "Tamanho"
["data-collect/label/user-agent"]
+ default = "User-Agent"
["datepicker/keyboard"]
+ default = "Use as teclas de seta para selecionar uma data"
["datepicker/month-next"]
default = "Próximo mês"
@@ -181,10 +194,23 @@
default = "Olá,"
["email/password-reset"]
+ default = """
+Alguém (esperamos que tenha sido você) solicitou uma redefinição da senha da sua conta do GoatCounter.
+
+Você pode fazer isso aqui:
+%(link)
+"""
["email/reset-user-email-subject"]
+ default = "Redefinição de senha para %(domain)"
["email/signature"]
+ default = """
+Se você tiver algum problema, perguntas, comentários ou algo mais para me dizer, basta responder a este e-mail. (Em inglês, se possível.)
+
+Atenciosamente,
+Martin
+"""
["error/account-has-stripe-subscription"]
@@ -199,42 +225,51 @@
["error/date-past"]
["error/delete-main-site"]
+ default = "Não é possível excluir o site principal"
["error/export-expired"]
["error/incorrect-password"]
+ default = "A senha atual está incorreta."
["error/invalid-end-date"]
+ default = "Data final inválida: %(date)"
["error/invalid-start-date"]
+ default = "Data inicial inválida: %(date)"
["error/load-url"]
+ default = "Não foi possível carregar %(url): %(error)"
["error/login-invalid"]
["error/login-no-password"]
["error/login-not-found"]
+ default = "Usuário %(e-mail) não encontrado"
["error/login-token-expired"]
["error/login-wrong-pwd"]
- default = "Senha errada para %(email)"
+ default = "Senha incorreta para %(email)"
["error/not-found"]
default = "Não encontrado"
["error/password-does-not-match"]
- default = "Confirmação de senha não combina."
+ default = "A confirmação da senha não corresponde."
["error/payment-cancelled"]
default = "Pagamento cancelado."
["error/reset-user-no-account"]
+ default = "Não é uma conta neste site: %(email)"
["error/token-already-used"]
+ default = "Token desconhecido; talvez já tenha sido usado?"
["error/wrong-verification-key"]
+ default = "Chave de verificação incorreta."
["event"]
default = "evento"
@@ -242,19 +277,19 @@
["forgot-domain-help"]
["header/access"]
- default = "Acesso"
+ default = "Nível de acesso"
["header/add-new-user"]
- default = "Adiciona um novo usuário"
+ default = "Adicionar novo usuário"
["header/allow-access"]
- default = "Permitir acesso"
+ default = "Nível de acesso"
["header/api"]
default = "API"
["header/api-tokens"]
- default = "Tokens de API"
+ default = "Tokens da API"
["header/browsers"]
default = "Navegadores"
@@ -278,6 +313,7 @@
default = "Painel"
["header/data-collection"]
+ default = "Coleta de dados"
["header/delete-account"]
default = "Excluir conta"
@@ -286,7 +322,7 @@
default = "Domínio"
["header/domain-settings"]
- default = "Configurações de domínio"
+ default = "Configurações do domínio"
["header/edit-user"]
default = "Editar usuário %(email)"
@@ -310,6 +346,7 @@
default = "Esqueci a senha"
["header/hash"]
+ default = "Hash"
["header/import"]
default = "Importar"
@@ -343,7 +380,7 @@
["header/pagination-cursor"]
["header/passwd-mfa"]
- default = "Senha & MFA"
+ default = "Senha e MFA"
["header/path"]
default = "Caminho"
@@ -410,48 +447,68 @@
default = "Usuários"
["help/allow-visitor-counts"]
+ default = "Consulte %[a documentação] para mais detalhes."
["help/campaign-parameters"]
["help/cfg-dashboard"]
["help/code-access"]
+ default = "Você acessará o seu site em https://[meu-código].%(domain)."
["help/custom-domain"]
+ default = 'Domínio personalizado, por exemplo “estatísticas.exemplo.com.br”. Observação: isto não impedirá que a maioria dos bloqueadores de anúncios bloqueie o GoatCounter. É apenas um "domínio bonitinho".'
["help/custom-domain-cname"]
+ default = "Defina um registro CNAME para %(domain)
- %[%docs instruções detalhadas]."
["help/custom-domain-error"]
+ default = """
+%[%error Ainda não verificado]; defina um registro CNAME para %(domain)
– %[%docs instruções detalhadas].
+A verificação é executada a cada 2 horas.
+"""
["help/custom-domain-plan"]
+ default = "Requer o plano Personal Plus ou Business (você está no plano %(plan); consulte %[%link faturamento])."
["help/custom-domain-verified"]
+ default = "Domínio verificado e configurado (observação: pode levar até uma hora para que o certificado funcione)."
["help/data-retention"]
["help/domain-access"]
["help/drag-reorder"]
+ default = "Arraste para reordenar"
["help/for-the-following-countries"]
["help/goatcounter-domain"]
+ default = 'O domínio de sua instalação do GoatCounter, por exemplo, "estatísticas.exemplo.com.br".'
["help/ignore-ips"]
+ default = "Nunca processar solicitações vindas desses endereços de IP (separados por vírgulas). Apenas correspondências exatas. %[Clique aqui para adicionar o seu IP atual]."
["help/ignore-ips-2"]
+ default = "... ou %[desative este navegador] (clique novamente para ativar)."
["help/new-user-email"]
+ default = "E-mail para fazer login."
["help/new-user-email-confirm"]
+ default = "E-mail para fazer login; deve ser confirmado."
["help/no-undo"]
+ default = "Esta ação é irreversível e não pode ser desfeita!"
["help/password-edit"]
+ default = "Deixe este campo em branco para manter inalterado."
["help/password-new-user"]
+ default = "Deixe em branco para enviar um e-mail de redefinição de senha."
["help/public"]
+ default = "Define quem pode acessar o painel."
["help/rm-hits"]
@@ -460,42 +517,60 @@
["help/turing-test"]
["help/your-email"]
+ default = "Você precisará verificar novamente o novo endereço caso o altere."
["label/24-hour-clock"]
+ default = "Relógio de 24 horas (13:00)"
["label/add-new"]
+ default = "Adicionar"
["label/all-sites"]
+ default = "Todos os sites"
["label/allow-admin-access"]
+ default = "Permitir acesso de administrador"
["label/allow-visitor-counts"]
+ default = "Permitir a inclusão de contagem de visitantes no seu site"
["label/browser-stats"]
+ default = "Estatísticas de navegadores"
["label/campaign-parameters"]
["label/change-code"]
+ default = "Você acessará a sua conta em https://[meu-código].%(domain) - %[%link alterar]."
["label/clear-pageviews"]
+ default = "Limpar todas as visualizações de página existentes."
["label/code"]
+ default = "Código"
["label/collected-since"]
+ default = "Coletado desde 2 de dezembro de 2021"
["label/csv-compress-format"]
+ default = "Arquivo CSV; pode ser compactado com gzip"
["label/current-passwd"]
+ default = "Senha atual"
["label/custom-domain"]
+ default = "Domínio personalizado"
["label/dashboard-public"]
+ default = "Visibilidade do painel"
["label/data-retention"]
+ default = "Retenção de dados em dias"
["label/date-fmt"]
+ default = "Formato da data"
["label/delete-account-confirmation"]
+ default = "Tem certeza de que deseja excluir a sua conta?"
["label/delete-account-contact"]
@@ -506,96 +581,135 @@
["label/delete-account-reason-placeholder"]
["label/email"]
+ default = "E-mail"
["label/email-address"]
+ default = "Endereço de e-mail"
["label/for-following-countries"]
+ default = "Restringir a apenas os seguintes países:"
["label/goatcounter-domain"]
+ default = "Domínio do GoatCounter"
["label/ignore-ips"]
+ default = "IPs ignorados"
["label/lang"]
+ default = "Idioma"
["label/language-stats"]
+ default = "Estatísticas de idioma"
["label/loc-stats"]
+ default = "Estatísticas de localização"
["label/mark-current"]
+ default = "(atual)"
["label/match-title"]
["label/mfa-token"]
+ default = "Token MFA"
["label/new-code"]
+ default = "Novo código"
["label/new-password"]
+ default = "Nova senha"
["label/new-password-confirm"]
+ default = "Nova senha (confirmação)"
["label/pagination-cursor"]
["label/password"]
+ default = "Senha"
["label/paths"]
["label/public-anyone"]
+ default = "Todos"
["label/public-private"]
+ default = "Apenas usuários com conta"
["label/public-token"]
+ default = "Usuários com conta ou com um segredo"
["label/secret"]
+ default = "Segredo"
["label/secret-access"]
+ default = "URL de acesso:"
["label/secret-token"]
+ default = "Segredo"
["label/set-default"]
+ default = "Também definir como padrão para novos usuários e para a exibição pública (se ativada)."
["label/size-desktop"]
+ default = "Monitores de computador"
["label/size-desktophd"]
+ default = "Monitores de computador maiores que HD"
["label/size-largephones"]
+ default = "Telefones grandes e tablets pequenos"
["label/size-phones"]
+ default = "Telefones"
["label/size-stats"]
["label/size-tablets"]
+ default = "Tablets e laptops pequenos"
["label/system-stats"]
["label/thousand-separator"]
+ default = "Separador de milhares"
["label/timezone"]
+ default = "Fuso horário"
["label/topref"]
["label/total-pageviews"]
+ default = "Total de visualizações de páginas do site"
["label/turing-test"]
["label/verifictation-token"]
+ default = "Token de verificação"
["label/week-start"]
+ default = "A semana começa no domingo"
["label/your-email"]
+ default = "Seu e-mail"
["label/your-site"]
+ default = "Seu site"
["link/add-translation"]
+ default = "Adicionar ou atualizar traduções"
["link/api"]
+ default = "API"
["link/api-docs"]
+ default = "Documentação da API"
["link/billing"]
+ default = "Cobrança"
["link/dashboard"]
+ default = "Painel"
["link/generate-random"]
+ default = "Gerar segredo aleatório."
["link/goto-path"]
default = "Ir para %(path)"
@@ -604,7 +718,7 @@
default = "Importar"
["link/passwd-mfa"]
- default = "Senha & MFA"
+ default = "Senha e MFA"
["link/preferences"]
default = "Preferências"
@@ -616,12 +730,13 @@
default = "Excluir visualizações de página"
["link/set-from-browser"]
+ default = "Definir a partir do navegador"
["link/settings"]
default = "configurações"
["link/show-more"]
- default = "Mostrar mais"
+ default = "Exibir mais"
["link/sites"]
default = "Sites"
@@ -642,7 +757,7 @@
default = "Início"
["nav-bot/src"]
- default = "Código fonte"
+ default = "Código-fonte"
["nav-dash/back"]
default = "atrás"
@@ -657,12 +772,16 @@
default = "dia"
["nav-dash/end-date"]
+ default = "Final do intervalo de datas a ser exibido."
["nav-dash/filter"]
+ default = "Filtrar caminhos"
["nav-dash/filter-tooltip"]
+ default = "Filtrar a lista de caminhos sem diferenciação entre maiúsculas e minúsculas no título e no caminho."
["nav-dash/forced-daily"]
+ default = "A visualização por hora não pode ser usada em um período de tempo superior a 90 dias."
["nav-dash/forward"]
default = "adiante"
@@ -680,6 +799,7 @@
default = "trimestre"
["nav-dash/start-date"]
+ default = "Início do período a ser exibido"
["nav-dash/week"]
default = "semana"
@@ -699,6 +819,7 @@
["notify/disabled-multi-factor-auth"]
["notify/email-already-verified"]
+ default = "%(email) já foi verificado."
["notify/export-started-in-background"]
@@ -711,20 +832,25 @@
["notify/need-business-plan-custom-domain"]
["notify/need-email-verification-for-api"]
+ default = "É necessário verificar o seu endereço de e-mail antes de usar a API."
["notify/no-user-for-token"]
["notify/not-found"]
+ default = "Não encontrado"
["notify/password-changed"]
+ default = "Senha alterada."
["notify/payment-processed"]
+ default = "O pagamento foi processado com sucesso!"
["notify/payment-processing"]
["notify/reset-to-default"]
["notify/reset-user-sent"]
+ default = "E-mail enviado para %(e-mail)"
["notify/restored-previously-deleted-site"]
@@ -732,20 +858,27 @@
default = "Salvo!"
["notify/sent-to-email"]
+ default = "Enviado para %(e-mail)."
["notify/settings-copied-to-site"]
+ default = "Configurações copiadas para os sites selecionados."
["notify/site-added"]
+ default = 'Site "%(url)" adicionado.'
["notify/site-removed"]
+ default = 'Site "%(url)" removido.'
["notify/started-background-process"]
["notify/user-added"]
+ default = 'Usuário "%(email)" adicionado.'
["notify/user-removed"]
+ default = 'Usuário "%(email)" removido.'
["notify/users-edited"]
+ default = 'Usuário "%(email)" editado.'
["p/add-goatcounter-to-multiple-websites"]
@@ -779,6 +912,7 @@
["p/have-mfa"]
["p/last-user"]
+ default = "Não é possível excluir ou editar o único administrador"
["p/no-data"]
@@ -789,6 +923,7 @@
["p/notify-pagination-cursor"]
["p/notify-site-deletion"]
+ default = "%(number) sites serão excluídos"
["p/remove-site-confirm"]
@@ -807,8 +942,10 @@
["p/setting-recovery-disabled-information"]
["p/settings-all-sites"]
+ default = "Estas configurações serão aplicadas a todos os sites aos quais você tem acesso."
["p/site-domain-link-to-page"]
+ default = 'O domínio do seu site, por exemplo, "www.exemplo.com.br", usado para criar links na página de visão geral.'
["p/text-data-retention"]
@@ -819,18 +956,25 @@
["restricted-admin-access"]
["scale-y"]
+ default = "Dimensionar o eixo Y para o máximo"
["top-nav/back"]
+ default = "Voltar"
["top-nav/dashboard"]
+ default = "Painel"
["top-nav/need-js"]
+ default = "O GoatCounter requer JavaScript ativado para funcionar; permita a execução de JavaScript no domínio %(domain)."
["top-nav/public-link"]
+ default = "Análises para %(domain)."
["top-nav/public-time"]
+ default = "A exibição pública é atualizada uma vez por hora; todos os horários estão em %(timezone-name) (%(timezone-offset))."
["top-nav/settings"]
+ default = "Configurações"
["top-nav/sign-in"]
default = "Entrar"
@@ -854,62 +998,87 @@
default = "(desconhecido)"
["validate/bool"]
+ default = "deve ser um booleano"
["validate/color"]
+ default = "deve ser um código de cor válido"
["validate/contains"]
+ default = "não pode conter os caracteres %s"
["validate/date"]
+ default = 'deve ser uma data como "%s"'
["validate/domain"]
+ default = "deve ser um domínio válido"
["validate/email"]
+ default = "deve ser um endereço de e-mail válido"
["validate/exclude"]
+ default = 'não pode ser "%s"'
["validate/hostname"]
+ default = "deve ser um nome de host válido"
["validate/include"]
+ default = 'deve ser um de "%s"'
["validate/int"]
+ default = "deve ser um número inteiro"
["validate/ip"]
+ default = "deve ser um endereço IPv4 ou IPv6 válido"
["validate/ipv4"]
+ default = "deve ser um endereço IPv4 válido"
["validate/len-longer"]
+ default = "deve ser maior que %d caracteres"
["validate/len-shorter"]
+ default = "deve ser menor que %d caracteres"
["validate/phone"]
+ default = "deve ser um número de telefone válido"
["validate/range-higher"]
+ default = "deve ser %d ou maior"
["validate/range-lower"]
+ default = "deve ser %d ou menor"
["validate/required"]
+ default = "deve ser definido"
["validate/url"]
+ default = "deve ser um url válido"
["validate/utf8"]
- default = "Precisa ser UTF-8"
+ default = "deve ser UTF-8"
["widget-setting/help/align"]
+ default = "Adicionar margem à esquerda para alinhar com os gráficos das páginas"
["widget-setting/help/chart-style"]
+ default = "Como o gráfico deve ser desenhado"
["widget-setting/help/no-events"]
+ default = "Não incluir eventos na visão geral"
["widget-setting/help/page-size"]
+ default = "Total de páginas a serem carregadas"
["widget-setting/help/ref-page-size"]
["widget-setting/help/regions"]
+ default = "Exibir as regiões correspondentes a este país em vez de uma lista de países"
["widget-setting/label/align"]
+ default = "Alinhar com as páginas"
["widget-setting/label/chart-style"]
- default = "Estilo de gráfico"
+ default = "Estilo do gráfico"
["widget-setting/label/no-events"]
default = "Desconsiderar eventos"
@@ -921,7 +1090,7 @@
default = "Tamanho da página do indicador"
["widget-setting/label/regions"]
- default = "Mostrar regiões"
+ default = "Exibir regiões"
["widget-settings/bar-chart"]
default = "Gráfico de barra"
diff --git a/i18n/ru-RU.toml b/i18n/ru-RU.toml
index 2664cbb9..45ca9628 100644
--- a/i18n/ru-RU.toml
+++ b/i18n/ru-RU.toml
@@ -178,6 +178,9 @@
["data-collect/help/size"]
default = "Размер экрана."
+["data-collect/help/user-agent"]
+ default = "Агент пользователя для получения браузера, названия и версии операционной системы."
+
["data-collect/label/country"]
default = "Страна"
diff --git a/i18n/zh-CN.toml b/i18n/zh-CN.toml
new file mode 100644
index 00000000..6229a47e
--- /dev/null
+++ b/i18n/zh-CN.toml
@@ -0,0 +1,1227 @@
+[__meta__]
+ comments = "|user|"
+ generated = 2021-11-29T19:38:18Z
+ language = "zh-CN"
+
+["button/add-new"]
+ default = "新建"
+
+["button/add-user"]
+ default = "新建用户"
+
+["button/cfg-dashboard"]
+ default = "配置仪表盘布局"
+
+["button/change"]
+ default = "更改"
+
+["button/change-passwd"]
+ default = "更改密码"
+
+["button/copy"]
+ default = "复制"
+
+["button/delete"]
+ default = "删除"
+
+["button/delete-account"]
+ default = "删除账号、所有站点与数据"
+
+["button/delete-all"]
+ default = "确定,删除全部"
+
+["button/delete-everything"]
+ default = "确定,删除每项"
+
+["button/disable-mfa"]
+ default = "关闭多重身份验证"
+
+["button/edit"]
+ default = "编辑"
+
+["button/enable-mfa"]
+ default = "启用多重身份验证"
+
+["button/forgot-password"]
+ default = "忘记了密码?"
+
+["button/remove"]
+ default = "删除"
+
+["button/request-reset"]
+ default = "请求密码重置"
+
+["button/resend-email"]
+ default = "重发邮件"
+
+["button/reset-defaults"]
+ default = "重置为默认值"
+
+["button/reset-password"]
+ default = "重置密码"
+
+["button/rm-hits"]
+ default = "删除页面浏览记录"
+
+["button/save"]
+ default = "保存"
+
+["button/save-default-view"]
+ default = "保存默认视图"
+
+["button/send-login-url"]
+ default = "发送登录 URL"
+
+["button/sign-in"]
+ default = "登录"
+
+["button/start-export"]
+ default = "开始导出"
+
+["button/start-import"]
+ default = "开始导入"
+
+["button/submit"]
+ default = "提交"
+
+["confirm/delete-user"]
+ default = "删除 %(email)?"
+
+["dashboard/day-ago"]
+ default = "%(n) 天前"
+ zero = "零天前"
+ one = "一天前"
+ two = "两天前"
+ few = "几天前"
+ many = "许多天前"
+
+["dashboard/future"]
+ default = "将来"
+
+["dashboard/month-ago"]
+ default = "%(n) 个月前"
+ zero = "零月前"
+ one = "一个月前"
+ two = "两个月前"
+ few = "几个月前"
+ many = "许多个月前"
+
+["dashboard/nothing-to-display"]
+ default = "没有数据可展示"
+
+["dashboard/pages/header"]
+ default = "路径总览"
+
+["dashboard/pages/num-visits"]
+ default = "显示了 %(total-visits) 次访问中的 %(num-visits) 次"
+
+["dashboard/pages/pageviews"]
+ default = "页面浏览记录"
+
+["dashboard/pages/path"]
+ default = "路径"
+
+["dashboard/pages/stats"]
+ default = "统计"
+
+["dashboard/pages/stats-tooltip"]
+ default = "每一条代表所选时间范围的 1/12"
+
+["dashboard/pages/title"]
+ default = "标题"
+
+["dashboard/pages/views"]
+ default = "查看"
+
+["dashboard/pages/visits"]
+ default = "访问"
+
+["dashboard/today"]
+ default = "今天"
+
+["dashboard/tooltip-event"]
+ default = "%(unique) 次点击;%(clicks) 次总点击"
+
+["dashboard/totals/header"]
+ default = "页面浏览总记录"
+
+["dashboard/totals/num-visits"]
+ default = "%(num-visits) 次访问"
+
+["dashboard/week-ago"]
+ default = "%(n) 周前"
+ zero = "零周前"
+ one = "一周前"
+ two = "两周前"
+ few = "几周前"
+ many = "许多周前"
+
+["dashboard/yesterday"]
+ default = "昨天"
+
+["data-collect/help/country"]
+ default = "国家名称,例如 Belgium、Indonesia。"
+
+["data-collect/help/language"]
+ default = "accept-language 标识的受支持的语言。"
+
+["data-collect/help/referrer"]
+ default = "referer 头与 campaign 参数。"
+
+["data-collect/help/region"]
+ default = "区域,例如 Texas、Bali。此项具体依国家不同而不同。"
+
+["data-collect/help/sessions"]
+ default = "跟踪 8 小时内的独立访问者;关闭此项后,同一人刷新页面将显示 2 次页面浏览而不是 1 次。"
+
+["data-collect/help/size"]
+ default = "屏幕大小。"
+
+["data-collect/label/country"]
+ default = "国家"
+
+["data-collect/label/language"]
+ default = "语言"
+
+["data-collect/label/referrer"]
+ default = "来源"
+
+["data-collect/label/region"]
+ default = "区域"
+
+["data-collect/label/sessions"]
+ default = "会话"
+
+["data-collect/label/size"]
+ default = "屏幕大小"
+
+["data-collect/label/user-agent"]
+ default = "用户代理字符串"
+
+["datepicker/keyboard"]
+ default = "使用方向键选择日期"
+
+["datepicker/month-next"]
+ default = "下个月"
+
+["datepicker/month-prev"]
+ default = "上个月"
+
+["email/header"]
+ default = "你好,"
+
+["email/password-reset"]
+ default = """
+有人(希望是你)在你的 GoatCounter 账号上申请重置密码。
+
+在此重置密码:
+%(link)
+"""
+
+["email/reset-user-email-subject"]
+ default = "%(domain) 的密码重置"
+
+["email/signature"]
+ default = """
+遇到问题或有任何疑问等,只需回复此邮件。
+
+Cheers,
+Martin
+"""
+
+["error/account-has-stripe-subscription"]
+ default = "此账号仍有 Stripe 订阅;请在账单页面取消它。"
+
+["error/address-exists"]
+ default = "%(addr) 已经存在"
+
+["error/could-not-read"]
+ default = "无法读取 gzip:%(err)"
+
+["error/date-future"]
+ default = "那将去到没有记录的将来。"
+
+["error/date-mismatch"]
+ default = "结束日期早于起始日期"
+
+["error/date-past"]
+ default = "那将回到站点开始记录之前;GoatCounter 还没那么厉害。;-)"
+
+["error/delete-main-site"]
+ default = "无法删除主站"
+
+["error/export-expired"]
+ default = "暂无导出或导出已过期。"
+
+["error/incorrect-password"]
+ default = "当前密码错误。"
+
+["error/invalid-end-date"]
+ default = "无效的结束日期:%(date)"
+
+["error/invalid-start-date"]
+ default = "无效的起始日期:%(date)"
+
+["error/load-url"]
+ default = "无法加载 %(url):%(error)"
+
+["error/login-invalid"]
+ default = "无效的登录"
+
+["error/login-no-password"]
+ default = "%(email) 没有设置密码;请重置密码。"
+
+["error/login-not-found"]
+ default = "未找到用户 %(email)"
+
+["error/login-token-expired"]
+ default = "无法查找到对应给定令牌的用户;或许令牌已过期或已被使用?"
+
+["error/login-wrong-pwd"]
+ default = "%(email) 的密码错误"
+
+["error/not-found"]
+ default = "未找到"
+
+["error/password-does-not-match"]
+ default = "密码不匹配。"
+
+["error/payment-cancelled"]
+ default = "支付取消。"
+
+["error/reset-user-no-account"]
+ default = "不存在账号 %(email)"
+
+["error/token-already-used"]
+ default = "未知令牌;或许它已被使用?"
+
+["error/wrong-verification-key"]
+ default = "验证密钥错误。"
+
+["event"]
+ default = "事件"
+
+["forgot-domain-help"]
+ default = "发送与邮箱地址关联的所有域名的列表"
+
+["header/access"]
+ default = "权限"
+
+["header/add-new-user"]
+ default = "新建用户"
+
+["header/allow-access"]
+ default = "权限等级"
+
+["header/api"]
+ default = "API"
+
+["header/api-tokens"]
+ default = "API 令牌"
+
+["header/browsers"]
+ default = "浏览器统计"
+
+["header/change-code"]
+ default = "更改站点代码"
+
+["header/change-passwd"]
+ default = "更改密码"
+
+["header/code"]
+ default = "代码"
+
+["header/copy-settings"]
+ default = "复制设置"
+
+["header/created-at"]
+ default = "创建于"
+
+["header/dashboard"]
+ default = "仪表盘"
+
+["header/data-collection"]
+ default = "数据收集"
+
+["header/delete-account"]
+ default = "删除账号"
+
+["header/domain"]
+ default = "域名"
+
+["header/domain-settings"]
+ default = "域名设置"
+
+["header/edit-user"]
+ default = "编辑用户 %(email)"
+
+["header/email"]
+ default = "邮箱"
+
+["header/export"]
+ default = "导出"
+
+["header/export-or-import"]
+ default = "导出/导入"
+
+["header/finished"]
+ default = "完成于"
+
+["header/forgot-domain"]
+ default = "忘记了域名"
+
+["header/forgot-password"]
+ default = "忘记了密码"
+
+["header/hash"]
+ default = "哈希"
+
+["header/import"]
+ default = "导入"
+
+["header/l10n"]
+ default = "本地化"
+
+["header/languages"]
+ default = "语言统计"
+
+["header/last-10-exports"]
+ default = "最后的 10 个导出"
+
+["header/locations"]
+ default = "位置统计"
+
+["header/locations-for"]
+ default = "%(country) 的位置"
+
+["header/mfa"]
+ default = "多重身份认证"
+
+["header/n-hits"]
+ default = "点击量"
+
+["header/name"]
+ default = "名称"
+
+["header/new"]
+ default = "新建"
+
+["header/pagination-cursor"]
+ default = "分页游标"
+
+["header/passwd-mfa"]
+ default = "密码与多重身份验证"
+
+["header/path"]
+ default = "路径"
+
+["header/permissions"]
+ default = "许可"
+
+["header/preferences"]
+ default = "首选项"
+
+["header/reset-password"]
+ default = "为 %(site-name) 的 %(email) 重置密码"
+
+["header/rm-hits"]
+ default = "删除页面浏览记录"
+
+["header/settings"]
+ default = "设置"
+
+["header/sign-in-at"]
+ default = "Sign in at %(name)"
+
+["header/site-settings"]
+ default = "站点设置"
+
+["header/sites"]
+ default = "站点"
+
+["header/size"]
+ default = "大小"
+
+["header/sizes"]
+ default = "屏幕大小统计"
+
+["header/start-pagination-cursor"]
+ default = "起始于分页游标"
+
+["header/started"]
+ default = "开始于"
+
+["header/systems"]
+ default = "系统统计"
+
+["header/title"]
+ default = "标题"
+
+["header/token"]
+ default = "令牌"
+
+["header/toprefs"]
+ default = "排名靠前的来源"
+
+["header/tracking"]
+ default = "跟踪"
+
+["header/updated"]
+ default = "更新"
+
+["header/user-info"]
+ default = "用户信息"
+
+["header/user-information"]
+ default = "用户信息"
+
+["header/users"]
+ default = "用户"
+
+["help/allow-visitor-counts"]
+ default = "查看%[文档]了解如何使用。"
+
+["help/campaign-parameters"]
+ default = "算作 campaign 的参数列表;此值将被设为来源,将覆盖任何 referer 头。"
+
+["help/cfg-dashboard"]
+ default = "更改仪表盘显示的内容与它们的顺序。"
+
+["help/code-access"]
+ default = "你可以在 https://[代码].%(domain) 访问站点。"
+
+["help/custom-domain"]
+ default = """
+自定义域名,例如“stats.example.com”。
+注意: 自定义域名仅仅是看起来不错,它无法阻止多数广告拦截器拦截 GoatCounter。
+"""
+
+["help/custom-domain-cname"]
+ default = "添加一条指向 %(domain)
的 CNAME 记录——%[详情见 %docs]。"
+
+["help/custom-domain-error"]
+ default = """
+%[%error 暂未完成验证];添加一条指向 %(domain)
的 CNAME 记录——%[详情见 %docs]。
+验证每隔 2 小时运行 1 次。
+"""
+
+["help/custom-domain-plan"]
+ default = "需要个人升级版或企业版套餐(你正在使用%(plan)套餐;请查阅%[%link 账单])。"
+
+["help/custom-domain-verified"]
+ default = "域名已验证并完成设置(注意:证书可能要等 1 小时才能生效)。"
+
+["help/data-retention"]
+ default = "页面浏览记录及所有关联数据都将在这些天后永久删除。设为 0
则永不删除。"
+
+["help/domain-access"]
+ default = "用以访问该站点的域名。"
+
+["help/drag-reorder"]
+ default = "拖拽排序"
+
+["help/for-the-following-countries"]
+ default = "国家代码列表(%[列表];使用 2 字母代码);留空则从所有国家收集数据(如果启用了国家数据收集)。"
+
+["help/goatcounter-domain"]
+ default = "你的 GoatCounter 安装域名,例如 “stats.example.com”。"
+
+["help/ignore-ips"]
+ default = "不记录这些 IP 地址发送的请求。使用英文逗号分隔。仅支持精确匹配。%[添加当前 IP 地址]。"
+
+["help/ignore-ips-2"]
+ default = "或者,%[为此浏览器关闭跟踪](再次点击以启用)。"
+
+["help/new-user-email"]
+ default = "登录用邮箱。"
+
+["help/new-user-email-confirm"]
+ default = "登录用邮箱;必须被确认。"
+
+["help/no-undo"]
+ default = "这是破坏性操作,无法撤销!"
+
+["help/password-edit"]
+ default = "留空不作更改。"
+
+["help/password-new-user"]
+ default = "留空以发送密码重置邮件。"
+
+["help/public"]
+ default = "控制谁可以查看仪表盘。"
+
+["help/rm-hits"]
+ default = "在删除任何数据之前,你将可以预览匹配。"
+
+["help/save-default-view"]
+ default = "保存当前视图(如黄色方框内的所有设置)为无选择时的默认视图。"
+
+["help/turing-test"]
+ default = "仅仅是验证一下你是人类。:-)"
+
+["help/your-email"]
+ default = "更改邮箱地址后需要重新验证。"
+
+["label/24-hour-clock"]
+ default = "24 小时时钟(13:00)"
+
+["label/add-new"]
+ default = "新建"
+
+["label/all-sites"]
+ default = "所有站点"
+
+["label/allow-admin-access"]
+ default = "允许管理员访问"
+
+["label/allow-visitor-counts"]
+ default = "允许在你的网站上添加访客计数"
+
+["label/browser-stats"]
+ default = "浏览器统计"
+
+["label/campaign-parameters"]
+ default = "campaign 参数"
+
+["label/change-code"]
+ default = "你的账号绑定在 https://[代码].%(domain)——%[%link 更改]。"
+
+["label/clear-pageviews"]
+ default = "清除现有页面浏览记录"
+
+["label/code"]
+ default = "代码"
+
+["label/collected-since"]
+ default = "自 2021 年 12 月 2 日开始收集"
+
+["label/csv-compress-format"]
+ default = "CSV 文件;可用 gzip 压缩"
+
+["label/current-passwd"]
+ default = "当前密码"
+
+["label/custom-domain"]
+ default = "当前域名"
+
+["label/dashboard-public"]
+ default = "仪表盘查看权限"
+
+["label/data-retention"]
+ default = "数据保留天数"
+
+["label/date-fmt"]
+ default = "日期格式"
+
+["label/delete-account-confirmation"]
+ default = "你确定要删除整个账号吗?"
+
+["label/delete-account-contact"]
+ default = "勾选此项,我可能会联系你,提出一些后续问题或评论。我不会劝说你留下(我不是电话销售员),但我可能会问一两个问题,或者概述一下未来的计划,如果你需要某项功能。"
+
+["label/delete-account-follow-up"]
+ default = "允许跟进"
+
+["label/delete-account-reason"]
+ default = "如果你能告诉我 GoatCounter 是否缺少某项你需要的功能,或者你删除账号的其他原因,我将不胜感激。这完全是自愿的。"
+
+["label/delete-account-reason-placeholder"]
+ default = "删除账号的原因(选填)"
+
+["label/email"]
+ default = "邮箱"
+
+["label/email-address"]
+ default = "邮箱地址"
+
+["label/for-following-countries"]
+ default = "只针对下列国家:"
+
+["label/goatcounter-domain"]
+ default = "GoatCounter 域名"
+
+["label/ignore-ips"]
+ default = "忽略 IP"
+
+["label/lang"]
+ default = "语言"
+
+["label/language-stats"]
+ default = "语言统计"
+
+["label/loc-stats"]
+ default = "位置统计"
+
+["label/mark-current"]
+ default = "(当前)"
+
+["label/match-title"]
+ default = "也匹配标题"
+
+["label/mfa-token"]
+ default = "多重身份验证令牌"
+
+["label/new-code"]
+ default = "新代码"
+
+["label/new-password"]
+ default = "新密码"
+
+["label/new-password-confirm"]
+ default = "新密码(确认)"
+
+["label/pagination-cursor"]
+ default = "分页游标"
+
+["label/password"]
+ default = "密码"
+
+["label/paths"]
+ default = "路径总览"
+
+["label/public-anyone"]
+ default = "赋予任何人"
+
+["label/public-private"]
+ default = "仅赋予登录用户"
+
+["label/public-token"]
+ default = "赋予登录用户或使用私密令牌的应用程序"
+
+["label/secret"]
+ default = "密钥"
+
+["label/secret-access"]
+ default = "私密访问 URL"
+
+["label/secret-token"]
+ default = "私密令牌"
+
+["label/set-default"]
+ default = "同样设为新用户及公共查看(如果启用)的默认值。"
+
+["label/size-desktop"]
+ default = "电脑显示屏"
+
+["label/size-desktophd"]
+ default = "高于 HD 的电脑显示屏"
+
+["label/size-largephones"]
+ default = "大型手机,小型平板"
+
+["label/size-phones"]
+ default = "手机"
+
+["label/size-stats"]
+ default = "屏幕大小统计"
+
+["label/size-tablets"]
+ default = "平板和小型笔记本"
+
+["label/system-stats"]
+ default = "系统统计"
+
+["label/thousand-separator"]
+ default = "千位分隔符"
+
+["label/timezone"]
+ default = "时区"
+
+["label/topref"]
+ default = "排名靠前的来源"
+
+["label/total-pageviews"]
+ default = "页面浏览总记录"
+
+["label/turing-test"]
+ default = "此处填 9"
+
+["label/verifictation-token"]
+ default = "验证令牌"
+
+["label/week-start"]
+ default = "一周开始于周日"
+
+["label/your-email"]
+ default = "你的邮箱"
+
+["label/your-site"]
+ default = "你的站点"
+
+["link/add-translation"]
+ default = "添加或更新翻译"
+
+["link/api"]
+ default = "API"
+
+["link/api-docs"]
+ default = "API 文档"
+
+["link/billing"]
+ default = "账单"
+
+["link/dashboard"]
+ default = "仪表盘"
+
+["link/generate-random"]
+ default = "生成随机密钥。"
+
+["link/goto-path"]
+ default = "前往 %(path)"
+
+["link/import"]
+ default = "导入"
+
+["link/passwd-mfa"]
+ default = "密码与多重身份验证"
+
+["link/preferences"]
+ default = "首选项"
+
+["link/rm-account"]
+ default = "删除账号"
+
+["link/rm-views"]
+ default = "删除页面浏览记录"
+
+["link/set-from-browser"]
+ default = "从浏览器设定"
+
+["link/settings"]
+ default = "设置"
+
+["link/show-more"]
+ default = "显示更多"
+
+["link/sites"]
+ default = "站点"
+
+["link/users"]
+ default = "用户"
+
+["nav-bot/contact"]
+ default = "联系"
+
+["nav-bot/contribute"]
+ default = "贡献"
+
+["nav-bot/docs"]
+ default = "文档"
+
+["nav-bot/home"]
+ default = "主页"
+
+["nav-bot/src"]
+ default = "源代码"
+
+["nav-dash/back"]
+ default = "后退"
+
+["nav-dash/by-day"]
+ default = "按天查看"
+
+["nav-dash/current"]
+ default = "当前"
+
+["nav-dash/day"]
+ default = "日"
+
+["nav-dash/end-date"]
+ default = "日期显示范围的截止"
+
+["nav-dash/filter"]
+ default = "筛选路径"
+
+["nav-dash/filter-tooltip"]
+ default = "筛选路径列表;忽略大小写匹配路径和标题"
+
+["nav-dash/forced-daily"]
+ default = "无法对 90 天以上的时间范围应用小时视图"
+
+["nav-dash/forward"]
+ default = "前进"
+
+["nav-dash/half-year"]
+ default = "半年"
+
+["nav-dash/last"]
+ default = "前一"
+
+["nav-dash/month"]
+ default = "月"
+
+["nav-dash/quarter"]
+ default = "季"
+
+["nav-dash/start-date"]
+ default = "日期显示范围的起始"
+
+["nav-dash/week"]
+ default = "周"
+
+["nav-dash/year"]
+ default = "年"
+
+["no-title"]
+ default = "无标题"
+
+["notify/add-one-thing"]
+ default = "必须添加至少一项;一个空的仪表盘有点儿无意义了,不是吗?"
+
+["notify/api-token-created"]
+ default = "API 令牌已创建。"
+
+["notify/api-token-removed"]
+ default = "API 令牌已删除。"
+
+["notify/disabled-multi-factor-auth"]
+ default = "多重身份验证已关闭。"
+
+["notify/email-already-verified"]
+ default = "%(email) 已经验证。"
+
+["notify/export-started-in-background"]
+ default = "导出已在后台开始;完成时将通过邮件发送下载链接。"
+
+["notify/import-started-in-background"]
+ default = "导入已在后台开始;完成时将通过邮件通知。"
+
+["notify/login-after-password-reset"]
+ default = "密码已重置;使用新密码登录。"
+
+["notify/multi-factor-auth-enabled"]
+ default = "多重身份验证已启用。"
+
+["notify/need-business-plan-custom-domain"]
+ default = "需要企业版套餐才能设置自定义域名"
+
+["notify/need-email-verification-for-api"]
+ default = "使用 API 前须验证邮箱。"
+
+["notify/no-user-for-token"]
+ default = "未查找到使用给定令牌的用户;或许令牌已过期或从未使用?"
+
+["notify/not-found"]
+ default = "未找到"
+
+["notify/password-changed"]
+ default = "密码已更改。"
+
+["notify/payment-processed"]
+ default = "支付处理成功!"
+
+["notify/payment-processing"]
+ default = "支付处理商报告了成功,但我们仍在处理这笔支付。"
+
+["notify/reset-to-default"]
+ default = "已重置为默认值!"
+
+["notify/reset-user-sent"]
+ default = "邮件已发送到 %(email)"
+
+["notify/restored-previously-deleted-site"]
+ default = "站点 ‘%(url)’ 此前已删除;已恢复全部数据。"
+
+["notify/saved"]
+ default = "已保存!"
+
+["notify/sent-to-email"]
+ default = "已发送到 %(email)。"
+
+["notify/settings-copied-to-site"]
+ default = "已复制设置到选择的站点。"
+
+["notify/site-added"]
+ default = "站点 ‘%(url)’ 已添加。"
+
+["notify/site-removed"]
+ default = "站点 ‘%(url)’ 已删除。"
+
+["notify/started-background-process"]
+ default = "已在后台开始;可能花费 10—20 秒才会处理完成。"
+
+["notify/user-added"]
+ default = "用户 ‘%(email)’ 已添加。"
+
+["notify/user-removed"]
+ default = "用户 ‘%(email)’ 已删除。"
+
+["notify/users-edited"]
+ default = "用户 ‘%(email)’ 已编辑。"
+
+["p/add-goatcounter-to-multiple-websites"]
+ default = """
+
通过创建新站点,将 GoatCounter 添加到多个网站。所有网站将共享相同的套餐、用户和登录名,但在其他方面完全独立。当前站点的设置会在创建其他站点时复制,但之后各自独立。
+ +你可以随意添加。
+""" + +["p/additional-errors"] + default = "额外错误。" + +["p/api-intro"] + default = "GoatCounter 的 API 功能有限;目前可以计算页面浏览、创建、删除和编辑站点,以及导出数据。" + +["p/change-code-request"] + default = """ +更改站点代码与登录域名。
+ +警告:这将立即生效,旧的代码可被任何人再次注册;如果你已经在一个网站使用它,请尽快更改,或临时集成新旧两个代码以避免损失任何页面浏览记录。
+ +当前代码:%(current-code)
(%(current-url))
将在完成后通过邮件发送下载链接。你每小时只能导出 1 次,并且将覆盖之前的副本。
+ +包含所有的页面浏览记录,包括不计入总览的“bot”浏览。
+""" + +["p/have-mfa"] + default = "此账号受多重身份验证保护;请输入验证器应用程序中的代码。" + +["p/last-user"] + default = "无法删除或编辑最后一位管理员用户" + +["p/no-data"] + default = """ +%[%bold 未收到数据]——GoatCounter 还没有收到任何数据。
开始记录很简单,仅需将以下 JavaScript 插入到页面的任何位置:
如果你没有看到任何页面浏览记录(%(domain) 和/或 gc.zgo.at 域名),检查 GoatCounter 是否被广告拦截器拦截 。
+ +收到数据后此消息就会消失;在顶栏菜单中查看%[%link_docs 站点代码]获得更多文档和现成的集成。
+""" + +["p/no-matches"] + default = "没有记录匹配 %(query)。" + +["p/notify-immediate-change"] + default = "将会立即生效" + +["p/notify-pagination-cursor"] + default = "邮件中将包含一个“分页游标”,如果在此处填写它,将只导出自上一次导出以来的页面浏览记录。" + +["p/notify-site-deletion"] + default = "将删除 %(number) 个站点" + +["p/remove-site-confirm"] + default = "你确定要删除站点 %(sitename)?%
作为通配符;例如 /page%.html
匹配以 /page
开头并且以 .html
结尾的所有路径。_
匹配任意字符;例如 _.html
匹配 a.html
和 b.html
。以 \\%
和 \\_
的形式使用这两个字符的字面意。"
+
+["p/rm-pageview-match"]
+ default = "以下路径匹配 %(query):"
+
+["p/setting-recovery-disabled-information"]
+ default = "如果关闭,那么在页面浏览记录产生后也无法恢复这些信息,因为它们根本没有存储。"
+
+["p/settings-all-sites"]
+ default = "这些设置对你有权限的所有站点都生效。"
+
+["p/site-domain-link-to-page"]
+ default = "你站点的域名,比如 “www.example.com”,用作总览中的链接。"
+
+["p/text-data-retention"]
+ default = "这包括数据保留和收集设置!"
+
+["p/verify-email"]
+ default = "请点击发送至 %(email) 的链接以验证邮箱。%[%sup (为什么?)]"
+
+["page-ranking"]
+ default = "页面排名"
+
+["restricted-admin-access"]
+ default = "通常管理员无法“登录”你的站点,但如果启用此项,他们就可以登录。为了技术支持,你可能被请求启用此项。"
+
+["scale-y"]
+ default = "缩放 Y 轴至最大"
+
+["top-nav/back"]
+ default = "返回"
+
+["top-nav/dashboard"]
+ default = "仪表盘"
+
+["top-nav/need-js"]
+ default = "GoatCounter 需要启用 JavaScript 以发挥效用;请允许 JavaScript 在 %(domain) 运行。"
+
+["top-nav/public-link"]
+ default = "%(domain) 的数据分析。"
+
+["top-nav/public-time"]
+ default = "公开页面每小时刷新 1 次;所有时间以%(timezone-name)(%(timezone-offset))显示。"
+
+["top-nav/settings"]
+ default = "设置"
+
+["top-nav/sign-in"]
+ default = "登录"
+
+["top-nav/sign-out"]
+ default = "注销"
+
+["top-nav/site-code"]
+ default = "站点代码"
+
+["top-nav/sites"]
+ default = "站点:"
+
+["top-nav/updates"]
+ default = "更新"
+
+["top-nav/user"]
+ default = "用户"
+
+["unknown"]
+ default = "(未知)"
+
+["validate/bool"]
+ default = "必须是布尔值"
+
+["validate/color"]
+ default = "必须是有效的颜色代码"
+
+["validate/contains"]
+ default = "不可包含字符 %s"
+
+["validate/date"]
+ default = "必须是日期,如‘%s’"
+
+["validate/domain"]
+ default = "必须是有效的域名"
+
+["validate/email"]
+ default = "必须是有效的邮箱地址"
+
+["validate/exclude"]
+ default = "不可是‘%s’"
+
+["validate/hostname"]
+ default = "必须是有效的主机名称"
+
+["validate/include"]
+ default = "必须是‘%s’之一"
+
+["validate/int"]
+ default = "必须是整数"
+
+["validate/ip"]
+ default = "必须是有效的 IPv4 或 IPv6 地址"
+
+["validate/ipv4"]
+ default = "必须是有效的 IPv4 地址"
+
+["validate/len-longer"]
+ default = "必须比 %d 个字符多"
+
+["validate/len-shorter"]
+ default = "必须比 %d 个字符少"
+
+["validate/phone"]
+ default = "必须是有效的电话号码"
+
+["validate/range-higher"]
+ default = "必须是 %d 或更高"
+
+["validate/range-lower"]
+ default = "必须是 %d 或更低"
+
+["validate/required"]
+ default = "必须设置"
+
+["validate/url"]
+ default = "必须是有效的 URL"
+
+["validate/utf8"]
+ default = "必须是 UTF-8"
+
+["widget-setting/help/align"]
+ default = "在左侧添加外边距,使其与路径图表对齐"
+
+["widget-setting/help/chart-style"]
+ default = "如何绘制图表"
+
+["widget-setting/help/no-events"]
+ default = "页面浏览总记录中不包括事件"
+
+["widget-setting/help/page-size"]
+ default = "加载的路径数"
+
+["widget-setting/help/ref-page-size"]
+ default = "点击路径时加载的来源数量"
+
+["widget-setting/help/regions"]
+ default = "显示该国的区域而不是国家列表"
+
+["widget-setting/label/align"]
+ default = "与路径图表对齐"
+
+["widget-setting/label/chart-style"]
+ default = "图表样式"
+
+["widget-setting/label/no-events"]
+ default = "排除事件"
+
+["widget-setting/label/page-size"]
+ default = "路径数量"
+
+["widget-setting/label/ref-page-size"]
+ default = "路径来源数量"
+
+["widget-setting/label/regions"]
+ default = "显示区域"
+
+["widget-settings/bar-chart"]
+ default = "条形图"
+
+["widget-settings/line-chart"]
+ default = "线形图"
+
+["widget-settings/text-chart"]
+ default = "文字表格"
+
+["y-scale"]
+ default = "Y 轴缩放"
diff --git a/i18n/zh-TW.toml b/i18n/zh-TW.toml
new file mode 100644
index 00000000..486ae2c4
--- /dev/null
+++ b/i18n/zh-TW.toml
@@ -0,0 +1,1007 @@
+[__meta__]
+ comments = "|user|"
+ generated = 2021-11-29T19:38:18Z
+ language = "zh-TW"
+
+["button/add-new"]
+ default = "新增"
+
+["button/add-user"]
+ default = "新增使用者"
+
+["button/cfg-dashboard"]
+ default = "編輯儀表板版面"
+
+["button/change"]
+ default = "修改"
+
+["button/change-passwd"]
+ default = "修改密碼"
+
+["button/copy"]
+ default = "複製"
+
+["button/delete"]
+ default = "刪除"
+
+["button/delete-account"]
+ default = "刪除帳號、所有網站和所有資料"
+
+["button/delete-all"]
+ default = "是,全部刪除!"
+
+["button/delete-everything"]
+ default = "是,刪除一切"
+
+["button/disable-mfa"]
+ default = "關閉多重要素驗證"
+
+["button/edit"]
+ default = "編輯"
+
+["button/enable-mfa"]
+ default = "開啟多重要素驗證"
+
+["button/forgot-password"]
+ default = "忘記密碼?"
+
+["button/remove"]
+ default = "移除"
+
+["button/request-reset"]
+ default = "請求重設密碼"
+
+["button/resend-email"]
+ default = "重新寄送信件"
+
+["button/reset-defaults"]
+ default = "恢復預設"
+
+["button/reset-password"]
+ default = "重設密碼"
+
+["button/rm-hits"]
+ default = "刪除頁面瀏覽"
+
+["button/save"]
+ default = "儲存"
+
+["button/save-default-view"]
+ default = "儲存預設版面"
+
+["button/send-login-url"]
+
+["button/sign-in"]
+ default = "登入"
+
+["button/start-export"]
+ default = "開始匯出"
+
+["button/start-import"]
+ default = "開始匯入"
+
+["button/submit"]
+ default = "送出"
+
+["confirm/delete-user"]
+ default = "刪除 %(email)?"
+
+["dashboard/day-ago"]
+ default = "%(n) 天前"
+ zero = "0 天前"
+ one = "1 天前"
+ two = "2 天前"
+ few = "幾天前"
+ many = "好幾天前"
+
+["dashboard/future"]
+ default = "未來"
+
+["dashboard/month-ago"]
+ default = "%(n) 個月前"
+ zero = "0 個月前"
+ one = "1 個月前"
+ two = "2 個月前"
+ few = "幾個月前"
+ many = "好幾個月前"
+
+["dashboard/nothing-to-display"]
+ default = "沒有資料顯示"
+
+["dashboard/pages/header"]
+ default = "頁面"
+
+["dashboard/pages/num-visits"]
+
+["dashboard/pages/pageviews"]
+
+["dashboard/pages/path"]
+ default = "路徑"
+
+["dashboard/pages/stats"]
+ default = "統計資訊"
+
+["dashboard/pages/stats-tooltip"]
+
+["dashboard/pages/title"]
+ default = "標題"
+
+["dashboard/pages/views"]
+ default = "瀏覽數"
+
+["dashboard/pages/visits"]
+
+["dashboard/today"]
+ default = "今天"
+
+["dashboard/tooltip-event"]
+
+["dashboard/totals/header"]
+ default = "總數"
+
+["dashboard/totals/num-visits"]
+ default = "%(num-visits) 次訪問"
+
+["dashboard/week-ago"]
+ default = "%(n) 週前"
+ zero = "0 週前"
+ one = "1 週前"
+ two = "2 週前"
+ few = "幾週前"
+ many = "好幾週前"
+
+["dashboard/yesterday"]
+ default = "昨天"
+
+["data-collect/help/country"]
+ default = "國家名稱,例如比利時、印尼等。"
+
+["data-collect/help/language"]
+
+["data-collect/help/referrer"]
+
+["data-collect/help/region"]
+ default = "地區,例如德克薩斯、峇里省等。每個國家、地區的詳細資訊有所不同。"
+
+["data-collect/help/sessions"]
+
+["data-collect/help/size"]
+ default = "螢幕尺寸。"
+
+["data-collect/label/country"]
+ default = "國家"
+
+["data-collect/label/language"]
+ default = "語言"
+
+["data-collect/label/referrer"]
+
+["data-collect/label/region"]
+
+["data-collect/label/sessions"]
+
+["data-collect/label/size"]
+
+["data-collect/label/user-agent"]
+
+["datepicker/keyboard"]
+
+["datepicker/month-next"]
+ default = "下個月"
+
+["datepicker/month-prev"]
+
+["email/header"]
+ default = "您好:"
+
+["email/password-reset"]
+ default = """
+有人(希望是您)請求重設您 GoatCounter 帳號的密碼。
+
+您可以從此連結來進行:
+%(link)
+"""
+
+["email/reset-user-email-subject"]
+ default = "%(domain) 的密碼重設"
+
+["email/signature"]
+ default = """
+如果有任何問題、疑問、評論,或其他事情要告訴我,請直接回覆這封電子郵件。
+
+祝好,
+馬丁
+"""
+
+["error/account-has-stripe-subscription"]
+
+["error/address-exists"]
+
+["error/could-not-read"]
+
+["error/date-future"]
+
+["error/date-mismatch"]
+
+["error/date-past"]
+ default = "那是在網站架設之前;GoatCounter 還沒「那麼」神呢 ;-)"
+
+["error/delete-main-site"]
+ default = "無法刪除主要網站"
+
+["error/export-expired"]
+
+["error/incorrect-password"]
+ default = "目前密碼不正確。"
+
+["error/invalid-end-date"]
+
+["error/invalid-start-date"]
+
+["error/load-url"]
+
+["error/login-invalid"]
+ default = "登入錯誤"
+
+["error/login-no-password"]
+
+["error/login-not-found"]
+
+["error/login-token-expired"]
+ default = "找不到給定令牌的使用者;或許它已經過期或已經被使用了?"
+
+["error/login-wrong-pwd"]
+ default = "%(email) 的密碼錯誤"
+
+["error/not-found"]
+ default = "找不到"
+
+["error/password-does-not-match"]
+ default = "密碼確認不符。"
+
+["error/payment-cancelled"]
+ default = "付款已取消。"
+
+["error/reset-user-no-account"]
+ default = "此網站無此帳號:%(email)"
+
+["error/token-already-used"]
+ default = "未知的令牌;可能已經被使用?"
+
+["error/wrong-verification-key"]
+ default = "驗證碼錯誤。"
+
+["event"]
+ default = "活動"
+
+["forgot-domain-help"]
+ default = "發送包含與電子郵件地址相關的所有域名的清單。"
+
+["header/access"]
+ default = "權限"
+
+["header/add-new-user"]
+ default = "新增使用者"
+
+["header/allow-access"]
+ default = "允許權限"
+
+["header/api"]
+ default = "API"
+
+["header/api-tokens"]
+ default = "API 令牌"
+
+["header/browsers"]
+ default = "瀏覽器"
+
+["header/change-code"]
+ default = "修改網站代碼"
+
+["header/change-passwd"]
+ default = "修改密碼"
+
+["header/code"]
+ default = "代碼"
+
+["header/copy-settings"]
+ default = "複製設定"
+
+["header/created-at"]
+ default = "建立於"
+
+["header/dashboard"]
+ default = "儀表板"
+
+["header/data-collection"]
+ default = "資料蒐集"
+
+["header/delete-account"]
+ default = "刪除帳號"
+
+["header/domain"]
+ default = "網域"
+
+["header/domain-settings"]
+ default = "網域設定"
+
+["header/edit-user"]
+ default = "編輯使用者 %(email)"
+
+["header/email"]
+ default = "信箱"
+
+["header/export"]
+ default = "匯出"
+
+["header/export-or-import"]
+ default = "匯出 / 匯入"
+
+["header/finished"]
+ default = "結束"
+
+["header/forgot-domain"]
+ default = "忘記網域"
+
+["header/forgot-password"]
+ default = "忘記密碼"
+
+["header/hash"]
+ default = "雜湊"
+
+["header/import"]
+ default = "匯入"
+
+["header/l10n"]
+ default = "本地化"
+
+["header/languages"]
+ default = "語言"
+
+["header/last-10-exports"]
+
+["header/locations"]
+ default = "位置"
+
+["header/locations-for"]
+
+["header/mfa"]
+
+["header/n-hits"]
+
+["header/name"]
+
+["header/new"]
+
+["header/pagination-cursor"]
+
+["header/passwd-mfa"]
+ default = "密碼和多重要素驗證"
+
+["header/path"]
+ default = "路徑"
+
+["header/permissions"]
+ default = "權限"
+
+["header/preferences"]
+
+["header/reset-password"]
+
+["header/rm-hits"]
+
+["header/settings"]
+ default = "設定"
+
+["header/sign-in-at"]
+
+["header/site-settings"]
+ default = "網站設定"
+
+["header/sites"]
+ default = "網站"
+
+["header/size"]
+ default = "大小"
+
+["header/sizes"]
+ default = "裝置"
+
+["header/start-pagination-cursor"]
+
+["header/started"]
+ default = "開始"
+
+["header/systems"]
+ default = "系統"
+
+["header/title"]
+ default = "標題"
+
+["header/token"]
+
+["header/toprefs"]
+ default = "最佳推薦"
+
+["header/tracking"]
+ default = "追蹤"
+
+["header/updated"]
+
+["header/user-info"]
+ default = "使用者資訊"
+
+["header/user-information"]
+ default = "使用者資訊"
+
+["header/users"]
+ default = "使用者"
+
+["help/allow-visitor-counts"]
+ default = "詳情請參閱 %[the documentation] 了解如何使用。"
+
+["help/campaign-parameters"]
+
+["help/cfg-dashboard"]
+ default = "修改在儀表板上顯示什麼以及顯示的順序。"
+
+["help/code-access"]
+ default = "您可透過 https://[我的代碼].%(domain) 瀏覽您的網站。"
+
+["help/custom-domain"]
+ default = """
+自訂域名,例如 “stats.example.com”。
+注意: 這 不會 阻止大多數廣告攔截器封鎖 GoatCounter,僅僅是作為一個漂亮的「虛榮域名」。
+"""
+
+["help/custom-domain-cname"]
+ default = "設定一個 CNAME 紀錄指向 %(domain)
– %[%docs detailed instructions]。"
+
+["help/custom-domain-error"]
+ default = """
+%[%error Not yet verified];設定一個 CNAME 紀錄指向 %(domain)
– %[%docs detailed instructions]。
+驗證每 2 小時執行一次。
+"""
+
+["help/custom-domain-plan"]
+ default = "需要個人加強版或商業計劃(您目前使用的是 %(plan) 計劃;參見 %[%link billing])。"
+
+["help/custom-domain-verified"]
+
+["help/data-retention"]
+
+["help/domain-access"]
+
+["help/drag-reorder"]
+
+["help/for-the-following-countries"]
+
+["help/goatcounter-domain"]
+
+["help/ignore-ips"]
+
+["help/ignore-ips-2"]
+
+["help/new-user-email"]
+
+["help/new-user-email-confirm"]
+
+["help/no-undo"]
+
+["help/password-edit"]
+
+["help/password-new-user"]
+
+["help/public"]
+
+["help/rm-hits"]
+
+["help/save-default-view"]
+
+["help/turing-test"]
+
+["help/your-email"]
+
+["label/24-hour-clock"]
+ default = "24 小時制時間"
+
+["label/add-new"]
+
+["label/all-sites"]
+ default = "全部網站"
+
+["label/allow-admin-access"]
+
+["label/allow-visitor-counts"]
+
+["label/browser-stats"]
+
+["label/campaign-parameters"]
+
+["label/change-code"]
+
+["label/clear-pageviews"]
+
+["label/code"]
+ default = "代碼"
+
+["label/collected-since"]
+
+["label/csv-compress-format"]
+
+["label/current-passwd"]
+ default = "目前密碼"
+
+["label/custom-domain"]
+ default = "自訂域名"
+
+["label/dashboard-public"]
+
+["label/data-retention"]
+
+["label/date-fmt"]
+ default = "日期格式"
+
+["label/delete-account-confirmation"]
+
+["label/delete-account-contact"]
+
+["label/delete-account-follow-up"]
+
+["label/delete-account-reason"]
+
+["label/delete-account-reason-placeholder"]
+
+["label/email"]
+ default = "信箱"
+
+["label/email-address"]
+ default = "信箱"
+
+["label/for-following-countries"]
+
+["label/goatcounter-domain"]
+ default = "GoatCounter 網域"
+
+["label/ignore-ips"]
+ default = "忽略 IP"
+
+["label/lang"]
+ default = "語言"
+
+["label/language-stats"]
+
+["label/loc-stats"]
+
+["label/mark-current"]
+ default = "(目前)"
+
+["label/match-title"]
+
+["label/mfa-token"]
+
+["label/new-code"]
+
+["label/new-password"]
+ default = "新密碼"
+
+["label/new-password-confirm"]
+ default = "新密碼(確認)"
+
+["label/pagination-cursor"]
+
+["label/password"]
+ default = "密碼"
+
+["label/paths"]
+
+["label/public-anyone"]
+ default = "任何人"
+
+["label/public-private"]
+
+["label/public-token"]
+
+["label/secret"]
+
+["label/secret-access"]
+
+["label/secret-token"]
+
+["label/set-default"]
+
+["label/size-desktop"]
+ default = "電腦螢幕"
+
+["label/size-desktophd"]
+ default = "高解析度電腦螢幕"
+
+["label/size-largephones"]
+ default = "大型手機、小型平板"
+
+["label/size-phones"]
+ default = "手機"
+
+["label/size-stats"]
+
+["label/size-tablets"]
+ default = "平板和小型筆電"
+
+["label/system-stats"]
+
+["label/thousand-separator"]
+
+["label/timezone"]
+ default = "時區"
+
+["label/topref"]
+
+["label/total-pageviews"]
+
+["label/turing-test"]
+ default = "在這裡輸入 9"
+
+["label/verifictation-token"]
+
+["label/week-start"]
+
+["label/your-email"]
+ default = "您的信箱"
+
+["label/your-site"]
+ default = "您的網站"
+
+["link/add-translation"]
+
+["link/api"]
+ default = "API"
+
+["link/api-docs"]
+ default = "API 文件"
+
+["link/billing"]
+
+["link/dashboard"]
+ default = "儀表板"
+
+["link/generate-random"]
+
+["link/goto-path"]
+
+["link/import"]
+ default = "匯入"
+
+["link/passwd-mfa"]
+ default = "密碼和多重要素驗證"
+
+["link/preferences"]
+
+["link/rm-account"]
+ default = "刪除帳號"
+
+["link/rm-views"]
+
+["link/set-from-browser"]
+
+["link/settings"]
+ default = "設定"
+
+["link/show-more"]
+ default = "顯示更多"
+
+["link/sites"]
+ default = "網站"
+
+["link/users"]
+ default = "使用者"
+
+["nav-bot/contact"]
+ default = "聯繫"
+
+["nav-bot/contribute"]
+ default = "貢獻"
+
+["nav-bot/docs"]
+ default = "文件"
+
+["nav-bot/home"]
+ default = "首頁"
+
+["nav-bot/src"]
+ default = "原始碼"
+
+["nav-dash/back"]
+ default = "較舊"
+
+["nav-dash/by-day"]
+
+["nav-dash/current"]
+ default = "目前"
+
+["nav-dash/day"]
+ default = "日"
+
+["nav-dash/end-date"]
+
+["nav-dash/filter"]
+
+["nav-dash/filter-tooltip"]
+
+["nav-dash/forced-daily"]
+
+["nav-dash/forward"]
+ default = "較新"
+
+["nav-dash/half-year"]
+ default = "半年"
+
+["nav-dash/last"]
+ default = "過往"
+
+["nav-dash/month"]
+ default = "月"
+
+["nav-dash/quarter"]
+ default = "季"
+
+["nav-dash/start-date"]
+
+["nav-dash/week"]
+ default = "週"
+
+["nav-dash/year"]
+ default = "年"
+
+["no-title"]
+ default = "無標題"
+
+["notify/add-one-thing"]
+
+["notify/api-token-created"]
+
+["notify/api-token-removed"]
+
+["notify/disabled-multi-factor-auth"]
+
+["notify/email-already-verified"]
+
+["notify/export-started-in-background"]
+
+["notify/import-started-in-background"]
+
+["notify/login-after-password-reset"]
+
+["notify/multi-factor-auth-enabled"]
+
+["notify/need-business-plan-custom-domain"]
+
+["notify/need-email-verification-for-api"]
+
+["notify/no-user-for-token"]
+
+["notify/not-found"]
+ default = "找不到"
+
+["notify/password-changed"]
+ default = "密碼已修改。"
+
+["notify/payment-processed"]
+
+["notify/payment-processing"]
+
+["notify/reset-to-default"]
+ default = "恢復為預設!"
+
+["notify/reset-user-sent"]
+
+["notify/restored-previously-deleted-site"]
+
+["notify/saved"]
+ default = "已儲存!"
+
+["notify/sent-to-email"]
+
+["notify/settings-copied-to-site"]
+
+["notify/site-added"]
+
+["notify/site-removed"]
+
+["notify/started-background-process"]
+
+["notify/user-added"]
+
+["notify/user-removed"]
+
+["notify/users-edited"]
+
+["p/add-goatcounter-to-multiple-websites"]
+
+["p/additional-errors"]
+
+["p/api-intro"]
+
+["p/change-code-request"]
+
+["p/change-email"]
+
+["p/collect-disabled"]
+
+["p/copy-settings-from-current-site"]
+
+["p/csv-file-format"]
+
+["p/delete-account-multi-site"]
+
+["p/delete-account-one-site"]
+
+["p/disable-mfa"]
+
+["p/enable-mfa"]
+
+["p/error"]
+ default = "錯誤:%(error-message)"
+
+["p/export-process"]
+
+["p/have-mfa"]
+
+["p/last-user"]
+ default = "無法刪除或編輯最後一位管理員使用者"
+
+["p/no-data"]
+
+["p/no-matches"]
+
+["p/notify-immediate-change"]
+
+["p/notify-pagination-cursor"]
+
+["p/notify-site-deletion"]
+ default = "%(number) 個網站將被刪除"
+
+["p/remove-site-confirm"]
+
+["p/remove-site-confirm-contact"]
+
+["p/remove-site-confirm-current"]
+
+["p/request-data-recovery"]
+
+["p/rm-hits"]
+
+["p/rm-hits-help"]
+
+["p/rm-pageview-match"]
+
+["p/setting-recovery-disabled-information"]
+
+["p/settings-all-sites"]
+
+["p/site-domain-link-to-page"]
+
+["p/text-data-retention"]
+
+["p/verify-email"]
+
+["page-ranking"]
+
+["restricted-admin-access"]
+
+["scale-y"]
+
+["top-nav/back"]
+ default = "返回"
+
+["top-nav/dashboard"]
+ default = "儀表板"
+
+["top-nav/need-js"]
+
+["top-nav/public-link"]
+
+["top-nav/public-time"]
+
+["top-nav/settings"]
+ default = "設定"
+
+["top-nav/sign-in"]
+ default = "登入"
+
+["top-nav/sign-out"]
+ default = "登出"
+
+["top-nav/site-code"]
+
+["top-nav/sites"]
+ default = "網站:"
+
+["top-nav/updates"]
+
+["top-nav/user"]
+ default = "使用者"
+
+["unknown"]
+ default = "(未知)"
+
+["validate/bool"]
+
+["validate/color"]
+
+["validate/contains"]
+
+["validate/date"]
+
+["validate/domain"]
+
+["validate/email"]
+
+["validate/exclude"]
+
+["validate/hostname"]
+
+["validate/include"]
+
+["validate/int"]
+
+["validate/ip"]
+
+["validate/ipv4"]
+
+["validate/len-longer"]
+
+["validate/len-shorter"]
+
+["validate/phone"]
+
+["validate/range-higher"]
+
+["validate/range-lower"]
+
+["validate/required"]
+
+["validate/url"]
+
+["validate/utf8"]
+ default = "必須為 UTF-8"
+
+["widget-setting/help/align"]
+
+["widget-setting/help/chart-style"]
+ default = "如何顯示圖表"
+
+["widget-setting/help/no-events"]
+
+["widget-setting/help/page-size"]
+
+["widget-setting/help/ref-page-size"]
+
+["widget-setting/help/regions"]
+
+["widget-setting/label/align"]
+
+["widget-setting/label/chart-style"]
+ default = "圖表樣式"
+
+["widget-setting/label/no-events"]
+
+["widget-setting/label/page-size"]
+ default = "頁面數量"
+
+["widget-setting/label/ref-page-size"]
+ default = "推薦頁面數量"
+
+["widget-setting/label/regions"]
+ default = "顯示地區"
+
+["widget-settings/bar-chart"]
+ default = "條形圖"
+
+["widget-settings/line-chart"]
+ default = "折線圖"
+
+["widget-settings/text-chart"]
+ default = "文字表格"
+
+["y-scale"]
+ default = "Y 軸尺寸"
diff --git a/tpl/i18n_manage.gohtml b/tpl/i18n_manage.gohtml
new file mode 100644
index 00000000..7786f5d1
--- /dev/null
+++ b/tpl/i18n_manage.gohtml
@@ -0,0 +1,16 @@
+{{- template "_backend_top.gohtml" . -}}
+
+
+
+{{range $f := .Files}}
+ {{$f.Name}} – {{substr $f.Updated 0 10}}
+ {{$f.File.TOML}}+
{{if $f.Diff}}{{$f.Diff}}{{else}}Identical{{end}}+