diff --git a/Makefile b/Makefile index a288c2d5..c99d1e2e 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .PHONY: build clean ui -VERSION=1.0.5 +VERSION=1.0.6 BIN=answer DIR_SRC=./cmd/answer DOCKER_CMD=docker diff --git a/docs/docs.go b/docs/docs.go index 1f923942..00964d0d 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -6429,9 +6429,6 @@ const docTemplate = `{ "schema.GetOtherUserInfoResp": { "type": "object", "properties": { - "has": { - "type": "boolean" - }, "info": { "$ref": "#/definitions/schema.GetOtherUserInfoByUsernameResp" } @@ -8222,7 +8219,6 @@ const docTemplate = `{ ], "properties": { "status": { - "description": "user status", "type": "string", "enum": [ "normal", @@ -8232,7 +8228,6 @@ const docTemplate = `{ ] }, "user_id": { - "description": "user id", "type": "string" } } @@ -8528,6 +8523,10 @@ const docTemplate = `{ "label": { "type": "string" }, + "progress": { + "description": "Translation completion percentage", + "type": "integer" + }, "value": { "type": "string" } diff --git a/docs/swagger.json b/docs/swagger.json index a2ff2c58..4b25ac65 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -6417,9 +6417,6 @@ "schema.GetOtherUserInfoResp": { "type": "object", "properties": { - "has": { - "type": "boolean" - }, "info": { "$ref": "#/definitions/schema.GetOtherUserInfoByUsernameResp" } @@ -8210,7 +8207,6 @@ ], "properties": { "status": { - "description": "user status", "type": "string", "enum": [ "normal", @@ -8220,7 +8216,6 @@ ] }, "user_id": { - "description": "user id", "type": "string" } } @@ -8516,6 +8511,10 @@ "label": { "type": "string" }, + "progress": { + "description": "Translation completion percentage", + "type": "integer" + }, "value": { "type": "string" } diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 70b24529..d570f396 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -557,8 +557,6 @@ definitions: type: object schema.GetOtherUserInfoResp: properties: - has: - type: boolean info: $ref: '#/definitions/schema.GetOtherUserInfoByUsernameResp' type: object @@ -1819,7 +1817,6 @@ definitions: schema.UpdateUserStatusReq: properties: status: - description: user status enum: - normal - suspended @@ -1827,7 +1824,6 @@ definitions: - inactive type: string user_id: - description: user id type: string required: - status @@ -2039,6 +2035,9 @@ definitions: properties: label: type: string + progress: + description: Translation completion percentage + type: integer value: type: string type: object diff --git a/go.mod b/go.mod index 18327905..cd9a0ee6 100644 --- a/go.mod +++ b/go.mod @@ -36,13 +36,13 @@ require ( github.com/segmentfault/pacman/contrib/server/http v0.0.0-20221018072427-a15dd1434e05 github.com/spf13/cobra v1.6.1 github.com/stretchr/testify v1.8.1 - github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a + github.com/swaggo/files v1.0.0 github.com/swaggo/gin-swagger v1.5.3 - github.com/swaggo/swag v1.8.7 + github.com/swaggo/swag v1.8.10 github.com/tidwall/gjson v1.14.4 github.com/yuin/goldmark v1.4.13 golang.org/x/crypto v0.1.0 - golang.org/x/net v0.1.0 + golang.org/x/net v0.2.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/yaml.v3 v3.0.1 modernc.org/sqlite v1.14.2 @@ -123,7 +123,7 @@ require ( go.uber.org/zap v1.23.0 // indirect golang.org/x/image v0.1.0 // indirect golang.org/x/mod v0.6.0 // indirect - golang.org/x/sys v0.1.0 // indirect + golang.org/x/sys v0.2.0 // indirect golang.org/x/text v0.5.0 // indirect golang.org/x/tools v0.2.0 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/go.sum b/go.sum index 8d715c9f..54cec9cb 100644 --- a/go.sum +++ b/go.sum @@ -670,13 +670,14 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a h1:kAe4YSu0O0UFn1DowNo2MY5p6xzqtJ/wQ7LZynSvGaY= github.com/swaggo/files v0.0.0-20220728132757-551d4a08d97a/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w= +github.com/swaggo/files v1.0.0 h1:1gGXVIeUFCS/dta17rnP0iOpr6CXFwKD7EO5ID233e4= +github.com/swaggo/files v1.0.0/go.mod h1:N59U6URJLyU1PQgFqPM7wXLMhJx7QAolnvfQkqO13kc= github.com/swaggo/gin-swagger v1.5.3 h1:8mWmHLolIbrhJJTflsaFoZzRBYVmEE7JZGIq08EiC0Q= github.com/swaggo/gin-swagger v1.5.3/go.mod h1:3XJKSfHjDMB5dBo/0rrTXidPmgLeqsX89Yp4uA50HpI= github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ= -github.com/swaggo/swag v1.8.7 h1:2K9ivTD3teEO+2fXV6zrZKDqk5IuU2aJtBDo8U7omWU= -github.com/swaggo/swag v1.8.7/go.mod h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk= +github.com/swaggo/swag v1.8.10 h1:eExW4bFa52WOjqRzRD58bgWsWfdFJso50lpbeTcmTfo= +github.com/swaggo/swag v1.8.10/go.mod h1:ezQVUUhly8dludpVk+/PuwJWvLLanB13ygV5Pr9enSk= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= @@ -852,8 +853,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -946,11 +947,12 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/i18n/de_DE.yaml b/i18n/de_DE.yaml index bfc672e6..33b012e3 100644 --- a/i18n/de_DE.yaml +++ b/i18n/de_DE.yaml @@ -107,6 +107,8 @@ backend: other: Should not contain synonym tags. cannot_update: other: No permission to update. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: You cannot set the synonym of the current tag as itself. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Code cannot be empty. language: - label: Language (optional) + label: Language placeholder: Automatic detection btn_cancel: Cancel btn_confirm: Add @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add uploading: Uploading @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) + label: Description btn_cancel: Cancel btn_submit: Submit tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: The following tags will be remapped to delete: title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Close edit_tag: title: Edit Tag @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml index 566aef69..0818309a 100644 --- a/i18n/en_US.yaml +++ b/i18n/en_US.yaml @@ -35,6 +35,10 @@ backend: other: Email and password do not match. error: admin: + cannot_update_their_password: + other: You cannot modify your password. + cannot_modify_self_status: + other: You cannot modify your status. email_or_password_wrong: other: Email and password do not match. answer: @@ -81,6 +85,8 @@ backend: new_password_same_as_previous_setting: other: The new password is the same as the previous one. question: + already_deleted: + other: This post has been deleted. not_found: other: Question not found. cannot_deleted: @@ -109,7 +115,7 @@ backend: cannot_update: other: No permission to update. is_used_cannot_delete: - other: "You cannot delete a tag that is in use" + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: You cannot set the synonym of the current tag as itself. smtp: @@ -837,6 +843,7 @@ ui: approve: Approve reject: Reject skip: Skip + discard_draft: Discard draft search: title: Search Results keywords: Keywords @@ -1033,9 +1040,11 @@ ui: answers: answers accepted: Accepted page_404: + http_error: HTTP Error 404 desc: "Unfortunately, this page doesn't exist." back_home: Back to homepage page_50X: + http_error: HTTP Error 500 desc: The server encountered an error and could not complete your request. back_home: Back to homepage page_maintenance: @@ -1453,6 +1462,10 @@ ui: reputation: reputation votes: votes prompt: - leave_page: "Are you sure you want to leave the page?" - changes_not_save: "Your changes may not be saved." + leave_page: Are you sure you want to leave the page? + changes_not_save: Your changes may not be saved. + draft: + discard_confirm: Are you sure you want to discard your draft? + messages: + post_deleted: This post has been deleted. diff --git a/i18n/es_ES.yaml b/i18n/es_ES.yaml index 0e910971..46c3c761 100644 --- a/i18n/es_ES.yaml +++ b/i18n/es_ES.yaml @@ -107,6 +107,8 @@ backend: other: No debe contener etiquetas sinónimas. cannot_update: other: Sin permiso para actualizar. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: No se puede establecer como sinónimo de una etiqueta la propia etiqueta. smtp: @@ -330,7 +332,7 @@ ui: msg: empty: Código no puede estar vacío. language: - label: Lenguage (opcional) + label: Language placeholder: Detección automática btn_cancel: Cancelar btn_confirm: Añadir @@ -366,7 +368,7 @@ ui: only_image: Solo se permiten archivos de imagen. max_size: El tamaño del archivo no puede superar 4MB. desc: - label: Descripción (opcional) + label: Description tab_url: URL de la imagen form_url: fields: @@ -375,7 +377,7 @@ ui: msg: empty: La URL de la imagen no puede estar vacía. name: - label: Descripción (opcional) + label: Description btn_cancel: Cancelar btn_confirm: Añadir uploading: Subiendo @@ -395,7 +397,7 @@ ui: msg: empty: La dirección no puede estar vacía. name: - label: Descripción (opcional) + label: Description btn_cancel: Cancelar btn_confirm: Añadir ordered_list: @@ -443,7 +445,7 @@ ui: range: URL slug hasta 35 caracteres. character: La URL amigable contiene caracteres no permitidos. desc: - label: Descripción (opcional) + label: Description btn_cancel: Cancelar btn_submit: Enviar tag_info: @@ -460,9 +462,11 @@ ui: synonyms_text: Las siguientes etiquetas serán reasignadas a delete: title: Eliminar esta etiqueta - content: >- -

No se permite la eliminación de etiquetas con posts.

Por favor antes elimina esta etiqueta del post.

- content2: '¿Estás seguro de que deseas borrarlo?' + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Cerrar edit_tag: title: Editar etiqueta @@ -698,13 +702,13 @@ ui: default: Sistema msg: Por favor, sube una imagen bio: - label: Sobre mí (opcional) + label: About Me website: - label: Sitio web (opcional) + label: Website placeholder: "https://example.com" msg: Formato del sitio web incorrecto location: - label: Ubicación (opcional) + label: Location placeholder: "Ciudad, País" notification: heading: Notificaciones @@ -1188,11 +1192,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1202,14 +1206,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1261,18 +1257,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1338,6 +1334,7 @@ ui: label: Inicio de sesión requerido text: Sólo usuarios con sesión iniciada pueden acceder a esta comunidad. form: + optional: (optional) empty: no puede estar en blanco invalid: no es válido btn_submit: Guardar @@ -1387,5 +1384,7 @@ ui: staffs: Nuestor equipo de la comunidad reputation: reputación votes: votos - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/fr_FR.yaml b/i18n/fr_FR.yaml index c51433c4..a331e4b1 100644 --- a/i18n/fr_FR.yaml +++ b/i18n/fr_FR.yaml @@ -107,6 +107,8 @@ backend: other: Ne dois pas contenir de tags synonymes. cannot_update: other: Pas de permission pour mettre à jour. + is_used_cannot_delete: + other: Vous ne pouvez pas supprimer un tag utilisé cannot_set_synonym_as_itself: other: Vous ne pouvez pas définir le synonyme de la balise actuelle comme elle-même. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Le code ne peut pas être vide. language: - label: Langue (facultatif) + label: Langage placeholder: Détection automatique btn_cancel: Annuler btn_confirm: Ajouter @@ -345,7 +347,7 @@ ui: only_image: Seules les images sont autorisées. max_size: La taille du fichier ne doit pas dépasser 4 Mo. desc: - label: Description (optionnel) + label: Description tab_url: URL de l'image form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: L'URL de l'image ne peut pas être vide. name: - label: Description (optionnel) + label: Description btn_cancel: Annuler btn_confirm: Ajouter uploading: Téléversement en cours @@ -374,7 +376,7 @@ ui: msg: empty: L'URL ne peut pas être vide. name: - label: Description (facultatif) + label: Description btn_cancel: Annuler btn_confirm: Ajouter ordered_list: @@ -422,7 +424,7 @@ ui: range: Titre de 35 caractères maximum. character: Le slug d'URL contient un jeu de caractères non autorisé. desc: - label: Description (facultatif) + label: Description btn_cancel: Annuler btn_submit: Valider tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: Les balises suivantes seront remappées en delete: title: Supprimer cette étiquette - content: >- -

Nous ne permettons pas de supprimer le tag avec les posts.

Veuillez d'abord supprimer ce tag des posts.

- content2: Etes-vous sûr de vouloir supprimer ? + tip_with_posts: >- +

Nous ne permettons pas de supprimer un tag avec des posts.

Veuillez d'abord supprimer ce tag des posts.

+ tip_with_synonyms: >- +

Nous ne permettons pas de supprimer un tag avec des synonymes.

Veuillez d'abord supprimer les synonymes de ce tag.

+ tip: Êtes-vous sûr de vouloir supprimer ? close: Fermer edit_tag: title: Editer le tag @@ -677,13 +681,13 @@ ui: default: Système msg: Veuillez charger un avatar bio: - label: À propos de moi (optionnel) + label: À propos de moi website: - label: Site web (facultatif) + label: Site Web placeholder: "https://example.com" msg: Format du site web incorrect location: - label: Emplacement (facultatif) + label: Position placeholder: "Ville, Pays" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Indiquez une URL valide. text: L'adresse de ce site. short_desc: - label: Description courte (optionnel) + label: Description Courte msg: La description courte ne peut pas être vide. text: "La description courte, telle qu'elle est utilisée dans le tag titre de la page d'accueil." desc: - label: Description du site (optionnel) + label: Description du Site msg: La description du site ne peut pas être vide. text: "Décrivez ce site en une phrase, telle qu'elle est utilisée dans la balise meta description." contact_email: @@ -1177,14 +1181,6 @@ ui: text: L'adresse email du responsable du site. interface: page_title: Interface - logo: - label: Logo (optionnel) - msg: Le logo ne peut pas être vide. - text: Vous pouvez télécharger votre image ou la <1>réinitialiser sur le texte du titre du site. - theme: - label: Thème - msg: Le thème ne peut pas être vide. - text: Sélectionne un thème existant. language: label: Langue de l'interface msg: La langue de l'interface ne peut pas être vide. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Marque logo: - label: Logo (optionnel) + label: Logo msg: Le logo ne peut pas être vide. text: L'image du logo en haut à gauche de votre site. Utilisez une grande image rectangulaire avec une hauteur de 56 et un ratio d'aspect supérieur à 3:1. Si laissé vide, le titre du site sera affiché. mobile_logo: - label: Logo mobile (optionnel) + label: Logo Mobile text: Le logo utilisé sur la version mobile de votre site. Utilisez une image rectangulaire large avec une hauteur de 56. Si laissé vide, l'image du paramètre « logo » sera utilisée. square_icon: - label: Icône carrée (optionnel) + label: Icône carrée msg: L'icône carrée ne peut pas être vide. text: Image utilisée comme base pour les icônes de métadonnées. Idéalement supérieure à 512x512. favicon: - label: Favicon (optionnel) + label: Favicon text: Une favicon pour votre site. Pour fonctionner correctement sur un CDN, il doit s'agir d'un png. Sera redimensionné en 32x32. Si laissé vide, « icône carrée » sera utilisé. legal: page_title: Légal @@ -1313,6 +1309,7 @@ ui: label: Connexion requise text: Seuls les utilisateurs connectés peuvent accéder à cette communauté. form: + optional: (optionnel) empty: ne peut pas être vide invalid: est invalide btn_submit: Sauvegarder @@ -1362,5 +1359,7 @@ ui: staffs: Staff de la communauté reputation: réputation votes: votes - + prompt: + leave_page: "Voulez-vous vraiment quitter la page ?" + changes_not_save: "Impossible d'enregistrer vos modifications." diff --git a/i18n/i18n.yaml b/i18n/i18n.yaml index 87db7100..a0b7a80f 100644 --- a/i18n/i18n.yaml +++ b/i18n/i18n.yaml @@ -1,26 +1,41 @@ # all support language language_options: - - label: "English(US)" + - label: "English" value: "en_US" - - label: "Español(ES)" + progress: 100 + - label: "Español" value: "es_ES" - - label: "Português(PT)" + progress: 0 + - label: "Português(BR)" + value: "pt_BR" + progress: 0 + - label: "Português" value: "pt_PT" - - label: "Deutsch(DE)" + progress: 0 + - label: "Deutsch" value: "de_DE" - - label: "Français(FR)" + progress: 4 + - label: "Français" value: "fr_FR" - - label: "日本語(JA)" + progress: 100 + - label: "日本語" value: "ja_JP" - - label: "Italiano(IT)" + progress: 0 + - label: "Italiano" value: "it_IT" - - label: "Русский(RU)" + progress: 16 + - label: "Русский" value: "ru_RU" - - label: "简体中文(CN)" + progress: 13 + - label: "简体中文" value: "zh_CN" - - label: "繁體中文(CN)" + progress: 100 + - label: "繁體中文" value: "zh_TW" - - label: "한국어(KO)" + progress: 100 + - label: "한국어" value: "ko_KR" - - label: "Tiếng Việt(VI)" + progress: 0 + - label: "Tiếng Việt" value: "vi_VN" + progress: 0 diff --git a/i18n/id_ID.yaml b/i18n/id_ID.yaml index 03a089c6..096133fc 100644 --- a/i18n/id_ID.yaml +++ b/i18n/id_ID.yaml @@ -107,6 +107,8 @@ backend: other: Tidak boleh mengandung Tag sinonim. cannot_update: other: Tidak memiliki izin untuk memperbaharui. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: Anda tidak bisa menetapkan sinonim dari tag saat ini dengan tag yang sama. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Code tidak boleh kosong. language: - label: Bahasa (opsional) + label: Language placeholder: Deteksi otomatis btn_cancel: Batal btn_confirm: Tambah @@ -345,7 +347,7 @@ ui: only_image: Hanya file Gambar yang diperbolehkan. max_size: Ukuran file tidak boleh melebihi 4MB. desc: - label: Deskripsi (opsional) + label: Description tab_url: URL gambar form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: URL gambar tidak boleh kosong. name: - label: Deskripsi (opsional) + label: Description btn_cancel: Batal btn_confirm: Tambah uploading: Sedang mengunggah @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Batal btn_confirm: Tambah ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) + label: Description btn_cancel: Cancel btn_submit: Submit tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: Tag berikut akan dipetakan ulang ke delete: title: Hapus tagar ini - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Anda yakin ingin menghapusnya? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Tutup edit_tag: title: Ubah Tag @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/it_IT.yaml b/i18n/it_IT.yaml index 42950b5d..e8492e22 100644 --- a/i18n/it_IT.yaml +++ b/i18n/it_IT.yaml @@ -107,6 +107,8 @@ backend: other: Non deve contenere tag sinonimi. cannot_update: other: Nessun permesso per l'aggiornamento. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: Non puoi impostare il sinonimo del tag corrente come se stesso. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Code cannot be empty. language: - label: Language (optional) + label: Language placeholder: Automatic detection btn_cancel: Cancel btn_confirm: Add @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add uploading: Uploading @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) + label: Description btn_cancel: Cancel btn_submit: Submit tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: The following tags will be remapped to delete: title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Close edit_tag: title: Edit Tag @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/ja_JP.yaml b/i18n/ja_JP.yaml index 14c553f5..3503ceba 100644 --- a/i18n/ja_JP.yaml +++ b/i18n/ja_JP.yaml @@ -107,6 +107,8 @@ backend: other: Should not contain synonym tags. cannot_update: other: No permission to update. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: You cannot set the synonym of the current tag as itself. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Code cannot be empty. language: - label: Language (optional) + label: Language placeholder: Automatic detection btn_cancel: Cancel btn_confirm: Add @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add uploading: Uploading @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) + label: Description btn_cancel: Cancel btn_submit: Submit tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: The following tags will be remapped to delete: title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Close edit_tag: title: Edit Tag @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/ko_KR.yaml b/i18n/ko_KR.yaml index 14c553f5..3503ceba 100644 --- a/i18n/ko_KR.yaml +++ b/i18n/ko_KR.yaml @@ -107,6 +107,8 @@ backend: other: Should not contain synonym tags. cannot_update: other: No permission to update. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: You cannot set the synonym of the current tag as itself. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Code cannot be empty. language: - label: Language (optional) + label: Language placeholder: Automatic detection btn_cancel: Cancel btn_confirm: Add @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add uploading: Uploading @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) + label: Description btn_cancel: Cancel btn_submit: Submit tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: The following tags will be remapped to delete: title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Close edit_tag: title: Edit Tag @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/pt_BR.yaml b/i18n/pt_BR.yaml index 14c553f5..49a4bd4f 100644 --- a/i18n/pt_BR.yaml +++ b/i18n/pt_BR.yaml @@ -2,914 +2,914 @@ backend: base: success: - other: Success. + other: Sucesso. unknown: - other: Unknown error. + other: Erro desconhecido. request_format_error: - other: Request format is not valid. + other: O formato da Requisição não é válido. unauthorized_error: - other: Unauthorized. + other: Não autorizado. database_error: - other: Data server error. + other: Erro no servidor de dados. role: name: user: - other: User + other: Usuário admin: - other: Admin + other: Administrador moderator: - other: Moderator + other: Moderador description: user: - other: Default with no special access. + other: Padrão sem acesso especial. admin: - other: Have the full power to access the site. + other: Possui controle total para acessar o site. moderator: - other: Has access to all posts except admin settings. + other: Não possui controle a todas as postagens exceto configurações de administrador. email: - other: Email + other: E-mail password: - other: Password + other: Senha email_or_password_wrong_error: - other: Email and password do not match. + other: E-mail e Senha inválidos. error: admin: email_or_password_wrong: - other: Email and password do not match. + other: E-mail e Senha inválidos. answer: not_found: - other: Answer do not found. + other: Resposta não encontrada. cannot_deleted: - other: No permission to delete. + other: Permissão insuficiente para deletar. cannot_update: - other: No permission to update. + other: Permissão insuficiente para atualizar. comment: edit_without_permission: - other: Comment are not allowed to edit. + other: Não é permitido atualizar comentários. not_found: - other: Comment not found. + other: Comentário não encontrado. cannot_edit_after_deadline: - other: The comment time has been too long to modify. + other: O tempo para comentários expirou. email: duplicate: - other: Email already exists. + other: E-mail já existe na base de dados. need_to_be_verified: - other: Email should be verified. + other: E-mail precisa ser verificado. verify_url_expired: - other: Email verified URL has expired, please resend the email. + other: A URL de validação do e-mail expirou, por favor, re-envie o e-mail. lang: not_found: - other: Language file not found. + other: Arquivo de idioma não encontrado. object: captcha_verification_failed: - other: Captcha wrong. + other: Captcha inválido. disallow_follow: - other: You are not allowed to follow. + other: Você não possui permissão para seguir. disallow_vote: - other: You are not allowed to vote. + other: Você não possui permissão para votar. disallow_vote_your_self: - other: You can't vote for your own post. + other: Você não pode votar na sua própria postagem. not_found: - other: Object not found. + other: Objeto não encontrado. verification_failed: - other: Verification failed. + other: Falha na verificação. email_or_password_incorrect: - other: Email and password do not match. + other: E-mail e Senha não conferem. old_password_verification_failed: - other: The old password verification failed + other: Verficação de senhas antigas falhou. new_password_same_as_previous_setting: - other: The new password is the same as the previous one. + other: A nova senha é idêntica à senha anterior. question: not_found: - other: Question not found. + other: Pergunta não encontrada. cannot_deleted: - other: No permission to delete. + other: Não possui permissão para deletar. cannot_close: - other: No permission to close. + other: Não possui permissão para fechar. cannot_update: - other: No permission to update. + other: Não possui permissão para atualizar.. rank: fail_to_meet_the_condition: - other: Rank fail to meet the condition. + other: A classificação não atende à condição. report: handle_failed: - other: Report handle failed. + other: Falha no processamento do relatório. not_found: - other: Report not found. + other: Relatório não encontrado. tag: not_found: - other: Tag not found. + other: Marcador não encontada. recommend_tag_not_found: - other: Recommend Tag is not exist. + other: Marcador recomendado não existe. recommend_tag_enter: - other: Please enter at least one required tag. + other: Por favor, insira ao menos um marcador obrigatório. not_contain_synonym_tags: - other: Should not contain synonym tags. + other: Não pode contar marcadores de sinônimos. cannot_update: - other: No permission to update. + other: Não possui permissão para atualizar. cannot_set_synonym_as_itself: - other: You cannot set the synonym of the current tag as itself. + other: Você não pode definir o sinônimo do marcador atual como ela mesma. smtp: config_from_name_cannot_be_email: - other: The From Name cannot be a email address. - theme: + other: O De Nome não pode ser um endereço de e-mail. + Tema: not_found: - other: Theme not found. + other: Tema não encontrado. revision: review_underway: - other: Can't edit currently, there is a version in the review queue. + other: Não é possível editar no momento, há uma versão na fila de revisão. no_permission: - other: No permission to Revision. + other: Sem pemissão para revisar. user: email_or_password_wrong: other: - other: Email and password do not match. + other: E-mail e senha não correspondem. not_found: - other: User not found. + other: Usuário não encontrado. suspended: - other: User has been suspended. + other: Usuário foi suspenso. username_invalid: - other: Username is invalid. + other: Nome de usuário inválido. username_duplicate: - other: Username is already in use. + other: Nome de usuário já está em uso. set_avatar: - other: Avatar set failed. + other: Falha ao configurar Avatar. cannot_update_your_role: - other: You cannot modify your role. + other: Você não pode modificar a sua função. not_allowed_registration: - other: Currently the site is not open for registration + other: Atualmente o site não está aberto para cadastro config: read_config_failed: - other: Read config failed + other: A leitura da configuração falhou database: connection_failed: - other: Database connection failed + other: Falha na conexão com o banco de dados create_table_failed: - other: Create table failed + other: Falha na criação de tabela install: create_config_failed: - other: Can't create the config.yaml file. + other: Não foi possível criar o arquivo config.yaml. upload: unsupported_file_format: - other: Unsupported file format. + other: Formato de arquivo não suportado. report: spam: name: other: spam desc: - other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic. + other: Este post é um anúncio, ou vandalismo. Não é útil ou relevante para o tópico atual. rude: name: - other: rude or abusive + other: rude ou abusivo desc: - other: A reasonable person would find this content inappropriate for respectful discourse. + other: Uma pessoa razoável acharia este conteúdo impróprio para um discurso respeitoso. duplicate: name: - other: a duplicate + other: uma duplicidade desc: - other: This question has been asked before and already has an answer. + other: Esta pergunta já foi feita antes e já tem uma resposta. not_answer: name: - other: not an answer + other: não é uma resposta desc: - other: This was posted as an answer, but it does not attempt to answer the question. It should possibly be an edit, a comment, another question, or deleted altogether. + other: Isso foi postado como uma resposta, mas não tenta responder à pergunta. Possivelmente deve ser uma edição, um comentário, outra pergunta ou excluído completamente. not_need: name: - other: no longer needed + other: não é mais necessário desc: - other: This comment is outdated, conversational or not relevant to this post. + other: Este comentário está desatualizado, coloquial ou não é relevante para esta postagem. other: name: - other: something else + other: algo mais desc: - other: This post requires staff attention for another reason not listed above. + other: Esta postagem requer atenção da equipe por outro motivo não listado acima. question: close: duplicate: name: other: spam desc: - other: This question has been asked before and already has an answer. + other: Esta pergunta já foi feita antes e já tem uma resposta. guideline: name: - other: a community-specific reason + other: um motivo específico da comunidade desc: - other: This question doesn't meet a community guideline. + other: Esta pergunta não atende a uma diretriz da comunidade. multiple: name: - other: needs details or clarity + other: precisa de detalhes ou clareza desc: - other: This question currently includes multiple questions in one. It should focus on one problem only. + other: Esta pergunta atualmente inclui várias perguntas em uma. Deve se concentrar em apenas um problema. other: name: - other: something else + other: algo mais desc: - other: This post requires another reason not listed above. + other: Este post requer outro motivo não listado acima. operation_type: asked: - other: asked + other: perguntado answered: - other: answered + other: respondido modified: - other: modified + other: modificado notification: action: update_question: - other: updated question + other: pergunta atualizada answer_the_question: - other: answered question + other: pergunta respondida update_answer: - other: updated answer + other: resposta atualizada accept_answer: - other: accepted answer + other: resposta aceita comment_question: - other: commented question + other: pergunta comentada comment_answer: - other: commented answer + other: resposta comentada reply_to_you: - other: replied to you + other: respondeu a você mention_you: - other: mentioned you + other: mencionou você your_question_is_closed: - other: Your question has been closed + other: A sua pergunta foi fechada your_question_was_deleted: - other: Your question has been deleted + other: A sua pergunta foi deletada your_answer_was_deleted: - other: Your answer has been deleted + other: A sua resposta foi deletada your_comment_was_deleted: - other: Your comment has been deleted + other: O seu comentário foi deletado #The following fields are used for interface presentation(Front-end) ui: how_to_format: - title: How to Format + title: Como formatar desc: >- - + pagination: - prev: Prev - next: Next + prev: Anterior + next: Próximo page_title: - question: Question - questions: Questions - tag: Tag - tags: Tags - tag_wiki: tag wiki - edit_tag: Edit Tag - ask_a_question: Add Question - edit_question: Edit Question - edit_answer: Edit Answer - search: Search - posts_containing: Posts containing - settings: Settings - notifications: Notifications - login: Log In - sign_up: Sign Up - account_recovery: Account Recovery - account_activation: Account Activation - confirm_email: Confirm Email - account_suspended: Account Suspended - admin: Admin - change_email: Modify Email - install: Answer Installation - upgrade: Answer Upgrade - maintenance: Website Maintenance - users: Users + question: Pergunta + questions: Perguntas + tag: Marcador + tags: Marcadores + tag_wiki: marcador wiki + edit_tag: Editar Marcador + ask_a_question: Adicionar Pergunta + edit_question: Editar Pergunta + edit_answer: Editar Resposta + search: Busca + posts_containing: Postagens contendo + settings: Configurações + notifications: Notificações + login: Entrar + sign_up: Criar conta + account_recovery: Recuperação de conta + account_activation: Ativação de conta + confirm_email: Confirmação de e-mail + account_suspended: Conta suspensa + admin: Administrador + change_email: Modificar e-mail + install: Instalação do Resposta + upgrade: Atualização do Resposta + maintenance: Manutençã do Website + users: Usuários notifications: - title: Notifications - inbox: Inbox - achievement: Achievements - all_read: Mark all as read - show_more: Show more + title: Notificações + inbox: Caixa de entrada + achievement: Conquistas + all_read: Marcar todas como lidas + show_more: Mostrar mais suspended: - title: Your Account has been Suspended - until_time: "Your account was suspended until {{ time }}." - forever: This user was suspended forever. - end: You don't meet a community guideline. + title: A sua conta foi suspensa + until_time: "A sua conta foi suspensa até {{ time }}." + forever: Este usuário foi suspenso por tempo indeterminado. + end: Você não atende a uma diretriz da comunidade. editor: blockquote: - text: Blockquote + text: Bloco de citação bold: - text: Strong + text: Forte chart: - text: Chart - flow_chart: Flow chart - sequence_diagram: Sequence diagram - class_diagram: Class diagram - state_diagram: State diagram - entity_relationship_diagram: Entity relationship diagram - user_defined_diagram: User defined diagram - gantt_chart: Gantt chart - pie_chart: Pie chart + text: Gráfico + flow_chart: Fluxograma + sequence_diagram: Diagrama de sequência + class_diagram: Diagrama de classe + state_diagram: Diagrama de estado + entity_relationship_diagram: Diagrama de relacionamento de entidade + user_defined_diagram: Diagrama definido pelo usuário + gantt_chart: Diagrama de Gantt + pie_chart: Gráfico de pizza code: - text: Code Sample - add_code: Add code sample + text: Código de exemplo + add_code: Adicione código de exemplo form: fields: code: - label: Code + label: Código msg: - empty: Code cannot be empty. + empty: Código não pode ser vazio. language: - label: Language (optional) - placeholder: Automatic detection - btn_cancel: Cancel - btn_confirm: Add + label: Idioma (opcional) + placeholder: Tetecção automática + btn_cancel: Cancelar + btn_confirm: Adicionar formula: - text: Formula + text: Fórmula options: - inline: Inline formula - block: Block formula - heading: - text: Heading + inline: Fórmula em linha + block: Fórmula em bloco + Cabeçalho: + text: Cabeçalho options: - h1: Heading 1 - h2: Heading 2 - h3: Heading 3 - h4: Heading 4 - h5: Heading 5 - h6: Heading 6 + h1: Cabeçalho 1 + h2: Cabeçalho 2 + h3: Cabeçalho 3 + h4: Cabeçalho 4 + h5: Cabeçalho 5 + h6: Cabeçalho 6 help: - text: Help + text: Ajuda hr: - text: Horizontal Rule + text: Régua horizontal image: - text: Image - add_image: Add image - tab_image: Upload image + text: Imagem + add_image: Adicionar imagem + tab_image: Enviar image, form_image: fields: file: - label: Image File - btn: Select image + label: Arquivo de imagem + btn: Selecione imagem msg: - empty: File cannot be empty. - only_image: Only image files are allowed. - max_size: File size cannot exceed 4MB. + empty: Arquivo não pode ser vazio. + only_image: Somente um arquivo de imagem é permitido. + max_size: O tamanho do arquivo não pode exceder 4MB. desc: - label: Description (optional) - tab_url: Image URL + label: Descrição (opcional) + tab_url: URL da imagem form_url: fields: url: - label: Image URL + label: URL da imagem msg: - empty: Image URL cannot be empty. + empty: URL da imagem não pode ser vazia. name: - label: Description (optional) - btn_cancel: Cancel - btn_confirm: Add - uploading: Uploading + label: Descrição (opcional) + btn_cancel: Cancelar + btn_confirm: Adicionar + uploading: Enviando indent: - text: Indent + text: Identação outdent: - text: Outdent + text: Não identado italic: - text: Emphasis + text: Emphase link: - text: Hyperlink - add_link: Add hyperlink + text: Superlink (Hyperlink) + add_link: Adicionar superlink (hyperlink) form: fields: url: label: URL msg: - empty: URL cannot be empty. + empty: URL não pode ser vazia. name: - label: Description (optional) - btn_cancel: Cancel - btn_confirm: Add + label: Descrição (opcional) + btn_cancel: Cancelar + btn_confirm: Adicionar ordered_list: - text: Numbered List + text: Lista numerada unordered_list: - text: Bulleted List + text: Lista com marcadores table: - text: Table - heading: Heading - cell: Cell + text: Tabela + Cabeçalho: Cabeçalho + cell: Célula close_modal: - title: I am closing this post as... - btn_cancel: Cancel - btn_submit: Submit + title: Estou fechando este post como... + btn_cancel: Cancelar + btn_submit: Enviar remark: - empty: Cannot be empty. + empty: Não pode ser vazio. msg: - empty: Please select a reason. + empty: Por favor selecione um motivo. report_modal: flag_title: I am flagging to report this post as... - close_title: I am closing this post as... - review_question_title: Review question - review_answer_title: Review answer - review_comment_title: Review comment - btn_cancel: Cancel - btn_submit: Submit + close_title: Estou fechando este post como... + review_question_title: Revisar pergunta + review_answer_title: Revisar resposta + review_comment_title: Revisar comentário + btn_cancel: Cancelar + btn_submit: Enviar remark: - empty: Cannot be empty. + empty: Não pode ser vazio. msg: - empty: Please select a reason. + empty: Por favor selecione um motivo. tag_modal: - title: Create new tag + title: Criar novo marcador form: fields: display_name: - label: Display Name + label: Nome de exibição msg: - empty: Display name cannot be empty. - range: Display name up to 35 characters. + empty: Nome de exibição não pode ser vazio. + range: Nome de exibição tem que ter até 35 caracteres. slug_name: - label: URL Slug - desc: 'Must use the character set "a-z", "0-9", "+ # - ."' + label: Slug de URL + desc: 'Deve usar o conjunto de caracteres "a-z", "0-9", "+ # - ."' msg: - empty: URL slug cannot be empty. - range: URL slug up to 35 characters. - character: URL slug contains unallowed character set. + empty: URL slug não pode ser vazio. + range: URL slug até 35 caracteres. + character: URL slug contém conjunto de caracteres não permitido. desc: - label: Description (optional) - btn_cancel: Cancel - btn_submit: Submit + label: Descrição (opcional) + btn_cancel: Cancelar + btn_submit: Enviar tag_info: - created_at: Created - edited_at: Edited - history: History + created_at: Criado + edited_at: Editado + history: Histórico synonyms: - title: Synonyms - text: The following tags will be remapped to - empty: No synonyms found. - btn_add: Add a synonym - btn_edit: Edit - btn_save: Save - synonyms_text: The following tags will be remapped to + title: Sinônimos + text: Os marcadores a seguir serão re-mapeados para + empty: Sinônimos não encotrados. + btn_add: Adicionar um sinônimo + btn_edit: Editar + btn_save: Salvar + synonyms_text: Os marcadores a seguir serão re-mapeados para delete: - title: Delete this tag + title: Deletar este marcador content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? - close: Close +

Não permitimos a exclusão de marcadores com postagens.

Por favor, remova este marcador das postagens primeiro.

+ content2: Você tem certeza que deseja deletar? + close: Fechar edit_tag: - title: Edit Tag - default_reason: Edit tag + title: Editar marcador + default_reason: Editar marcador form: fields: revision: - label: Revision + label: Revisão display_name: - label: Display Name + label: Nome de exibição slug_name: - label: URL Slug - info: 'Must use the character set "a-z", "0-9", "+ # - ."' + label: Slug de URL + info: 'Deve usar o conjunto de caracteres "a-z", "0-9", "+ # - ."' desc: - label: Description + label: Descrição edit_summary: - label: Edit Summary + label: Resumo da edição placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_save_edits: Save edits - btn_cancel: Cancel + Explique resumidamente suas alterações (ortografia corrigida, gramática corrigida, formatação aprimorada) + btn_save_edits: Salvar edições + btn_cancel: Cancelar dates: - long_date: MMM D - long_date_with_year: "MMM D, YYYY" - long_date_with_time: "MMM D, YYYY [at] HH:mm" - now: now - x_seconds_ago: "{{count}}s ago" - x_minutes_ago: "{{count}}m ago" - x_hours_ago: "{{count}}h ago" - hour: hour - day: day + long_date: D MMM + long_date_with_year: "D MMM, YYYY" + long_date_with_time: "D MMM, YYYY [at] HH:mm" + now: agora + x_seconds_ago: "{{count}}s atrás" + x_minutes_ago: "{{count}}m atrás" + x_hours_ago: "{{count}}h atrás" + hour: hora + day: dia comment: - btn_add_comment: Add comment - reply_to: Reply to - btn_reply: Reply - btn_edit: Edit - btn_delete: Delete - btn_flag: Flag - btn_save_edits: Save edits - btn_cancel: Cancel - show_more: Show more comments + btn_add_comment: Adicionar comentário + reply_to: Responder a + btn_reply: Responder + btn_edit: Editar + btn_delete: Deletar + btn_flag: Marcador + btn_save_edits: Salvar edições + btn_cancel: Cancelar + show_more: Mostrar mais comentários tip_question: >- - Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. + Use os comentários para pedir mais informações ou sugerir melhorias. Evite responder perguntas nos comentários. tip_answer: >- - Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + Use comentários para responder a outros usuários ou notificá-los sobre alterações. Se você estiver adicionando novas informações, edite sua postagem em vez de comentar. edit_answer: - title: Edit Answer - default_reason: Edit answer + title: Editar Resposta + default_reason: Editar Resposta form: fields: revision: - label: Revision + label: Revisão answer: - label: Answer + label: Resposta feedback: - characters: content must be at least 6 characters in length. + caracteres: conteúdo deve ser pelo menos 6 caracteres em comprimento. edit_summary: - label: Edit Summary + label: Resumo da edição placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_save_edits: Save edits - btn_cancel: Cancel + Explique resumidamente suas alterações (ortografia corrigida, gramática corrigida, formatação aprimorada) + btn_save_edits: Salvar edições + btn_cancel: Cancelar tags: - title: Tags + title: Marcadores sort_buttons: popular: Popular - name: Name - newest: newest - button_follow: Follow - button_following: Following - tag_label: questions - search_placeholder: Filter by tag name - no_desc: The tag has no description. - more: More + name: Nome + newest: mais recente + button_follow: Seguir + button_following: Seguindo + tag_label: perguntas + search_placeholder: Filtrar por nome de marcador + no_desc: O marcador não possui descrição. + more: Mais ask: - title: Add Question - edit_title: Edit Question - default_reason: Edit question - similar_questions: Similar questions + title: Adicionar Pergunta + edit_title: Editar Pergunta + default_reason: Editar pergunta + similar_questions: Similar perguntas form: fields: revision: - label: Revision + label: Revisão title: - label: Title - placeholder: Be specific and imagine you're asking a question to another person + label: Título + placeholder: Seja específico e tenha em mente que está fazendo uma pergunta a outra pessoa msg: - empty: Title cannot be empty. - range: Title up to 150 characters + empty: Título não pode ser vazio. + range: Título até 150 caracteres body: - label: Body + label: Corpo msg: - empty: Body cannot be empty. + empty: Corpo da mensagem não pode ser vazio. tags: - label: Tags + label: Marcadores msg: - empty: Tags cannot be empty. + empty: Marcadores não podes ser vazios. answer: - label: Answer + label: Resposta msg: - empty: Answer cannot be empty. + empty: Resposta não pode ser vazia. edit_summary: - label: Edit Summary + label: Resumo da edição placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_post_question: Post your question - btn_save_edits: Save edits - answer_question: Answer your own question - post_question&answer: Post your question and answer + Explique resumidamente suas alterações (ortografia corrigida, gramática corrigida, formatação aprimorada) + btn_post_question: Publicação a sua pergunta + btn_save_edits: Salvar edições + answer_question: Responda a sua própria pergunta + post_question&answer: Publicação a sua pergunta e resposta tag_selector: - add_btn: Add tag - create_btn: Create new tag - search_tag: Search tag - hint: "Describe what your question is about, at least one tag is required." - no_result: No tags matched - tag_required_text: Required tag (at least one) + add_btn: Adicionar marcador + create_btn: Criar novo marcador + search_tag: Procurar marcador + hint: "Descreva do quê se trata a sua pergunta, ao menos um marcador é requirido." + no_result: Nenhum marcador correspondente + tag_required_text: Marcador obrigatório (ao menos um) header: nav: - question: Questions - tag: Tags - user: Users - profile: Profile - setting: Settings - logout: Log out - admin: Admin - review: Review + question: Perguntas + tag: Marcadores + user: Usuários + profile: Perfil + setting: Configurações + logout: Sair + admin: Administrador + review: Revisar search: - placeholder: Search + placeholder: Procurar footer: build_on: >- Built on <1> Answer - the open-source software that powers Q&A communities.
Made with love © {{cc}}. upload_img: - name: Change - loading: loading... + name: Mudar + loading: carregando... pic_auth_code: title: Captcha - placeholder: Type the text above + placeholder: Escreva o texto acima msg: - empty: Captcha cannot be empty. + empty: Captcha não pode ser vazio. inactive: first: >- - You're almost done! We sent an activation mail to {{mail}}. Please follow the instructions in the mail to activate your account. - info: "If it doesn't arrive, check your spam folder." + Você está quase pronto! Enviamos um e-mail de ativação para {{mail}}. Por favor, siga as instruções no e-mail para ativar uma conta sua. + info: "Se não chegar, verifique sua pasta de spam." another: >- - We sent another activation email to you at {{mail}}. It might take a few minutes for it to arrive; be sure to check your spam folder. + Enviamos outro e-mail de ativação para você em {{mail}}. Pode levar alguns minutos para chegar; certifique-se de verificar sua pasta de spam. btn_name: Resend activation email - change_btn_name: Change email + change_btn_name: Mudar email msg: - empty: Cannot be empty. + empty: Não pode ser vazio. login: - page_title: Welcome to {{site_name}} - login_to_continue: Log in to continue - info_sign: Don't have an account? <1>Sign up - info_login: Already have an account? <1>Log in - agreements: By registering, you agree to the <1>privacy policy and <3>terms of service. - forgot_pass: Forgot password? + page_title: Bem vindo ao {{site_name}} + login_to_continue: Entre para continue + info_sign: Não possui uma conta? <1>Cadastrar-se + info_login: Já possui uma conta? <1>Entre + agreements: Ao se registrar, você concorda com as <1>políticas de privacidades e os <3>termos de serviços. + forgot_pass: Esqueceu a sua senha? name: - label: Name + label: Nome msg: - empty: Name cannot be empty. - range: Name up to 30 characters. + empty: Nome não pode ser vazio. + range: Nome até 30 caracteres. email: - label: Email + label: E-mail msg: - empty: Email cannot be empty. + empty: E-mail não pode ser vazio. password: - label: Password + label: Senha msg: - empty: Password cannot be empty. - different: The passwords entered on both sides are inconsistent + empty: Senha não pode ser vazia. + different: As senhas inseridas em ambos os campos são inconsistentes account_forgot: - page_title: Forgot Your Password - btn_name: Send me recovery email + page_title: Esqueceu a sua senha + btn_name: Enviar e-mail de recuperação de senha send_success: >- - If an account matches {{mail}}, you should receive an email with instructions on how to reset your password shortly. + Se uma conta corresponder {{mail}}, você deve receber um e-mail com instruções sobre como redefinir sua senha em breve. email: - label: Email + label: E-mail msg: - empty: Email cannot be empty. + empty: E-mail não pode ser vazio. change_email: - page_title: Welcome to {{site_name}} - btn_cancel: Cancel - btn_update: Update email address + page_title: Bem vindo ao {{site_name}} + btn_cancel: Cancelar + btn_update: Atualiza email address send_success: >- - If an account matches {{mail}}, you should receive an email with instructions on how to reset your password shortly. + Se uma conta corresponder {{mail}}, você deve receber um e-mail com instruções sobre como redefinir sua senha em breve. email: - label: New Email + label: Novo E-mail msg: - empty: Email cannot be empty. + empty: E-mail não pode ser vazio. password_reset: - page_title: Password Reset - btn_name: Reset my password + page_title: Redefinir senha + btn_name: Redefinir minha senha reset_success: >- - You successfully changed your password; you will be redirected to the log in page. + Você alterou com sucesso uma senha sua; você será redirecionado para a página de login. link_invalid: >- - Sorry, this password reset link is no longer valid. Perhaps your password is already reset? - to_login: Continue to log in page + Desculpe, este link de redefinição de senha não é mais válido. Talvez uma senha sua já tenha sido redefinida? + to_login: Continuar para a tela de login password: - label: Password + label: Senha msg: - empty: Password cannot be empty. - length: The length needs to be between 8 and 32 - different: The passwords entered on both sides are inconsistent + empty: Senha não pode ser vazio. + length: O comprimento deve estar entre 8 e 32 + different: As senhas inseridas em ambos os campos são inconsistentes password_confirm: - label: Confirm New Password + label: Confirmar Nova senha settings: - page_title: Settings + page_title: Configurações nav: - profile: Profile - notification: Notifications - account: Account + profile: Perfil + notification: Notificações + account: Conta interface: Interface profile: - heading: Profile - btn_name: Save + Cabeçalho: Perfil + btn_name: Salvar display_name: - label: Display Name - msg: Display name cannot be empty. - msg_range: Display name up to 30 characters. + label: Nome de exibição + msg: Nome de exibição não pode ser vazio. + msg_range: Nome de exibição tem que ter até 30 caracteres. username: - label: Username - caption: People can mention you as "@username". - msg: Username cannot be empty. - msg_range: Username up to 30 characters. - character: 'Must use the character set "a-z", "0-9", " - . _"' + label: Nome de usuário + caption: As pessoas poderão mensionar você com "@usuário". + msg: Nome de usuário não pode ser vazio. + msg_range: Nome de usuário até 30 caracteres. + character: 'Deve usar o conjunto de caracteres "a-z", "0-9", " - . _"' avatar: - label: Profile Image + label: Perfil Imagem gravatar: Gravatar - gravatar_text: You can change image on <1>gravatar.com - custom: Custom - btn_refresh: Refresh - custom_text: You can upload your image. + gravatar_text: Você pode mudar a imagem em <1>gravatar.com + custom: Customizado + btn_refresh: Atualizar + custom_text: Você pode enviar a sua image. default: System - msg: Please upload an avatar + msg: Por favor envie um avatar bio: - label: About Me (optional) + label: Sobre mim (opcional) website: - label: Website (optional) - placeholder: "https://example.com" - msg: Website incorrect format + label: Website (opcional) + placeholder: "https://exemplo.com.br" + msg: Formato incorreto de endereço de Website location: - label: Location (optional) - placeholder: "City, Country" + label: Localização (opcional) + placeholder: "Cidade, País" notification: - heading: Notifications + Cabeçalho: Notificações email: - label: Email Notifications - radio: "Answers to your questions, comments, and more" + label: E-mail Notificações + radio: "Responda as suas perguntas, comentários, e mais" account: - heading: Account - change_email_btn: Change email - change_pass_btn: Change password + Cabeçalho: Conta + change_email_btn: Mudar e-mail + change_pass_btn: Mudar senha change_email_info: >- - We've sent an email to that address. Please follow the confirmation instructions. + Enviamos um e-mail para esse endereço. Siga as instruções de confirmação. email: - label: Email - msg: Email cannot be empty. - password_title: Password + label: E-mail + msg: E-mail não pode ser vazio. + password_title: Senha current_pass: - label: Current Password + label: Senha atual msg: - empty: Current Password cannot be empty. - length: The length needs to be between 8 and 32. - different: The two entered passwords do not match. + empty: A Senha não pode ser vazia. + length: O comprimento deve estar entre 8 and 32. + different: As duas senhas inseridas não correspondem. new_pass: - label: New Password + label: Nova Senha pass_confirm: - label: Confirm New Password + label: Confirmar nova Senha interface: - heading: Interface + Cabeçalho: Interface lang: - label: Interface Language - text: User interface language. It will change when you refresh the page. + label: Idioma da Interface + text: Idioma da interface do usuário. A interface mudará quando você atualizar a página. toast: - update: update success - update_password: Password changed successfully. - flag_success: Thanks for flagging. - forbidden_operate_self: Forbidden to operate on yourself - review: Your revision will show after review. + update: atualização realizada com sucesso + update_password: Senha alterada com sucesso. + flag_success: Obrigado por marcar. + forbidden_operate_self: Proibido para operar por você mesmo + review: A sua resposta irá aparecer após a revisão. related_question: - title: Related Questions - btn: Add question - answers: answers + title: Perguntas relacionadas + btn: Adicionar pegunta + answers: respostas question_detail: - Asked: Asked - asked: asked - update: Modified - edit: edited - Views: Viewed - Follow: Follow - Following: Following - answered: answered - closed_in: Closed in - show_exist: Show existing question. + Perguntado: Perguntado + asked: perguntado + update: Modificado + edit: modificado + Views: Visualizado + Seguir: Seguir + Seguindo: Seguindo + answered: respondido + closed_in: Fechado em + show_exist: Mostrar pergunta existente. answers: - title: Answers - score: Score - newest: Newest - btn_accept: Accept - btn_accepted: Accepted + title: Respostas + score: Pontuação + newest: Mais recente + btn_accept: Aceito + btn_accepted: Aceito write_answer: - title: Your Answer - btn_name: Post your answer - add_another_answer: Add another answer - confirm_title: Continue to answer - continue: Continue + title: A sua Resposta + btn_name: Publicação a sua resposta + add_another_answer: Adicionar outra resposta + confirm_title: Continuar a responder + continue: Continuar confirm_info: >- -

Are you sure you want to add another answer?

You could use the edit link to refine and improve your existing answer, instead.

- empty: Answer cannot be empty. - characters: content must be at least 6 characters in length. +

Tem certeza de que deseja adicionar outra resposta?

Você pode usar o link de edição para refinar e melhorar uma resposta existente.

+ empty: Resposta não pode ser vazio. + caracteres: conteúdo deve ser pelo menos 6 caracteres em comprimento. reopen: - title: Reopen this post - content: Are you sure you want to reopen? - success: This post has been reopened + title: Reabrir esta postagem + content: Tem certeza que deseja reabrir? + success: Esta postagem foi reaberta delete: - title: Delete this post + title: Excluir esta postagem question: >- - We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.

Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? + Nós não recomendamos excluindo perguntas com respostas porque isso priva os futuros leitores desse conhecimento.

Repeated deletion of answered questions can result in a sua account being blocked from asking. Você tem certeza que deseja deletar? answer_accepted: >- -

We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.

Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? - other: Are you sure you wish to delete? - tip_question_deleted: This post has been deleted - tip_answer_deleted: This answer has been deleted +

Nós não recomendamos deleting accepted answer porque isso priva os futuros leitores desse conhecimento.

Repeated deletion of accepted answers can result in a sua account being blocked from answering. Você tem certeza que deseja deletar? + other: Você tem certeza que deseja deletar? + tip_question_deleted: Esta postagem foi deletada + tip_answer_deleted: Esta resposta foi deletada btns: - confirm: Confirm - cancel: Cancel - save: Save - delete: Delete - login: Log in - signup: Sign up - logout: Log out - verify: Verify - add_question: Add question - approve: Approve - reject: Reject - skip: Skip + confirm: Confirmar + cancel: Cancelar + save: Salvar + delete: Deletar + login: Entrar + signup: Cadastrar-se + logout: Sair + verify: Verificar + add_question: Adicionar pergunta + approve: Aprovar + reject: Rejetar + skip: Pular search: - title: Search Results - keywords: Keywords - options: Options - follow: Follow - following: Following - counts: "{{count}} Results" - more: More + title: Procurar Resultados + keywords: Palavras-chave + options: Opções + follow: Seguir + following: Seguindo + counts: "{{count}} Resultados" + more: Mais sort_btns: - relevance: Relevance - newest: Newest - active: Active - score: Score - more: More + relevance: Relevância + newest: Mais recente + active: Ativar + score: Pontuação + more: Mais tips: - title: Advanced Search Tips - tag: "<1>[tag] search withing a tag" - user: "<1>user:username search by author" - answer: "<1>answers:0 unanswered questions" - score: "<1>score:3 posts with a 3+ score" - question: "<1>is:question search questions" - is_answer: "<1>is:answer search answers" - empty: We couldn't find anything.
Try different or less specific keywords. + title: Dicas de Pesquisa Avançada + tag: "<1>[tag] pesquisar dentro de um marcador" + user: "<1>user:username buscar por autor" + answer: "<1>answers:0 perguntas não respondidas" + score: "<1>score:3 postagens com mais de 3+ placares" + question: "<1>is:question buscar perguntas" + is_answer: "<1>is:answer buscar respostas" + empty: Não conseguimos encontrar nada.
Tente palavras-chave diferentes ou menos específicas. share: - name: Share - copy: Copy link - via: Share post via... - copied: Copied - facebook: Share to Facebook - twitter: Share to Twitter - cannot_vote_for_self: You can't vote for your own post + name: Compartilhar + copy: Copiar link + via: Compartilhar postagem via... + copied: Copiado + facebook: Compartilhar no Facebook + twitter: Compartilhar no Twitter + cannot_vote_for_self: Você não pode votar na sua própria postagem modal_confirm: - title: Error... + title: Erro... account_result: - page_title: Welcome to {{site_name}} - success: Your new account is confirmed; you will be redirected to the home page. - link: Continue to homepage + page_title: Bem vindo ao {{site_name}} + success: A sua nova conta está confirmada; você será redirecionado para a página inicial. + link: Continuar para a página inicial. invalid: >- - Sorry, this account confirmation link is no longer valid. Perhaps your account is already active? + Desculpe, este link de confirmação não é mais válido. Talvez a sua já está ativa. confirm_new_email: Your email has been updated. confirm_new_email_invalid: >- - Sorry, this confirmation link is no longer valid. Perhaps your email was already changed? + Desculpe, este link de confirmação não é mais válido. Talvez o seu e-mail já tenha sido alterado. unsubscribe: - page_title: Unsubscribe - success_title: Unsubscribe Successful - success_desc: You have been successfully removed from this subscriber list and won't receive any further emails from us. - link: Change settings + page_title: Cancelar subscrição + success_title: Cancelamento de inscrição bem-sucedido + success_desc: Você foi removido com sucesso desta lista de assinantes e não receberá mais nenhum e-mail nosso. + link: Mudar configurações question: - following_tags: Following Tags - edit: Edit - save: Save - follow_tag_tip: Follow tags to curate your list of questions. - hot_questions: Hot Questions - all_questions: All Questions - x_questions: "{{ count }} Questions" - x_answers: "{{ count }} answers" - questions: Questions - answers: Answers - newest: Newest - active: Active - frequent: Frequent - score: Score - unanswered: Unanswered - modified: modified - answered: answered - asked: asked - closed: closed - follow_a_tag: Follow a tag - more: More + following_tags: Seguindo Marcadores + edit: Editar + save: Salvar + follow_tag_tip: Seguir tags to curate a sua lista de perguntas. + hot_questions: Perguntas quentes + all_questions: Todas Perguntas + x_questions: "{{ count }} perguntas" + x_answers: "{{ count }} respostas" + questions: Perguntas + answers: Respostas + newest: Mais recente + active: Ativo + frequent: Frequente + score: Pontuação + unanswered: Não Respondido + modified: modificado + answered: respondido + asked: perguntado + closed: fechado + follow_a_tag: Seguir o marcador + more: Mais personal: - overview: Overview - answers: Answers - answer: answer - questions: Questions - question: question - bookmarks: Bookmarks - reputation: Reputation - comments: Comments - votes: Votes - newest: Newest - score: Score - edit_profile: Edit Profile - visited_x_days: "Visited {{ count }} days" + overview: Visão geral + answers: Respostas + answer: resposta + questions: Perguntas + question: pergunta + bookmarks: Favoritas + reputation: Reputação + comments: Comentários + Votos: Votos + newest: Mais recente + score: Pontuação + edit_profile: Editar Perfil + visited_x_days: "Visitado {{ count }} dias" viewed: Viewed - joined: Joined - last_login: Seen - about_me: About Me - about_me_empty: "// Hello, World !" - top_answers: Top Answers - top_questions: Top Questions - stats: Stats - list_empty: No posts found.
Perhaps you'd like to select a different tab? - accepted: Accepted - answered: answered - asked: asked - upvote: upvote - downvote: downvote - mod_short: Mod - mod_long: Moderators - x_reputation: reputation - x_votes: votes received - x_answers: answers - x_questions: questions + joined: Ingressou + last_login: Visto + about_me: Sobre mim + about_me_empty: "// Olá, Mundo !" + top_answers: Melhores Respostas + top_questions: Melhores Perguntas + stats: Estatísticas + list_empty: Postagens não encontradas.
Talvez você queira selecionar uma guia diferente? + accepted: Aceito + answered: respondido + asked: perguntado + upvote: voto positivo + downvote: voto negativo + mod_short: Moderador + mod_long: Moderadores + x_reputation: reputação + x_Votos: votos recebidos + x_answers: respostas + x_questions: perguntas install: - title: Answer - next: Next - done: Done - config_yaml_error: Can't create the config.yaml file. + title: Resposta + next: Proximo + done: Completo + config_yaml_error: Não é possível criar o arquivo config.yaml. lang: - label: Please Choose a Language + label: Por favor Escolha um Idioma db_type: label: Database Engine db_username: - label: Username + label: Nome de usuário placeholder: root - msg: Username cannot be empty. + msg: Nome de usuário não pode ser vazio. db_password: - label: Password + label: Senha placeholder: root - msg: Password cannot be empty. + msg: Senha não pode ser vazio. db_host: label: Database Host placeholder: "db:3306" - msg: Database Host cannot be empty. + msg: Database Host não pode ser vazio. db_name: - label: Database Name + label: Database Nome placeholder: answer - msg: Database Name cannot be empty. + msg: Database Nome não pode ser vazio. db_file: label: Database File placeholder: /data/answer.db - msg: Database File cannot be empty. + msg: Database File não pode ser vazio. config_yaml: title: Create config.yaml label: The config.yaml file created. @@ -917,37 +917,37 @@ ui: You can create the <1>config.yaml file manually in the <1>/var/wwww/xxx/ directory and paste the following text into it. info: After you've done that, click "Next" button. site_information: Site Information - admin_account: Admin Account + admin_account: Administrador Conta site_name: - label: Site Name - msg: Site Name cannot be empty. + label: Site Nome + msg: Site Nome não pode ser vazio. site_url: label: Site URL - text: The address of your site. + text: The address of a sua site. msg: - empty: Site URL cannot be empty. + empty: Site URL não pode ser vazio. incorrect: Site URL incorrect format. contact_email: - label: Contact Email + label: E-mail par contato text: Email address of key contact responsible for this site. msg: - empty: Contact Email cannot be empty. - incorrect: Contact Email incorrect format. + empty: E-mail par contato não pode ser vazio. + incorrect: E-mail par contato incorrect format. admin_name: - label: Name - msg: Name cannot be empty. + label: Nome + msg: Nome não pode ser vazio. admin_password: - label: Password + label: Senha text: >- - You will need this password to log in. Please store it in a secure location. - msg: Password cannot be empty. + You will need this password to log in. Por favor store it in a secure location. + msg: Senha não pode ser vazio. admin_email: label: Email text: You will need this email to log in. msg: - empty: Email cannot be empty. + empty: Email não pode ser vazio. incorrect: Email incorrect format. - ready_title: Your Answer is Ready! + ready_title: Your Resposta is Ready! ready_desc: >- If you ever feel like changing more settings, visit <1>admin section; find it in the site menu. good_luck: "Have fun, and good luck!" @@ -957,272 +957,272 @@ ui: install_now: You may try <1>installing now. installed: Already installed installed_desc: >- - You appear to have already installed. To reinstall please clear your old database tables first. + You appear to have already installed. To reinstall please clear a sua old database tables first. db_failed: Database connection failed db_failed_desc: >- - This either means that the database information in your <1>config.yaml file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down. + This either means that the database information in a sua <1>config.yaml file is incorrect or that contact with the database server could not be established. This could mean a sua host’s database server is down. counts: - views: views - votes: votes - answers: answers - accepted: Accepted + views: visualizações + Votos: votos + answers: respostas + accepted: Aceito page_404: - desc: "Unfortunately, this page doesn't exist." - back_home: Back to homepage + desc: "Infelizmente, esta postagem não existe mais." + back_home: Voltar para a página inicial page_50X: - desc: The server encountered an error and could not complete your request. - back_home: Back to homepage + desc: O servidor encontrou um erro e não pôde concluir uma solicitação sua. + back_home: Voltar para a página inicial page_maintenance: - desc: "We are under maintenance, we'll be back soon." + desc: "Estamos em manutenção, voltaremos em breve." nav_menus: - dashboard: Dashboard - contents: Contents - questions: Questions - answers: Answers - users: Users - flags: Flags - settings: Settings - general: General + dashboard: Painel + contents: Conteúdos + questions: Perguntas + answers: Respostas + users: Usuários + flags: Marcadores + settings: Configurações + general: Geral interface: Interface smtp: SMTP - branding: Branding + branding: Marca legal: Legal - write: Write - tos: Terms of Service - privacy: Privacy + write: Escrever + tos: Termos de Serviços + privacy: Privacidade seo: SEO - customize: Customize - themes: Themes + customize: Personalização + Temas: Temas css-html: CSS/HTML login: Login admin: admin_header: - title: Admin + title: Administrador dashboard: - title: Dashboard - welcome: Welcome to Answer Admin! - site_statistics: Site Statistics - questions: "Questions:" - answers: "Answers:" - comments: "Comments:" - votes: "Votes:" - active_users: "Active users:" - flags: "Flags:" - site_health_status: Site Health Status - version: "Version:" + title: Painel + welcome: Bem vindo ao Answer Administrador! + site_statistics: Estatísticas do Site + questions: "Perguntas:" + answers: "Respostas:" + comments: "Comentários:" + Votos: "Votos:" + active_users: "Usuários ativos:" + flags: "Marcadores:" + site_health_status: Estatísticas da saúde do site + version: "Versão:" https: "HTTPS:" - uploading_files: "Uploading files:" + uploading_files: "Enviando arquivos:" smtp: "SMTP:" - timezone: "Timezone:" - system_info: System Info - storage_used: "Storage used:" - uptime: "Uptime:" - answer_links: Answer Links - documents: Documents - feedback: Feedback - support: Support - review: Review - config: Config - update_to: Update to - latest: Latest - check_failed: Check failed - "yes": "Yes" - "no": "No" - not_allowed: Not allowed - allowed: Allowed - enabled: Enabled - disabled: Disabled + timezone: "Fuso horário:" + system_info: Informações do Sistema + storage_used: "Armazenamento usado:" + uptime: "Tempo de atividade:" + answer_links: Links das Respostas + documents: Documentos + feedback: Opinião + support: Supporte + review: Revisar + config: Configurações + update_to: Atualizar ao + latest: Ultimo + check_failed: Falha na verificação + "yes": "Sim" + "no": "Não" + not_allowed: Não permitido + allowed: Permitido + enabled: Ativo + disabled: Disponível flags: - title: Flags - pending: Pending - completed: Completed - flagged: Flagged - created: Created - action: Action - review: Review + title: Marcadores + pending: Pendente + completed: Completo + flagged: Marcado + created: Criado + action: Ação + review: Revisar change_modal: - title: Change user status to... - btn_cancel: Cancel - btn_submit: Submit + title: Mudar user status to... + btn_cancel: Cancelar + btn_submit: Enviar normal_name: normal - normal_desc: A normal user can ask and answer questions. - suspended_name: suspended - suspended_desc: A suspended user can't log in. - deleted_name: deleted - deleted_desc: "Delete profile, authentication associations." - inactive_name: inactive - inactive_desc: An inactive user must re-validate their email. - confirm_title: Delete this user - confirm_content: Are you sure you want to delete this user? This is permanent! - confirm_btn: Delete + normal_desc: Um usuário normal pode fazer e responder perguntas. + suspended_name: suspenso + suspended_desc: Um usuário suspenso não pode fazer login. + deleted_name: removido + deleted_desc: "Deletar perfil, associações de autenticação." + inactive_name: inativo + inactive_desc: Um usuário inativo deve revalidar seu e-mail. + confirm_title: Remover este usuário + confirm_content: Tem certeza de que deseja excluir este usuário? Isso é permanente! + confirm_btn: Deletar msg: - empty: Please select a reason. + empty: Por favor selecione um motivo. status_modal: - title: "Change {{ type }} status to..." + title: "Mudar {{ type }} status para..." normal_name: normal - normal_desc: A normal post available to everyone. - closed_name: closed - closed_desc: "A closed question can't answer, but still can edit, vote and comment." - deleted_name: deleted - deleted_desc: All reputation gained and lost will be restored. - btn_cancel: Cancel - btn_submit: Submit - btn_next: Next + normal_desc: Um post normal disponível para todos. + closed_name: fechado + closed_desc: "Uma pergunta fechada não pode responder, mas ainda pode editar, votar e comentar." + deleted_name: removido + deleted_desc: Toda reputação ganha e perdida será restaurada. + btn_cancel: Cancelar + btn_submit: Enviar + btn_next: Próximo user_role_modal: - title: Change user role to... - btn_cancel: Cancel - btn_submit: Submit + title: Altere a função do usuário para... + btn_cancel: Cancelar + btn_submit: Enviar users: - title: Users - name: Name + title: Usuários + name: Nome email: Email - reputation: Reputation - created_at: Created Time - delete_at: Deleted Time - suspend_at: Suspended Time + reputation: Reputação + created_at: Hora de criação + delete_at: Hora da remoção + suspend_at: Hora da suspensão status: Status - role: Role - action: Action - change: Change - all: All - staff: Staff - inactive: Inactive - suspended: Suspended - deleted: Deleted + role: Função + action: Ação + change: Mudar + all: Todos + staff: Funcionários + inactive: Inativo + suspended: Suspenso + deleted: Removido normal: Normal - Moderator: Moderator - Admin: Admin - User: User + Moderador: Moderador + Administrador: Administrador + Usuário: Usuário filter: - placeholder: "Filter by name, user:id" - set_new_password: Set new password - change_status: Change status - change_role: Change role - show_logs: Show logs - add_user: Add user + placeholder: "Filtrar por nome, user:id" + set_new_password: Configurar nova senha + change_status: Mudar status + change_role: Mudar função + show_logs: Mostrar registros + add_user: Adicionar usuário new_password_modal: - title: Set new password + title: Configurar nova senha form: fields: password: - label: Password - text: The user will be logged out and need to login again. - msg: Password must be at 8-32 characters in length. - btn_cancel: Cancel - btn_submit: Submit + label: Senha + text: O usuário será desconectado e precisará fazer login novamente. + msg: Senha de ver entre 8-32 caracteres em comprimento. + btn_cancel: Cancelar + btn_submit: Enviar user_modal: - title: Add new user + title: Adicionar novo usuário form: fields: display_name: - label: Display Name - msg: Display Name must be at 3-30 characters in length. + label: Nome de exibição + msg: Nome de exibição deve ser 3-30 caracteres em comprimento. email: label: Email - msg: Email is not valid. + msg: Email não é válido. password: - label: Password - msg: Password must be at 8-32 characters in length. - btn_cancel: Cancel - btn_submit: Submit + label: Senha + msg: Senha deve ser 8-32 caracteres em comprimento. + btn_cancel: Cancelar + btn_submit: Enviar questions: - page_title: Questions + page_title: Perguntas normal: Normal - closed: Closed - deleted: Deleted - post: Post - votes: Votes - answers: Answers - created: Created + closed: Fechado + deleted: Removido + post: Publicação + Votos: Votos + answers: Respostas + created: Criado status: Status - action: Action - change: Change + action: Ação + change: Mudar filter: - placeholder: "Filter by title, question:id" + placeholder: "Filtrar por título, question:id" answers: - page_title: Answers + page_title: Respostas normal: Normal - deleted: Deleted - post: Post - votes: Votes - created: Created + deleted: Removido + post: Publicação + Votos: Votos + created: Criado status: Status - action: Action - change: Change + action: Ação + change: Mudar filter: - placeholder: "Filter by title, answer:id" + placeholder: "Filtrar por título, answer:id" general: page_title: General name: - label: Site Name - msg: Site name cannot be empty. - text: "The name of this site, as used in the title tag." + label: Site Nome + msg: Site name não pode ser vazio. + text: "O nome deste site, conforme usado na tag de título." site_url: - label: Site URL - msg: Site url cannot be empty. - validate: Please enter a valid URL. - text: The address of your site. + label: URL do Site + msg: Site url não pode ser vazio. + validate: Por favor digite uma URL válida. + text: O endereço do seu site. short_desc: - label: Short Site Description (optional) - msg: Short site description cannot be empty. - text: "Short description, as used in the title tag on homepage." + label: Breve Descrição do site (opcional) + msg: Breve Descrição do site não pode ser vazio. + text: "Breve descrição, conforme usado na tag de título na página inicial." desc: - label: Site Description (optional) - msg: Site description cannot be empty. - text: "Describe this site in one sentence, as used in the meta description tag." + label: Site Descrição (opcional) + msg: Descrição do site não pode ser vazio. + text: "Descreva este site em uma única sentença, conforme usado na meta tag de descrição." contact_email: - label: Contact Email - msg: Contact email cannot be empty. - validate: Contact email is not valid. - text: Email address of key contact responsible for this site. + label: E-mail para contato + msg: E-mail par contato não pode ser vazio. + validate: E-mail par contato não é válido. + text: Endereço de e-mail do principal contato responsável por este site. interface: page_title: Interface logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. + label: Logo (opcional) + msg: Site logo não pode ser vazio. + text: Você pode enviar a sua image ou <1>reiniciar ao texto do título do site. + Tema: + label: Tema + msg: Tema não pode ser vazio. + text: Selecione um tema existente. language: - label: Interface Language - msg: Interface language cannot be empty. - text: User interface language. It will change when you refresh the page. + label: Idioma da interface + msg: Idioma da Interface não pode ser vazio. + text: Idioma da interface do Usuário. Ele mudará quando você atualizar a página. time_zone: - label: Timezone - msg: Timezone cannot be empty. - text: Choose a city in the same timezone as you. + label: Fuso horário + msg: Fuso horário não pode ser vazio. + text: Escolha a cidade no mesmo fuso horário que você. smtp: page_title: SMTP from_email: - label: From Email - msg: From email cannot be empty. - text: The email address which emails are sent from. + label: E-mail de origem + msg: E-mail de origem não pode ser vazio. + text: O endereço de e-mail de onde os e-mails são enviados. from_name: - label: From Name - msg: From name cannot be empty. - text: The name which emails are sent from. + label: Nome de origem + msg: Nome de origem não pode ser vazio. + text: O nome de onde os e-mails são enviados. smtp_host: label: SMTP Host - msg: SMTP host cannot be empty. - text: Your mail server. + msg: SMTP host não pode ser vazio. + text: O seu servidor de e-mails. encryption: - label: Encryption - msg: Encryption cannot be empty. - text: For most servers SSL is the recommended option. + label: Criptografia + msg: Criptografia não pode ser vazio. + text: Para a maioria dos servidores SSL é a opção recomendada. ssl: SSL none: None smtp_port: label: SMTP Port msg: SMTP port must be number 1 ~ 65535. - text: The port to your mail server. + text: The port to a sua mail server. smtp_username: - label: SMTP Username - msg: SMTP username cannot be empty. + label: SMTP Nome de usuário + msg: SMTP username não pode ser vazio. smtp_password: - label: SMTP Password - msg: SMTP password cannot be empty. + label: SMTP Senha + msg: SMTP password não pode ser vazio. test_email_recipient: label: Test Email Recipients text: Provide email address that will receive test sends. @@ -1230,25 +1230,25 @@ ui: smtp_authentication: label: Enable authentication title: SMTP Authentication - msg: SMTP authentication cannot be empty. + msg: SMTP authentication não pode ser vazio. "yes": "Yes" "no": "No" branding: page_title: Branding logo: - label: Logo (optional) - msg: Logo cannot be empty. - text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. + label: Logo (opcional) + msg: Logo não pode ser vazio. + text: The logo image at the top left of a sua site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) - text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. + label: Mobile Logo (opcional) + text: The logo used on mobile version of a sua site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) - msg: Square icon cannot be empty. - text: Image used as the base for metadata icons. Should ideally be larger than 512x512. + label: Square Icon (opcional) + msg: Square icon não pode ser vazio. + text: Imagem used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) - text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. + label: Favicon (opcional) + text: A favicon for a sua site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal terms_of_service: @@ -1260,34 +1260,34 @@ ui: write: page_title: Write recommend_tags: - label: Recommend Tags - text: "Please input tag slug above, one tag per line." + label: Recommend Marcadores + text: "Por favor input tag slug above, one tag per line." required_tag: title: Required Tag - label: Set recommend tag as required - text: "Every new question must have at least one recommend tag." + label: Set recommend tag as requirido + text: "Every new question must have ao menos one recommend tag." reserved_tags: - label: Reserved Tags + label: Reserved Marcadores text: "Reserved tags can only be added to a post by moderator." seo: page_title: SEO permalink: label: Permalink - text: Custom URL structures can improve the usability, and forward-compatibility of your links. + text: Custom URL structures can improve the usability, and forward-compatibility of a sua links. robots: label: robots.txt text: This will permanently override any related site settings. - themes: - page_title: Themes - themes: - label: Themes - text: Select an existing theme. + Temas: + page_title: Temas + Temas: + label: Temas + text: Select an existing Tema. navbar_style: label: Navbar Style - text: Select an existing theme. + text: Select an existing Tema. primary_color: label: Primary Color - text: Modify the colors used by your themes + text: Modify the colors used by a sua Temas css_and_html: page_title: CSS and HTML custom_css: @@ -1310,23 +1310,23 @@ ui: text: Turn off to prevent anyone from creating a new account. private: title: Private - label: Login required + label: Login requirido text: Only logged in users can access this community. form: - empty: cannot be empty + empty: não pode ser vazio invalid: is invalid - btn_submit: Save + btn_submit: Salvar not_found_props: "Required property {{ key }} not found." page_review: - review: Review + review: Revisar proposed: proposed - question_edit: Question edit - answer_edit: Answer edit + question_edit: Pergunta edit + answer_edit: Resposta edit tag_edit: Tag edit - edit_summary: Edit summary - edit_question: Edit question - edit_answer: Edit answer - edit_tag: Edit tag + edit_summary: Editar summary + edit_question: Editar question + edit_answer: Editar answer + edit_tag: Editar tag empty: No review tasks left. timeline: undeleted: undeleted @@ -1343,9 +1343,9 @@ ui: closed: closed reopened: reopened created: created - title: "History for" + title: "Histórico for" tag_title: "Timeline for" - show_votes: "Show votes" + show_Votos: "Show Votos" n_or_a: N/A title_for_question: "Timeline for" title_for_answer: "Timeline for answer to {{ title }} by {{ author }}" @@ -1356,11 +1356,11 @@ ui: comment: Comment no_data: "We couldn't find anything." users: - title: Users - users_with_the_most_reputation: Users with the highest reputation scores - users_with_the_most_vote: Users who voted the most + title: Usuários + users_with_the_most_reputation: Usuários with the highest reputation scores + users_with_the_most_vote: Usuários who voted the most staffs: Our community staff reputation: reputation - votes: votes + Votos: Votos diff --git a/i18n/pt_PT.yaml b/i18n/pt_PT.yaml index fe56949f..80b73278 100644 --- a/i18n/pt_PT.yaml +++ b/i18n/pt_PT.yaml @@ -14,153 +14,155 @@ backend: role: name: user: - other: User + other: Usuário admin: - other: Admin + other: Administrador moderator: - other: Moderator + other: Moderador description: user: - other: Default with no special access. + other: Padrão sem acesso especial. admin: - other: Have the full power to access the site. + other: Possui acesso total ao site. moderator: - other: Has access to all posts except admin settings. + other: Possui acesso a todas as postagens exceto às configurações de usuários. email: - other: Email + other: E-mail password: - other: Password + other: Senha email_or_password_wrong_error: - other: Email and password do not match. + other: O e-mail e a palavra-passe não coincidem. error: admin: email_or_password_wrong: - other: Email and password do not match. + other: O e-mail e a palavra-passe não coincidem. answer: not_found: - other: Answer do not found. + other: Resposta não encontrada. cannot_deleted: - other: No permission to delete. + other: Sem permissão para remover. cannot_update: - other: No permission to update. + other: Sem permissão para atualizar. comment: edit_without_permission: - other: Comment are not allowed to edit. + other: Não é possível alterar comentários. not_found: - other: Comment not found. + other: Comentário não encontrado. cannot_edit_after_deadline: - other: The comment time has been too long to modify. + other: O tempo do comentário foi muito longo para ser modificado. email: duplicate: - other: Email already exists. + other: O e-mail já existe. need_to_be_verified: - other: Email should be verified. + other: O e-mail deve ser verificado. verify_url_expired: - other: Email verified URL has expired, please resend the email. + other: O e-mail verificado URL expirou, por favor, reenvie o e-mail. lang: not_found: - other: Language file not found. + other: Arquivo de idioma não encontrado. object: captcha_verification_failed: - other: Captcha wrong. + other: O Captcha está incorreto. disallow_follow: - other: You are not allowed to follow. + other: Você não possui autorização suficiente para seguir. disallow_vote: - other: You are not allowed to vote. + other: Você não possui permissão para votar. disallow_vote_your_self: - other: You can't vote for your own post. + other: Você não pode votar na sua própria postagem. not_found: - other: Object not found. + other: Objeto não encontrado. verification_failed: - other: Verification failed. + other: A verificação falhou. email_or_password_incorrect: - other: Email and password do not match. + other: O e-mail e a senha não correspondem. old_password_verification_failed: - other: The old password verification failed + other: Falha na verificação de senha antiga new_password_same_as_previous_setting: - other: The new password is the same as the previous one. + other: A nova senha é a mesma que a anterior. question: not_found: - other: Question not found. + other: Pergunta não encontrada. cannot_deleted: - other: No permission to delete. + other: Sem permissão para remover. cannot_close: - other: No permission to close. + other: Sem permissão para fechar. cannot_update: - other: No permission to update. + other: Sem permissão para atualizar. rank: fail_to_meet_the_condition: - other: Rank fail to meet the condition. + other: O nível não consegue satisfazer a condição. report: handle_failed: - other: Report handle failed. + other: Falha ao manusear relatório. not_found: - other: Report not found. + other: Relatório não encontrado. tag: not_found: - other: Tag not found. + other: Marcador não encontrado. recommend_tag_not_found: - other: Recommend Tag is not exist. + other: O marcador recomendado não existe. recommend_tag_enter: - other: Please enter at least one required tag. + other: Por favor, insira pelo menos um marcador obrigatório. not_contain_synonym_tags: - other: Should not contain synonym tags. + other: Não deve conter marcadores sinónimos. cannot_update: - other: No permission to update. + other: Sem permissão para atualizar. + is_used_cannot_delete: + other: Não é possível excluir um marcador em uso cannot_set_synonym_as_itself: - other: You cannot set the synonym of the current tag as itself. + other: Você não pode definir o sinônimo do marcador atual como a si mesmo. smtp: config_from_name_cannot_be_email: - other: The From Name cannot be a email address. + other: Nome do remetente não pode ser um endereço de e-mail. theme: not_found: - other: Theme not found. + other: Tema não encontrado. revision: review_underway: - other: Can't edit currently, there is a version in the review queue. + other: Não é possível neste momento, há uma versão na fila de análise. no_permission: - other: No permission to Revision. + other: Sem permissão para realizar Revisão. user: email_or_password_wrong: other: - other: Email and password do not match. + other: O e-mail e a senha não conferem. not_found: - other: User not found. + other: Usuário não encontrado. suspended: - other: User has been suspended. + other: O usuário foi suspenso. username_invalid: - other: Username is invalid. + other: Nome de usuário inválido. username_duplicate: - other: Username is already in use. + other: O nome de usuário já em uso. set_avatar: - other: Avatar set failed. + other: Configuração de avatar falhou. cannot_update_your_role: - other: You cannot modify your role. + other: Você não pode modificar a sua função. not_allowed_registration: - other: Currently the site is not open for registration + other: O site não está aberto para novos registros config: read_config_failed: - other: Read config failed + other: Falha ao ler configuração database: connection_failed: - other: Database connection failed + other: Falha ao conectar-se ao banco de dados create_table_failed: - other: Create table failed + other: Falha ao criar tabela install: create_config_failed: - other: Can't create the config.yaml file. + other: Não foi possível criar o arquivo de configuração. upload: unsupported_file_format: - other: Unsupported file format. + other: Formato de arquivo não suportado. report: spam: name: other: spam desc: - other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic. + other: Essa postagem é um anúncio, ou vandalismo. Não é útil ou relevante para o tópico atual. rude: name: - other: rude or abusive + other: rude ou abusivo desc: other: A reasonable person would find this content inappropriate for respectful discourse. duplicate: @@ -262,73 +264,73 @@ ui: settings: Settings notifications: Notifications login: Log In - sign_up: Sign Up - account_recovery: Account Recovery - account_activation: Account Activation - confirm_email: Confirm Email - account_suspended: Account Suspended - admin: Admin - change_email: Modify Email - install: Answer Installation - upgrade: Answer Upgrade - maintenance: Website Maintenance - users: Users + sign_up: Registar-se + account_recovery: Recuperação de conta + account_activation: Ativação de conta + confirm_email: Confirmar E-mail + account_suspended: Conta suspensa + admin: Administrador + change_email: Modificar e-mail + install: Instalação do Answer + upgrade: Atualização do Answer + maintenance: Manutenção do website + users: Usuários notifications: - title: Notifications - inbox: Inbox - achievement: Achievements - all_read: Mark all as read - show_more: Show more + title: Notificações + inbox: Caixa de entrada + achievement: Conquistas + all_read: Marcar todos como lida + show_more: Mostrar mais suspended: - title: Your Account has been Suspended - until_time: "Your account was suspended until {{ time }}." - forever: This user was suspended forever. - end: You don't meet a community guideline. + title: A sua conta foi suspensa + until_time: "Sua conta está suspensa até {{ time }}." + forever: Este usuário foi suspenso permanentemente. + end: Você não atende a uma diretriz da comunidade. editor: blockquote: - text: Blockquote + text: Bloco de citação bold: - text: Strong + text: Negrito chart: - text: Chart - flow_chart: Flow chart - sequence_diagram: Sequence diagram - class_diagram: Class diagram - state_diagram: State diagram - entity_relationship_diagram: Entity relationship diagram - user_defined_diagram: User defined diagram - gantt_chart: Gantt chart - pie_chart: Pie chart + text: Gráfico + flow_chart: Gráfico de fluxo + sequence_diagram: Diagrama de sequência + class_diagram: Diagrama de classe + state_diagram: Diagrama de estado + entity_relationship_diagram: Diagrama de relacionamento de entidade + user_defined_diagram: Diagrama definido pelo usuário + gantt_chart: Gráfico de Gantt + pie_chart: Gráfico de pizza code: - text: Code Sample - add_code: Add code sample + text: Exemplo de código + add_code: Adicionar exemplo de código form: fields: code: - label: Code + label: Código msg: - empty: Code cannot be empty. + empty: Código não pode ser vazio. language: - label: Language (optional) - placeholder: Automatic detection - btn_cancel: Cancel - btn_confirm: Add + label: Idioma + placeholder: Deteção automática + btn_cancel: Cancelar + btn_confirm: Adicionar formula: - text: Formula + text: Fórmula options: - inline: Inline formula - block: Block formula + inline: Fórmula na linha + block: Bloco de fórmula heading: - text: Heading + text: Cabeçalho options: - h1: Heading 1 - h2: Heading 2 - h3: Heading 3 - h4: Heading 4 - h5: Heading 5 - h6: Heading 6 + h1: Cabeçalho 1 + h2: Cabeçalho 2 + h3: Cabeçalho 3 + h4: Cabeçalho 4 + h5: Cabeçalho 5 + h6: Cabeçalho 6 help: - text: Help + text: Ajuda hr: text: Horizontal Rule image: @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add uploading: Uploading @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) + label: Description btn_cancel: Cancel btn_submit: Submit tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: The following tags will be remapped to delete: title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Close edit_tag: title: Edit Tag @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/ru_RU.yaml b/i18n/ru_RU.yaml index bb8db439..1c8e88c9 100644 --- a/i18n/ru_RU.yaml +++ b/i18n/ru_RU.yaml @@ -107,6 +107,8 @@ backend: other: Не должно содержать теги синонимы. cannot_update: other: Нет прав для обновления. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: Вы не можете установить синоним текущего тега. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Код не может быть пустым. language: - label: Language (optional) + label: Language placeholder: Automatic detection btn_cancel: Cancel btn_confirm: Add @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add uploading: Uploading @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug до 35 символов. character: URL slug содержит недопустимый набор символов. desc: - label: Описание (опционально) + label: Description btn_cancel: Отмена btn_submit: Отправить tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: Следующие теги будут переназначены на delete: title: Удалить этот тег - content: >- -

Мы не разрешаем удалять тег с сообщениями.

Пожалуйста, сначала удалите этот тег из сообщений

- content2: Вы действительно хотите удалить? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Закрыть edit_tag: title: Изменить тег @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/tr_TR.yaml b/i18n/tr_TR.yaml index 14c553f5..cfde3166 100644 --- a/i18n/tr_TR.yaml +++ b/i18n/tr_TR.yaml @@ -2,23 +2,23 @@ backend: base: success: - other: Success. + other: Başarılı. unknown: - other: Unknown error. + other: Bilinmeyen hata. request_format_error: other: Request format is not valid. unauthorized_error: - other: Unauthorized. + other: İzin yok. database_error: - other: Data server error. + other: Veri sunucu hatası. role: name: user: - other: User + other: Kullanıcı admin: - other: Admin + other: Yönetici moderator: - other: Moderator + other: Moderatör description: user: other: Default with no special access. @@ -27,131 +27,133 @@ backend: moderator: other: Has access to all posts except admin settings. email: - other: Email + other: E-Posta password: - other: Password + other: Parola email_or_password_wrong_error: - other: Email and password do not match. + other: E-Posta ve parola eşleşmiyor. error: admin: email_or_password_wrong: - other: Email and password do not match. + other: E-Posta ve parola eşleşmiyor. answer: not_found: - other: Answer do not found. + other: Cevap bulunamadı. cannot_deleted: - other: No permission to delete. + other: Silme izni yok. cannot_update: - other: No permission to update. + other: Düzenleme izni yok. comment: edit_without_permission: - other: Comment are not allowed to edit. + other: Yorum düzenleme izni yok. not_found: - other: Comment not found. + other: Yorum bulunamadı. cannot_edit_after_deadline: other: The comment time has been too long to modify. email: duplicate: - other: Email already exists. + other: Bu e-posta adresi kullanılmaktadır. need_to_be_verified: - other: Email should be verified. + other: E-Posta doğrulanmalı. verify_url_expired: other: Email verified URL has expired, please resend the email. lang: not_found: - other: Language file not found. + other: Dil dosyası bulunamadı. object: captcha_verification_failed: - other: Captcha wrong. + other: Captcha yanlış. disallow_follow: - other: You are not allowed to follow. + other: Takip etme izniniz yok. disallow_vote: - other: You are not allowed to vote. + other: Oy verme yetkiniz yok. disallow_vote_your_self: - other: You can't vote for your own post. + other: Kendi mesajınız için oy kullanamazsınız. not_found: - other: Object not found. + other: Nesne bulunamadı. verification_failed: - other: Verification failed. + other: Doğrulama başarısız. email_or_password_incorrect: - other: Email and password do not match. + other: E-Posta ve parola eşleşmiyor. old_password_verification_failed: - other: The old password verification failed + other: Eski parola doğrulaması başarısız new_password_same_as_previous_setting: - other: The new password is the same as the previous one. + other: Yeni parola bir önceki parolanızın aynısı. question: not_found: - other: Question not found. + other: Soru bulunamadı. cannot_deleted: - other: No permission to delete. + other: Silme izni yok. cannot_close: - other: No permission to close. + other: Kapatma izni yok. cannot_update: - other: No permission to update. + other: Düzenleme izni yok. rank: fail_to_meet_the_condition: other: Rank fail to meet the condition. report: handle_failed: - other: Report handle failed. + other: Rapor işlenemedi. not_found: - other: Report not found. + other: Rapor bulunamadı. tag: not_found: - other: Tag not found. + other: Etiket bulunamadı. recommend_tag_not_found: - other: Recommend Tag is not exist. + other: Önerilen Etiket yok. recommend_tag_enter: - other: Please enter at least one required tag. + other: Lütfen en az bir adet gerekli etiket giriniz. not_contain_synonym_tags: other: Should not contain synonym tags. cannot_update: - other: No permission to update. + other: Düzenleme izni yok. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: You cannot set the synonym of the current tag as itself. smtp: config_from_name_cannot_be_email: - other: The From Name cannot be a email address. + other: Gönderen adı bir e-posta adresi olamaz. theme: not_found: - other: Theme not found. + other: Tema bulunamadı. revision: review_underway: other: Can't edit currently, there is a version in the review queue. no_permission: - other: No permission to Revision. + other: Revizyon izni yok. user: email_or_password_wrong: other: - other: Email and password do not match. + other: E-Posta ve parola eşleşmiyor. not_found: - other: User not found. + other: Kullanıcı bulunamadı. suspended: - other: User has been suspended. + other: Kullanıcı askıya alındı. username_invalid: - other: Username is invalid. + other: Kullanıcı adı geçersiz. username_duplicate: - other: Username is already in use. + other: Kullanıcı adı zaten kullanımda. set_avatar: - other: Avatar set failed. + other: Avatar ayarlama başarısız. cannot_update_your_role: - other: You cannot modify your role. + other: Kendi rolünüzü değiştiremezsiniz. not_allowed_registration: - other: Currently the site is not open for registration + other: Site şu anda kayıt olmaya açık değil config: read_config_failed: other: Read config failed database: connection_failed: - other: Database connection failed + other: Veri tabanı bağlantısı başarısız create_table_failed: - other: Create table failed + other: Tablo oluşturulamadı install: create_config_failed: - other: Can't create the config.yaml file. + other: Config.yaml dosyası oluşturulamadı. upload: unsupported_file_format: - other: Unsupported file format. + other: Desteklenmeyen dosya formatı. report: spam: name: @@ -170,7 +172,7 @@ backend: other: This question has been asked before and already has an answer. not_answer: name: - other: not an answer + other: cevap değil desc: other: This was posted as an answer, but it does not attempt to answer the question. It should possibly be an edit, a comment, another question, or deleted altogether. not_need: @@ -229,15 +231,15 @@ backend: reply_to_you: other: replied to you mention_you: - other: mentioned you + other: sizden bahsetti your_question_is_closed: - other: Your question has been closed + other: Sorunuz kapatıldı your_question_was_deleted: - other: Your question has been deleted + other: Sorunuz silindi your_answer_was_deleted: - other: Your answer has been deleted + other: Cevabınız silindi your_comment_was_deleted: - other: Your comment has been deleted + other: Yorumunuz silindi #The following fields are used for interface presentation(Front-end) ui: how_to_format: @@ -245,53 +247,53 @@ ui: desc: >- pagination: - prev: Prev - next: Next + prev: Önceki + next: Sonraki page_title: - question: Question - questions: Questions - tag: Tag - tags: Tags + question: Soru + questions: Sorular + tag: Etiket + tags: Etiketler tag_wiki: tag wiki - edit_tag: Edit Tag - ask_a_question: Add Question - edit_question: Edit Question - edit_answer: Edit Answer - search: Search + edit_tag: Etiketi Düzenle + ask_a_question: Soru Ekle + edit_question: Soruyu Düzenle + edit_answer: Cevabı Düzenle + search: Ara posts_containing: Posts containing - settings: Settings - notifications: Notifications - login: Log In - sign_up: Sign Up - account_recovery: Account Recovery - account_activation: Account Activation - confirm_email: Confirm Email - account_suspended: Account Suspended - admin: Admin - change_email: Modify Email + settings: Ayarlar + notifications: Bildirimler + login: Oturum Aç + sign_up: Üye Ol + account_recovery: Hesap Kurtarma + account_activation: Hesap Aktivasyonu + confirm_email: E-Posta Adresinizi Onaylayın + account_suspended: Hesap Askıya Alındı + admin: Yönetici + change_email: E-Postayı değiştir install: Answer Installation upgrade: Answer Upgrade - maintenance: Website Maintenance - users: Users + maintenance: Website Bakımı + users: Kullanıcı notifications: - title: Notifications - inbox: Inbox - achievement: Achievements - all_read: Mark all as read - show_more: Show more + title: Bildirimler + inbox: Gelen Kutusu + achievement: Başarılar + all_read: Tümünü okundu olarak işaretle + show_more: Daha fazla göster suspended: - title: Your Account has been Suspended + title: Hesabınız Askıya Alındı until_time: "Your account was suspended until {{ time }}." forever: This user was suspended forever. end: You don't meet a community guideline. editor: blockquote: - text: Blockquote + text: Alıntı bold: text: Strong chart: text: Chart - flow_chart: Flow chart + flow_chart: Akış Şeması sequence_diagram: Sequence diagram class_diagram: Class diagram state_diagram: State diagram @@ -309,7 +311,7 @@ ui: msg: empty: Code cannot be empty. language: - label: Language (optional) + label: Language placeholder: Automatic detection btn_cancel: Cancel btn_confirm: Add @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,10 +356,10 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) - btn_cancel: Cancel - btn_confirm: Add - uploading: Uploading + label: Description + btn_cancel: İptal + btn_confirm: Ekle + uploading: Gönderiliyor indent: text: Indent outdent: @@ -365,54 +367,54 @@ ui: italic: text: Emphasis link: - text: Hyperlink - add_link: Add hyperlink + text: Bağlantı + add_link: Bağlantı ekle form: fields: url: label: URL msg: - empty: URL cannot be empty. + empty: URL boş olamaz. name: - label: Description (optional) - btn_cancel: Cancel - btn_confirm: Add + label: Description + btn_cancel: İptal Et + btn_confirm: Ekle ordered_list: - text: Numbered List + text: Numaralı liste unordered_list: text: Bulleted List table: - text: Table - heading: Heading - cell: Cell + text: Tablo + heading: Başlık + cell: Hücre close_modal: title: I am closing this post as... - btn_cancel: Cancel - btn_submit: Submit + btn_cancel: İptal Et + btn_submit: Gönder remark: - empty: Cannot be empty. + empty: Boş olamaz. msg: - empty: Please select a reason. + empty: Lütfen bir sebep seçin. report_modal: flag_title: I am flagging to report this post as... close_title: I am closing this post as... review_question_title: Review question review_answer_title: Review answer review_comment_title: Review comment - btn_cancel: Cancel - btn_submit: Submit + btn_cancel: İptal Et + btn_submit: Gönder remark: - empty: Cannot be empty. + empty: Boş olamaz. msg: - empty: Please select a reason. + empty: Lütfen bir sebep seçin. tag_modal: - title: Create new tag + title: Yeni etiket oluştur form: fields: display_name: - label: Display Name + label: Görüntülenen Ad msg: - empty: Display name cannot be empty. + empty: Görünen ad boş olamaz. range: Display name up to 35 characters. slug_name: label: URL Slug @@ -422,15 +424,15 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) - btn_cancel: Cancel - btn_submit: Submit + label: Description + btn_cancel: İptal Et + btn_submit: Gönder tag_info: - created_at: Created - edited_at: Edited - history: History + created_at: Oluşturuldu + edited_at: Düzenlendi + history: Geçmiş synonyms: - title: Synonyms + title: Eş anlamlılar text: The following tags will be remapped to empty: No synonyms found. btn_add: Add a synonym @@ -438,30 +440,32 @@ ui: btn_save: Save synonyms_text: The following tags will be remapped to delete: - title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? - close: Close + title: Bu etiketi sil + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? + close: Kapat edit_tag: - title: Edit Tag - default_reason: Edit tag + title: Etiketi Düzenle + default_reason: Etiketi düzenle form: fields: revision: - label: Revision + label: Revizyon display_name: - label: Display Name + label: Görüntülenen Ad slug_name: label: URL Slug info: 'Must use the character set "a-z", "0-9", "+ # - ."' desc: - label: Description + label: Açıklama edit_summary: - label: Edit Summary + label: Özeti Düzenle placeholder: >- Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_save_edits: Save edits + btn_save_edits: Düzenlemeleri kaydet btn_cancel: Cancel dates: long_date: MMM D @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/vi_VN.yaml b/i18n/vi_VN.yaml index 14c553f5..3503ceba 100644 --- a/i18n/vi_VN.yaml +++ b/i18n/vi_VN.yaml @@ -107,6 +107,8 @@ backend: other: Should not contain synonym tags. cannot_update: other: No permission to update. + is_used_cannot_delete: + other: You cannot delete a tag that is in use cannot_set_synonym_as_itself: other: You cannot set the synonym of the current tag as itself. smtp: @@ -309,7 +311,7 @@ ui: msg: empty: Code cannot be empty. language: - label: Language (optional) + label: Language placeholder: Automatic detection btn_cancel: Cancel btn_confirm: Add @@ -345,7 +347,7 @@ ui: only_image: Only image files are allowed. max_size: File size cannot exceed 4MB. desc: - label: Description (optional) + label: Description tab_url: Image URL form_url: fields: @@ -354,7 +356,7 @@ ui: msg: empty: Image URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add uploading: Uploading @@ -374,7 +376,7 @@ ui: msg: empty: URL cannot be empty. name: - label: Description (optional) + label: Description btn_cancel: Cancel btn_confirm: Add ordered_list: @@ -422,7 +424,7 @@ ui: range: URL slug up to 35 characters. character: URL slug contains unallowed character set. desc: - label: Description (optional) + label: Description btn_cancel: Cancel btn_submit: Submit tag_info: @@ -439,9 +441,11 @@ ui: synonyms_text: The following tags will be remapped to delete: title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? + tip_with_posts: >- +

We do not allowed deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allowed deleting tag with synonyms.

Please remove the synonyms from this tag first.

+ tip: Are you sure you wish to delete? close: Close edit_tag: title: Edit Tag @@ -677,13 +681,13 @@ ui: default: System msg: Please upload an avatar bio: - label: About Me (optional) + label: About Me website: - label: Website (optional) + label: Website placeholder: "https://example.com" msg: Website incorrect format location: - label: Location (optional) + label: Location placeholder: "City, Country" notification: heading: Notifications @@ -1163,11 +1167,11 @@ ui: validate: Please enter a valid URL. text: The address of your site. short_desc: - label: Short Site Description (optional) + label: Short Site Description msg: Short site description cannot be empty. text: "Short description, as used in the title tag on homepage." desc: - label: Site Description (optional) + label: Site Description msg: Site description cannot be empty. text: "Describe this site in one sentence, as used in the meta description tag." contact_email: @@ -1177,14 +1181,6 @@ ui: text: Email address of key contact responsible for this site. interface: page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. language: label: Interface Language msg: Interface language cannot be empty. @@ -1236,18 +1232,18 @@ ui: branding: page_title: Branding logo: - label: Logo (optional) + label: Logo msg: Logo cannot be empty. text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. mobile_logo: - label: Mobile Logo (optional) + label: Mobile Logo text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. square_icon: - label: Square Icon (optional) + label: Square Icon msg: Square icon cannot be empty. text: Image used as the base for metadata icons. Should ideally be larger than 512x512. favicon: - label: Favicon (optional) + label: Favicon text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. legal: page_title: Legal @@ -1313,6 +1309,7 @@ ui: label: Login required text: Only logged in users can access this community. form: + optional: (optional) empty: cannot be empty invalid: is invalid btn_submit: Save @@ -1362,5 +1359,7 @@ ui: staffs: Our community staff reputation: reputation votes: votes - + prompt: + leave_page: "Are you sure you want to leave the page?" + changes_not_save: "Your changes may not be saved." diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml index 72eb92c4..d36e727c 100644 --- a/i18n/zh_CN.yaml +++ b/i18n/zh_CN.yaml @@ -1,4 +1,5 @@ #The following fields are used for back-end + backend: base: success: @@ -49,7 +50,7 @@ backend: not_found: other: 评论未找到。 cannot_edit_after_deadline: - other: The comment time has been too long to modify. + other: 评论时间太长,无法修改。 email: duplicate: other: 邮箱已经存在。 @@ -80,6 +81,8 @@ backend: new_password_same_as_previous_setting: other: 新密码与之前的设置相同 question: + already_deleted: + other: 该内容已被删除 not_found: other: 问题未找到 cannot_deleted: @@ -108,7 +111,7 @@ backend: cannot_update: other: 没有更新标签权限。 is_used_cannot_delete: - other: 您不能删除正在被使用的标签 + other: 您不能删除正在使用的标签 cannot_set_synonym_as_itself: other: 您不能将当前标签的同义词设置为本身。 smtp: @@ -150,10 +153,10 @@ backend: other: 创建表失败 install: create_config_failed: - other: Can't create the config.yaml file. + other: 无法创建 config.yaml 文件。 upload: unsupported_file_format: - other: Unsupported file format. + other: 不支持的文件格式。 report: spam: name: @@ -311,7 +314,7 @@ ui: msg: empty: 代码块不能为空 language: - label: 语言 (可选) + label: 语言 placeholder: 自动识别 btn_cancel: 取消 btn_confirm: 添加 @@ -347,7 +350,7 @@ ui: only_image: 只能上传图片文件。 max_size: 图片文件大小不能超过 4 MB。 desc: - label: 描述(可选) + label: 描述 tab_url: 网络图片 form_url: fields: @@ -356,7 +359,7 @@ ui: msg: empty: 图片地址不能为空 name: - label: 图片描述(可选) + label: 描述 btn_cancel: 取消 btn_confirm: 添加 uploading: 上传中... @@ -376,7 +379,7 @@ ui: msg: empty: 链接不能为空。 name: - label: 链接描述(可选) + label: 描述 btn_cancel: 取消 btn_confirm: 添加 ordered_list: @@ -424,7 +427,7 @@ ui: range: URL 固定链接不能超过 35 个字符。 character: URL 固定链接包含非法字符。 desc: - label: 描述(可选) + label: 描述 btn_cancel: 取消 btn_submit: 提交 tag_info: @@ -441,9 +444,11 @@ ui: synonyms_text: 以下标签等同于 delete: title: 删除标签 - content: >- -

不允许删除有关联问题的标签。

请先从关联的问题中删除此标签的引用。

- content2: 确定要删除吗? + tip_with_posts: >- +

我们不允许 删除带有同义词的标签

请先从此标签中删除同义词。

+ tip_with_synonyms: >- +

我们不允许 删除带有同义词的标签

请先从此标签中删除同义词。

+ tip: 确定要删除吗? close: 关闭 edit_tag: title: 编辑标签 @@ -484,7 +489,7 @@ ui: btn_flag: 举报 btn_save_edits: 保存 btn_cancel: 取消 - show_more: Show more comments + show_more: 显示更多评论 tip_question: >- 使用评论提问更多信息或者提出改进意见。尽量避免使用评论功能回答问题。 tip_answer: >- @@ -499,7 +504,7 @@ ui: answer: label: 回答内容 feedback: - characters: content must be at least 6 characters in length. + characters: 内容长度至少 6 个字符 edit_summary: label: 编辑概要 placeholder: >- @@ -624,7 +629,7 @@ ui: msg: empty: 邮箱不能为空 change_email: - page_title: Welcome to {{site_name}} + page_title: 欢迎来到 {{site_name}} btn_cancel: 取消 btn_update: 更新电子邮件地址 send_success: >- @@ -662,12 +667,12 @@ ui: display_name: label: 昵称 msg: 昵称不能为空。 - msg_range: Display name up to 30 characters. + msg_range: 显示名称不能超过 30 个字符。 username: label: 用户名 caption: 用户之间可以通过 "@用户名" 进行交互。 msg: 用户名不能为空 - msg_range: Username up to 30 characters. + msg_range: 用户名不能超过 30 个字符。 character: '用户名只能由 "a-z", "0-9", " - . _" 组成' avatar: label: 头像 @@ -679,13 +684,13 @@ ui: default: 系统 msg: 请上传头像 bio: - label: 关于我 (可选) + label: 关于我 website: - label: 网站 (可选) + label: 网站 placeholder: "https://example.com" msg: 格式不正确 location: - label: 位置 (可选) + label: 位置 placeholder: "城市, 国家" notification: heading: 通知 @@ -753,7 +758,7 @@ ui: confirm_info: >-

您确定要提交一个新的回答吗?

您可以直接编辑和改善您之前的回答的。

empty: 回答内容不能为空。 - characters: content must be at least 6 characters in length. + characters: 内容长度至少 6 个字符 reopen: title: 重新打开这个帖子 content: 确定要重新打开吗? @@ -814,7 +819,7 @@ ui: modal_confirm: title: 发生错误... account_result: - page_title: Welcome to {{site_name}} + page_title: 欢迎来到 {{site_name}} success: 你的账号已通过验证,即将返回首页。 link: 返回首页 invalid: >- @@ -825,7 +830,7 @@ ui: unsubscribe: page_title: 退订 success_title: 取消订阅成功 - success_desc: You have been successfully removed from this subscriber list and won't receive any further emails from us. + success_desc: 您已成功地从此订阅者列表中移除,并且将不会再收到我们的任何电子邮件。 link: 更改设置 question: following_tags: 已关注的标签 @@ -887,7 +892,7 @@ ui: title: Answer next: 下一步 done: 完成 - config_yaml_error: Can't create the config.yaml file. + config_yaml_error: 无法创建 config.yaml 文件。 lang: label: 请选择一种语言 db_type: @@ -917,7 +922,7 @@ ui: label: 已创建 config.yaml 文件。 desc: >- 您可以手动在 <1>/var/wwww/xxx/ 目录中创建<1>config.yaml 文件并粘贴以下文本。 - info: After you've done that, click "Next" button. + info: 完成后,点击“下一步”按钮。 site_information: 站点信息 admin_account: 管理员账户 site_name: @@ -962,12 +967,12 @@ ui: 您似乎已经安装过了。要重新安装,请先清除旧的数据库表。 db_failed: 数据连接异常! db_failed_desc: >- - This either means that the database information in your <1>config.yaml file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down. + 这或者意味着数据库信息在 <1>config.yaml 文件不正确,或者无法与数据库服务器建立联系。这可能意味着您的主机数据库服务器已关闭。 counts: - views: views - votes: votes - answers: answers - accepted: Accepted + views: 次浏览 + votes: 个点赞 + answers: 个回答 + accepted: 已被采纳 page_404: desc: "很抱歉,此页面不存在。" back_home: 回到主页 @@ -975,7 +980,7 @@ ui: desc: 服务器遇到了一个错误,无法完成你的请求。 back_home: 回到主页 page_maintenance: - desc: "We are under maintenance, we'll be back soon." + desc: "我们正在进行维护,我们将很快回来。" nav_menus: dashboard: 后台管理 contents: 内容管理 @@ -1116,7 +1121,7 @@ ui: password: label: 密码 text: 用户将被注销,需要再次登录。 - msg: Password must be at 8-32 characters in length. + msg: 密码的长度必须是8-32个字符。 btn_cancel: 取消 btn_submit: 提交 user_modal: @@ -1125,13 +1130,13 @@ ui: fields: display_name: label: 昵称 - msg: Display Name must be at 3-30 characters in length. + msg: 显示名称长度必须为 3-30 个字符 email: label: 邮箱 msg: 电子邮箱无效。 password: label: 密码 - msg: Password must be at 8-32 characters in length. + msg: 密码的长度必须是8-32个字符。 btn_cancel: 取消 btn_submit: 提交 questions: @@ -1172,11 +1177,11 @@ ui: validate: 请输入一个有效的 URL。 text: 此网站的地址。 short_desc: - label: 简短网站描述(可选) + label: 简短站点描述 msg: 简短网站描述不能为空。 text: "简短的标语,作为网站主页的标题(Html 的 title 标签)。" desc: - label: 网站描述 (可选) + label: 站点描述 msg: 网站描述不能为空。 text: "使用一句话描述本站,作为网站的描述(Html 的 meta 标签)。" contact_email: @@ -1186,14 +1191,6 @@ ui: text: 负责本网站的主要联系人的电子邮件地址。 interface: page_title: 界面 - logo: - label: Logo (可选) - msg: 不能为空 - text: 可以上传图片,或者<1>重置为站点标题。 - theme: - label: 主题 - msg: 不能为空 - text: 选择一个主题 language: label: 界面语言 msg: 不能为空 @@ -1245,19 +1242,19 @@ ui: branding: page_title: 品牌 logo: - label: Logo (可选) + label: 网站标志(Logo) msg: 图标不能为空。 text: 在你的网站左上方的Logo图标。使用一个高度为56,长宽比大于3:1的宽长方形图像。如果留空,将显示网站标题文本。 mobile_logo: - label: 移动端图标(可选) - text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. + label: 移动端 Logo + text: 在你的网站的移动版上使用的标志。使用一个高度为56的宽矩形图像。如果留空,将使用 "Logo"设置中的图像。 square_icon: - label: 方形图标 (可选) + label: 方形图标 msg: 方形图标不能为空。 text: 用作元数据图标的基础的图像。最好是大于512x512。 favicon: - label: 收藏夹图标(可选) - text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. + label: 收藏夹图标 + text: 网站的图标。要在 CDN 正常工作,它必须是 png。 将调整大小到32x32。如果留空,将使用“方形图标”。 legal: page_title: 法律条款 terms_of_service: @@ -1339,6 +1336,7 @@ ui: activate: 启用 settings: 设置 form: + optional: (选填) empty: 不能为空 invalid: 是无效的 btn_submit: 保存 @@ -1388,5 +1386,7 @@ ui: staffs: 我们的社区工作人员 reputation: 声望值 votes: 投票 - + prompt: + leave_page: "确定要离开此页面?" + changes_not_save: "您的更改尚未保存" diff --git a/i18n/zh_TW.yaml b/i18n/zh_TW.yaml index 3a681b28..f5051767 100644 --- a/i18n/zh_TW.yaml +++ b/i18n/zh_TW.yaml @@ -2,11 +2,11 @@ backend: base: success: - other: 成功! + other: 成功。 unknown: other: 未知的錯誤。 request_format_error: - other: 請求的格式無效。 + other: 請求格式錯誤。 unauthorized_error: other: 未授權。 database_error: @@ -16,65 +16,65 @@ backend: user: other: 使用者 admin: - other: 管理者 + other: 管理員 moderator: other: 版主 description: user: - other: 預設沒有特別閱讀權限 + other: 預設沒有特別閱讀權限。 admin: - other: 擁有所有權限 + other: 擁有訪問該網站的全部權限。 moderator: - other: 可以訪問除了管理員設定以外的所有貼文 + other: 可以訪問除了管理員設定以外的所有貼文。 email: other: 電子郵件 password: other: 密碼 email_or_password_wrong_error: - other: 電子郵箱和密碼不匹配。 + other: 電郵和密碼不匹配。 error: admin: email_or_password_wrong: - other: 電子郵箱和密碼不匹配。 + other: 電郵和密碼不匹配。 answer: not_found: - other: 無答案。 + other: 未發現答案。 cannot_deleted: - other: 無刪除權限。 + other: 沒有刪除權限。 cannot_update: - other: 無更新權限。 + other: 沒有更新權限。 comment: edit_without_permission: other: 不允許編輯評論。 not_found: - other: 無評論。 + other: 未發現評論。 cannot_edit_after_deadline: - other: The comment time has been too long to modify. + other: 該則評論時間過久,無法修改。 email: duplicate: - other: 該電子郵件已被使用 + other: 該電子郵件已被使用。 need_to_be_verified: - other: 需驗證電子郵件信箱。 + other: 需驗證電子郵件 verify_url_expired: - other: 電子郵件驗證網址已過期,請重發確認郵件。 + other: 電子郵件驗證網址已過期,請重發電子郵件。 lang: not_found: - other: 無此語系檔。 + other: 未找到语言文件。 object: captcha_verification_failed: other: 驗證碼錯誤。 disallow_follow: - other: 你不能追蹤 + other: 你不被允許追蹤。 disallow_vote: - other: 你不能投票 + other: 你無法投票。 disallow_vote_your_self: - other: 你不能為自己的貼文投票 + other: 你不能為自己的貼文投票。 not_found: - other: 找不到物件 + other: 找不到物件。 verification_failed: other: 驗證失敗。 email_or_password_incorrect: - other: 電子郵箱和密碼不匹配。 + other: 電郵和密碼不匹配。 old_password_verification_failed: other: 舊密碼驗證失敗 new_password_same_as_previous_setting: @@ -83,1284 +83,1260 @@ backend: not_found: other: 找不到問題。 cannot_deleted: - other: 沒有刪除的權限。 + other: 無刪除權限。 cannot_close: - other: 沒有關閉的權限。 + other: 無關閉權限。 cannot_update: - other: 沒有更新的權限。 + other: 無更新權限。 rank: fail_to_meet_the_condition: - other: 無法為條件排序 + other: 級別不符合條件 report: handle_failed: - other: Report handle failed. + other: 報告處理失敗。 not_found: - other: 找不到報告 + other: 找不到報告。 tag: not_found: - other: Tag not found. + other: 找不到標籤。 recommend_tag_not_found: - other: Recommend Tag is not exist. + other: 推薦的標籤不存在。 recommend_tag_enter: - other: Please enter at least one required tag. + other: 請輸入至少一個必需的標籤。 not_contain_synonym_tags: - other: Should not contain synonym tags. + other: 不應包含同義詞標籤。 cannot_update: - other: No permission to update. + other: 沒有權限更新。 + is_used_cannot_delete: + other: 你不能刪除使用中的標籤 cannot_set_synonym_as_itself: - other: You cannot set the synonym of the current tag as itself. + other: 你不能將當前標籤的同義詞設置為本身。 smtp: config_from_name_cannot_be_email: - other: The From Name cannot be a email address. + other: 發件人名稱不能是電子郵件地址。 theme: not_found: other: 未找到主題。 revision: review_underway: - other: Can't edit currently, there is a version in the review queue. + other: 目前無法編輯,有一個版本在審查佇列中。 no_permission: - other: No permission to Revision. + other: 無權限修改。 user: email_or_password_wrong: other: - other: Email and password do not match. + other: 電子郵箱和密碼不匹配。 not_found: - other: User not found. + other: 未找到使用者。 suspended: - other: User has been suspended. + other: 該使用者已被停權。 username_invalid: - other: Username is invalid. + other: 使用者名稱無效。 username_duplicate: - other: Username is already in use. + other: 用戶名已被使用 set_avatar: - other: Avatar set failed. + other: 頭像設置錯誤。 cannot_update_your_role: - other: You cannot modify your role. + other: 您不能修改自己的角色。 not_allowed_registration: - other: Currently the site is not open for registration + other: 本站目前未開放註冊。 config: read_config_failed: - other: Read config failed + other: 讀取配置失敗 database: connection_failed: - other: Database connection failed + other: 資料庫連接失敗 create_table_failed: - other: Create table failed + other: 表建立失敗 install: create_config_failed: - other: Can't create the config.yaml file. + other: 無法建立 config.yaml 檔。 upload: unsupported_file_format: - other: Unsupported file format. + other: 不支援的檔案格式。 report: spam: name: - other: spam + other: 垃圾貼文。 desc: - other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic. + other: 此貼文是一個廣告,或是破壞性行為。它對當前的主題沒有用處,也不相關。 rude: name: - other: rude or abusive + other: 粗魯或辱罵的 desc: - other: A reasonable person would find this content inappropriate for respectful discourse. + other: 一個有理智的人都會認為這種內容不適合進行尊重性的討論。 duplicate: name: - other: 重複 + other: 重覆信息 desc: - other: This question has been asked before and already has an answer. + other: 此問題以前就有人問過,而且已經有了答案。 not_answer: name: - other: not an answer + other: 不是答案 desc: - other: This was posted as an answer, but it does not attempt to answer the question. It should possibly be an edit, a comment, another question, or deleted altogether. + other: 此帖子是作為一個答案發布的,但它並沒有試圖回答這個問題。總之,它可能應該是個編輯,評論,另一個問題或者被刪除。 not_need: name: - other: no longer needed + other: 不再需要 desc: - other: This comment is outdated, conversational or not relevant to this post. + other: 此評論已過時,對話或與此帖子無關。 other: name: - other: something else + other: 其他原因 desc: - other: This post requires staff attention for another reason not listed above. + other: 由於上面未列出的另一個原因,這篇文章需要工作人員注意。 question: close: duplicate: name: - other: spam + other: 垃圾信息 desc: - other: This question has been asked before and already has an answer. + other: 此問題以前就有人問過,而且已經有了答案。 guideline: name: - other: a community-specific reason + other: 一个社群特定原因 desc: - other: This question doesn't meet a community guideline. + other: 此問題不符合社群準則。 multiple: name: - other: needs details or clarity + other: 需要細節或明晰 desc: - other: This question currently includes multiple questions in one. It should focus on one problem only. + other: 此問題目前涵蓋多個問題。它應該只集中在一個問題上。 other: name: - other: something else + other: 其他原因 desc: - other: This post requires another reason not listed above. + other: 這個帖子需要上面沒有列出的另一個原因。 operation_type: asked: - other: asked + other: 提問於 answered: - other: answered + other: 回答於 modified: - other: modified + other: 修改於 notification: action: update_question: - other: updated question + other: 更新了問題 answer_the_question: - other: answered question + other: 回答了問題 update_answer: - other: updated answer + other: 更新了答案 accept_answer: - other: accepted answer + other: 已接受的回答 comment_question: - other: commented question + other: 評論了問題 comment_answer: - other: commented answer + other: 評論了答案 reply_to_you: - other: replied to you + other: 回覆了你 mention_you: - other: mentioned you + other: 提到了你 your_question_is_closed: - other: Your question has been closed + other: 你的問題已被關閉 your_question_was_deleted: - other: Your question has been deleted + other: 你的問題已被刪除 your_answer_was_deleted: - other: Your answer has been deleted + other: 你的答案已被刪除 your_comment_was_deleted: - other: Your comment has been deleted + other: 你的評論已被刪除 #The following fields are used for interface presentation(Front-end) ui: how_to_format: - title: How to Format + title: 如何設定文本格式 desc: >- - + pagination: - prev: Prev - next: Next + prev: 上一頁 + next: 下一頁 page_title: - question: Question - questions: Questions - tag: Tag - tags: Tags - tag_wiki: tag wiki - edit_tag: Edit Tag - ask_a_question: Add Question - edit_question: Edit Question - edit_answer: Edit Answer - search: Search - posts_containing: Posts containing - settings: Settings - notifications: Notifications - login: Log In - sign_up: Sign Up - account_recovery: Account Recovery - account_activation: Account Activation - confirm_email: Confirm Email - account_suspended: Account Suspended - admin: Admin - change_email: Modify Email - install: Answer Installation - upgrade: Answer Upgrade - maintenance: Website Maintenance - users: Users + question: 問題 + questions: 問題 + tag: 標籤 + tags: 標籤 + tag_wiki: 標籤 wiki + edit_tag: 編輯標籤 + ask_a_question: 提問題 + edit_question: 編輯問題 + edit_answer: 編輯回答 + search: 搜尋 + posts_containing: 包含的帖子 + settings: 設定 + notifications: 通知 + login: 登入 + sign_up: 註冊 + account_recovery: 帳號恢復 + account_activation: 帳號啟用 + confirm_email: 確認電子郵件 + account_suspended: 帳號已封禁 + admin: 後台管理 + change_email: 修改電子郵件 + install: Answer 安裝 + upgrade: Answer 升級 + maintenance: 網站維護 + users: 用戶 notifications: - title: Notifications - inbox: Inbox - achievement: Achievements - all_read: Mark all as read - show_more: Show more + title: 通知 + inbox: 收件夾 + achievement: 成就 + all_read: 全部標記為已讀 + show_more: 顯示更多 suspended: - title: Your Account has been Suspended - until_time: "Your account was suspended until {{ time }}." - forever: This user was suspended forever. - end: You don't meet a community guideline. + title: 您的帳號已被停權 + until_time: "你的帳號被停權至{{ time }}。" + forever: 你的帳號已被永久停權。 + end: 違反了我們的社群準則。 editor: blockquote: - text: Blockquote + text: 引用 bold: - text: Strong + text: 粗體 chart: - text: Chart - flow_chart: Flow chart - sequence_diagram: Sequence diagram - class_diagram: Class diagram - state_diagram: State diagram - entity_relationship_diagram: Entity relationship diagram - user_defined_diagram: User defined diagram - gantt_chart: Gantt chart - pie_chart: Pie chart + text: 圖表 + flow_chart: 流程圖 + sequence_diagram: 時序圖 + class_diagram: 類圖 + state_diagram: 狀態圖 + entity_relationship_diagram: 實體關係圖 + user_defined_diagram: 用戶自定義圖表 + gantt_chart: 甘特圖 + pie_chart: 圓餅圖 code: - text: Code Sample - add_code: Add code sample + text: 代碼示例 + add_code: 添加代碼示例 form: fields: code: - label: Code + label: 代碼塊 msg: - empty: Code cannot be empty. + empty: 代碼不能為空 language: - label: Language (optional) - placeholder: Automatic detection - btn_cancel: Cancel - btn_confirm: Add + label: 語言 + placeholder: 自動偵測 + btn_cancel: 取消 + btn_confirm: 添加 formula: - text: Formula + text: 公式 options: - inline: Inline formula - block: Block formula + inline: 內聯公式 + block: 公式塊 heading: - text: Heading + text: 標題 options: - h1: Heading 1 - h2: Heading 2 - h3: Heading 3 - h4: Heading 4 - h5: Heading 5 - h6: Heading 6 + h1: 標題 1 + h2: 標題 2 + h3: 標題 3 + h4: 標題 4 + h5: 標題 5 + h6: 標題 6 help: - text: Help + text: 幫助 hr: - text: Horizontal Rule + text: 水平分割線 image: - text: Image - add_image: Add image - tab_image: Upload image + text: 圖片 + add_image: 添加圖片 + tab_image: 上傳圖片 form_image: fields: file: - label: Image File - btn: Select image + label: 圖片文件 + btn: 選擇圖片 msg: - empty: File cannot be empty. - only_image: Only image files are allowed. - max_size: File size cannot exceed 4MB. + empty: 文件不能為空。 + only_image: 只能上傳圖片文件。 + max_size: 文件大小不能超過4MB desc: - label: Description (optional) - tab_url: Image URL + label: 圖片描述 + tab_url: 圖片地址 form_url: fields: url: - label: Image URL + label: 圖片地址 msg: - empty: Image URL cannot be empty. + empty: 圖片地址不能為空 name: - label: Description (optional) - btn_cancel: Cancel - btn_confirm: Add - uploading: Uploading + label: 圖片描述 + btn_cancel: 取消 + btn_confirm: 添加 + uploading: 上傳中... indent: - text: Indent + text: 增加縮排 outdent: - text: Outdent + text: 減少縮排 italic: - text: Emphasis + text: 斜體 link: - text: Hyperlink - add_link: Add hyperlink + text: 超連結 + add_link: 添加超連結 form: fields: url: - label: URL + label: 連結 msg: - empty: URL cannot be empty. + empty: 連結不能為空。 name: - label: Description (optional) - btn_cancel: Cancel - btn_confirm: Add + label: 描述 + btn_cancel: 取消 + btn_confirm: 添加 ordered_list: - text: Numbered List + text: 有編號列表 unordered_list: - text: Bulleted List + text: 無編號列表 table: - text: Table - heading: Heading - cell: Cell + text: 表格 + heading: 表頭 + cell: 單元格 close_modal: - title: I am closing this post as... - btn_cancel: Cancel - btn_submit: Submit + title: 關閉原因是... + btn_cancel: 取消 + btn_submit: 提交 remark: - empty: Cannot be empty. + empty: 不能為空。 msg: - empty: Please select a reason. + empty: 請選擇一個原因。 report_modal: - flag_title: I am flagging to report this post as... - close_title: I am closing this post as... - review_question_title: Review question - review_answer_title: Review answer - review_comment_title: Review comment - btn_cancel: Cancel - btn_submit: Submit + flag_title: 報告為... + close_title: 關閉原因是... + review_question_title: 審核問題 + review_answer_title: 審核回答 + review_comment_title: 審核評論 + btn_cancel: 取消 + btn_submit: 提交 remark: - empty: Cannot be empty. + empty: 不能為空 msg: - empty: Please select a reason. + empty: 請選擇一個原因。 tag_modal: - title: Create new tag + title: 創建新標籤 form: fields: display_name: - label: Display Name + label: 顯示名稱 msg: - empty: Display name cannot be empty. - range: Display name up to 35 characters. + empty: 顯示名稱不能為空。 + range: 顯示名稱不能超過 35 個字符。 slug_name: - label: URL Slug - desc: 'Must use the character set "a-z", "0-9", "+ # - ."' + label: URL 固定連結 + desc: '必須由 "a-z", "0-9", "+ # - ." 組成' msg: - empty: URL slug cannot be empty. - range: URL slug up to 35 characters. - character: URL slug contains unallowed character set. + empty: URL 固定連結不能為空。 + range: URL 固定連結不能超過 35 個字元。 + character: URL 固定連結包含非法字元。 desc: - label: Description (optional) - btn_cancel: Cancel - btn_submit: Submit + label: 描述 + btn_cancel: 取消 + btn_submit: 提交 tag_info: - created_at: Created - edited_at: Edited - history: History + created_at: 創建於 + edited_at: 編輯於 + history: 歷史 synonyms: - title: Synonyms - text: The following tags will be remapped to - empty: No synonyms found. - btn_add: Add a synonym - btn_edit: Edit - btn_save: Save - synonyms_text: The following tags will be remapped to + title: 同義詞 + text: 以下標籤等同於 + empty: 此標籤目前沒有同義詞。 + btn_add: 添加同義詞 + btn_edit: 編輯 + btn_save: 儲存 + synonyms_text: 以下標籤等同於 delete: - title: Delete this tag - content: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

- content2: Are you sure you wish to delete? - close: Close + title: 刪除標籤 + tip_with_posts: >- +

我們不允許刪除帶有貼文的標籤

請先從該貼文中刪除此標籤。

+ tip_with_synonyms: >- +

我們不允許刪除帶有同義詞的標籤

請先從該標籤中刪除同義詞。

+ tip: 你確定要刪除嗎? + close: 關閉 edit_tag: - title: Edit Tag - default_reason: Edit tag + title: 編輯標籤 + default_reason: 編輯標籤 form: fields: revision: - label: Revision + label: 編輯歷史 display_name: - label: Display Name + label: 顯示名稱 slug_name: - label: URL Slug - info: 'Must use the character set "a-z", "0-9", "+ # - ."' + label: URL 固定連結 + info: '必須由 "a-z", "0-9", "+ # - ." 組成' desc: - label: Description + label: 描述 edit_summary: - label: Edit Summary + label: 編輯概要 placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_save_edits: Save edits - btn_cancel: Cancel + 簡單描述更改原因 (錯別字、文字表達、格式等等) + btn_save_edits: 儲存更改 + btn_cancel: 取消 dates: - long_date: MMM D - long_date_with_year: "MMM D, YYYY" - long_date_with_time: "MMM D, YYYY [at] HH:mm" - now: now - x_seconds_ago: "{{count}}s ago" - x_minutes_ago: "{{count}}m ago" - x_hours_ago: "{{count}}h ago" - hour: hour - day: day + long_date: MM月DD日 + long_date_with_year: "YYYY年MM月DD日" + long_date_with_time: "YYYY年MM月DD日 HH:mm" + now: 剛剛 + x_seconds_ago: "{{count}} 秒前" + x_minutes_ago: "{{count}} 分鐘前" + x_hours_ago: "{{count}} 小時前" + hour: 小時 + day: 天 comment: - btn_add_comment: Add comment - reply_to: Reply to - btn_reply: Reply - btn_edit: Edit - btn_delete: Delete - btn_flag: Flag - btn_save_edits: Save edits - btn_cancel: Cancel - show_more: Show more comments - tip_question: >- - Use comments to ask for more information or suggest improvements. Avoid answering questions in comments. - tip_answer: >- - Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting. + btn_add_comment: 添加評論 + reply_to: 回復 + btn_reply: 回復 + btn_edit: 編輯 + btn_delete: 刪除 + btn_flag: 舉報 + btn_save_edits: 保存 + btn_cancel: 取消 + show_more: 顯示更多評論 + tip_question: 通过評論询问更多问题或提出改進建議。避免在評論中回答問題。 + tip_answer: 使用評論回復其他用戶或通知他們进行更改。如果你要添加新的信息,請編輯你的帖子,而不是發表評論。 edit_answer: - title: Edit Answer - default_reason: Edit answer + title: 編輯回答 + default_reason: 編輯回答 form: fields: revision: - label: Revision + label: 編輯歷史 answer: - label: Answer + label: 回答內容 feedback: - characters: content must be at least 6 characters in length. + characters: 內容必須至少6個字元長度。 edit_summary: - label: Edit Summary - placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_save_edits: Save edits - btn_cancel: Cancel + label: 編輯概要 + placeholder: 簡單描述更改原因 (錯別字、文字表達、格式等等) + btn_save_edits: 儲存更改 + btn_cancel: 取消 tags: - title: Tags + title: 標籤 sort_buttons: - popular: Popular - name: Name - newest: newest - button_follow: Follow - button_following: Following - tag_label: questions - search_placeholder: Filter by tag name - no_desc: The tag has no description. - more: More + popular: 熱門 + name: 名稱 + newest: 最新 + button_follow: 關注 + button_following: 已關注 + tag_label: 個問題 + search_placeholder: 通過標籤名過濾 + no_desc: 此標籤無描述。 + more: 更多 ask: - title: Add Question - edit_title: Edit Question - default_reason: Edit question - similar_questions: Similar questions + title: 發問 + edit_title: 編輯問題 + default_reason: 編輯問題 + similar_questions: 相似的問題 form: fields: revision: - label: Revision + label: 編輯歷史 title: - label: Title - placeholder: Be specific and imagine you're asking a question to another person + label: 標題 + placeholder: 具體一點,想像你是在向另一個人提出問題 msg: - empty: Title cannot be empty. - range: Title up to 150 characters + empty: 標題不能為空 + range: 標題最多 150 個字元 body: - label: Body + label: 正文 msg: - empty: Body cannot be empty. + empty: 正文不能爲空。 tags: - label: Tags + label: 標籤 msg: - empty: Tags cannot be empty. + empty: 標籤不能為空 answer: - label: Answer + label: 回答內容 msg: - empty: Answer cannot be empty. + empty: 回答內容不能為空 edit_summary: - label: Edit Summary - placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_post_question: Post your question - btn_save_edits: Save edits - answer_question: Answer your own question - post_question&answer: Post your question and answer + label: 編輯概要 + placeholder: 簡單描述更改原因 (錯別字、文字表達、格式等等) + btn_post_question: 提出問題 + btn_save_edits: 儲存更改 + answer_question: 回答您自己的問題 + post_question&answer: 發布您的問題和答案 tag_selector: - add_btn: Add tag - create_btn: Create new tag - search_tag: Search tag - hint: "Describe what your question is about, at least one tag is required." - no_result: No tags matched - tag_required_text: Required tag (at least one) + add_btn: 建立標籤 + create_btn: 建立新標籤 + search_tag: 搜尋標籤 + hint: 请描述您的問題,至少需要一個標籤。 + no_result: 沒有匹配的標籤 + tag_required_text: 必填標籤 (至少一個) header: nav: - question: Questions - tag: Tags - user: Users - profile: Profile - setting: Settings - logout: Log out - admin: Admin - review: Review + question: 問題 + tag: 標籤 + user: 用戶 + profile: 用戶主頁 + setting: 帳號設置 + logout: 登出 + admin: 後台管理 + review: 審查 search: - placeholder: Search + placeholder: 搜尋 footer: build_on: >- - Built on <1> Answer - the open-source software that powers Q&A communities.
Made with love © {{cc}}. + 基於<1>Answer--為問答社群提供動力的開源軟體。
Made with love © {{cc}}. upload_img: - name: Change - loading: loading... + name: 更改 + loading: 讀取中... pic_auth_code: - title: Captcha - placeholder: Type the text above + title: 驗證碼 + placeholder: 輸入上面的文字 msg: - empty: Captcha cannot be empty. + empty: 验证码不能為空 inactive: - first: >- - You're almost done! We sent an activation mail to {{mail}}. Please follow the instructions in the mail to activate your account. - info: "If it doesn't arrive, check your spam folder." - another: >- - We sent another activation email to you at {{mail}}. It might take a few minutes for it to arrive; be sure to check your spam folder. - btn_name: Resend activation email - change_btn_name: Change email + first: 就差一步!我們寄送了一封啟用電子郵件到 {{mail}}。請按照郵件中的說明啟用您的帳戶。 + info: 如果沒有收到,請檢查您的垃圾郵件文件夾。 + another: 我們向您發送了另一封啟用電子郵件,地址為 {{mail}}。它可能需要幾分鐘才能到達;請務必檢查您的垃圾郵件文件夾。 + btn_name: 重新發送啟用郵件 + change_btn_name: 更改郵箱 msg: - empty: Cannot be empty. + empty: 不能為空 login: - page_title: Welcome to {{site_name}} - login_to_continue: Log in to continue - info_sign: Don't have an account? <1>Sign up - info_login: Already have an account? <1>Log in - agreements: By registering, you agree to the <1>privacy policy and <3>terms of service. - forgot_pass: Forgot password? + page_title: 歡迎來到 {{site_name}} + login_to_continue: 登入以繼續 + info_sign: 沒有帳戶?<1>註冊 + info_login: 已經有一個帳號?<1>登入 + agreements: 登入即表示您同意<1>隱私政策和<3>服務條款。 + forgot_pass: 忘記密碼? name: - label: Name + label: 名稱 msg: - empty: Name cannot be empty. - range: Name up to 30 characters. + empty: 名稱不能為空 + range: 名稱最多 30 個字元 email: - label: Email + label: 郵箱 msg: - empty: Email cannot be empty. + empty: 郵箱不能為空 password: - label: Password + label: 密碼 msg: - empty: Password cannot be empty. - different: The passwords entered on both sides are inconsistent + empty: 密碼不能為空 + different: 兩次輸入密碼不一致 account_forgot: - page_title: Forgot Your Password - btn_name: Send me recovery email - send_success: >- - If an account matches {{mail}}, you should receive an email with instructions on how to reset your password shortly. + page_title: 忘記密碼 + btn_name: 向我發送恢復郵件 + send_success: 如果帳號與{{mail}}相符,您應該很快就會收到一封電子郵件,說明如何重置您的密碼。 email: - label: Email + label: 郵箱 msg: - empty: Email cannot be empty. + empty: 郵箱不能為空 change_email: - page_title: Welcome to {{site_name}} - btn_cancel: Cancel - btn_update: Update email address - send_success: >- - If an account matches {{mail}}, you should receive an email with instructions on how to reset your password shortly. + page_title: 歡迎來到 {{site_name}} + btn_cancel: 取消 + btn_update: 更新電子郵件地址 + send_success: 如果帳號與{{mail}}相符,您應該很快就會收到一封電子郵件,說明如何重置您的密碼。 email: - label: New Email + label: 新電子郵件 msg: - empty: Email cannot be empty. + empty: 郵箱不能為空 password_reset: - page_title: Password Reset - btn_name: Reset my password - reset_success: >- - You successfully changed your password; you will be redirected to the log in page. - link_invalid: >- - Sorry, this password reset link is no longer valid. Perhaps your password is already reset? - to_login: Continue to log in page + page_title: 密碼重置 + btn_name: 重置我的密碼 + reset_success: 你已經成功更改密碼,將返回登入頁面 + link_invalid: 抱歉,此密碼重置連結已失效。也許是你已經重置過密碼了? + to_login: 前往登入頁面 password: - label: Password + label: 密碼 msg: - empty: Password cannot be empty. - length: The length needs to be between 8 and 32 - different: The passwords entered on both sides are inconsistent + empty: 密碼不能為空 + length: 密碼長度在8-32個字元之間 + different: 兩次輸入密碼不一致 password_confirm: - label: Confirm New Password + label: 確認新密碼 settings: - page_title: Settings + page_title: 設置 nav: - profile: Profile - notification: Notifications - account: Account - interface: Interface + profile: 我的資料 + notification: 通知 + account: 帳號 + interface: 界面 profile: - heading: Profile - btn_name: Save + heading: 個人資料 + btn_name: 保存 display_name: - label: Display Name - msg: Display name cannot be empty. - msg_range: Display name up to 30 characters. + label: 顯示名稱 + msg: 顯示名稱不能為空。 + msg_range: 顯示名稱最長 30 個字元。 username: - label: Username - caption: People can mention you as "@username". - msg: Username cannot be empty. - msg_range: Username up to 30 characters. - character: 'Must use the character set "a-z", "0-9", " - . _"' + label: 用戶名 + caption: 用戶之間可以通過 "@用戶名" 進行交互。 + msg: 用戶名不能為空 + msg_range: 使用者名稱最長 30 個字元。 + character: 必須由 "a-z", "0-9", " - . _" 組成 avatar: - label: Profile Image - gravatar: Gravatar - gravatar_text: You can change image on <1>gravatar.com - custom: Custom - btn_refresh: Refresh - custom_text: You can upload your image. - default: System - msg: Please upload an avatar + label: 頭像 + gravatar: 頭像 + gravatar_text: 您可以在 <1>gravatar.com 更改圖像 + custom: 自定義 + btn_refresh: 重新整理 + custom_text: 您可以上傳您的圖片。 + default: 系統 + msg: 請上傳頭像 bio: - label: About Me (optional) + label: 關於我 website: - label: Website (optional) - placeholder: "https://example.com" - msg: Website incorrect format + label: 網站 + placeholder: https://example.com + msg: 網站格式不正確 location: - label: Location (optional) - placeholder: "City, Country" + label: 位置 + placeholder: 城市, 國家 notification: - heading: Notifications + heading: 通知 email: - label: Email Notifications - radio: "Answers to your questions, comments, and more" + label: 郵件通知 + radio: 回答你的問題,評論,以及更多 account: - heading: Account - change_email_btn: Change email - change_pass_btn: Change password - change_email_info: >- - We've sent an email to that address. Please follow the confirmation instructions. + heading: 帳號 + change_email_btn: 更改郵箱 + change_pass_btn: 更改密碼 + change_email_info: 我們已經寄出一封郵件至此電子郵件地址,請遵照說明進行確認。 email: - label: Email - msg: Email cannot be empty. - password_title: Password + label: 郵箱 + msg: 郵箱不能為空 + password_title: 密碼 current_pass: - label: Current Password + label: 當前密碼 msg: - empty: Current Password cannot be empty. - length: The length needs to be between 8 and 32. - different: The two entered passwords do not match. + empty: 當前密碼不能為空 + length: 密碼長度必須在 8 至 32 之間 + different: 兩次輸入的密碼不匹配 new_pass: - label: New Password + label: 新密碼 pass_confirm: - label: Confirm New Password + label: 確認新密碼 interface: - heading: Interface + heading: 介面 lang: - label: Interface Language - text: User interface language. It will change when you refresh the page. + label: 介面語言 + text: 設定使用者介面語言,在重新整裡頁面後生效。 toast: - update: update success - update_password: Password changed successfully. - flag_success: Thanks for flagging. - forbidden_operate_self: Forbidden to operate on yourself - review: Your revision will show after review. + update: 更新成功 + update_password: 更改密碼成功。 + flag_success: 感謝您的標記 + forbidden_operate_self: 禁止自己操作 + review: 您的修訂將在審核通過後顯示。 related_question: - title: Related Questions - btn: Add question - answers: answers + title: 相關問題 + btn: 發問 + answers: 個回答 question_detail: - Asked: Asked - asked: asked - update: Modified - edit: edited - Views: Viewed - Follow: Follow - Following: Following - answered: answered - closed_in: Closed in - show_exist: Show existing question. + Asked: 提問於 + asked: 提問於 + update: 修改於 + edit: 最後編輯於 + Views: 閱讀次數 + Follow: 關注 + Following: 已關注 + answered: 回答於 + closed_in: 關閉於 + show_exist: 顯示現有問題。 answers: - title: Answers - score: Score - newest: Newest - btn_accept: Accept - btn_accepted: Accepted + title: 個回答 + score: 評分 + newest: 最新 + btn_accept: 採納 + btn_accepted: 已被採納 write_answer: - title: Your Answer - btn_name: Post your answer - add_another_answer: Add another answer - confirm_title: Continue to answer - continue: Continue - confirm_info: >- -

Are you sure you want to add another answer?

You could use the edit link to refine and improve your existing answer, instead.

- empty: Answer cannot be empty. - characters: content must be at least 6 characters in length. + title: 你的回答 + btn_name: 提交你的回答 + add_another_answer: 添加另一個答案 + confirm_title: 繼續回答 + continue: 繼續 + confirm_info:

您確定要添加一個新的回答嗎?

您可以使用编辑链接来完善和改进您现有的答案。

+ empty: 回答內容不能為空。 + characters: 內容必須至少6個字元長度。 reopen: - title: Reopen this post - content: Are you sure you want to reopen? - success: This post has been reopened + title: 重新打開這個貼文 + content: 確定要重新打開嗎? + success: 這個貼文已被重新打開 delete: - title: Delete this post - question: >- - We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.

Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete? - answer_accepted: >- -

We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.

Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete? - other: Are you sure you wish to delete? - tip_question_deleted: This post has been deleted - tip_answer_deleted: This answer has been deleted + title: 刪除此貼 + question: 我們不建議刪除有回答的貼文。因為這樣做會使得後來的讀者無法從該問題中獲得幫助。

如果刪除過多有回答的貼文,你的帳號將會被禁止提問。你確定要刪除嗎? + answer_accepted:

我們不建議刪除被採納的回答。因為這樣做會使得後來的讀者無法從該回答中獲得幫助。

如果刪除過多被採納的貼文,你的帳號將會被禁止回答任何提問。你確定要刪除嗎? + other: 你確定要刪除? + tip_question_deleted: 該帖子已被刪除。 + tip_answer_deleted: 此回答已被刪除 btns: - confirm: Confirm - cancel: Cancel - save: Save - delete: Delete - login: Log in - signup: Sign up - logout: Log out - verify: Verify - add_question: Add question - approve: Approve - reject: Reject - skip: Skip + confirm: 確認 + cancel: 取消 + save: 儲存 + delete: 刪除 + login: 登入 + signup: 註冊 + logout: 登出 + verify: 驗證 + add_question: 發問 + approve: 核准 + reject: 拒絕 + skip: 略過 search: - title: Search Results - keywords: Keywords - options: Options - follow: Follow - following: Following - counts: "{{count}} Results" - more: More + title: 搜尋結果 + keywords: 關鍵詞 + options: 選項 + follow: 追蹤 + following: 已關注 + counts: "{{count}} 個結果" + more: 更多 sort_btns: - relevance: Relevance - newest: Newest - active: Active - score: Score - more: More + relevance: 相關性 + newest: 最新的 + active: 活躍的 + score: 評分 + more: 更多 tips: - title: Advanced Search Tips - tag: "<1>[tag] search withing a tag" - user: "<1>user:username search by author" - answer: "<1>answers:0 unanswered questions" - score: "<1>score:3 posts with a 3+ score" - question: "<1>is:question search questions" - is_answer: "<1>is:answer search answers" - empty: We couldn't find anything.
Try different or less specific keywords. + title: 高級搜尋提示 + tag: <1>[tag] 在指定標籤中搜尋 + user: <1>user:username 根據作者搜尋 + answer: <1>answers:0 搜尋未回答的問題 + score: <1>score:3 得分為 3+ 的帖子 + question: <1>is:question 只搜尋問題 + is_answer: <1>is:answer 只搜尋回答 + empty: 找不到任何相關的內容。
請嘗試其他關鍵字,或者減少查找內容的長度。 share: - name: Share - copy: Copy link - via: Share post via... - copied: Copied - facebook: Share to Facebook - twitter: Share to Twitter - cannot_vote_for_self: You can't vote for your own post + name: 分享 + copy: 複製連結 + via: 分享在... + copied: 已複製 + facebook: 分享到 Facebook + twitter: 分享到 Twitter + cannot_vote_for_self: 不能給自己投票 modal_confirm: - title: Error... + title: 發生錯誤... account_result: - page_title: Welcome to {{site_name}} - success: Your new account is confirmed; you will be redirected to the home page. - link: Continue to homepage - invalid: >- - Sorry, this account confirmation link is no longer valid. Perhaps your account is already active? - confirm_new_email: Your email has been updated. - confirm_new_email_invalid: >- - Sorry, this confirmation link is no longer valid. Perhaps your email was already changed? + page_title: 歡迎來到 {{site_name}} + success: 你的帳號已通過驗證,即將返回首頁。 + link: 繼續訪問主頁 + invalid: 抱歉,此驗證連結已失效。也許是你的帳號已經通過驗證了? + confirm_new_email: 你的電子郵箱已更新 + confirm_new_email_invalid: 抱歉,此驗證連結已失效。也許是你的郵箱已經成功更改了? unsubscribe: - page_title: Unsubscribe - success_title: Unsubscribe Successful - success_desc: You have been successfully removed from this subscriber list and won't receive any further emails from us. - link: Change settings + page_title: 退訂 + success_title: 取消訂閱成功 + success_desc: 您已成功從訂閱者清單中移除且不會在收到任何來自我們的郵件。 + link: 更改設置 question: - following_tags: Following Tags - edit: Edit - save: Save - follow_tag_tip: Follow tags to curate your list of questions. - hot_questions: Hot Questions - all_questions: All Questions - x_questions: "{{ count }} Questions" - x_answers: "{{ count }} answers" - questions: Questions - answers: Answers - newest: Newest - active: Active - frequent: Frequent - score: Score - unanswered: Unanswered - modified: modified - answered: answered - asked: asked - closed: closed - follow_a_tag: Follow a tag - more: More + following_tags: 已關注的標籤 + edit: 編輯 + save: 儲存 + follow_tag_tip: 按照標籤整理您的問題列表。 + hot_questions: 熱門問題 + all_questions: 全部問題 + x_questions: "{{ count }} 個問題" + x_answers: "{{ count }} 個回答" + questions: 個問題 + answers: 回答 + newest: 最新的 + active: 活躍的 + frequent: 瀏覽量 + score: 評分 + unanswered: 未回答 + modified: 修改於 + answered: 回答於 + asked: 提問於 + closed: 已關閉 + follow_a_tag: 關注一個標籤 + more: 更多 personal: - overview: Overview - answers: Answers - answer: answer - questions: Questions - question: question - bookmarks: Bookmarks - reputation: Reputation - comments: Comments - votes: Votes - newest: Newest - score: Score - edit_profile: Edit Profile - visited_x_days: "Visited {{ count }} days" - viewed: Viewed - joined: Joined - last_login: Seen - about_me: About Me - about_me_empty: "// Hello, World !" - top_answers: Top Answers - top_questions: Top Questions - stats: Stats - list_empty: No posts found.
Perhaps you'd like to select a different tab? - accepted: Accepted - answered: answered - asked: asked - upvote: upvote - downvote: downvote - mod_short: Mod - mod_long: Moderators - x_reputation: reputation - x_votes: votes received - x_answers: answers - x_questions: questions + overview: 概覽 + answers: 回答 + answer: 回答 + questions: 問題 + question: 問題 + bookmarks: 書籤 + reputation: 聲望 + comments: 評論 + votes: 得票 + newest: 最新 + score: 評分 + edit_profile: 編輯個人資料 + visited_x_days: 已造訪 {{ count }} 天 + viewed: 閱讀次數 + joined: 加入於 + last_login: 出現時間 + about_me: 關於我 + about_me_empty: // 你好, 世界 ! + top_answers: 熱門回答 + top_questions: 熱門問題 + stats: 狀態 + list_empty: 沒有找到相關的內容。
試試看其他標籤? + accepted: 已採納 + answered: 回答於 + asked: 提問於 + upvote: 讚同 + downvote: 反對 + mod_short: 模組 + mod_long: 管理員 + x_reputation: 聲望 + x_votes: 得票 + x_answers: 個回答 + x_questions: 個問題 install: - title: Answer - next: Next - done: Done - config_yaml_error: Can't create the config.yaml file. + title: 回答 + next: 下一步 + done: 完成 + config_yaml_error: 無法建立 config.yaml 檔。 lang: - label: Please Choose a Language + label: 請選擇一種語言 db_type: - label: Database Engine + label: 資料庫引擎 db_username: - label: Username - placeholder: root - msg: Username cannot be empty. + label: 用戶名 + placeholder: 根 + msg: 用戶名不能為空 db_password: - label: Password + label: 密碼 placeholder: root - msg: Password cannot be empty. + msg: 密碼不能為空 db_host: - label: Database Host - placeholder: "db:3306" - msg: Database Host cannot be empty. + label: "數據庫伺服器" + placeholder: "db: 3306" + msg: 資料庫主機位址不能為空 db_name: - label: Database Name - placeholder: answer - msg: Database Name cannot be empty. + label: 資料庫名 + placeholder: 回答 + msg: 資料庫名稱不能為空。 db_file: - label: Database File + label: 資料庫檔案 placeholder: /data/answer.db - msg: Database File cannot be empty. + msg: 資料庫文件不能為空。 config_yaml: - title: Create config.yaml - label: The config.yaml file created. - desc: >- - You can create the <1>config.yaml file manually in the <1>/var/wwww/xxx/ directory and paste the following text into it. - info: After you've done that, click "Next" button. - site_information: Site Information - admin_account: Admin Account + title: 創建 config.yaml + label: 已創建 config.yaml 文件。 + desc: 您可以手動在 <1>/var/wwww/xxx/ 目錄中創建<1>config.yaml 文件並粘貼以下文本。 + info: 完成後點擊"下一步"按鈕。 + site_information: 網站資訊 + admin_account: 管理員帳戶 site_name: - label: Site Name - msg: Site Name cannot be empty. + label: 網站名稱 + msg: 網站名稱不能為空。 site_url: - label: Site URL - text: The address of your site. + label: 網站 URL + text: 此網站的地址。 msg: - empty: Site URL cannot be empty. - incorrect: Site URL incorrect format. + empty: 網站URL不能為空。 + incorrect: 網站URL格式不正確。 contact_email: - label: Contact Email - text: Email address of key contact responsible for this site. + label: 聯絡信箱 + text: 負責本網站的主要聯絡人的電子郵件地址。 msg: - empty: Contact Email cannot be empty. - incorrect: Contact Email incorrect format. + empty: 聯絡人電子郵件信箱不能為空。 + incorrect: 聯絡人電子郵件信箱不正確。 admin_name: - label: Name - msg: Name cannot be empty. + label: 暱稱 + msg: 暱稱不能為空。 admin_password: - label: Password - text: >- - You will need this password to log in. Please store it in a secure location. - msg: Password cannot be empty. + label: 密碼 + text: 您需要此密碼才能登入。請將其儲存在一個安全的位置。 + msg: 密碼不能為空。 admin_email: - label: Email - text: You will need this email to log in. + label: 郵箱 + text: 您需要此電子郵件才能登入。 msg: - empty: Email cannot be empty. - incorrect: Email incorrect format. - ready_title: Your Answer is Ready! - ready_desc: >- - If you ever feel like changing more settings, visit <1>admin section; find it in the site menu. - good_luck: "Have fun, and good luck!" - warn_title: Warning - warn_desc: >- - The file <1>config.yaml already exists. If you need to reset any of the configuration items in this file, please delete it first. - install_now: You may try <1>installing now. - installed: Already installed - installed_desc: >- - You appear to have already installed. To reinstall please clear your old database tables first. - db_failed: Database connection failed - db_failed_desc: >- - This either means that the database information in your <1>config.yaml file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down. + empty: 郵箱不能為空。 + incorrect: 郵箱格式不正確。 + ready_title: 你的Answer已經準備好了! + ready_desc: 如果你想改變更多的設定,請瀏覽<1>管理員部分;在網站選單中找到它。 + good_luck: 玩得愉快,祝您好運! + warn_title: 警告 + warn_desc: 檔案<1>config.yaml已存在。如果您需要重置此文件中的任何配置項,請先刪除它。 + install_now: 您可以嘗試<1>現在安裝。 + installed: 已安裝 + installed_desc: 您似乎已經安裝過了。要重新安裝,請先清除舊的資料庫表。 + db_failed: 資料連接異常! + db_failed_desc: 這要么意味著你<1>config.yaml文件中的數據庫信息不正確,要么意味著無法與數據庫服務器建立聯繫。這可能意味著你的主機的數據庫服務器已經停機。 counts: - views: views - votes: votes - answers: answers - accepted: Accepted + views: 觀看 + votes: 得票 + answers: 回答 + accepted: 已採納 page_404: - desc: "Unfortunately, this page doesn't exist." - back_home: Back to homepage + desc: 很抱歉,此頁面不存在。 + back_home: 回到首頁 page_50X: - desc: The server encountered an error and could not complete your request. - back_home: Back to homepage + desc: 伺服器遇到了一個錯誤,無法完成你的請求。 + back_home: 回到首頁 page_maintenance: - desc: "We are under maintenance, we'll be back soon." + desc: 我們正在維護中,很快就會回來。 nav_menus: - dashboard: Dashboard - contents: Contents - questions: Questions - answers: Answers - users: Users - flags: Flags - settings: Settings - general: General - interface: Interface + dashboard: 後台管理 + contents: 內容 + questions: 問題 + answers: 回答 + users: 使用者管理 + flags: 檢舉 + settings: 設定 + general: 一般 + interface: 介面 smtp: SMTP - branding: Branding - legal: Legal - write: Write - tos: Terms of Service - privacy: Privacy + branding: 品牌 + legal: 法律條款 + write: 撰寫 + tos: 服務條款 + privacy: 隱私政策 seo: SEO - customize: Customize - themes: Themes + customize: 自定義 + themes: 主題 css-html: CSS/HTML - login: Login + login: 登入 admin: admin_header: - title: Admin + title: 後台管理 dashboard: - title: Dashboard - welcome: Welcome to Answer Admin! - site_statistics: Site Statistics - questions: "Questions:" - answers: "Answers:" - comments: "Comments:" - votes: "Votes:" - active_users: "Active users:" - flags: "Flags:" - site_health_status: Site Health Status - version: "Version:" + title: 後台管理 + welcome: 歡迎來到 Answer 後台管理! + site_statistics: 站點統計 + questions: "問題:" + answers: "回答:" + comments: "評論:" + votes: "投票:" + active_users: "活躍用戶:" + flags: "檢舉:" + site_health_status: "健康狀態:" + version: 版本 https: "HTTPS:" - uploading_files: "Uploading files:" + uploading_files: "上傳文件:" smtp: "SMTP:" - timezone: "Timezone:" - system_info: System Info - storage_used: "Storage used:" - uptime: "Uptime:" - answer_links: Answer Links - documents: Documents - feedback: Feedback - support: Support - review: Review - config: Config - update_to: Update to - latest: Latest - check_failed: Check failed - "yes": "Yes" - "no": "No" - not_allowed: Not allowed - allowed: Allowed - enabled: Enabled - disabled: Disabled + timezone: 時區: + system_info: 系統資訊 + storage_used: 已用儲存空間: + uptime: 運行時間: + answer_links: 回答連結 + documents: 文件 + feedback: 用戶反饋 + support: 支持 + review: 審核 + config: 配置 + update_to: 更新到 + latest: 最新版本 + check_failed: 校驗失敗 + yes: 是 + no: 否 + not_allowed: 不允許 + allowed: 允許 + enabled: 已啟用 + disabled: 停用 flags: - title: Flags - pending: Pending - completed: Completed - flagged: Flagged - created: Created - action: Action - review: Review + title: 檢舉 + pending: 等待處理 + completed: 已完成 + flagged: 已標記 + created: 創建於 + action: 操作 + review: 審核 change_modal: - title: Change user status to... - btn_cancel: Cancel - btn_submit: Submit - normal_name: normal - normal_desc: A normal user can ask and answer questions. - suspended_name: suspended - suspended_desc: A suspended user can't log in. - deleted_name: deleted - deleted_desc: "Delete profile, authentication associations." - inactive_name: inactive - inactive_desc: An inactive user must re-validate their email. - confirm_title: Delete this user - confirm_content: Are you sure you want to delete this user? This is permanent! - confirm_btn: Delete + title: 更改用戶狀態為... + btn_cancel: 取消 + btn_submit: 提交 + normal_name: 正常 + normal_desc: 普通用戶可以提問和回答。 + suspended_name: 停權 + suspended_desc: 被停權的使用者將無法登入。 + deleted_name: 刪除 + deleted_desc: 刪除個人資料和身份驗證關聯。 + inactive_name: 不活躍 + inactive_desc: 不活躍的用戶必須重新驗證郵箱。 + confirm_title: 刪除此用戶 + confirm_content: 確定要刪除此用戶?此操作無法撤銷! + confirm_btn: 刪除 msg: - empty: Please select a reason. + empty: 請選擇一個原因 status_modal: - title: "Change {{ type }} status to..." - normal_name: normal - normal_desc: A normal post available to everyone. - closed_name: closed - closed_desc: "A closed question can't answer, but still can edit, vote and comment." - deleted_name: deleted - deleted_desc: All reputation gained and lost will be restored. - btn_cancel: Cancel - btn_submit: Submit - btn_next: Next + title: 更改 {{ type }} 狀態為... + normal_name: 正常 + normal_desc: 所有使用者都可以瀏覽的普通貼文。 + closed_name: 關閉 + closed_desc: 關閉的問題不能回答,但仍然可以編輯、投票和評論。 + deleted_name: 刪除 + deleted_desc: 獲得和失去的所有信譽將被恢復。 + btn_cancel: 取消 + btn_submit: 提交 + btn_next: 下一步 user_role_modal: - title: Change user role to... - btn_cancel: Cancel - btn_submit: Submit + title: 更改用戶狀態為... + btn_cancel: 取消 + btn_submit: 提交 users: - title: Users - name: Name - email: Email - reputation: Reputation - created_at: Created Time - delete_at: Deleted Time - suspend_at: Suspended Time - status: Status - role: Role - action: Action - change: Change - all: All - staff: Staff - inactive: Inactive - suspended: Suspended - deleted: Deleted - normal: Normal - Moderator: Moderator - Admin: Admin - User: User + title: 用戶 + name: 名稱 + email: 郵箱 + reputation: 聲望 + created_at: 創建時間 + delete_at: 刪除時間 + suspend_at: 停權時間 + status: 狀態 + role: 角色 + action: 操作 + change: 更改 + all: 全部 + staff: 工作人員 + inactive: 不活躍 + suspended: 已停權 + deleted: 已刪除 + normal: 正常 + Moderator: 版主 + Admin: 管理員 + User: 用戶 filter: - placeholder: "Filter by name, user:id" - set_new_password: Set new password - change_status: Change status - change_role: Change role - show_logs: Show logs - add_user: Add user + placeholder: 按名稱篩選,用戶:id + set_new_password: 設置新密碼 + change_status: 更改狀態 + change_role: 更改角色 + show_logs: 顯示日誌 + add_user: 新增使用者 new_password_modal: - title: Set new password + title: 設置新密碼 form: fields: password: - label: Password - text: The user will be logged out and need to login again. - msg: Password must be at 8-32 characters in length. - btn_cancel: Cancel - btn_submit: Submit + label: 密碼 + text: 用戶將被登出,需要再次登入。 + msg: 密碼必須在 8-32 字元長度。 + btn_cancel: 取消 + btn_submit: 提交 user_modal: - title: Add new user + title: 添加新用戶 form: fields: display_name: - label: Display Name - msg: Display Name must be at 3-30 characters in length. + label: 顯示名稱 + msg: 顯示名稱必須在 3-30 字元長度。 email: - label: Email - msg: Email is not valid. + label: 郵箱 + msg: 電子郵箱無效。 password: - label: Password - msg: Password must be at 8-32 characters in length. - btn_cancel: Cancel - btn_submit: Submit + label: 密碼 + msg: 密碼必須在 8-32 字元長度。 + btn_cancel: 取消 + btn_submit: 提交 questions: - page_title: Questions - normal: Normal - closed: Closed - deleted: Deleted - post: Post - votes: Votes - answers: Answers - created: Created - status: Status - action: Action - change: Change + page_title: 問題 + normal: 正常 + closed: 已關閉 + deleted: 已刪除 + post: 標題 + votes: 得票數 + answers: 回答 + created: 創建於 + status: 狀態 + action: 操作 + change: 更改 filter: - placeholder: "Filter by title, question:id" + placeholder: 按標題過濾,問題:id answers: - page_title: Answers - normal: Normal - deleted: Deleted - post: Post - votes: Votes - created: Created - status: Status - action: Action - change: Change + page_title: 回答 + normal: 正常 + deleted: 已刪除 + post: 發布 + votes: 得票數 + created: 創建於 + status: 狀態 + action: 操作 + change: 更改 filter: - placeholder: "Filter by title, answer:id" + placeholder: 按名稱篩選,answer:id general: - page_title: General + page_title: 一般 name: - label: Site Name - msg: Site name cannot be empty. - text: "The name of this site, as used in the title tag." + label: 網站名稱 + msg: 不能為空 + text: 網站的名稱,如標題標籤中所用。 site_url: - label: Site URL - msg: Site url cannot be empty. - validate: Please enter a valid URL. - text: The address of your site. + label: 網站網址 + msg: 網站網址不能為空。 + validate: 請輸入一個有效的 URL。 + text: 此網站的網址。 short_desc: - label: Short Site Description (optional) - msg: Short site description cannot be empty. - text: "Short description, as used in the title tag on homepage." + label: 網站簡短描述 + msg: 網站簡短描述不能為空。 + text: 簡短的描述,如主頁上的標題標籤所使用的那样。 desc: - label: Site Description (optional) - msg: Site description cannot be empty. - text: "Describe this site in one sentence, as used in the meta description tag." + label: 網站描述 + msg: 網站描述不能為空。 + text: 使用一句話描述本站,作為網站的描述(Html 的 meta 標籤)。 contact_email: - label: Contact Email - msg: Contact email cannot be empty. - validate: Contact email is not valid. - text: Email address of key contact responsible for this site. + label: 聯絡人信箱 + msg: 聯絡人信箱不能為空。 + validate: 聯絡人信箱無效。 + text: 負責本網站的主要聯絡人的電子郵件信箱。 interface: - page_title: Interface - logo: - label: Logo (optional) - msg: Site logo cannot be empty. - text: You can upload your image or <1>reset it to the site title text. - theme: - label: Theme - msg: Theme cannot be empty. - text: Select an existing theme. + page_title: 介面 language: - label: Interface Language - msg: Interface language cannot be empty. - text: User interface language. It will change when you refresh the page. + label: 介面語言 + msg: 界面語言不能為空 + text: 設置用戶界面語言,在刷新頁面后生效。 time_zone: - label: Timezone - msg: Timezone cannot be empty. - text: Choose a city in the same timezone as you. + label: 時區 + msg: 時區不能為空。 + text: 選擇一個與您相同時區的城市。 smtp: page_title: SMTP from_email: - label: From Email - msg: From email cannot be empty. - text: The email address which emails are sent from. + label: 發件人電子郵件 + msg: 發件人電子郵件不能为空。 + text: 發送郵件的郵箱地址 from_name: - label: From Name - msg: From name cannot be empty. - text: The name which emails are sent from. + label: 發件人名稱 + msg: 發件人名稱不能为空。 + text: 發件人的名稱 smtp_host: - label: SMTP Host - msg: SMTP host cannot be empty. - text: Your mail server. + label: SMTP 主機 + msg: SMTP 主機名稱不能為空。 + text: 郵件服務器 encryption: - label: Encryption - msg: Encryption cannot be empty. - text: For most servers SSL is the recommended option. + label: 加密 + msg: 加密不能為空。 + text: 對於大多數服務器,SSL 是推薦的選項。 ssl: SSL - none: None + none: 無 smtp_port: - label: SMTP Port - msg: SMTP port must be number 1 ~ 65535. - text: The port to your mail server. + label: SMTP 埠 + msg: SMTP 埠必須在 1 ~ 65535 之間。 + text: 郵件服務器的端口號。 smtp_username: - label: SMTP Username - msg: SMTP username cannot be empty. + label: SMTP 用戶名 + msg: SMTP 用戶名不能為空。 smtp_password: - label: SMTP Password - msg: SMTP password cannot be empty. + label: SMTP 密碼 + msg: SMTP 密碼不能為空。 test_email_recipient: - label: Test Email Recipients - text: Provide email address that will receive test sends. - msg: Test email recipients is invalid + label: 測試郵件收件人 + text: 提供用於接收測試郵件的郵箱地址。 + msg: 測試郵件收件人無效 smtp_authentication: - label: Enable authentication - title: SMTP Authentication - msg: SMTP authentication cannot be empty. - "yes": "Yes" - "no": "No" + label: 啟用身份驗證 + title: SMTP身份驗證 + msg: SMTP 身份驗證不能為空。 + yes: 是 + no: 否 branding: - page_title: Branding + page_title: 品牌 logo: - label: Logo (optional) - msg: Logo cannot be empty. - text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown. + label: 標誌 + msg: 圖標不能為空。 + text: 在你的網站左上方的Logo圖標。使用一個高度為56,長寬比大於3:1的寬長方形圖像。如果留空,將顯示網站標題文本。 mobile_logo: - label: Mobile Logo (optional) - text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the "logo" setting will be used. + label: 移動標識 + text: 在您網站的移動版本上使用的徽標。 使用高度為 56 的寬矩形圖像。如果留空,將使用“徽標”設置中的圖像。 square_icon: - label: Square Icon (optional) - msg: Square icon cannot be empty. - text: Image used as the base for metadata icons. Should ideally be larger than 512x512. + label: 方形圖示 + msg: 方形圖示不能為空。 + text: 用作元數據圖標的基礎的圖像。最好是大於512x512。 favicon: - label: Favicon (optional) - text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, "square icon" will be used. + label: 網站圖示 + text: 您網站的圖標。 要在 CDN 上正常工作,它必須是 png。 將調整為 32x32的大小。 如果留空,將使用“方形圖標”。 legal: - page_title: Legal + page_title: 法律條款 terms_of_service: - label: Terms of Service - text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here." + label: 服務條款 + text: 您可以在此加入服務內容的條款。如果您已經在別處托管了文檔,請在這裡提供完整的URL。 privacy_policy: - label: Privacy Policy - text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here." + label: 隱私條款 + text: 您可以在此加入隱私政策內容。如果您已經在別處托管了文檔,請在這裡提供完整的URL。 write: - page_title: Write + page_title: 編輯 recommend_tags: - label: Recommend Tags - text: "Please input tag slug above, one tag per line." + label: 推薦標籤 + text: 請在上方輸入標籤固定連結,每行一個標籤。 required_tag: - title: Required Tag - label: Set recommend tag as required - text: "Every new question must have at least one recommend tag." + title: 必需的標籤 + label: 根據需要設置推薦標籤 + text: 每個新問題必須至少有一個推薦標籤。 reserved_tags: - label: Reserved Tags - text: "Reserved tags can only be added to a post by moderator." + label: 保留標籤 + text: 保留的標籤只能由版主加入到一個貼文中。 seo: - page_title: SEO + page_title: 搜尋引擎優化 permalink: - label: Permalink - text: Custom URL structures can improve the usability, and forward-compatibility of your links. + label: 固定連結 + text: 自定義URL結構可以提高可用性,以及你的連結的向前相容性。 robots: label: robots.txt - text: This will permanently override any related site settings. + text: 這將永久覆蓋任何相關的網站設置。 themes: - page_title: Themes + page_title: 主題 themes: - label: Themes - text: Select an existing theme. + label: 主題 + text: 選擇一個現有主題。 navbar_style: - label: Navbar Style - text: Select an existing theme. + label: 導航欄樣式 + text: 選擇一個現有主題。 primary_color: - label: Primary Color - text: Modify the colors used by your themes + label: 主色調 + text: 修改您主題使用的顏色 css_and_html: - page_title: CSS and HTML + page_title: CSS 與 HTML custom_css: - label: Custom CSS - text: This will insert as + label: 自定義CSS + text: 這將在 之前插入 head: - label: Head - text: This will insert before + label: 頭部 + text: 這將在 之前插入 header: - label: Header - text: This will insert after + label: 標題 + text: 這將在 之前插入 footer: - label: Footer - text: This will insert before . + label: 頁尾 + text: 這將在 之前插入 login: - page_title: Login + page_title: 登入 membership: - title: Membership - label: Allow new registrations - text: Turn off to prevent anyone from creating a new account. + title: 會員 + label: 允許新註冊 + text: 關閉以防止任何人創建新帳戶。 private: - title: Private - label: Login required - text: Only logged in users can access this community. + title: 非公開的 + label: 需要登入 + text: 只有登入使用者才能訪問這個社群。 form: - empty: cannot be empty - invalid: is invalid - btn_submit: Save - not_found_props: "Required property {{ key }} not found." + optional: (選填) + empty: 不能為空 + invalid: 是無效的 + btn_submit: 儲存 + not_found_props: 所需屬性 {{ key }} 未找到。 page_review: - review: Review - proposed: proposed - question_edit: Question edit - answer_edit: Answer edit - tag_edit: Tag edit - edit_summary: Edit summary - edit_question: Edit question - edit_answer: Edit answer - edit_tag: Edit tag - empty: No review tasks left. + review: 審核 + proposed: 提案 + question_edit: 問題編輯 + answer_edit: 回答編輯 + tag_edit: "標籤管理: 編輯標籤" + edit_summary: 編輯摘要 + edit_question: 編輯問題 + edit_answer: 編輯回答 + edit_tag: 編輯標籤 + empty: 沒有剩餘的審核任務。 timeline: - undeleted: undeleted - deleted: deleted - downvote: downvote - upvote: upvote - accept: accept - cancelled: cancelled - commented: commented - rollback: rollback - edited: edited - answered: answered - asked: asked - closed: closed - reopened: reopened - created: created - title: "History for" - tag_title: "Timeline for" - show_votes: "Show votes" + undeleted: 未刪除的 + deleted: 刪除 + downvote: 反對 + upvote: 贊同 + accept: 採納 + cancelled: 已取消 + commented: "評論:" + rollback: 回滾 + edited: 最後編輯於 + answered: 回答於 + asked: 提問於 + closed: 關閉 + reopened: 重新開啟 + created: 創建於 + title: 歷史記錄 + tag_title: 時間線 + show_votes: 顯示投票 n_or_a: N/A - title_for_question: "Timeline for" - title_for_answer: "Timeline for answer to {{ title }} by {{ author }}" - title_for_tag: "Timeline for tag" - datetime: Datetime - type: Type - by: By - comment: Comment - no_data: "We couldn't find anything." + title_for_question: 時間線 + title_for_answer: "{{ title }} 的 {{ author }} 回答時間線" + title_for_tag: 標籤的時間線 + datetime: 日期時間 + type: 類型 + by: 由 + comment: 評論 + no_data: 我們找不到任何東西。 users: - title: Users - users_with_the_most_reputation: Users with the highest reputation scores - users_with_the_most_vote: Users who voted the most - staffs: Our community staff - reputation: reputation - votes: votes - - + title: 用戶 + users_with_the_most_reputation: 信譽積分最高的用戶 + users_with_the_most_vote: 投票最多的用戶 + staffs: 我們的社區工作人員 + reputation: 聲望值 + votes: 選票 + prompt: + leave_page: 你確定要離開此頁面? + changes_not_save: 你所做的變更可能不會儲存。 diff --git a/internal/base/reason/reason.go b/internal/base/reason/reason.go index a33e33cc..17c00070 100644 --- a/internal/base/reason/reason.go +++ b/internal/base/reason/reason.go @@ -21,6 +21,7 @@ const ( QuestionCannotDeleted = "error.question.cannot_deleted" QuestionCannotClose = "error.question.cannot_close" QuestionCannotUpdate = "error.question.cannot_update" + QuestionAlreadyDeleted = "error.question.already_deleted" AnswerNotFound = "error.answer.not_found" AnswerCannotDeleted = "error.answer.cannot_deleted" AnswerCannotUpdate = "error.answer.cannot_update" @@ -64,4 +65,6 @@ const ( TagCannotSetSynonymAsItself = "error.tag.cannot_set_synonym_as_itself" NotAllowedRegistration = "error.user.not_allowed_registration" SMTPConfigFromNameCannotBeEmail = "error.smtp.config_from_name_cannot_be_email" + AdminCannotUpdateTheirPassword = "error.admin.cannot_update_their_password" + AdminCannotModifySelfStatus = "error.admin.cannot_modify_self_status" ) diff --git a/internal/base/translator/provider.go b/internal/base/translator/provider.go index ae673092..c6a5a36f 100644 --- a/internal/base/translator/provider.go +++ b/internal/base/translator/provider.go @@ -20,6 +20,8 @@ var GlobalTrans i18n.Translator type LangOption struct { Label string `json:"label"` Value string `json:"value"` + // Translation completion percentage + Progress int `json:"progress"` } // DefaultLangOption default language option. If user config the language is default, the language option is admin choose. @@ -47,6 +49,7 @@ func NewTranslator(c *I18n) (tr i18n.Translator, err error) { if filepath.Ext(file.Name()) != ".yaml" && file.Name() != "i18n.yaml" { continue } + log.Debugf("try to read file: %s", file.Name()) buf, err := os.ReadFile(filepath.Join(c.BundleDir, file.Name())) if err != nil { return nil, fmt.Errorf("read file failed: %s %s", file.Name(), err) @@ -96,6 +99,11 @@ func NewTranslator(c *I18n) (tr i18n.Translator, err error) { return nil, fmt.Errorf("i18n file parsing failed: %s", err) } LanguageOptions = s.LangOption + for _, option := range LanguageOptions { + if option.Progress != 100 { + option.Label = fmt.Sprintf("%s (%d%%)", option.Label, option.Progress) + } + } return GlobalTrans, err } diff --git a/internal/controller/comment_controller.go b/internal/controller/comment_controller.go index 79ed9681..6b74b754 100644 --- a/internal/controller/comment_controller.go +++ b/internal/controller/comment_controller.go @@ -112,6 +112,18 @@ func (cc *CommentController) UpdateComment(ctx *gin.Context) { req.UserID = middleware.GetLoginUserIDFromContext(ctx) req.IsAdmin = middleware.GetIsAdminFromContext(ctx) + canList, err := cc.rankService.CheckOperationPermissions(ctx, req.UserID, []string{ + permission.CommentAdd, + permission.CommentEdit, + permission.CommentDelete, + }) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + req.CanAdd = canList[0] + req.CanEdit = canList[1] + req.CanDelete = canList[2] can, err := cc.rankService.CheckOperationPermission(ctx, req.UserID, permission.CommentEdit, req.CommentID) if err != nil { handler.HandleResponse(ctx, err, nil) @@ -122,8 +134,8 @@ func (cc *CommentController) UpdateComment(ctx *gin.Context) { return } - err = cc.commentService.UpdateComment(ctx, req) - handler.HandleResponse(ctx, err, nil) + resp, err := cc.commentService.UpdateComment(ctx, req) + handler.HandleResponse(ctx, err, resp) } // GetCommentWithPage get comment page diff --git a/internal/controller/lang_controller.go b/internal/controller/lang_controller.go index b48080ee..0cf2637a 100644 --- a/internal/controller/lang_controller.go +++ b/internal/controller/lang_controller.go @@ -41,7 +41,6 @@ func (u *LangController) GetLangMapping(ctx *gin.Context) { // @Tags Lang // @Produce json // @Success 200 {object} handler.RespBody{} -// @Router /answer/api/v1/language/options [get] // @Router /answer/admin/api/language/options [get] func (u *LangController) GetAdminLangOptions(ctx *gin.Context) { handler.HandleResponse(ctx, nil, translator.LanguageOptions) diff --git a/internal/controller/template_controller.go b/internal/controller/template_controller.go index 894b4930..0ccd5ad3 100644 --- a/internal/controller/template_controller.go +++ b/internal/controller/template_controller.go @@ -404,22 +404,17 @@ func (tc *TemplateController) UserInfo(ctx *gin.Context) { req := &schema.GetOtherUserInfoByUsernameReq{} req.Username = username userinfo, err := tc.templateRenderController.UserInfo(ctx, req) - if err != nil { tc.Page404(ctx) return } - if !userinfo.Has { - tc.Page404(ctx) - return - } siteInfo := tc.SiteInfo(ctx) siteInfo.Canonical = fmt.Sprintf("%s/users/%s", siteInfo.General.SiteUrl, username) siteInfo.Title = fmt.Sprintf("%s - %s", username, siteInfo.General.Name) tc.html(ctx, http.StatusOK, "homepage.html", siteInfo, gin.H{ "userinfo": userinfo, - "bio": template.HTML(userinfo.Info.BioHTML), + "bio": template.HTML(userinfo.BioHTML), }) } @@ -451,6 +446,7 @@ func (tc *TemplateController) html(ctx *gin.Context, code int, tpl string, siteI if !ok { data["path"] = "" } + ctx.Header("X-Frame-Options", "DENY") ctx.HTML(code, tpl, data) } diff --git a/internal/controller/template_render/userinfo.go b/internal/controller/template_render/userinfo.go index e10e2dfa..2186fac5 100644 --- a/internal/controller/template_render/userinfo.go +++ b/internal/controller/template_render/userinfo.go @@ -5,6 +5,6 @@ import ( "golang.org/x/net/context" ) -func (q *TemplateRenderController) UserInfo(ctx context.Context, req *schema.GetOtherUserInfoByUsernameReq) (resp *schema.GetOtherUserInfoResp, err error) { +func (q *TemplateRenderController) UserInfo(ctx context.Context, req *schema.GetOtherUserInfoByUsernameReq) (resp *schema.GetOtherUserInfoByUsernameResp, err error) { return q.userService.GetOtherUserInfoByUsername(ctx, req.Username) } diff --git a/internal/controller/user_controller.go b/internal/controller/user_controller.go index c2cf25bf..a1489e41 100644 --- a/internal/controller/user_controller.go +++ b/internal/controller/user_controller.go @@ -157,7 +157,7 @@ func (uc *UserController) RetrievePassWord(ctx *gin.Context) { return } _, _ = uc.actionService.ActionRecordAdd(ctx, schema.ActionRecordTypeFindPass, ctx.ClientIP()) - _, err := uc.userService.RetrievePassWord(ctx, req) + err := uc.userService.RetrievePassWord(ctx, req) handler.HandleResponse(ctx, err, nil) } @@ -203,6 +203,7 @@ func (uc *UserController) UserLogout(ctx *gin.Context) { return } _ = uc.authService.RemoveUserCacheInfo(ctx, accessToken) + _ = uc.authService.RemoveAdminUserCacheInfo(ctx, accessToken) handler.HandleResponse(ctx, nil, nil) } diff --git a/internal/controller_admin/user_backyard_controller.go b/internal/controller_admin/user_backyard_controller.go index 848319b5..eaa06f73 100644 --- a/internal/controller_admin/user_backyard_controller.go +++ b/internal/controller_admin/user_backyard_controller.go @@ -34,6 +34,8 @@ func (uc *UserAdminController) UpdateUserStatus(ctx *gin.Context) { return } + req.LoginUserID = middleware.GetLoginUserIDFromContext(ctx) + err := uc.userService.UpdateUserStatus(ctx, req) handler.HandleResponse(ctx, err, nil) } diff --git a/internal/entity/answer_entity.go b/internal/entity/answer_entity.go index 8c3bcdb1..43567efd 100644 --- a/internal/entity/answer_entity.go +++ b/internal/entity/answer_entity.go @@ -35,9 +35,11 @@ type Answer struct { type AnswerSearch struct { Answer - Order string `json:"order_by" ` // default or updated - Page int `json:"page" form:"page"` // Query number of pages - PageSize int `json:"page_size" form:"page_size"` // Search page size + IncludeDeleted bool `json:"include_deleted"` + LoginUserID string `json:"login_user_id"` + Order string `json:"order_by"` // default or updated + Page int `json:"page" form:"page"` // Query number of pages + PageSize int `json:"page_size" form:"page_size"` // Search page size } type AdminAnswerSearch struct { diff --git a/internal/install/install_req.go b/internal/install/install_req.go index a465d6bd..96e16638 100644 --- a/internal/install/install_req.go +++ b/internal/install/install_req.go @@ -78,7 +78,7 @@ type InitEnvironmentResp struct { // InitBaseInfoReq init base info request type InitBaseInfoReq struct { Language string `validate:"required,gt=0,lte=30" json:"lang"` - SiteName string `validate:"required,gt=0,lte=30" json:"site_name"` + SiteName string `validate:"required,sanitizer,gt=0,lte=30" json:"site_name"` SiteURL string `validate:"required,gt=0,lte=512,url" json:"site_url"` ContactEmail string `validate:"required,email,gt=0,lte=500" json:"contact_email"` AdminName string `validate:"required,gt=3,lte=30" json:"name"` diff --git a/internal/repo/answer/answer_repo.go b/internal/repo/answer/answer_repo.go index 97734343..48a54d6a 100644 --- a/internal/repo/answer/answer_repo.go +++ b/internal/repo/answer/answer_repo.go @@ -206,7 +206,9 @@ func (ar *answerRepo) SearchList(ctx context.Context, search *entity.AnswerSearc default: session = session.OrderBy("adopted desc,vote_count desc,created_at asc") } - session = session.And("status = ?", entity.AnswerStatusAvailable) + if !search.IncludeDeleted { + session = session.And("status = ? OR user_id = ?", entity.AnswerStatusAvailable, search.LoginUserID) + } session = session.Limit(search.PageSize, offset) count, err = session.FindAndCount(&rows) diff --git a/internal/repo/captcha/captcha.go b/internal/repo/captcha/captcha.go index bda41d1e..382e45e7 100644 --- a/internal/repo/captcha/captcha.go +++ b/internal/repo/captcha/captcha.go @@ -68,3 +68,11 @@ func (cr *captchaRepo) GetCaptcha(ctx context.Context, key string) (captcha stri } return captcha, nil } + +func (cr *captchaRepo) DelCaptcha(ctx context.Context, key string) (err error) { + err = cr.data.Cache.Del(ctx, key) + if err != nil { + log.Debug(err) + } + return nil +} diff --git a/internal/router/ui.go b/internal/router/ui.go index 2654a37e..86740dbc 100644 --- a/internal/router/ui.go +++ b/internal/router/ui.go @@ -106,6 +106,7 @@ func (a *UIRouter) Register(r *gin.Engine) { default: filePath = UIIndexFilePath c.Header("content-type", "text/html;charset=utf-8") + c.Header("X-Frame-Options", "DENY") } file, err := ui.Build.ReadFile(filePath) if err != nil { diff --git a/internal/schema/answer_schema.go b/internal/schema/answer_schema.go index 7fc6a12d..3a67f2bf 100644 --- a/internal/schema/answer_schema.go +++ b/internal/schema/answer_schema.go @@ -83,6 +83,7 @@ type AnswerInfo struct { VoteStatus string `json:"vote_status"` VoteCount int `json:"vote_count"` QuestionInfo *QuestionInfo `json:"question_info,omitempty"` + Status int `json:"status"` // MemberActions MemberActions []*PermissionMemberAction `json:"member_actions"` diff --git a/internal/schema/backyard_user_schema.go b/internal/schema/backyard_user_schema.go index 57f3f183..995f0187 100644 --- a/internal/schema/backyard_user_schema.go +++ b/internal/schema/backyard_user_schema.go @@ -2,10 +2,9 @@ package schema // UpdateUserStatusReq update user request type UpdateUserStatusReq struct { - // user id - UserID string `validate:"required" json:"user_id"` - // user status - Status string `validate:"required,oneof=normal suspended deleted inactive" json:"status" enums:"normal,suspended,deleted,inactive"` + UserID string `validate:"required" json:"user_id"` + Status string `validate:"required,oneof=normal suspended deleted inactive" json:"status" enums:"normal,suspended,deleted,inactive"` + LoginUserID string `json:"-"` } const ( diff --git a/internal/schema/comment_schema.go b/internal/schema/comment_schema.go index dcc44bd5..5b045a07 100644 --- a/internal/schema/comment_schema.go +++ b/internal/schema/comment_schema.go @@ -53,6 +53,12 @@ type UpdateCommentReq struct { // user id UserID string `json:"-"` IsAdmin bool `json:"-"` + + CanAdd bool `json:"-"` + // whether user can edit it + CanEdit bool `json:"-"` + // whether user can delete it + CanDelete bool `json:"-"` } func (req *UpdateCommentReq) Check() (errFields []*validator.FormErrorField, err error) { diff --git a/internal/schema/question_schema.go b/internal/schema/question_schema.go index b656b834..b0101141 100644 --- a/internal/schema/question_schema.go +++ b/internal/schema/question_schema.go @@ -176,11 +176,20 @@ type AdminQuestionInfo struct { UserInfo *UserBasicInfo `json:"user_info"` } +type OperationLevel string + +const ( + OperationLevelInfo OperationLevel = "info" + OperationLevelDanger OperationLevel = "danger" + OperationLevelWarning OperationLevel = "warning" +) + type Operation struct { - OperationType string `json:"operation_type"` - OperationDescription string `json:"operation_description"` - OperationMsg string `json:"operation_msg"` - OperationTime int64 `json:"operation_time"` + Type string `json:"type"` + Description string `json:"description"` + Msg string `json:"msg"` + Time int64 `json:"time"` + Level OperationLevel `json:"level"` } type GetCloseTypeResp struct { diff --git a/internal/schema/tag_schema.go b/internal/schema/tag_schema.go index cc046b37..3eb8d389 100644 --- a/internal/schema/tag_schema.go +++ b/internal/schema/tag_schema.go @@ -90,7 +90,7 @@ type GetTagResp struct { } func (tr *GetTagResp) GetExcerpt() { - excerpt := strings.TrimSpace(tr.OriginalText) + excerpt := strings.TrimSpace(tr.ParsedText) idx := strings.Index(excerpt, "\n") if idx >= 0 { excerpt = excerpt[0:idx] diff --git a/internal/schema/user_schema.go b/internal/schema/user_schema.go index 44dffc15..16238091 100644 --- a/internal/schema/user_schema.go +++ b/internal/schema/user_schema.go @@ -316,7 +316,7 @@ func (req *UpdateInfoRequest) Check() (errFields []*validator.FormErrorField, er return errFields, errors.BadRequest(reason.UsernameInvalid) } } - req.BioHTML = converter.Markdown2HTML(req.Bio) + req.BioHTML = converter.Markdown2BasicHTML(req.Bio) return nil, nil } @@ -393,7 +393,6 @@ type GetOtherUserInfoByUsernameReq struct { type GetOtherUserInfoResp struct { Info *GetOtherUserInfoByUsernameResp `json:"info"` - Has bool `json:"has"` } type UserChangeEmailSendCodeReq struct { diff --git a/internal/service/action/captcha_service.go b/internal/service/action/captcha_service.go index a6ee8e04..84a189ed 100644 --- a/internal/service/action/captcha_service.go +++ b/internal/service/action/captcha_service.go @@ -16,6 +16,7 @@ import ( type CaptchaRepo interface { SetCaptcha(ctx context.Context, key, captcha string) (err error) GetCaptcha(ctx context.Context, key string) (captcha string, err error) + DelCaptcha(ctx context.Context, key string) (err error) SetActionType(ctx context.Context, ip, actionType string, amount int) (err error) GetActionType(ctx context.Context, ip, actionType string) (amount int, err error) DelActionType(ctx context.Context, ip, actionType string) (err error) @@ -143,6 +144,12 @@ func (cs *CaptchaService) GenerateCaptcha(ctx context.Context) (key, captchaBase func (cs *CaptchaService) VerifyCaptcha(ctx context.Context, key, captcha string) (isCorrect bool, err error) { realCaptcha, err := cs.captchaRepo.GetCaptcha(ctx, key) if err != nil { + log.Error("VerifyCaptcha GetCaptcha Error", err.Error()) + return false, nil + } + err = cs.captchaRepo.DelCaptcha(ctx, key) + if err != nil { + log.Error("VerifyCaptcha DelCaptcha Error", err.Error()) return false, nil } return strings.TrimSpace(captcha) == realCaptcha, nil diff --git a/internal/service/answer_common/answer.go b/internal/service/answer_common/answer.go index 758908e1..357484f2 100644 --- a/internal/service/answer_common/answer.go +++ b/internal/service/answer_common/answer.go @@ -73,6 +73,7 @@ func (as *AnswerCommon) ShowFormat(ctx context.Context, data *entity.Answer) *sc } info.UserID = data.UserID info.UpdateUserID = data.LastEditUserID + info.Status = data.Status return &info } diff --git a/internal/service/answer_service.go b/internal/service/answer_service.go index 974482c9..f92784e1 100644 --- a/internal/service/answer_service.go +++ b/internal/service/answer_service.go @@ -164,7 +164,7 @@ func (as *AnswerService) Insert(ctx context.Context, req *schema.AnswerAddReq) ( if err != nil { log.Error("UpdateLastAnswer error", err.Error()) } - err = as.questionCommon.UpdataPostTime(ctx, req.QuestionID) + err = as.questionCommon.UpdatePostTime(ctx, req.QuestionID) if err != nil { return insertData.ID, err } @@ -232,6 +232,11 @@ func (as *AnswerService) Update(ctx context.Context, req *schema.AnswerUpdateReq return "", nil } + if answerInfo.Status == entity.AnswerStatusDeleted { + err = errors.BadRequest(reason.AnswerCannotUpdate) + return "", err + } + //If the content is the same, ignore it if answerInfo.OriginalText == req.Content { return "", nil @@ -268,7 +273,7 @@ func (as *AnswerService) Update(ctx context.Context, req *schema.AnswerUpdateReq if err = as.answerRepo.UpdateAnswer(ctx, insertData, []string{"original_text", "parsed_text", "updated_at", "last_edit_user_id"}); err != nil { return "", err } - err = as.questionCommon.UpdataPostTime(ctx, req.QuestionID) + err = as.questionCommon.UpdatePostTime(ctx, req.QuestionID) if err != nil { return insertData.ID, err } @@ -473,6 +478,8 @@ func (as *AnswerService) SearchList(ctx context.Context, req *schema.AnswerListR dbSearch.Page = req.Page dbSearch.PageSize = req.PageSize dbSearch.Order = req.Order + dbSearch.IncludeDeleted = req.CanDelete + dbSearch.LoginUserID = req.UserID answerOriginalList, count, err := as.answerRepo.SearchList(ctx, &dbSearch) if err != nil { return list, count, err diff --git a/internal/service/comment/comment_service.go b/internal/service/comment/comment_service.go index 18b755ab..6a33ee90 100644 --- a/internal/service/comment/comment_service.go +++ b/internal/service/comment/comment_service.go @@ -209,24 +209,40 @@ func (cs *CommentService) RemoveComment(ctx context.Context, req *schema.RemoveC } // UpdateComment update comment -func (cs *CommentService) UpdateComment(ctx context.Context, req *schema.UpdateCommentReq) (err error) { +func (cs *CommentService) UpdateComment(ctx context.Context, req *schema.UpdateCommentReq) ( + resp *schema.GetCommentResp, err error) { + resp = &schema.GetCommentResp{} + old, exist, err := cs.commentCommonRepo.GetComment(ctx, req.CommentID) if err != nil { return } if !exist { - return errors.BadRequest(reason.CommentNotFound) + return resp, errors.BadRequest(reason.CommentNotFound) } // user can edit the comment that was posted by himself before deadline. if !req.IsAdmin && (time.Now().After(old.CreatedAt.Add(constant.CommentEditDeadline))) { - return errors.BadRequest(reason.CommentCannotEditAfterDeadline) + return resp, errors.BadRequest(reason.CommentCannotEditAfterDeadline) } comment := &entity.Comment{} _ = copier.Copy(comment, req) comment.ID = req.CommentID - return cs.commentRepo.UpdateComment(ctx, comment) + resp.SetFromComment(comment) + resp.MemberActions = permission.GetCommentPermission(ctx, req.UserID, resp.UserID, + time.Now(), req.CanEdit, req.CanDelete) + userInfo, exist, err := cs.userCommon.GetUserBasicInfoByID(ctx, resp.UserID) + if err != nil { + return nil, err + } + if exist { + resp.Username = userInfo.Username + resp.UserDisplayName = userInfo.DisplayName + resp.UserAvatar = userInfo.Avatar + resp.UserStatus = userInfo.Status + } + return resp, cs.commentRepo.UpdateComment(ctx, comment) } // GetComment get comment one diff --git a/internal/service/dashboard/dashboard_service.go b/internal/service/dashboard/dashboard_service.go index 11868acd..e47645fe 100644 --- a/internal/service/dashboard/dashboard_service.go +++ b/internal/service/dashboard/dashboard_service.go @@ -89,6 +89,7 @@ func (ds *DashboardService) StatisticalByCache(ctx context.Context) (*schema.Das } startTime := time.Now().Unix() - schema.AppStartTime.Unix() dashboardInfo.AppStartTime = fmt.Sprintf("%d", startTime) + dashboardInfo.VersionInfo.Version = constant.Version return dashboardInfo, nil } diff --git a/internal/service/question_common/question.go b/internal/service/question_common/question.go index 23424d2c..926ca650 100644 --- a/internal/service/question_common/question.go +++ b/internal/service/question_common/question.go @@ -86,7 +86,7 @@ func NewQuestionCommon(questionRepo QuestionRepo, } } -func (qs *QuestionCommon) UpdataPv(ctx context.Context, questionID string) error { +func (qs *QuestionCommon) UpdatePv(ctx context.Context, questionID string) error { return qs.questionRepo.UpdatePvCount(ctx, questionID) } @@ -112,14 +112,14 @@ func (qs *QuestionCommon) UpdateLastAnswer(ctx context.Context, questionID, Answ return qs.questionRepo.UpdateLastAnswer(ctx, question) } -func (qs *QuestionCommon) UpdataPostTime(ctx context.Context, questionID string) error { +func (qs *QuestionCommon) UpdatePostTime(ctx context.Context, questionID string) error { questioninfo := &entity.Question{} now := time.Now() questioninfo.ID = questionID questioninfo.PostUpdateTime = now return qs.questionRepo.UpdateQuestion(ctx, questioninfo, []string{"post_update_time"}) } -func (qs *QuestionCommon) UpdataPostSetTime(ctx context.Context, questionID string, setTime time.Time) error { +func (qs *QuestionCommon) UpdatePostSetTime(ctx context.Context, questionID string, setTime time.Time) error { questioninfo := &entity.Question{} questioninfo.ID = questionID questioninfo.PostUpdateTime = setTime @@ -148,7 +148,7 @@ func (qs *QuestionCommon) Info(ctx context.Context, questionID string, loginUser return showinfo, err } if !has { - return showinfo, errors.BadRequest(reason.QuestionNotFound) + return showinfo, errors.NotFound(reason.QuestionNotFound) } showinfo = qs.ShowFormat(ctx, dbinfo) @@ -170,10 +170,11 @@ func (qs *QuestionCommon) Info(ctx context.Context, questionID string, loginUser log.Error("json.Unmarshal QuestionCloseJson error", err.Error()) } else { operation := &schema.Operation{} - operation.OperationType = closeinfo.Name - operation.OperationDescription = closeinfo.Description - operation.OperationMsg = closemsg.CloseMsg - operation.OperationTime = metainfo.CreatedAt.Unix() + operation.Type = closeinfo.Name + operation.Description = closeinfo.Description + operation.Msg = closemsg.CloseMsg + operation.Time = metainfo.CreatedAt.Unix() + operation.Level = schema.OperationLevelInfo showinfo.Operation = operation } diff --git a/internal/service/question_service.go b/internal/service/question_service.go index a21523b5..36bab816 100644 --- a/internal/service/question_service.go +++ b/internal/service/question_service.go @@ -470,6 +470,10 @@ func (qs *QuestionService) UpdateQuestion(ctx context.Context, req *schema.Quest if !has { return } + if dbinfo.Status == entity.QuestionStatusDeleted { + err = errors.BadRequest(reason.QuestionCannotUpdate) + return nil, err + } now := time.Now() question := &entity.Question{} @@ -614,12 +618,23 @@ func (qs *QuestionService) GetQuestion(ctx context.Context, questionID, userID s if err != nil { return } + // If the question is deleted, only the administrator and the author can view it + if question.Status == entity.QuestionStatusDeleted && !per.CanReopen && question.UserID != userID { + return nil, errors.NotFound(reason.QuestionNotFound) + } if question.Status != entity.QuestionStatusClosed { per.CanReopen = false } if question.Status == entity.QuestionStatusClosed { per.CanClose = false } + if question.Status == entity.QuestionStatusDeleted { + operation := &schema.Operation{} + operation.Msg = translator.Tr(handler.GetLangByCtx(ctx), reason.QuestionAlreadyDeleted) + operation.Level = schema.OperationLevelDanger + question.Operation = operation + } + question.Description = htmltext.FetchExcerpt(question.HTML, "...", 240) question.MemberActions = permission.GetQuestionPermission(ctx, userID, question.UserID, per.CanEdit, per.CanDelete, per.CanClose, per.CanReopen) @@ -630,7 +645,7 @@ func (qs *QuestionService) GetQuestion(ctx context.Context, questionID, userID s func (qs *QuestionService) GetQuestionAndAddPV(ctx context.Context, questionID, loginUserID string, per schema.QuestionPermission) ( resp *schema.QuestionInfo, err error) { - err = qs.questioncommon.UpdataPv(ctx, questionID) + err = qs.questioncommon.UpdatePv(ctx, questionID) if err != nil { log.Error(err) } diff --git a/internal/service/revision_service.go b/internal/service/revision_service.go index bb65db32..3e8c3605 100644 --- a/internal/service/revision_service.go +++ b/internal/service/revision_service.go @@ -191,7 +191,7 @@ func (rs *RevisionService) revisionAuditAnswer(ctx context.Context, revisionitem if saveerr != nil { return saveerr } - saveerr = rs.questionCommon.UpdataPostSetTime(ctx, answerinfo.QuestionID, PostUpdateTime) + saveerr = rs.questionCommon.UpdatePostSetTime(ctx, answerinfo.QuestionID, PostUpdateTime) if saveerr != nil { return saveerr } diff --git a/internal/service/tag/tag_service.go b/internal/service/tag/tag_service.go index 1fb118ec..db28ef09 100644 --- a/internal/service/tag/tag_service.go +++ b/internal/service/tag/tag_service.go @@ -102,7 +102,7 @@ func (ts *TagService) GetTagInfo(ctx context.Context, req *schema.GetTagInfoReq) return nil, err } if !exist { - return nil, errors.BadRequest(reason.TagNotFound) + return nil, errors.NotFound(reason.TagNotFound) } resp = &schema.GetTagResp{} @@ -113,7 +113,7 @@ func (ts *TagService) GetTagInfo(ctx context.Context, req *schema.GetTagInfoReq) return nil, err } if !exist { - return nil, errors.BadRequest(reason.TagNotFound) + return nil, errors.NotFound(reason.TagNotFound) } resp.MainTagSlugName = tagInfo.SlugName } diff --git a/internal/service/user_admin/user_backyard.go b/internal/service/user_admin/user_backyard.go index ae09ce85..76d35859 100644 --- a/internal/service/user_admin/user_backyard.go +++ b/internal/service/user_admin/user_backyard.go @@ -61,6 +61,10 @@ func NewUserAdminService( // UpdateUserStatus update user func (us *UserAdminService) UpdateUserStatus(ctx context.Context, req *schema.UpdateUserStatusReq) (err error) { + // Admin cannot modify their status + if req.UserID == req.LoginUserID { + return errors.BadRequest(reason.AdminCannotModifySelfStatus) + } userInfo, exist, err := us.userRepo.GetUserInfo(ctx, req.UserID) if err != nil { return @@ -153,6 +157,10 @@ func (us *UserAdminService) AddUser(ctx context.Context, req *schema.AddUserReq) // UpdateUserPassword update user password func (us *UserAdminService) UpdateUserPassword(ctx context.Context, req *schema.UpdateUserPasswordReq) (err error) { + // Users cannot modify their password + if req.UserID == req.LoginUserID { + return errors.BadRequest(reason.AdminCannotUpdateTheirPassword) + } userInfo, exist, err := us.userRepo.GetUserInfo(ctx, req.UserID) if err != nil { return err diff --git a/internal/service/user_service.go b/internal/service/user_service.go index 48c6355f..b89d95a2 100644 --- a/internal/service/user_service.go +++ b/internal/service/user_service.go @@ -92,19 +92,17 @@ func (us *UserService) GetUserInfoByUserID(ctx context.Context, token, userID st } func (us *UserService) GetOtherUserInfoByUsername(ctx context.Context, username string) ( - resp *schema.GetOtherUserInfoResp, err error, + resp *schema.GetOtherUserInfoByUsernameResp, err error, ) { userInfo, exist, err := us.userRepo.GetByUsername(ctx, username) if err != nil { return nil, err } - resp = &schema.GetOtherUserInfoResp{} if !exist { - return resp, nil + return nil, errors.NotFound(reason.UserNotFound) } - resp.Has = true - resp.Info = &schema.GetOtherUserInfoByUsernameResp{} - resp.Info.GetFromUserEntity(userInfo) + resp = &schema.GetOtherUserInfoByUsernameResp{} + resp.GetFromUserEntity(userInfo) return resp, nil } @@ -155,13 +153,13 @@ func (us *UserService) EmailLogin(ctx context.Context, req *schema.UserEmailLogi } // RetrievePassWord . -func (us *UserService) RetrievePassWord(ctx context.Context, req *schema.UserRetrievePassWordRequest) (string, error) { +func (us *UserService) RetrievePassWord(ctx context.Context, req *schema.UserRetrievePassWordRequest) error { userInfo, has, err := us.userRepo.GetByEmail(ctx, req.Email) if err != nil { - return "", err + return err } if !has { - return "", errors.BadRequest(reason.UserNotFound) + return nil } // send email @@ -173,10 +171,10 @@ func (us *UserService) RetrievePassWord(ctx context.Context, req *schema.UserRet verifyEmailURL := fmt.Sprintf("%s/users/password-reset?code=%s", us.getSiteUrl(ctx), code) title, body, err := us.emailService.PassResetTemplate(ctx, verifyEmailURL) if err != nil { - return "", err + return err } go us.emailService.SendAndSaveCode(ctx, req.Email, title, body, code, data.ToJSONString()) - return code, nil + return nil } // UseRePassword diff --git a/pkg/converter/markdown.go b/pkg/converter/markdown.go index d61d79f9..b1e2a418 100644 --- a/pkg/converter/markdown.go +++ b/pkg/converter/markdown.go @@ -35,6 +35,17 @@ func Markdown2HTML(source string) string { return buf.String() } +// Markdown2BasicHTML convert markdown to html ,Only basic syntax can be used +func Markdown2BasicHTML(source string) string { + content := Markdown2HTML(source) + filter := bluemonday.NewPolicy() + filter.AllowElements("p", "b", "br") + filter.AllowAttrs("src").OnElements("img") + filter.AddSpaceWhenStrippingTag(true) + content = filter.Sanitize(content) + return content +} + type DangerousHTMLFilterExtension struct { } diff --git a/ui/src/common/constants.ts b/ui/src/common/constants.ts index 70de4cbd..0817cf22 100644 --- a/ui/src/common/constants.ts +++ b/ui/src/common/constants.ts @@ -6,6 +6,21 @@ export const LOGGED_USER_STORAGE_KEY = '_a_lui_'; export const LOGGED_TOKEN_STORAGE_KEY = '_a_ltk_'; export const REDIRECT_PATH_STORAGE_KEY = '_a_rp_'; export const CAPTCHA_CODE_STORAGE_KEY = '_a_captcha_'; +export const DRAFT_QUESTION_STORAGE_KEY = '_a_dq_'; +export const DRAFT_ANSWER_STORAGE_KEY = '_a_da_'; +export const DRAFT_TIMESIGH_STORAGE_KEY = '|_a_t_s_|'; + +export const IGNORE_PATH_LIST = [ + '/users/login', + '/users/register', + '/users/account-recovery', + '/users/change-email', + '/users/password-reset', + '/users/account-activation', + '/users/account-activation/success', + '/users/account-activation/failed', + '/users/confirm-new-email', +]; export const ADMIN_LIST_STATUS = { // normal; diff --git a/ui/src/components/Comment/index.tsx b/ui/src/components/Comment/index.tsx index 6f42a559..2101f4da 100644 --- a/ui/src/components/Comment/index.tsx +++ b/ui/src/components/Comment/index.tsx @@ -5,7 +5,6 @@ import { Link } from 'react-router-dom'; import classNames from 'classnames'; import { unionBy } from 'lodash'; -import { marked } from 'marked'; import * as Types from '@/common/interface'; import { Modal } from '@/components'; @@ -108,15 +107,11 @@ const Comment = ({ objectId, mode, commentId }) => { const users = matchedUsers(item.value); const userNames = unionBy(users.map((user) => user.userName)); const commentMarkDown = parseUserInfo(item.value); - const html = marked.parse(commentMarkDown); - // if (!commentMarkDown || !html) { - // return; - // } + const params = { object_id: objectId, original_text: commentMarkDown, mention_username_list: userNames, - parsed_text: html, ...(item.type === 'reply' ? { reply_comment_id: item.comment_id, @@ -128,13 +123,13 @@ const Comment = ({ objectId, mode, commentId }) => { return updateComment({ ...params, comment_id: item.comment_id, - }).then(() => { + }).then((res) => { setComments( comments.map((comment) => { if (comment.comment_id === item.comment_id) { comment.showEdit = false; - comment.parsed_text = html; - comment.original_text = item.value; + comment.parsed_text = res.parsed_text; + comment.original_text = res.original_text; } return comment; }), diff --git a/ui/src/components/DiffContent/index.tsx b/ui/src/components/DiffContent/index.tsx index 2a3b3bd9..e784c731 100644 --- a/ui/src/components/DiffContent/index.tsx +++ b/ui/src/components/DiffContent/index.tsx @@ -69,7 +69,10 @@ const Index: FC = ({ {objectType !== 'answer' && opts?.showTitle && (
diff --git a/ui/src/components/Editor/utils/index.ts b/ui/src/components/Editor/utils/index.ts index 10ec9664..56fe47a7 100644 --- a/ui/src/components/Editor/utils/index.ts +++ b/ui/src/components/Editor/utils/index.ts @@ -114,19 +114,8 @@ export function htmlRender(el: HTMLElement | null) { }, ); - el.querySelectorAll('table').forEach((table) => { - if ( - (table.parentNode as HTMLDivElement)?.classList.contains( - 'table-responsive', - ) - ) { - return; - } - - table.classList.add('table', 'table-bordered'); - const div = document.createElement('div'); - div.className = 'table-responsive'; - table.parentNode?.replaceChild(div, table); - div.appendChild(table); - }); + // remove change table style to htmlToReact function + /** + * @description: You modify the DOM with other scripts after React has rendered the DOM. This way, on the next render cycle (re-render), React cannot find the DOM node it rendered before, because it has been modified or removed by other scripts. + */ } diff --git a/ui/src/components/Header/index.tsx b/ui/src/components/Header/index.tsx index eda36a03..ced8ffc0 100644 --- a/ui/src/components/Header/index.tsx +++ b/ui/src/components/Header/index.tsx @@ -71,6 +71,10 @@ const Header: FC = () => { }; const onLoginClick = (evt) => { evt.preventDefault(); + if (location.pathname === '/users/login') { + window.location.reload(); + return; + } floppyNavigation.navigateToLogin((loginPath) => { navigate(loginPath, { replace: true }); }); diff --git a/ui/src/components/SchemaForm/index.tsx b/ui/src/components/SchemaForm/index.tsx index 658689a8..34f5b2c6 100644 --- a/ui/src/components/SchemaForm/index.tsx +++ b/ui/src/components/SchemaForm/index.tsx @@ -238,7 +238,6 @@ const SchemaForm: ForwardRefRenderFunction = ( const errors = requiredValidator(); if (errors.length > 0) { formData = errors.reduce((acc, cur) => { - console.log('schema.properties[cur]', cur); acc[cur] = { ...formData[cur], isInvalid: true, diff --git a/ui/src/hooks/index.ts b/ui/src/hooks/index.ts index 756d8724..f7942048 100644 --- a/ui/src/hooks/index.ts +++ b/ui/src/hooks/index.ts @@ -10,6 +10,7 @@ import useChangePasswordModal from './useChangePasswordModal'; import usePageTags from './usePageTags'; import useLoginRedirect from './useLoginRedirect'; import usePromptWithUnload from './usePrompt'; +import useImgViewer from './useImgViewer'; export { useTagModal, @@ -24,4 +25,5 @@ export { usePageTags, useLoginRedirect, usePromptWithUnload, + useImgViewer, }; diff --git a/ui/src/hooks/useImgViewer/index.tsx b/ui/src/hooks/useImgViewer/index.tsx new file mode 100644 index 00000000..6b3a30c2 --- /dev/null +++ b/ui/src/hooks/useImgViewer/index.tsx @@ -0,0 +1,78 @@ +import { useLayoutEffect, useState, MouseEvent, useEffect } from 'react'; +import { Modal } from 'react-bootstrap'; +import { useLocation } from 'react-router-dom'; + +import ReactDOM from 'react-dom/client'; + +const div = document.createElement('div'); +const root = ReactDOM.createRoot(div); + +const useImgViewer = () => { + const location = useLocation(); + const [visible, setVisible] = useState(false); + const [imgSrc, setImgSrc] = useState(''); + const onClose = () => { + setVisible(false); + setImgSrc(''); + }; + + const checkIfInLink = (target) => { + let ret = false; + let el = target.parentElement; + while (el) { + if (el.nodeName.toLowerCase() === 'a') { + ret = true; + break; + } + el = el.parentElement; + } + return ret; + }; + + const checkClickForImgView = (evt: MouseEvent) => { + const { target } = evt; + // @ts-ignore + if (target.nodeName.toLowerCase() !== 'img') { + return; + } + const img = target as HTMLImageElement; + if (!img.naturalWidth || !img.naturalHeight) { + img.classList.add('broken'); + return; + } + const src = img.currentSrc || img.src; + if (src && checkIfInLink(img) === false) { + setImgSrc(src); + setVisible(true); + } + }; + + useLayoutEffect(() => { + root.render( + + + {imgSrc} + + , + ); + }); + useEffect(() => { + onClose(); + }, [location]); + return { + onClose, + checkClickForImgView, + }; +}; + +export default useImgViewer; diff --git a/ui/src/hooks/usePrompt/index.tsx b/ui/src/hooks/usePrompt/index.tsx index 9b34db07..4eddc9c5 100644 --- a/ui/src/hooks/usePrompt/index.tsx +++ b/ui/src/hooks/usePrompt/index.tsx @@ -6,7 +6,7 @@ import { import { useTranslation } from 'react-i18next'; // https://gist.github.com/chaance/2f3c14ec2351a175024f62fd6ba64aa6 -// The link above is an example of implementing usePromt with useBlocer. +// The link above is an example of implementing usePrompt with useBlocker. interface PromptProps { when: boolean; beforeUnload?: boolean; diff --git a/ui/src/hooks/useReportModal/index.tsx b/ui/src/hooks/useReportModal/index.tsx index 28b85eb5..748564d9 100644 --- a/ui/src/hooks/useReportModal/index.tsx +++ b/ui/src/hooks/useReportModal/index.tsx @@ -47,7 +47,11 @@ const useReportModal = (callback?: () => void) => { setShow(true); }); }; - + const asyncCallback = () => { + setTimeout(() => { + callback?.(); + }); + }; const handleRadio = (val) => { setInvalidState(false); setContent({ @@ -93,8 +97,8 @@ const useReportModal = (callback?: () => void) => { close_type: reportType.type, close_msg: content.value, }).then(() => { - callback?.(); onClose(); + asyncCallback(); }); return; } @@ -109,8 +113,8 @@ const useReportModal = (callback?: () => void) => { msg: t('flag_success', { keyPrefix: 'toast' }), variant: 'warning', }); - callback?.(); onClose(); + asyncCallback(); }); } @@ -121,8 +125,8 @@ const useReportModal = (callback?: () => void) => { flagged_type: reportType.type, id: params.id, }).then(() => { - callback?.(); onClose(); + asyncCallback(); }); } }; diff --git a/ui/src/index.scss b/ui/src/index.scss index 549ffe78..e7ae1d1f 100644 --- a/ui/src/index.scss +++ b/ui/src/index.scss @@ -120,6 +120,14 @@ a { cursor: pointer; } +.cursor-zoom-out { + cursor: zoom-out !important; +} + +img:not(a img, img.broken) { + cursor: zoom-in; +} + .resize-none { resize: none; } diff --git a/ui/src/pages/404/index.jsx b/ui/src/pages/404/index.jsx index d2aa8a85..90722e77 100644 --- a/ui/src/pages/404/index.jsx +++ b/ui/src/pages/404/index.jsx @@ -1,17 +1,30 @@ +import { useEffect } from 'react'; import { Container, Button } from 'react-bootstrap'; import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; const Index = () => { const { t } = useTranslation('translation', { keyPrefix: 'page_404' }); + useEffect(() => { + // auto height of container + const pageWrap = document.querySelector('.page-wrap'); + pageWrap.style.display = 'contents'; + + return () => { + pageWrap.style.display = 'block'; + }; + }, []); return ( - +
(=‘x‘=)
-
{t('desc')}
+

{t('http_error')}

+
{t('desc')}
+ {isEdit && ( + + )} - + {hasDraft && ( + + )}
)} {!isEdit && ( @@ -411,7 +463,6 @@ const Ask = () => { }} />