From 803da7852657ea0dd80783ee6fd70e62b85d170f Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Tue, 22 Oct 2024 15:36:53 +0800 Subject: [PATCH 01/40] # Conflicts: # i18n/da_DK.yaml # i18n/de_DE.yaml # i18n/es_ES.yaml # i18n/fa_IR.yaml # i18n/fr_FR.yaml # i18n/it_IT.yaml # i18n/ko_KR.yaml # i18n/pl_PL.yaml # i18n/pt_PT.yaml # i18n/ro_RO.yaml # i18n/ru_RU.yaml # i18n/sv_SE.yaml # i18n/uk_UA.yaml # i18n/vi_VN.yaml # i18n/zh_CN.yaml --- i18n/cs_CZ.yaml | 20 +- i18n/cy_GB.yaml | 20 +- i18n/da_DK.yaml | 20 +- i18n/de_DE.yaml | 30 +- i18n/es_ES.yaml | 20 +- i18n/fa_IR.yaml | 20 +- i18n/fr_FR.yaml | 20 +- i18n/hi_IN.yaml | 20 +- i18n/id_ID.yaml | 20 +- i18n/it_IT.yaml | 170 ++-- i18n/ja_JP.yaml | 20 +- i18n/ko_KR.yaml | 22 +- i18n/ml_IN.yaml | 2221 +++++++++++++++++++++++++++++++++++++++++++++++ i18n/pl_PL.yaml | 68 +- i18n/pt_PT.yaml | 617 +++++++------ i18n/ro_RO.yaml | 20 +- i18n/ru_RU.yaml | 20 +- i18n/sk_SK.yaml | 20 +- i18n/sv_SE.yaml | 43 +- i18n/te_IN.yaml | 20 +- i18n/tr_TR.yaml | 36 +- i18n/uk_UA.yaml | 188 ++-- i18n/vi_VN.yaml | 331 ++++--- i18n/zh_CN.yaml | 22 +- i18n/zh_TW.yaml | 20 +- 25 files changed, 3100 insertions(+), 928 deletions(-) create mode 100644 i18n/ml_IN.yaml diff --git a/i18n/cs_CZ.yaml b/i18n/cs_CZ.yaml index 0a54c51a6..65438419f 100644 --- a/i18n/cs_CZ.yaml +++ b/i18n/cs_CZ.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: needs details or clarity desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: something else @@ -794,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- - + pagination: prev: Prev next: Next @@ -1341,6 +1334,10 @@ ui: related_question: title: Related Questions answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Questions stats: Stats list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: asked diff --git a/i18n/cy_GB.yaml b/i18n/cy_GB.yaml index c3b3b55a0..af605269b 100644 --- a/i18n/cy_GB.yaml +++ b/i18n/cy_GB.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: angen manylion neu eglurder desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: rhywbeth arall @@ -794,7 +787,7 @@ ui: how_to_format: title: Sut i Fformatio desc: >- - + pagination: prev: Cynt next: Nesaf @@ -1341,6 +1334,10 @@ ui: related_question: title: Related Questions answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Questions stats: Stats list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: asked diff --git a/i18n/da_DK.yaml b/i18n/da_DK.yaml index d707d3554..bd19779fe 100644 --- a/i18n/da_DK.yaml +++ b/i18n/da_DK.yaml @@ -326,9 +326,7 @@ backend: name: other: uhøflig eller misbrug desc: - other: - - En fornuftig person ville finde dette indhold upassende eller ikke respektfuldt - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: en duplikering @@ -340,10 +338,7 @@ backend: name: other: ikke et svar desc: - other: - - Dette blev sendt som svar, men det forsøger ikke at besvare - - spørgsmål. Det bør muligvis være en redigering, en kommentar, et andet spørgsmål - - eller slettet helt. + 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." no_longer_needed: name: other: ikke længere nødvendigt @@ -402,9 +397,7 @@ backend: name: other: kræver detaljer eller klarhed desc: - other: - - Dette spørgsmål indeholder i øjeblikket flere spørgsmål i et. Det bør - - fokusere på kun ét problem. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: noget andet @@ -794,7 +787,7 @@ ui: how_to_format: title: Sådan formaterer du desc: >- - + pagination: prev: Forrige next: Næste @@ -1341,6 +1334,10 @@ ui: related_question: title: Relaterede spørgsmål answers: svar + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Inviter personer desc: Invitér personer, som du tror, kan svare. @@ -1559,6 +1556,7 @@ ui: top_questions: Populære Spørgsmål stats: Statistik list_empty: Ingen indlæg fundet.
Måske vil du vælge en anden fane? + content_empty: No posts found. accepted: Accepteret answered: besvaret asked: spurgt diff --git a/i18n/de_DE.yaml b/i18n/de_DE.yaml index d780b4382..9eee7c030 100644 --- a/i18n/de_DE.yaml +++ b/i18n/de_DE.yaml @@ -146,7 +146,7 @@ backend: invalid_url: other: Ungültige URL. status_invalid: - other: Invalid status. + other: Ungültiger Status. password: space_invalid: other: Passwort darf keine Leerzeichen enthalten. @@ -326,9 +326,7 @@ backend: name: other: unhöflich oder beleidigend desc: - other: - - Eine vernünftige Person würde diesen Inhalt als unangemessen für einen respektvollen - - Umgang empfinden + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: ein Duplikat @@ -340,10 +338,7 @@ backend: name: other: keine Antwort desc: - other: - - Dies wurde als Antwort gepostet, aber es wird nicht versucht, die - - Frage zu beantworten. Es sollte vielleicht eine Bearbeitung, ein Kommentar oder eine andere Frage sein, - - oder ganz gelöscht. + 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." no_longer_needed: name: other: nicht mehr benötigt @@ -402,9 +397,7 @@ backend: name: other: benötigt Details oder Klarheit desc: - other: - - Diese Frage enthält derzeit mehrere Fragen in einer. Sie sollte - - auf ein einziges Problem konzentrieren. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: etwas anderes @@ -465,7 +458,7 @@ backend: invited_you_to_answer: other: hat dich eingeladen, zu antworten earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: Du hast das "{{.BadgeName}}" Abzeichen verdient email_tpl: change_email: title: @@ -536,12 +529,12 @@ backend: default_badges: autobiographer: name: - other: Autobiographer + other: Autobiograph desc: other: Filled out profile information. certified: name: - other: Certified + other: Zertifiziert desc: other: Completed our new user tutorial. editor: @@ -794,7 +787,7 @@ ui: how_to_format: title: Wie man formatiert desc: >- - + pagination: prev: Zurück next: Weiter @@ -1341,6 +1334,10 @@ ui: related_question: title: Verwandte Fragen answers: antworten + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Frage jemanden desc: Lade Leute ein, von denen du glaubst, dass sie die Antwort wissen könnten. @@ -1559,6 +1556,7 @@ ui: top_questions: Top-Fragen stats: Statistiken list_empty: Keine Beiträge gefunden.
Vielleicht möchtest du einen anderen Reiter auswählen? + content_empty: No posts found. accepted: Akzeptiert answered: antwortete asked: gefragt @@ -2205,7 +2203,7 @@ ui: users_with_the_most_vote: Benutzer, die diese Woche am meisten gestimmt haben staffs: Unsere Community Teammitglieder reputation: Ansehen - votes: stimmen + votes: Stimmen prompt: leave_page: Bist du sicher, dass du die Seite verlassen willst? changes_not_save: Deine Änderungen werden möglicherweise nicht gespeichert. diff --git a/i18n/es_ES.yaml b/i18n/es_ES.yaml index ff3853d1c..561b461d4 100644 --- a/i18n/es_ES.yaml +++ b/i18n/es_ES.yaml @@ -326,9 +326,7 @@ backend: name: other: grosero u ofensivo desc: - other: - - Una persona razonable consideraría este contenido como inapropiado - - discurso. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: un duplicado @@ -340,10 +338,7 @@ backend: name: other: no es una respuesta desc: - other: - - Esto fue publicado como respuesta, pero no responde la - - pregunta. Podría ser una edición, un comentario, otra pregunta, - - o borrado por completo. + 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." no_longer_needed: name: other: ya no es necesario @@ -402,9 +397,7 @@ backend: name: other: necesita más detalles o aclaraciónes desc: - other: - - Esta pregunta actualmente incluye múltiples preguntas en una. Debería - - centrarse en un problema solamente. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: otra razón @@ -794,7 +787,7 @@ ui: how_to_format: title: Cómo formatear desc: >- - + pagination: prev: Anterior next: Siguiente @@ -1341,6 +1334,10 @@ ui: related_question: title: Preguntas relacionadas answers: respuestas + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Personas Preguntadas desc: Selecciona personas que creas que sepan la respuesta. @@ -1559,6 +1556,7 @@ ui: top_questions: Preguntas Principales stats: Estadísticas list_empty: No se encontraron publicaciones.
¿Quizás le gustaría seleccionar una pestaña diferente? + content_empty: No posts found. accepted: Aceptada answered: respondida asked: preguntó diff --git a/i18n/fa_IR.yaml b/i18n/fa_IR.yaml index 274b97d5f..55cc98052 100644 --- a/i18n/fa_IR.yaml +++ b/i18n/fa_IR.yaml @@ -326,9 +326,7 @@ backend: name: other: بی ادب یا توهین آمیز desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: تکراری @@ -340,10 +338,7 @@ backend: name: 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: "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." no_longer_needed: name: other: دیگر نیازی نیست @@ -402,9 +397,7 @@ backend: name: other: نیاز به جزئیات یا واضح کردن دارد desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: یک مورد دیگر @@ -794,7 +787,7 @@ ui: how_to_format: title: نحوه فرمت کردن desc: >- - + pagination: prev: قبلی next: بعدی @@ -1341,6 +1334,10 @@ ui: related_question: title: سوالات مرتبط answers: جواب ها + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: مردم پرسیدند desc: افرادی را دعوت کنید که فکر می کنید ممکن است پاسخ را بدانند. @@ -1559,6 +1556,7 @@ ui: top_questions: سوالات برتر stats: آمار list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: پذیرفته شده answered: جواب داده asked: پرسیده شده diff --git a/i18n/fr_FR.yaml b/i18n/fr_FR.yaml index c7bf5fced..52ad13755 100644 --- a/i18n/fr_FR.yaml +++ b/i18n/fr_FR.yaml @@ -326,9 +326,7 @@ backend: name: other: grossier ou abusif desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: un doublon @@ -340,10 +338,7 @@ backend: name: other: n'est pas une réponse 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: "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." no_longer_needed: name: other: ce n’est plus nécessaire @@ -402,9 +397,7 @@ backend: name: other: a besoin de détails ou de clarté desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: quelque chose d'autre @@ -794,7 +787,7 @@ ui: how_to_format: title: Comment mettre en forme desc: >- - + pagination: prev: Préc next: Suivant @@ -1341,6 +1334,10 @@ ui: related_question: title: Questions liées answers: réponses + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Personnes interrogées desc: Invite people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Questions les plus populaires stats: Statistiques list_empty: Aucune publication trouvée.
Peut-être souhaiteriez-vous sélectionner un autre onglet ? + content_empty: No posts found. accepted: Accepté answered: a répondu asked: a demandé diff --git a/i18n/hi_IN.yaml b/i18n/hi_IN.yaml index 78a23394d..8a9da4d56 100644 --- a/i18n/hi_IN.yaml +++ b/i18n/hi_IN.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: needs details or clarity desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: something else @@ -794,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- - + pagination: prev: Prev next: Next @@ -1341,6 +1334,10 @@ ui: related_question: title: Related Questions answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Questions stats: Stats list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: asked diff --git a/i18n/id_ID.yaml b/i18n/id_ID.yaml index 11da05216..bf8e827d4 100644 --- a/i18n/id_ID.yaml +++ b/i18n/id_ID.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: membutuhkan detail atau kejelasan desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: lainnya @@ -794,7 +787,7 @@ ui: how_to_format: title: Cara memformat desc: >- - + pagination: prev: Sebelumnya next: Selanjutnya @@ -1341,6 +1334,10 @@ ui: related_question: title: Pertanyaan Terkait answers: jawaban + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Pertanyaan terpopuler stats: Statistik list_empty: Postingan tidak ditemukan.
Mungkin Anda ingin memilih tab lain? + content_empty: No posts found. accepted: Diterima answered: dijawab asked: ditanyakan diff --git a/i18n/it_IT.yaml b/i18n/it_IT.yaml index 1c9f8a85f..3cc901716 100644 --- a/i18n/it_IT.yaml +++ b/i18n/it_IT.yaml @@ -138,7 +138,7 @@ backend: pass: other: Password original_text: - other: This post + other: Questo post email_or_password_wrong_error: other: Email o password errati. error: @@ -146,7 +146,7 @@ backend: invalid_url: other: URL non valido. status_invalid: - other: Invalid status. + other: Status non valido. password: space_invalid: other: La password non può contenere spazi. @@ -154,7 +154,7 @@ backend: cannot_update_their_password: other: Non è possibile modificare la password. cannot_edit_their_profile: - other: You cannot modify your profile. + other: Non è possibile modificare il profilo. cannot_modify_self_status: other: Non è possibile modificare il tuo status. email_or_password_wrong: @@ -207,10 +207,10 @@ backend: new_password_same_as_previous_setting: other: La nuova password è identica alla precedente already_deleted: - other: This post has been deleted. + other: Questo post è stato eliminato. meta: object_not_found: - other: Meta object not found + other: Meta oggetto non trovato question: already_deleted: other: Questo post è stato eliminato. @@ -315,7 +315,7 @@ backend: other: Configurazione del sito non trovata. badge: object_not_found: - other: Badge object not found + other: Oggetto badge non trovato reason: spam: name: @@ -326,9 +326,7 @@ backend: name: other: scortese o offensivo desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: duplicato @@ -340,10 +338,7 @@ backend: name: other: Non è una risposta 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: "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." no_longer_needed: name: other: Non più necessario @@ -402,9 +397,7 @@ backend: name: other: richiede maggiori dettagli o chiarezza desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: altro @@ -420,12 +413,12 @@ backend: deleted_title: other: "\nDomanda cancellata" questions_title: - other: Questions + other: Domande tag: tags_title: other: Tags no_description: - other: The tag has no description. + other: Il tag non ha descrizioni. notification: action: update_question: @@ -465,7 +458,7 @@ backend: invited_you_to_answer: other: sei invitato a rispondere earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: Hai ottenuto il badge "{{.BadgeName}}" email_tpl: change_email: title: @@ -531,89 +524,89 @@ backend: other: Modifiche suggerite reaction: tooltip: - other: "{{ .Names }} and {{ .Count }} more..." + other: "{{ .Names }} e {{ .Count }} più..." badge: default_badges: autobiographer: name: - other: Autobiographer + other: Autobiografo desc: - other: Filled out profile information. + other: Informazioni sul profilo completate. certified: name: - other: Certified + other: Certificato desc: - other: Completed our new user tutorial. + other: "\nCompletato il nostro nuovo tutorial per l'utente." editor: name: other: Editor desc: - other: First post edit. + other: Prima modifica al post. first_flag: name: - other: First Flag + other: Primo Contrassegno desc: - other: First flagged a post. + other: Primo contrassegno di un post. first_upvote: name: - other: First Upvote + other: Primo Mi Piace desc: - other: First up voted a post. + other: Primo Mi Piace a un post first_link: name: - other: First Link + other: Primo Link desc: - other: First dirst added a link to another post. + other: Aggiunto un link a un altro post per la prima volta first_reaction: name: - other: First Reaction + other: Prima Reazione desc: - other: First reacted to the post. + other: Prima reazione al post. first_share: name: - other: First Share + other: Prima Condivisione desc: - other: First shared a post. + other: Prima condivisione a un post. scholar: name: - other: Scholar + other: Studioso desc: - other: Asked a question and accepted an answer. + other: Ha posto una domanda e ha accettato una risposta commentator: name: - other: Commentator + other: Commentatore desc: - other: Leave 5 comments. + other: Lascia 5 commenti. new_user_of_the_month: name: - other: New User of the Month + other: Nuovo Utente del Mese desc: - other: Outstanding contributions in their first month. + other: Contributi straordinari nel primo mese. read_guidelines: name: - other: Read Guidelines + other: Leggi le Linee Guida desc: - other: Read the [community guidelines]. + other: Leggi le [linee guida della community]. reader: name: - other: Reader + other: Lettore desc: - other: Read every answers in a topic with more than 10 answers. + other: Leggi ogni risposta in un argomento con più di 10 risposte. welcome: name: - other: Welcome + other: Benvenuto desc: - other: Received a up vote. + other: Ricevuto un voto positivo. nice_share: name: - other: Nice Share + other: Condivisione positiva. desc: - other: Shared a post with 25 unique visitors. + other: Ha condiviso un post con 25 visitatori unici. good_share: name: - other: Good Share + other: Condivisione positiva. desc: - other: Shared a post with 300 unique visitors. + other: Condiviso un post con 300 visitatori unici. great_share: name: other: Great Share @@ -741,60 +734,60 @@ backend: other: Question score of 10 or more. good_question: name: - other: Good Question + other: Buona domanda desc: - other: Question score of 25 or more. + other: Punteggio della domanda di 25 o più great_question: name: - other: Great Question + other: Ottima domanda desc: - other: Question score of 50 or more. + other: Punteggio domande pari o superiore a 50. popular_question: name: - other: Popular Question + other: Domanda popolare desc: - other: Question with 500 views. + other: "Domanda con 500 visualizzazioni\n" notable_question: name: - other: Notable Question + other: Domanda notevole desc: - other: Question with 1,000 views. + other: Domanda con 1.000 visualizzazioni. famous_question: name: - other: Famous Question + other: Domanda celebre desc: - other: Question with 5,000 views. + other: "Domanda con 5.000 visualizzazioni.\n." popular_link: name: - other: Popular Link + other: Link Popolare desc: - other: Posted an external link with 50 clicks. + other: Pubblicato un link esterno con 50 clic. hot_link: name: - other: Hot Link + other: Link popolare desc: - other: Posted an external link with 300 clicks. + other: Pubblicato un link esterno con 300 clic. famous_link: name: - other: Famous Link + other: Link celebre desc: - other: Posted an external link with 100 clicks. + other: Pubblicato un link esterno con 100 clic. default_badge_groups: getting_started: name: - other: Getting Started + other: Primi passi community: name: other: Community posting: name: - other: Posting + other: Pubblicazione in corso # The following fields are used for interface presentation(Front-end) ui: how_to_format: title: Come formattare desc: >- - + pagination: prev: Prec next: Successivo @@ -843,9 +836,9 @@ ui: posts: Messaggi invites: Inviti votes: Voti - answer: Answer - question: Question - badge_award: Badge + answer: Risposta + question: Domanda + badge_award: Distintivo suspended: title: Il tuo account è stato sospeso until_time: "Il tuo account è stato sospeso fino a {{ time }}." @@ -1017,9 +1010,9 @@ ui: delete: title: Elimina questo tag tip_with_posts: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

+

Non è consentita l'eliminazione di tag con post.

Rimuovi prima questo tag dai post.

tip_with_synonyms: >- -

We do not allow deleting tag with synonyms.

Please remove the synonyms from this tag first.

+

Non è consentita l'eliminazione di tag con sinonimi.

Per favore, rimuovi prima i sinonimi da questo tag.

tip: Sei sicuro di voler cancellare? close: Chiudi edit_tag: @@ -1041,13 +1034,13 @@ ui: hours: ore days: giorni reaction: - heart: heart - smile: smile - frown: frown - btn_label: add or remove reactions - undo_emoji: undo {{ emoji }} reaction - react_emoji: react with {{ emoji }} - unreact_emoji: unreact with {{ emoji }} + heart: cuore + smile: sorriso + frown: disapprovare + btn_label: aggiungere o rimuovere le reazioni + undo_emoji: annulla reazione {{ emoji }} + react_emoji: reagire con {{ emoji }} + unreact_emoji: non reagire con {{ emoji }} comment: btn_add_comment: Aggiungi un commento reply_to: Rispondi a @@ -1186,7 +1179,7 @@ ui: msg: empty: Il nome non può essere vuoto. range: Name must be between 2 to 30 characters in length. - character: 'Must use the character set "a-z", "A-Z", "0-9", " - . _"' + character: 'È necessario utilizzare il set di caratteri "a-z", "0-9", " - . _"' email: label: E-mail msg: @@ -1341,6 +1334,10 @@ ui: related_question: title: Domande correlate answers: risposte + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Persone Interpellate desc: Seleziona le persone che pensi potrebbero conoscere la risposta. @@ -1502,7 +1499,7 @@ ui: success: Il tuo nuovo account è confermato; sarai reindirizzato alla home page. link: Continua alla Homepage oops: Oops! - invalid: The link you used no longer works. + invalid: Il link che hai usato non è più attivo. confirm_new_email: La tua email è stata aggiornata. confirm_new_email_invalid: >- Siamo spiacenti, questo link di conferma non è più valido. Forse la tua email è già stata modificata? @@ -1524,8 +1521,8 @@ ui: answers: Risposte newest: Più recenti active: Attivo - hot: Hot - recommend: Recommend + hot: Caldo + recommend: Raccomandato score: Punteggio unanswered: Senza risposta modified: Modificato @@ -1559,6 +1556,7 @@ ui: top_questions: Domande principali stats: Statistiche list_empty: Nessun post trovato.
Forse desideri selezionare una scheda diversa? + content_empty: No posts found. accepted: Accettato answered: risposto asked: chiesto diff --git a/i18n/ja_JP.yaml b/i18n/ja_JP.yaml index 887ba7904..433831f46 100644 --- a/i18n/ja_JP.yaml +++ b/i18n/ja_JP.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: needs details or clarity desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: something else @@ -794,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- - + pagination: prev: 前へ next: 次へ @@ -1341,6 +1334,10 @@ ui: related_question: title: Related Questions answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Questions stats: Stats list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: 質問済み diff --git a/i18n/ko_KR.yaml b/i18n/ko_KR.yaml index fba3d7d99..53b413f31 100644 --- a/i18n/ko_KR.yaml +++ b/i18n/ko_KR.yaml @@ -326,9 +326,7 @@ backend: name: other: 폭언 또는 무례한 언행입니다. desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: 중복 @@ -340,10 +338,7 @@ backend: name: 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: "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." no_longer_needed: name: other: 더 이상 필요하지 않습니다. @@ -402,9 +397,7 @@ backend: name: other: 세부사항 또는 명확성이 필요합니다. desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: 다른 이유 @@ -794,7 +787,7 @@ ui: how_to_format: title: 포맷 방법 desc: >- - + pagination: prev: 이전 next: 다음 @@ -1185,7 +1178,7 @@ ui: label: 이름 msg: empty: 이름을 입력하세요. - range: 이름은 최대 30자까지 입력 가능합니다. + range: Name must be between 2 to 30 characters in length. character: '문자 집합 "a-z", "0-9", " - . _"를 사용해야 합니다' email: label: 이메일 @@ -1341,6 +1334,10 @@ ui: related_question: title: 관련 질문 answers: 답변 + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: 질문자 초대 desc: 답변을 알고 있을 것으로 생각되는 사람을 선택하세요. @@ -1559,6 +1556,7 @@ ui: top_questions: 최고 질문 stats: 통계 list_empty: 게시물을 찾을 수 없습니다.
다른 탭을 선택하실 수 있습니다. + content_empty: No posts found. accepted: 채택됨 answered: 답변됨 asked: 질문됨 diff --git a/i18n/ml_IN.yaml b/i18n/ml_IN.yaml new file mode 100644 index 000000000..c2d2af8f4 --- /dev/null +++ b/i18n/ml_IN.yaml @@ -0,0 +1,2221 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# The following fields are used for back-end +backend: + base: + success: + other: Success. + unknown: + other: Unknown error. + request_format_error: + other: Request format is not valid. + unauthorized_error: + other: Unauthorized. + database_error: + other: Data server error. + forbidden_error: + other: Forbidden. + duplicate_request_error: + other: Duplicate submission. + action: + report: + other: Flag + edit: + other: Edit + delete: + other: Delete + close: + other: Close + reopen: + other: Reopen + forbidden_error: + other: Forbidden. + pin: + other: Pin + hide: + other: Unlist + unpin: + other: Unpin + show: + other: List + invite_someone_to_answer: + other: Edit + undelete: + other: Undelete + role: + name: + user: + other: User + admin: + other: Admin + moderator: + other: Moderator + description: + user: + other: Default with no special access. + admin: + other: Have the full power to access the site. + moderator: + other: Has access to all posts except admin settings. + privilege: + level_1: + description: + other: Level 1 (less reputation required for private team, group) + level_2: + description: + other: Level 2 (low reputation required for startup community) + level_3: + description: + other: Level 3 (high reputation required for mature community) + level_custom: + description: + other: Custom Level + rank_question_add_label: + other: Ask question + rank_answer_add_label: + other: Write answer + rank_comment_add_label: + other: Write comment + rank_report_add_label: + other: Flag + rank_comment_vote_up_label: + other: Upvote comment + rank_link_url_limit_label: + other: Post more than 2 links at a time + rank_question_vote_up_label: + other: Upvote question + rank_answer_vote_up_label: + other: Upvote answer + rank_question_vote_down_label: + other: Downvote question + rank_answer_vote_down_label: + other: Downvote answer + rank_invite_someone_to_answer_label: + other: Invite someone to answer + rank_tag_add_label: + other: Create new tag + rank_tag_edit_label: + other: Edit tag description (need to review) + rank_question_edit_label: + other: Edit other's question (need to review) + rank_answer_edit_label: + other: Edit other's answer (need to review) + rank_question_edit_without_review_label: + other: Edit other's question without review + rank_answer_edit_without_review_label: + other: Edit other's answer without review + rank_question_audit_label: + other: Review question edits + rank_answer_audit_label: + other: Review answer edits + rank_tag_audit_label: + other: Review tag edits + rank_tag_edit_without_review_label: + other: Edit tag description without review + rank_tag_synonym_label: + other: Manage tag synonyms + email: + other: Email + e_mail: + other: Email + password: + other: Password + pass: + other: Password + original_text: + other: This post + email_or_password_wrong_error: + other: Email and password do not match. + error: + common: + invalid_url: + other: Invalid URL. + status_invalid: + other: Invalid status. + password: + space_invalid: + other: Password cannot contain spaces. + admin: + cannot_update_their_password: + other: You cannot modify your password. + cannot_edit_their_profile: + other: You cannot modify your profile. + cannot_modify_self_status: + other: You cannot modify your status. + email_or_password_wrong: + other: Email and password do not match. + answer: + not_found: + other: Answer do not found. + cannot_deleted: + other: No permission to delete. + cannot_update: + other: No permission to update. + question_closed_cannot_add: + other: Questions are closed and cannot be added. + comment: + edit_without_permission: + other: Comment are not allowed to edit. + not_found: + other: Comment not found. + cannot_edit_after_deadline: + other: The comment time has been too long to modify. + email: + duplicate: + other: Email already exists. + need_to_be_verified: + other: Email should be verified. + verify_url_expired: + other: Email verified URL has expired, please resend the email. + illegal_email_domain_error: + other: Email is not allowed from that email domain. Please use another one. + lang: + not_found: + other: Language file not found. + object: + captcha_verification_failed: + other: Captcha wrong. + disallow_follow: + other: You are not allowed to follow. + disallow_vote: + other: You are not allowed to vote. + disallow_vote_your_self: + other: You can't vote for your own post. + not_found: + other: Object not found. + verification_failed: + other: Verification failed. + email_or_password_incorrect: + other: Email and password do not match. + old_password_verification_failed: + other: The old password verification failed + new_password_same_as_previous_setting: + other: The new password is the same as the previous one. + already_deleted: + other: This post has been deleted. + meta: + object_not_found: + other: Meta object not found + question: + already_deleted: + other: This post has been deleted. + under_review: + other: Your post is awaiting review. It will be visible after it has been approved. + not_found: + other: Question not found. + cannot_deleted: + other: No permission to delete. + cannot_close: + other: No permission to close. + cannot_update: + other: No permission to update. + rank: + fail_to_meet_the_condition: + other: Reputation rank fail to meet the condition. + vote_fail_to_meet_the_condition: + other: Thanks for the feedback. You need at least {{.Rank}} reputation to cast a vote. + no_enough_rank_to_operate: + other: You need at least {{.Rank}} reputation to do this. + report: + handle_failed: + other: Report handle failed. + not_found: + other: Report not found. + tag: + already_exist: + other: Tag already exists. + not_found: + other: Tag not found. + recommend_tag_not_found: + other: Recommend tag is not exist. + recommend_tag_enter: + other: Please enter at least one required tag. + not_contain_synonym_tags: + 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: + config_from_name_cannot_be_email: + other: The from name cannot be a email address. + theme: + not_found: + other: Theme not found. + revision: + review_underway: + other: Can't edit currently, there is a version in the review queue. + no_permission: + other: No permission to revise. + user: + external_login_missing_user_id: + other: The third-party platform does not provide a unique UserID, so you cannot login, please contact the website administrator. + external_login_unbinding_forbidden: + other: Please set a login password for your account before you remove this login. + email_or_password_wrong: + other: + other: Email and password do not match. + not_found: + other: User not found. + suspended: + other: User has been suspended. + username_invalid: + other: Username is invalid. + username_duplicate: + other: Username is already in use. + set_avatar: + other: Avatar set failed. + cannot_update_your_role: + other: You cannot modify your role. + not_allowed_registration: + other: Currently the site is not open for registration. + not_allowed_login_via_password: + other: Currently the site is not allowed to login via password. + access_denied: + other: Access denied + page_access_denied: + other: You do not have access to this page. + add_bulk_users_format_error: + other: "Error {{.Field}} format near '{{.Content}}' at line {{.Line}}. {{.ExtraMessage}}" + add_bulk_users_amount_error: + other: "The number of users you add at once should be in the range of 1-{{.MaxAmount}}." + config: + read_config_failed: + other: Read config failed + database: + connection_failed: + other: Database connection failed + create_table_failed: + other: Create table failed + install: + create_config_failed: + other: Can't create the config.yaml file. + upload: + unsupported_file_format: + other: Unsupported file format. + site_info: + config_not_found: + other: Site config not found. + badge: + object_not_found: + other: Badge object not found + reason: + spam: + name: + other: spam + desc: + other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic. + rude_or_abusive: + name: + other: rude or abusive + desc: + other: "A reasonable person would find this content inappropriate for respectful discourse." + a_duplicate: + name: + other: a duplicate + desc: + other: This question has been asked before and already has an answer. + placeholder: + other: Enter the existing question link + not_a_answer: + name: + other: not an answer + 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." + no_longer_needed: + name: + other: no longer needed + desc: + other: This comment is outdated, conversational or not relevant to this post. + something: + name: + other: something else + desc: + other: This post requires staff attention for another reason not listed above. + placeholder: + other: Let us know specifically what you are concerned about + community_specific: + name: + other: a community-specific reason + desc: + other: This question doesn't meet a community guideline. + not_clarity: + name: + other: needs details or clarity + desc: + other: This question currently includes multiple questions in one. It should focus on one problem only. + looks_ok: + name: + other: looks OK + desc: + other: This post is good as-is and not low quality. + needs_edit: + name: + other: needs edit, and I did it + desc: + other: Improve and correct problems with this post yourself. + needs_close: + name: + other: needs close + desc: + other: A closed question can't answer, but still can edit, vote and comment. + needs_delete: + name: + other: needs delete + desc: + other: This post will be deleted. + question: + close: + duplicate: + name: + other: spam + desc: + other: This question has been asked before and already has an answer. + guideline: + name: + other: a community-specific reason + desc: + other: This question doesn't meet a community guideline. + multiple: + name: + other: needs details or clarity + desc: + other: This question currently includes multiple questions in one. It should focus on one problem only. + other: + name: + other: something else + desc: + other: This post requires another reason not listed above. + operation_type: + asked: + other: asked + answered: + other: answered + modified: + other: modified + deleted_title: + other: Deleted question + questions_title: + other: Questions + tag: + tags_title: + other: Tags + no_description: + other: The tag has no description. + notification: + action: + update_question: + other: updated question + answer_the_question: + other: answered question + update_answer: + other: updated answer + accept_answer: + other: accepted answer + comment_question: + other: commented question + comment_answer: + other: commented answer + reply_to_you: + other: replied to you + mention_you: + other: mentioned you + your_question_is_closed: + other: Your question has been closed + your_question_was_deleted: + other: Your question has been deleted + your_answer_was_deleted: + other: Your answer has been deleted + your_comment_was_deleted: + other: Your comment has been deleted + up_voted_question: + other: upvoted question + down_voted_question: + other: downvoted question + up_voted_answer: + other: upvoted answer + down_voted_answer: + other: downvoted answer + up_voted_comment: + other: upvoted comment + invited_you_to_answer: + other: invited you to answer + earned_badge: + other: You've earned the "{{.BadgeName}}" badge + email_tpl: + change_email: + title: + other: "[{{.SiteName}}] Confirm your new email address" + body: + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
\n{{.ChangeEmailUrl}}

\n\nIf you did not request this change, please ignore this email.\n" + new_answer: + title: + other: "[{{.SiteName}}] {{.DisplayName}} answered your question" + body: + other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
{{.AnswerSummary}}

\nView it on {{.SiteName}}

\n\n--
\nUnsubscribe" + invited_you_to_answer: + title: + other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" + body: + other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
I think you may know the answer.

\nView it on {{.SiteName}}

\n\n--
\nUnsubscribe" + new_comment: + title: + other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" + body: + other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
{{.CommentSummary}}

\nView it on {{.SiteName}}

\n\n--
\nUnsubscribe" + new_question: + title: + other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" + body: + other: "{{.QuestionTitle}}
\n{{.Tags}}

\n\n--
\nUnsubscribe" + pass_reset: + title: + other: "[{{.SiteName }}] Password reset" + body: + other: "Somebody asked to reset your password on {{.SiteName}}.

\n\nIf it was not you, you can safely ignore this email.

\n\nClick the following link to choose a new password:
\n{{.PassResetUrl}}\n" + register: + title: + other: "[{{.SiteName}}] Confirm your new account" + body: + other: "Welcome to {{.SiteName}}!

\n\nClick the following link to confirm and activate your new account:
\n{{.RegisterUrl}}

\n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + test: + title: + other: "[{{.SiteName}}] Test Email" + body: + other: "This is a test email." + action_activity_type: + upvote: + other: upvote + upvoted: + other: upvoted + downvote: + other: downvote + downvoted: + other: downvoted + accept: + other: accept + accepted: + other: accepted + edit: + other: edit + review: + queued_post: + other: Queued post + flagged_post: + other: Flagged post + suggested_post_edit: + other: Suggested edits + reaction: + tooltip: + other: "{{ .Names }} and {{ .Count }} more..." + badge: + default_badges: + autobiographer: + name: + other: Autobiographer + desc: + other: Filled out profile information. + certified: + name: + other: Certified + desc: + other: Completed our new user tutorial. + editor: + name: + other: Editor + desc: + other: First post edit. + first_flag: + name: + other: First Flag + desc: + other: First flagged a post. + first_upvote: + name: + other: First Upvote + desc: + other: First up voted a post. + first_link: + name: + other: First Link + desc: + other: First dirst added a link to another post. + first_reaction: + name: + other: First Reaction + desc: + other: First reacted to the post. + first_share: + name: + other: First Share + desc: + other: First shared a post. + scholar: + name: + other: Scholar + desc: + other: Asked a question and accepted an answer. + commentator: + name: + other: Commentator + desc: + other: Leave 5 comments. + new_user_of_the_month: + name: + other: New User of the Month + desc: + other: Outstanding contributions in their first month. + read_guidelines: + name: + other: Read Guidelines + desc: + other: Read the [community guidelines]. + reader: + name: + other: Reader + desc: + other: Read every answers in a topic with more than 10 answers. + welcome: + name: + other: Welcome + desc: + other: Received a up vote. + nice_share: + name: + other: Nice Share + desc: + other: Shared a post with 25 unique visitors. + good_share: + name: + other: Good Share + desc: + other: Shared a post with 300 unique visitors. + great_share: + name: + other: Great Share + desc: + other: Shared a post with 1000 unique visitors. + out_of_love: + name: + other: Out of Love + desc: + other: Used 50 up votes in a day. + higher_love: + name: + other: Higher Love + desc: + other: Used 50 up votes in a day 5 times. + crazy_in_love: + name: + other: Crazy in Love + desc: + other: Used 50 up votes in a day 20 times. + promoter: + name: + other: Promoter + desc: + other: Invited a user. + campaigner: + name: + other: Campaigner + desc: + other: Invited 3 basic users. + champion: + name: + other: Champion + desc: + other: Invited 5 members. + thank_you: + name: + other: Thank You + desc: + other: Has 20 up voted posts and gave 10 up votes. + gives_back: + name: + other: Gives Back + desc: + other: Has 100 up voted posts and gave 100 up votes. + empathetic: + name: + other: Empathetic + desc: + other: Has 500 up voted posts and gave 1000 up votes. + enthusiast: + name: + other: Enthusiast + desc: + other: Visited 10 consecutive days. + aficionado: + name: + other: Aficionado + desc: + other: Visited 100 consecutive days. + devotee: + name: + other: Devotee + desc: + other: Visited 365 consecutive days. + anniversary: + name: + other: Anniversary + desc: + other: Active member for a year, posted at least once. + appreciated: + name: + other: Appreciated + desc: + other: Received 1 up vote on 20 posts. + respected: + name: + other: Respected + desc: + other: Received 2 up votes on 100 posts. + admired: + name: + other: Admired + desc: + other: Received 5 up votes on 300 posts. + solved: + name: + other: Solved + desc: + other: Have an answer be accepted. + guidance_counsellor: + name: + other: Guidance Counsellor + desc: + other: Have 10 answers be accepted. + know_it_all: + name: + other: Know-it-All + desc: + other: Have 50 answers be accepted. + solution_institution: + name: + other: Solution Institution + desc: + other: Have 150 answers be accepted. + nice_answer: + name: + other: Nice Answer + desc: + other: Answer score of 10 or more. + good_answer: + name: + other: Good Answer + desc: + other: Answer score of 25 or more. + great_answer: + name: + other: Great Answer + desc: + other: Answer score of 50 or more. + nice_question: + name: + other: Nice Question + desc: + other: Question score of 10 or more. + good_question: + name: + other: Good Question + desc: + other: Question score of 25 or more. + great_question: + name: + other: Great Question + desc: + other: Question score of 50 or more. + popular_question: + name: + other: Popular Question + desc: + other: Question with 500 views. + notable_question: + name: + other: Notable Question + desc: + other: Question with 1,000 views. + famous_question: + name: + other: Famous Question + desc: + other: Question with 5,000 views. + popular_link: + name: + other: Popular Link + desc: + other: Posted an external link with 50 clicks. + hot_link: + name: + other: Hot Link + desc: + other: Posted an external link with 300 clicks. + famous_link: + name: + other: Famous Link + desc: + other: Posted an external link with 100 clicks. + default_badge_groups: + getting_started: + name: + other: Getting Started + community: + name: + other: Community + posting: + name: + other: Posting +# The following fields are used for interface presentation(Front-end) +ui: + how_to_format: + title: How to Format + desc: >- + + pagination: + prev: Prev + next: Next + page_title: + question: Question + questions: Questions + tag: Tag + tags: Tags + tag_wiki: tag wiki + create_tag: Create Tag + 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 + oauth_callback: Processing + http_404: HTTP Error 404 + http_50X: HTTP Error 500 + http_403: HTTP Error 403 + logout: Log Out + notifications: + title: Notifications + inbox: Inbox + achievement: Achievements + new_alerts: New alerts + all_read: Mark all as read + show_more: Show more + someone: Someone + inbox_type: + all: All + posts: Posts + invites: Invites + votes: Votes + answer: Answer + question: Question + badge_award: Badge + 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. + contact_us: Contact us + editor: + blockquote: + text: Blockquote + bold: + text: Strong + 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 + code: + text: Code Sample + add_code: Add code sample + form: + fields: + code: + label: Code + msg: + empty: Code cannot be empty. + language: + label: Language + placeholder: Automatic detection + btn_cancel: Cancel + btn_confirm: Add + formula: + text: Formula + options: + inline: Inline formula + block: Block formula + heading: + text: Heading + options: + h1: Heading 1 + h2: Heading 2 + h3: Heading 3 + h4: Heading 4 + h5: Heading 5 + h6: Heading 6 + help: + text: Help + hr: + text: Horizontal rule + image: + text: Image + add_image: Add image + tab_image: Upload image + form_image: + fields: + file: + label: Image file + btn: Select image + msg: + empty: File cannot be empty. + only_image: Only image files are allowed. + max_size: File size cannot exceed 4 MB. + desc: + label: Description + tab_url: Image URL + form_url: + fields: + url: + label: Image URL + msg: + empty: Image URL cannot be empty. + name: + label: Description + btn_cancel: Cancel + btn_confirm: Add + uploading: Uploading + indent: + text: Indent + outdent: + text: Outdent + italic: + text: Emphasis + link: + text: Hyperlink + add_link: Add hyperlink + form: + fields: + url: + label: URL + msg: + empty: URL cannot be empty. + name: + label: Description + btn_cancel: Cancel + btn_confirm: Add + ordered_list: + text: Numbered list + unordered_list: + text: Bulleted list + table: + text: Table + heading: Heading + cell: Cell + close_modal: + title: I am closing this post as... + btn_cancel: Cancel + btn_submit: Submit + remark: + empty: Cannot be empty. + msg: + empty: Please select a reason. + 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 + remark: + empty: Cannot be empty. + msg: + empty: Please select a reason. + not_a_url: URL format is incorrect. + url_not_match: URL origin does not match the current website. + tag_modal: + title: Create new tag + form: + fields: + display_name: + label: Display name + msg: + empty: Display name cannot be empty. + range: Display name up to 35 characters. + slug_name: + label: URL slug + desc: URL slug up to 35 characters. + msg: + empty: URL slug cannot be empty. + range: URL slug up to 35 characters. + character: URL slug contains unallowed character set. + desc: + label: Description + revision: + label: Revision + edit_summary: + label: Edit summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_cancel: Cancel + btn_submit: Submit + btn_post: Post new tag + tag_info: + created_at: Created + edited_at: Edited + history: 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 + delete: + title: Delete this tag + tip_with_posts: >- +

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

+ tip_with_synonyms: >- +

We do not allow 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 + default_reason: Edit tag + default_first_reason: Add tag + btn_save_edits: Save edits + btn_cancel: 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 + hours: hours + days: days + reaction: + heart: heart + smile: smile + frown: frown + btn_label: add or remove reactions + undo_emoji: undo {{ emoji }} reaction + react_emoji: react with {{ emoji }} + unreact_emoji: unreact with {{ emoji }} + 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: "{{count}} 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. + tip_vote: It adds something useful to the post + edit_answer: + title: Edit Answer + default_reason: Edit answer + default_first_reason: Add answer + form: + fields: + revision: + label: Revision + answer: + label: Answer + feedback: + characters: content must be at least 6 characters in length. + edit_summary: + label: Edit summary + placeholder: >- + Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + btn_save_edits: Save edits + btn_cancel: Cancel + tags: + title: Tags + 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 + ask: + title: Add Question + edit_title: Edit Question + default_reason: Edit question + default_first_reason: Add question + similar_questions: Similar questions + form: + fields: + revision: + label: Revision + title: + label: Title + placeholder: Be specific and imagine you're asking a question to another person + msg: + empty: Title cannot be empty. + range: Title up to 150 characters + body: + label: Body + msg: + empty: Body cannot be empty. + tags: + label: Tags + msg: + empty: Tags cannot be empty. + answer: + label: Answer + msg: + empty: Answer cannot be 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 + 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) + header: + nav: + question: Questions + tag: Tags + user: Users + badges: Badges + profile: Profile + setting: Settings + logout: Log out + admin: Admin + review: Review + bookmark: Bookmarks + moderation: Moderation + search: + placeholder: Search + footer: + build_on: >- + Powered by <1> Apache Answer - the open-source software that powers Q&A communities.
Made with love © {{cc}}. + upload_img: + name: Change + loading: loading... + pic_auth_code: + title: Captcha + placeholder: Type the text above + msg: + empty: Captcha cannot be 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 + msg: + empty: Cannot be empty. + resend_email: + url_label: Are you sure you want to resend the activation email? + url_text: You can also give the activation link above to the user. + login: + 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? + name: + label: Name + msg: + empty: Name cannot be empty. + range: Name must be between 2 to 30 characters in length. + character: 'Must use the character set "a-z", "A-Z", "0-9", " - . _"' + email: + label: Email + msg: + empty: Email cannot be empty. + password: + label: Password + msg: + empty: Password cannot be empty. + different: The passwords entered on both sides are inconsistent + 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. + email: + label: Email + msg: + empty: Email cannot be empty. + change_email: + 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. + email: + label: New email + msg: + empty: Email cannot be empty. + oauth: + connect: Connect with {{ auth_name }} + remove: Remove {{ auth_name }} + oauth_bind_email: + subtitle: Add a recovery email to your account. + btn_update: Update email address + email: + label: Email + msg: + empty: Email cannot be empty. + modal_title: Email already existes. + modal_content: This email address already registered. Are you sure you want to connect to the existing account? + modal_cancel: Change email + modal_confirm: Connect to the existing account + 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 + password: + label: Password + 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 + password_confirm: + label: Confirm new password + settings: + page_title: Settings + goto_modify: Go to modify + nav: + profile: Profile + notification: Notifications + account: Account + interface: Interface + profile: + heading: Profile + btn_name: Save + display_name: + label: Display name + msg: Display name cannot be empty. + msg_range: Display name up to 30 characters. + 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", " - . _"' + avatar: + label: Profile image + gravatar: Gravatar + gravatar_text: You can change image on + custom: Custom + custom_text: You can upload your image. + default: System + msg: Please upload an avatar + bio: + label: About me + website: + label: Website + placeholder: "https://example.com" + msg: Website incorrect format + location: + label: Location + placeholder: "City, Country" + notification: + heading: Email Notifications + turn_on: Turn on + inbox: + label: Inbox notifications + description: Answers to your questions, comments, invites, and more. + all_new_question: + label: All new questions + description: Get notified of all new questions. Up to 50 questions per week. + all_new_question_for_following_tags: + label: All new questions for following tags + description: Get notified of new questions for following tags. + 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. + email: + label: Email + new_email: + label: New email + msg: New email cannot be empty. + pass: + label: Current password + msg: Password cannot be empty. + password_title: Password + current_pass: + label: Current password + 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. + new_pass: + label: New password + pass_confirm: + label: Confirm new password + interface: + heading: Interface + lang: + label: Interface language + text: User interface language. It will change when you refresh the page. + my_logins: + title: My logins + label: Log in or sign up on this site using these accounts. + modal_title: Remove login + modal_content: Are you sure you want to remove this login from your account? + modal_confirm_btn: Remove + remove_success: Removed successfully + 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. + sent_success: Sent successfully + related_question: + title: Related Questions + answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. + invite_to_answer: + title: Invite People + desc: Invite people you think can answer. + invite: Invite to answer + add: Add people + search: Search people + question_detail: + action: Action + Asked: Asked + asked: asked + update: Modified + edit: edited + commented: commented + Views: Viewed + Follow: Follow + Following: Following + follow_tip: Follow this question to receive notifications + answered: answered + closed_in: Closed in + show_exist: Show existing question. + useful: Useful + question_useful: It is useful and clear + question_un_useful: It is unclear or not useful + question_bookmark: Bookmark this question + answer_useful: It is useful + answer_un_useful: It is not useful + answers: + title: Answers + score: Score + newest: Newest + oldest: Oldest + btn_accept: Accept + btn_accepted: Accepted + write_answer: + title: Your Answer + edit_answer: Edit my existing 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. + tips: + header_1: Thanks for your answer + li1_1: Please be sure to answer the question. Provide details and share your research. + li1_2: Back up any statements you make with references or personal experience. + header_2: But avoid ... + li2_1: Asking for help, seeking clarification, or responding to other answers. + reopen: + confirm_btn: Reopen + title: Reopen this post + content: Are you sure you want to reopen? + list: + confirm_btn: List + title: List this post + content: Are you sure you want to list? + unlist: + confirm_btn: Unlist + title: Unlist this post + content: Are you sure you want to unlist? + pin: + title: Pin this post + content: Are you sure you wish to pinned globally? This post will appear at the top of all post lists. + confirm_btn: Pin + 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_answer_deleted: This answer has been deleted + undelete_title: Undelete this post + undelete_desc: Are you sure you wish to undelete? + btns: + confirm: Confirm + cancel: Cancel + edit: Edit + save: Save + delete: Delete + undelete: Undelete + list: List + unlist: Unlist + unlisted: Unlisted + login: Log in + signup: Sign up + logout: Log out + verify: Verify + add_question: Add question + approve: Approve + reject: Reject + skip: Skip + discard_draft: Discard draft + pinned: Pinned + all: All + question: Question + answer: Answer + comment: Comment + refresh: Refresh + resend: Resend + deactivate: Deactivate + active: Active + suspend: Suspend + unsuspend: Unsuspend + close: Close + reopen: Reopen + ok: OK + light: Light + dark: Dark + system_setting: System setting + default: Default + reset: Reset + tag: Tag + post_lowercase: post + filter: Filter + ignore: Ignore + submit: Submit + normal: Normal + closed: Closed + deleted: Deleted + pending: Pending + more: More + search: + title: Search Results + keywords: Keywords + options: Options + follow: Follow + following: Following + counts: "{{count}} Results" + more: More + sort_btns: + relevance: Relevance + newest: Newest + active: Active + score: Score + more: More + tips: + title: Advanced Search Tips + tag: "<1>[tag] search with 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. + 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. + modal_confirm: + title: Error... + account_result: + success: Your new account is confirmed; you will be redirected to the home page. + link: Continue to homepage + oops: Oops! + invalid: The link you used no longer works. + 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? + 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 + 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 + hot: Hot + recommend: Recommend + score: Score + unanswered: Unanswered + modified: modified + answered: answered + asked: asked + closed: closed + follow_a_tag: Follow a tag + more: More + personal: + overview: Overview + answers: Answers + answer: answer + questions: Questions + question: question + bookmarks: Bookmarks + reputation: Reputation + comments: Comments + votes: Votes + badges: Badges + newest: Newest + score: Score + edit_profile: Edit profile + visited_x_days: "Visited {{ count }} days" + viewed: Viewed + joined: Joined + comma: "," + 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? + content_empty: No posts found. + accepted: Accepted + answered: answered + asked: asked + downvoted: downvoted + mod_short: MOD + mod_long: Moderators + x_reputation: reputation + x_votes: votes received + x_answers: answers + x_questions: questions + recent_badges: Recent Badges + install: + title: Installation + next: Next + done: Done + config_yaml_error: Can't create the config.yaml file. + lang: + label: Please choose a language + db_type: + label: Database engine + db_username: + label: Username + placeholder: root + msg: Username cannot be empty. + db_password: + label: Password + placeholder: root + msg: Password cannot be empty. + db_host: + label: Database host + placeholder: "db:3306" + msg: Database host cannot be empty. + db_name: + label: Database name + placeholder: answer + msg: Database name cannot be empty. + db_file: + label: Database file + placeholder: /data/answer.db + msg: Database file cannot be empty. + 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 + site_name: + label: Site name + msg: Site name cannot be empty. + msg_max_length: Site name must be at maximum 30 characters in length. + site_url: + label: Site URL + text: The address of your site. + msg: + empty: Site URL cannot be empty. + incorrect: Site URL incorrect format. + max_length: Site URL must be at maximum 512 characters in length. + contact_email: + label: Contact email + text: Email address of key contact responsible for this site. + msg: + empty: Contact email cannot be empty. + incorrect: Contact email incorrect format. + login_required: + label: Private + switch: Login required + text: Only logged in users can access this community. + admin_name: + label: Name + msg: Name cannot be empty. + character: 'Must use the character set "a-z", "0-9", " - . _"' + msg_max_length: Name must be at maximum 30 characters in length. + 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. + msg_min_length: Password must be at least 8 characters in length. + msg_max_length: Password must be at maximum 32 characters in length. + admin_email: + label: Email + text: You will need this email to log in. + msg: + empty: Email cannot be empty. + incorrect: Email incorrect format. + ready_title: Your site 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. + counts: + views: views + votes: votes + answers: answers + accepted: Accepted + page_error: + http_error: HTTP Error {{ code }} + desc_403: You don't have permission to access this page. + desc_404: Unfortunately, this page doesn't exist. + desc_50X: The server encountered an error and could not complete your request. + back_home: Back to homepage + page_maintenance: + desc: "We are under maintenance, we'll be back soon." + nav_menus: + dashboard: Dashboard + contents: Contents + questions: Questions + answers: Answers + users: Users + badges: Badges + flags: Flags + settings: Settings + general: General + interface: Interface + smtp: SMTP + branding: Branding + legal: Legal + write: Write + tos: Terms of Service + privacy: Privacy + seo: SEO + customize: Customize + themes: Themes + css_html: CSS/HTML + login: Login + privileges: Privileges + plugins: Plugins + installed_plugins: Installed Plugins + website_welcome: Welcome to {{site_name}} + user_center: + login: Login + qrcode_login_tip: Please use {{ agentName }} to scan the QR code and log in. + login_failed_email_tip: Login failed, please allow this app to access your email information before try again. + badges: + modal: + title: Congratulations + content: You've earned a new badge. + close: Close + confirm: View badges + title: Badges + awarded: Awarded + earned_×: Earned ×{{ number }} + ×_awarded: "{{ number }} awarded" + can_earn_multiple: You can earn this multiple times. + earned: Earned + admin: + admin_header: + title: Admin + dashboard: + title: Dashboard + welcome: Welcome to Admin! + site_statistics: Site statistics + questions: "Questions:" + answers: "Answers:" + comments: "Comments:" + votes: "Votes:" + users: "Users:" + flags: "Flags:" + reviews: "Reviews:" + site_health: Site health + version: "Version:" + https: "HTTPS:" + upload_folder: "Upload folder:" + run_mode: "Running mode:" + private: Private + public: Public + smtp: "SMTP:" + timezone: "Timezone:" + system_info: System info + go_version: "Go version:" + database: "Database:" + database_size: "Database size:" + storage_used: "Storage used:" + uptime: "Uptime:" + links: Links + plugins: Plugins + github: GitHub + blog: Blog + contact: Contact + forum: Forum + 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 + writable: Writable + not_writable: Not writable + flags: + title: Flags + pending: Pending + completed: Completed + flagged: Flagged + flagged_type: Flagged {{ type }} + created: Created + action: Action + review: Review + user_role_modal: + title: Change user role to... + btn_cancel: Cancel + btn_submit: Submit + new_password_modal: + title: Set new password + 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 + edit_profile_modal: + title: Edit profile + form: + fields: + display_name: + label: Display name + msg_range: Display name up to 30 characters. + username: + label: Username + msg_range: Username up to 30 characters. + email: + label: Email + msg_invalid: Invalid Email Address. + edit_success: Edited successfully + btn_cancel: Cancel + btn_submit: Submit + user_modal: + title: Add new user + form: + fields: + users: + label: Bulk add user + placeholder: "John Smith, john@example.com, BUSYopr2\nAlice, alice@example.com, fpDntV8q" + text: Separate “name, email, password” with commas. One user per line. + msg: "Please enter the user's email, one per line." + display_name: + label: Display name + msg: Display name must be 2-30 characters in length. + email: + label: Email + msg: Email is not valid. + password: + label: Password + msg: Password must be at 8-32 characters in length. + btn_cancel: Cancel + btn_submit: 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 + more: More + inactive: Inactive + suspended: Suspended + deleted: Deleted + normal: Normal + Moderator: Moderator + Admin: Admin + User: User + filter: + placeholder: "Filter by name, user:id" + set_new_password: Set new password + edit_profile: Edit profile + change_status: Change status + change_role: Change role + show_logs: Show logs + add_user: Add user + deactivate_user: + title: Deactivate user + content: An inactive user must re-validate their email. + delete_user: + title: Delete this user + content: Are you sure you want to delete this user? This is permanent! + remove: Remove their content + label: Remove all questions, answers, comments, etc. + text: Don’t check this if you wish to only delete the user’s account. + suspend_user: + title: Suspend this user + content: A suspended user can't log in. + questions: + page_title: Questions + unlisted: Unlisted + post: Post + votes: Votes + answers: Answers + created: Created + status: Status + action: Action + change: Change + pending: Pending + filter: + placeholder: "Filter by title, question:id" + answers: + page_title: Answers + post: Post + votes: Votes + created: Created + status: Status + action: Action + change: Change + filter: + placeholder: "Filter by title, 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." + site_url: + label: Site URL + msg: Site url cannot be empty. + validate: Please enter a valid URL. + text: The address of your site. + short_desc: + 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 + msg: Site description cannot be empty. + text: "Describe this site in one sentence, as used in the meta description tag." + 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. + check_update: + label: Software updates + text: Automatically check for updates + interface: + page_title: Interface + language: + label: Interface language + msg: Interface language cannot be empty. + text: User interface language. It will change when you refresh the page. + time_zone: + label: Timezone + msg: Timezone cannot be empty. + text: Choose a city in the same timezone as you. + smtp: + page_title: SMTP + from_email: + label: From email + msg: From email cannot be empty. + text: The email address which emails are sent from. + from_name: + label: From name + msg: From name cannot be empty. + text: The name which emails are sent from. + smtp_host: + label: SMTP host + msg: SMTP host cannot be empty. + text: Your mail server. + encryption: + label: Encryption + msg: Encryption cannot be empty. + text: For most servers SSL is the recommended option. + ssl: SSL + tls: TLS + none: None + smtp_port: + label: SMTP port + msg: SMTP port must be number 1 ~ 65535. + text: The port to your mail server. + smtp_username: + label: SMTP username + msg: SMTP username cannot be empty. + smtp_password: + label: SMTP password + msg: SMTP password cannot be empty. + test_email_recipient: + label: Test email recipients + text: Provide email address that will receive test sends. + msg: Test email recipients is invalid + smtp_authentication: + label: Enable authentication + title: SMTP authentication + msg: SMTP authentication cannot be empty. + "yes": "Yes" + "no": "No" + branding: + page_title: Branding + logo: + 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 + 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 + msg: Square icon cannot be empty. + text: Image used as the base for metadata icons. Should ideally be larger than 512x512. + favicon: + 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 + 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." + 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." + write: + page_title: Write + restrict_answer: + title: Answer write + label: Each user can only write one answer for the same question + text: "Turn off to allow users to write multiple answers to the same question, which may cause answers to be unfocused." + recommend_tags: + label: Recommend tags + text: "Recommend tags will show in the dropdown list by default." + msg: + contain_reserved: "recommended tags cannot contain reserved tags" + required_tag: + title: Set required tags + label: Set “Recommend tags” as required tags + text: "Every new question must have at least one recommend tag." + reserved_tags: + label: Reserved tags + text: "Reserved tags can only be used by moderator." + seo: + page_title: SEO + permalink: + label: Permalink + text: Custom URL structures can improve the usability, and forward-compatibility of your 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. + color_scheme: + label: Color scheme + navbar_style: + label: Navbar style + primary_color: + label: Primary color + text: Modify the colors used by your themes + css_and_html: + page_title: CSS and HTML + custom_css: + label: Custom CSS + text: > + + head: + label: Head + text: > + + header: + label: Header + text: > + + footer: + label: Footer + text: This will insert before </body>. + sidebar: + label: Sidebar + text: This will insert in sidebar. + login: + page_title: Login + membership: + title: Membership + label: Allow new registrations + text: Turn off to prevent anyone from creating a new account. + email_registration: + title: Email registration + label: Allow email registration + text: Turn off to prevent anyone creating new account through email. + allowed_email_domains: + title: Allowed email domains + text: Email domains that users must register accounts with. One domain per line. Ignored when empty. + private: + title: Private + label: Login required + text: Only logged in users can access this community. + password_login: + title: Password login + label: Allow email and password login + text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method." + installed_plugins: + title: Installed Plugins + plugin_link: Plugins extend and expand the functionality. You may find plugins in the <1>Plugin Repository. + filter: + all: All + active: Active + inactive: Inactive + outdated: Outdated + plugins: + label: Plugins + text: Select an existing plugin. + name: Name + version: Version + status: Status + action: Action + deactivate: Deactivate + activate: Activate + settings: Settings + settings_users: + title: Users + avatar: + label: Default avatar + text: For users without a custom avatar of their own. + gravatar_base_url: + label: Gravatar base URL + text: URL of the Gravatar provider's API base. Ignored when empty. + profile_editable: + title: Profile editable + allow_update_display_name: + label: Allow users to change their display name + allow_update_username: + label: Allow users to change their username + allow_update_avatar: + label: Allow users to change their profile image + allow_update_bio: + label: Allow users to change their about me + allow_update_website: + label: Allow users to change their website + allow_update_location: + label: Allow users to change their location + privilege: + title: Privileges + level: + label: Reputation required level + text: Choose the reputation required for the privileges + msg: + should_be_number: the input should be number + number_larger_1: number should be equal or larger than 1 + badges: + action: Action + active: Active + activate: Activate + all: All + awards: Awards + deactivate: Deactivate + filter: + placeholder: Filter by name, badge:id + group: Group + inactive: Inactive + name: Name + show_logs: Show logs + status: Status + title: Badges + form: + optional: (optional) + empty: cannot be empty + invalid: is invalid + btn_submit: Save + not_found_props: "Required property {{ key }} not found." + select: Select + 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. + approve_revision_tip: Do you approve this revision? + approve_flag_tip: Do you approve this flag? + approve_post_tip: Do you approve this post? + approve_user_tip: Do you approve this user? + suggest_edits: Suggested edits + flag_post: Flag post + flag_user: Flag user + queued_post: Queued post + queued_user: Queued user + filter_label: Type + reputation: reputation + flag_post_type: Flagged this post as {{ type }}. + flag_user_type: Flagged this user as {{ type }}. + edit_post: Edit post + list_post: List post + unlist_post: Unlist post + 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 + pin: pinned + unpin: unpinned + show: listed + hide: unlisted + title: "History for" + tag_title: "Timeline for" + show_votes: "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." + users: + title: Users + users_with_the_most_reputation: Users with the highest reputation scores this week + users_with_the_most_vote: Users who voted the most this week + 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. + draft: + discard_confirm: Are you sure you want to discard your draft? + messages: + post_deleted: This post has been deleted. + post_pin: This post has been pinned. + post_unpin: This post has been unpinned. + post_hide_list: This post has been hidden from list. + post_show_list: This post has been shown to list. + post_reopen: This post has been reopened. + post_list: This post has been listed. + post_unlist: This post has been unlisted. + post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. diff --git a/i18n/pl_PL.yaml b/i18n/pl_PL.yaml index 7e885b924..9c0adc78a 100644 --- a/i18n/pl_PL.yaml +++ b/i18n/pl_PL.yaml @@ -146,7 +146,7 @@ backend: invalid_url: other: Nieprawidłowy URL. status_invalid: - other: Invalid status. + other: Nieprawidłowy status. password: space_invalid: other: Hasło nie może zawierać spacji. @@ -326,9 +326,7 @@ backend: name: other: niegrzeczny lub obraźliwy desc: - other: - - Rozsądna osoba uznałaby tę treść za nieodpowiednią do dyskusji opartej na szacunku - - dyskomfort. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: duplikat @@ -340,10 +338,7 @@ backend: name: other: nie jest odpowiedzią desc: - other: - - To zostało opublikowane jako odpowiedź, ale nie próbuje odpowiedzieć na - - pytanie. Powinna być prawdopodobnie edytowana, opatrzona komentarzem, kolejnym pytaniem, - - lub całkowicie usunięta. + 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." no_longer_needed: name: other: nie jest już potrzebne @@ -402,9 +397,7 @@ backend: name: other: wymaga szczegółów lub wyjaśnienia desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: coś innego @@ -420,12 +413,12 @@ backend: deleted_title: other: Usunięte pytanie questions_title: - other: Questions + other: Pytania tag: tags_title: - other: Tags + other: Tagi no_description: - other: The tag has no description. + other: Tag nie posiada opisu. notification: action: update_question: @@ -536,57 +529,57 @@ backend: default_badges: autobiographer: name: - other: Autobiographer + other: Autobiografista desc: other: Filled out profile information. certified: name: - other: Certified + other: Certyfikowany desc: - other: Completed our new user tutorial. + other: Ukończono nasz nowy samouczek. editor: name: - other: Editor + other: Edytor desc: other: First post edit. first_flag: name: - other: First Flag + other: Pierwsza flaga desc: other: First flagged a post. first_upvote: name: - other: First Upvote + other: Pierwszy pozytywny głos desc: other: First up voted a post. first_link: name: - other: First Link + other: Pierwszy odnośnik desc: other: First dirst added a link to another post. first_reaction: name: - other: First Reaction + other: Pierwsza Reakcja desc: other: First reacted to the post. first_share: name: - other: First Share + other: Pierwsze udostępnianie desc: other: First shared a post. scholar: name: other: Scholar desc: - other: Asked a question and accepted an answer. + other: Zadane pytania i zaakceptowane odpowiedź. commentator: name: other: Commentator desc: - other: Leave 5 comments. + other: Pozostaw 5 komentarzy. new_user_of_the_month: name: - other: New User of the Month + other: Nowy użytkownik miesiąca desc: other: Outstanding contributions in their first month. read_guidelines: @@ -794,7 +787,7 @@ ui: how_to_format: title: Jak formatować desc: >- - + pagination: prev: Poprzedni next: Następny @@ -1341,6 +1334,10 @@ ui: related_question: title: Powiązane pytania answers: odpowiedzi + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Ludzie pytali desc: Wybierz osoby, które mogą znać odpowiedź. @@ -1524,8 +1521,8 @@ ui: answers: Odpowiedzi newest: Najnowsze active: Aktywne - hot: Hot - recommend: Recommend + hot: Gorące + recommend: Polecane score: Ocena unanswered: Bez odpowiedzi modified: zmodyfikowane @@ -1544,7 +1541,7 @@ ui: reputation: Reputacja comments: Komentarze votes: Głosy - badges: Badges + badges: Odznaczenia newest: Najnowsze score: Ocena edit_profile: Edytuj Profil @@ -1559,6 +1556,7 @@ ui: top_questions: Najlepsze pytania stats: Statystyki list_empty: Nie znaleziono wpisów.
Być może chcesz wybrać inną kartę? + content_empty: No posts found. accepted: Zaakceptowane answered: Udzielone odpowiedzi asked: zapytano @@ -1705,7 +1703,7 @@ ui: login_failed_email_tip: Logowanie nie powiodło się, przed ponowną próbą zezwól na dostęp tej aplikacji do informacji o Twojej skrzynce pocztowej. badges: modal: - title: Congratulations + title: Gratulacje content: You've earned a new badge. close: Close confirm: View badges @@ -1795,10 +1793,10 @@ ui: fields: display_name: label: Display name - msg_range: Display name up to 30 characters. + msg_range: Wyświetlana nazwa użytkownika maksymalnie 30 znaków. username: label: Nazwa - msg_range: Username up to 30 characters. + msg_range: Nazwa użytkownika maksymalnie 30 znaków. email: label: Email msg_invalid: Błędny adresy email. @@ -2128,10 +2126,10 @@ ui: deactivate: Deactivate filter: placeholder: Filter by name, badge:id - group: Group + group: Grupa inactive: Inactive name: Name - show_logs: Show logs + show_logs: Wyświetl dzienniki status: Status title: Badges form: diff --git a/i18n/pt_PT.yaml b/i18n/pt_PT.yaml index d95385e15..5c21779ed 100644 --- a/i18n/pt_PT.yaml +++ b/i18n/pt_PT.yaml @@ -110,11 +110,11 @@ backend: rank_tag_add_label: other: Criar marcador rank_tag_edit_label: - other: Editar descrição de um marcador (precisa revisar) + other: Editar descrição de um marcador (revisão necessária) rank_question_edit_label: - other: Editar pergunta do outro (precisa revisar) + other: Editar pergunta do outro (revisão necessária) rank_answer_edit_label: - other: Editar a resposta do outro (precisa revisar) + other: Editar a resposta do outro (revisão necessária) rank_question_edit_without_review_label: other: Editar a pergunta do outro sem revisar rank_answer_edit_without_review_label: @@ -138,7 +138,7 @@ backend: pass: other: Senha original_text: - other: This post + other: Esta publicação email_or_password_wrong_error: other: O e-mail e a palavra-passe não coincidem. error: @@ -146,7 +146,7 @@ backend: invalid_url: other: URL inválida. status_invalid: - other: Invalid status. + other: Estado inválido. password: space_invalid: other: A senha não pode conter espaços. @@ -207,15 +207,15 @@ backend: new_password_same_as_previous_setting: other: A nova senha é a mesma que a anterior. already_deleted: - other: This post has been deleted. + other: Esta publicação foi removida. meta: object_not_found: - other: Meta object not found + other: Objeto meta não encontrado question: already_deleted: other: Essa publicação foi deletado. under_review: - other: Your post is awaiting review. It will be visible after it has been approved. + other: Sua postagem está aguardando revisão. Ela ficará visível depois que for aprovada. not_found: other: Pergunta não encontrada. cannot_deleted: @@ -287,7 +287,7 @@ backend: not_allowed_registration: other: Atualmente o site não está aberto para cadastro not_allowed_login_via_password: - other: Currently the site is not allowed to login via password. + other: Atualmente o site não tem permissão para acessar utilizando senha. access_denied: other: Acesso negado page_access_denied: @@ -315,7 +315,7 @@ backend: other: Configuração do site não encontrada. badge: object_not_found: - other: Badge object not found + other: Objeto emblema não encontrado reason: spam: name: @@ -326,9 +326,7 @@ backend: name: other: rude ou abusivo desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: uma duplicação @@ -340,10 +338,7 @@ backend: name: 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: "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." no_longer_needed: name: other: não é mais necessário @@ -402,9 +397,7 @@ backend: name: other: precisa de detalhes ou clareza desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: algo mais @@ -420,12 +413,12 @@ backend: deleted_title: other: Questão excluída questions_title: - other: Questions + other: Questões tag: tags_title: - other: Tags + other: Marcadores no_description: - other: The tag has no description. + other: O marcador não possui descrição. notification: action: update_question: @@ -465,7 +458,7 @@ backend: invited_you_to_answer: other: lhe convidou para responder earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: Ganhou o emblema "{{.BadgeName}}" emblema email_tpl: change_email: title: @@ -501,7 +494,7 @@ backend: title: other: "[{{.SiteName}}] Confirme seu novo endereço de e-mail" body: - other: "Bem-vindo a {{.SiteName}}!

\n\nClique no seguinte link para confirmar e ativar sua nova conta:
\n{{.RegisterUrl}}

\n\nSe o link acima não é clicável, tente copiar e colá-lo na barra de endereços do seu navegador da web.\n" + other: "Bem-vindo ao {{.SiteName}}!

\n\nClique no seguinte link para confirmar e ativar sua nova conta:
\n{{.RegisterUrl}}

\n\nSe o link acima não é clicável, tente copiar e colá-lo na barra de endereços do seu navegador da web.\n" test: title: other: "[{{.SiteName}}] E-mail de teste" @@ -521,280 +514,280 @@ backend: accepted: other: aceito edit: - other: edit + other: editar review: queued_post: - other: Queued post + other: Publicação na fila flagged_post: - other: Flagged post + other: Postagem sinalizada suggested_post_edit: - other: Suggested edits + other: Edições sugeridas reaction: tooltip: - other: "{{ .Names }} and {{ .Count }} more..." + other: "{{ .Names }} e mais {{ .Count }}..." badge: default_badges: autobiographer: name: - other: Autobiographer + other: Autobiógrafo desc: - other: Filled out profile information. + other: Preenchido com perfil . certified: name: - other: Certified + other: Certificado desc: - other: Completed our new user tutorial. + other: Completou o nosso tutorial de novo usuário. editor: name: other: Editor desc: - other: First post edit. + other: Primeira edição em publicação. first_flag: name: - other: First Flag + other: Primeira Sinalização desc: - other: First flagged a post. + other: Primeiro sinalização numa publicação. first_upvote: name: - other: First Upvote + other: Primeiro voto desc: - other: First up voted a post. + other: Primeiro post votado. first_link: name: - other: First Link + other: Primeiro link desc: - other: First dirst added a link to another post. + other: Primeiro a adicionar um link a outra postagem. first_reaction: name: - other: First Reaction + other: Primeira Reação desc: - other: First reacted to the post. + other: Primeira reação a um post. first_share: name: - other: First Share + other: Primeiro Compartilhamento desc: - other: First shared a post. + other: Primeiro a compartilhar um post. scholar: name: - other: Scholar + other: Académico desc: - other: Asked a question and accepted an answer. + other: Fez uma pergunta e aceitou uma resposta. commentator: name: - other: Commentator + other: Comentador desc: - other: Leave 5 comments. + other: Fez 5 comentários. new_user_of_the_month: name: - other: New User of the Month + other: Novo usuário do mês desc: - other: Outstanding contributions in their first month. + other: Contribuições pendentes no seu primeiro mês. read_guidelines: name: - other: Read Guidelines + other: Ler diretrizes desc: - other: Read the [community guidelines]. + other: Leia as [diretrizes da comunidade]. reader: name: - other: Reader + other: Leitor desc: - other: Read every answers in a topic with more than 10 answers. + other: Leia todas as respostas num tópico com mais de 10 respostas. welcome: name: - other: Welcome + other: Bem-vindo desc: - other: Received a up vote. + other: Recebeu um voto positivo. nice_share: name: - other: Nice Share + other: Bom compartilhador desc: - other: Shared a post with 25 unique visitors. + other: Compartilhou um post com 25 visitantes únicos. good_share: name: - other: Good Share + other: Bom compartilhador desc: - other: Shared a post with 300 unique visitors. + other: Compartilhou um post com 300 visitantes únicos. great_share: name: - other: Great Share + other: Grande Compartilhador desc: - other: Shared a post with 1000 unique visitors. + other: Compartilhou um post com 1000 visitantes únicos. out_of_love: name: - other: Out of Love + other: Por amor desc: - other: Used 50 up votes in a day. + other: Cinquenta votos positivos em um dia. higher_love: name: - other: Higher Love + other: Amor Superior desc: - other: Used 50 up votes in a day 5 times. + other: Usou 50 votos positivos em um dia — 5 vezes. crazy_in_love: name: - other: Crazy in Love + other: Amor Louco desc: - other: Used 50 up votes in a day 20 times. + other: Usou 50 votos positivos em um dia — 20 vezes. promoter: name: - other: Promoter + other: Promotor desc: - other: Invited a user. + other: Convidou um usuário. campaigner: name: - other: Campaigner + other: Ativista desc: - other: Invited 3 basic users. + other: Foram convidados 3 usuários básicos. champion: name: - other: Champion + other: Campeão desc: - other: Invited 5 members. + other: Cinco membros convidados. thank_you: name: - other: Thank You + other: Obrigado desc: - other: Has 20 up voted posts and gave 10 up votes. + other: Recebeu 20 votos positivos e deu 10 votos. gives_back: name: - other: Gives Back + other: Dar de volta desc: - other: Has 100 up voted posts and gave 100 up votes. + other: Recebeu100 votos positivos e deu 100 votos a favor. empathetic: name: - other: Empathetic + other: Empático desc: - other: Has 500 up voted posts and gave 1000 up votes. + other: Recebeu 500 votos e deu 1000 votos. enthusiast: name: - other: Enthusiast + other: Entusiasta desc: - other: Visited 10 consecutive days. + other: . aficionado: name: other: Aficionado desc: - other: Visited 100 consecutive days. + other: Visitou 100 dias consecutivos. devotee: name: - other: Devotee + other: Devoto desc: - other: Visited 365 consecutive days. + other: Visitou 365 dias consecutivos. anniversary: name: - other: Anniversary + other: Aniversário desc: - other: Active member for a year, posted at least once. + other: Membro ativo por um ano, postando pelo menos uma vez. appreciated: name: - other: Appreciated + other: Apreciado desc: - other: Received 1 up vote on 20 posts. + other: Recebeu 1 voto positivo em 20 posts. respected: name: - other: Respected + other: Respeitado desc: - other: Received 2 up votes on 100 posts. + other: Novos 2 votos em 100 posts. admired: name: - other: Admired + other: Admirado desc: - other: Received 5 up votes on 300 posts. + other: Recebeu 5 votos positivos em 300 posts. solved: name: - other: Solved + other: Resolvido desc: - other: Have an answer be accepted. + other: Ter uma resposta aceita. guidance_counsellor: name: - other: Guidance Counsellor + other: Orientador Educacional desc: - other: Have 10 answers be accepted. + other: Tenham 10 respostas aceitas. know_it_all: name: - other: Know-it-All + other: Sabichão desc: - other: Have 50 answers be accepted. + other: Tenha 50 respostas aceitas. solution_institution: name: - other: Solution Institution + other: Instituição de Soluções desc: - other: Have 150 answers be accepted. + other: Tenham 150 respostas aceitas. nice_answer: name: - other: Nice Answer + other: Resposta legal desc: - other: Answer score of 10 or more. + other: Resposta com pontuação maior que 10. good_answer: name: - other: Good Answer + other: Boa resposta desc: - other: Answer score of 25 or more. + other: Resposta com pontuação maior que 25. great_answer: name: - other: Great Answer + other: Ótima Resposta desc: - other: Answer score of 50 or more. + other: Resposta com pontuação maior que 50. nice_question: name: - other: Nice Question + other: Questão legal desc: - other: Question score of 10 or more. + other: Pergunta com pontuação maior que 10. good_question: name: - other: Good Question + other: Boa questão desc: - other: Question score of 25 or more. + other: Questão com pontuação maior que 25. great_question: name: - other: Great Question + other: Otima questão desc: - other: Question score of 50 or more. + other: Questão com pontuação maior que 50. popular_question: name: - other: Popular Question + other: Pergunta Popular desc: - other: Question with 500 views. + other: Pergunta com 500 visualizações. notable_question: name: - other: Notable Question + other: Pergunta Notável desc: - other: Question with 1,000 views. + other: Pergunta com 1000 visualizações. famous_question: name: - other: Famous Question + other: Pergunta Famosa desc: - other: Question with 5,000 views. + other: Pergunta com 5000 visualizações. popular_link: name: - other: Popular Link + other: Link Popular desc: - other: Posted an external link with 50 clicks. + other: Postou um link externo com 50 cliques. hot_link: name: - other: Hot Link + other: Link Quente desc: - other: Posted an external link with 300 clicks. + other: Postou um link externo com 300 cliques. famous_link: name: - other: Famous Link + other: Link Famoso desc: - other: Posted an external link with 100 clicks. + other: Postou um link externo com 100 cliques. default_badge_groups: getting_started: name: - other: Getting Started + other: Começando community: name: - other: Community + other: Comunidade posting: name: - other: Posting + other: Postando # The following fields are used for interface presentation(Front-end) ui: how_to_format: title: Como formatar desc: >- - + pagination: prev: Anterior next: Próximo @@ -829,7 +822,7 @@ ui: http_404: HTTP Erro 404 http_50X: HTTP Erro 500 http_403: HTTP Erro 403 - logout: Log Out + logout: Encerrar Sessão notifications: title: Notificações inbox: Caixa de entrada @@ -843,9 +836,9 @@ ui: posts: Postagens invites: Convites votes: Votos - answer: Answer - question: Question - badge_award: Badge + answer: Resposta + question: Questão + badge_award: Emblema suspended: title: A sua conta foi suspensa until_time: "Sua conta está suspensa até {{ time }}." @@ -973,8 +966,8 @@ ui: empty: Não pode ser vazio. msg: empty: Por favor selecione um motivo. - not_a_url: URL format is incorrect. - url_not_match: URL origin does not match the current website. + not_a_url: Formato da URL incorreto. + url_not_match: A origem da URL não corresponde ao site atual. tag_modal: title: Criar novo marcador form: @@ -994,11 +987,11 @@ ui: desc: label: Descrição (opcional) revision: - label: Revision + label: Revisão edit_summary: - label: Edit summary + label: Editar descrição placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + Explique resumidamente as suas alterações (ortografia corrigida, gramática corrigida, formatação aprimorada) btn_cancel: Cancelar btn_submit: Enviar btn_post: Postar novo marcador @@ -1017,15 +1010,15 @@ ui: delete: title: Remover este marcador tip_with_posts: >- -

We do not allow deleting tag with posts.

Please remove this tag from the posts first.

+

Nós não permitimos remover marcadores com postagens.

Por favor, remova este marcador a partir da postagem.

tip_with_synonyms: >- -

We do not allow deleting tag with synonyms.

Please remove the synonyms from this tag first.

+

Nós não permitimos remover marcadores com postagens.

Por favor, remova este marcador a partir da postagem.

tip: Você tem certeza que deseja remover? close: Fechar edit_tag: title: Editar marcador default_reason: Editar marcador - default_first_reason: Add tag + default_first_reason: Adicionar marcador btn_save_edits: Salvar edições btn_cancel: Cancelar dates: @@ -1038,16 +1031,16 @@ ui: x_hours_ago: "{{count}}h atrás" hour: hora day: dia - hours: hours - days: days + hours: horas + days: dias reaction: - heart: heart - smile: smile - frown: frown - btn_label: add or remove reactions - undo_emoji: undo {{ emoji }} reaction - react_emoji: react with {{ emoji }} - unreact_emoji: unreact with {{ emoji }} + heart: coração + smile: sorrir + frown: cara feia + btn_label: adicionar ou remover reações + undo_emoji: desfazer reação {{ emoji }} + react_emoji: reagir com {{ emoji }} + unreact_emoji: remover reação {{ emoji }} comment: btn_add_comment: Adicionar comentário reply_to: Responder a @@ -1057,7 +1050,7 @@ ui: btn_flag: Marcador btn_save_edits: Salvar edições btn_cancel: Cancelar - show_more: "{{count}} more comments" + show_more: "Mais {{count}} comentários" tip_question: >- Use os comentários para pedir mais informações ou sugerir melhorias. Evite responder perguntas nos comentários. tip_answer: >- @@ -1066,7 +1059,7 @@ ui: edit_answer: title: Editar Resposta default_reason: Editar Resposta - default_first_reason: Add answer + default_first_reason: Adicionar resposta form: fields: revision: @@ -1097,7 +1090,7 @@ ui: title: Adicionar Pergunta edit_title: Editar Pergunta default_reason: Editar pergunta - default_first_reason: Add question + default_first_reason: Adicionar questão similar_questions: Similar perguntas form: fields: @@ -1141,7 +1134,7 @@ ui: question: Perguntas tag: Marcadores user: Usuários - badges: Badges + badges: Emblemas profile: Perfil setting: Configurações logout: Sair @@ -1153,7 +1146,7 @@ ui: placeholder: Procurar footer: build_on: >- - Powered by <1> Apache Answer - the open-source software that powers Q&A communities.
Made with love © {{cc}}. + . upload_img: name: Mudar loading: carregando... @@ -1186,7 +1179,7 @@ ui: msg: empty: Nome não pode ser vazio. range: Name must be between 2 to 30 characters in length. - character: 'Must use the character set "a-z", "A-Z", "0-9", " - . _"' + character: 'Deve usar o conjunto de caracteres "a-z", "0-9", " - . _"' email: label: E-mail msg: @@ -1283,10 +1276,10 @@ ui: label: Localização (opcional) placeholder: "Cidade, País" notification: - heading: Email Notifications - turn_on: Turn on + heading: Notificações por e-mail + turn_on: Ativar inbox: - label: Inbox notifications + label: Notificações na caixa de entrada description: Responda suas próprias perguntas, comentários, convites e muito mais. all_new_question: label: Todas as perguntas novas @@ -1301,10 +1294,10 @@ ui: change_email_info: >- Enviamos um e-mail para esse endereço. Siga as instruções de confirmação. email: - label: Email + label: Correio eletrónico new_email: - label: New email - msg: New email cannot be empty. + label: Novo correio eletrónico + msg: Novo correio eletrónico não pode ser vazio. pass: label: Senha atual msg: Senha não pode ser vazio. @@ -1341,6 +1334,10 @@ ui: related_question: title: Perguntas relacionadas answers: respostas + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Pessoas Perguntaram desc: Select people who you think might know the answer. @@ -1353,7 +1350,7 @@ ui: asked: perguntado update: Modificado edit: modificado - commented: commented + commented: comentado Views: Visualizado Follow: Seguir Following: Seguindo @@ -1371,12 +1368,12 @@ ui: title: Respostas score: Pontuação newest: Mais recente - oldest: Oldest + oldest: Mais Antigos btn_accept: Aceito btn_accepted: Aceito write_answer: title: A sua Resposta - edit_answer: Edit my existing answer + edit_answer: Editar a minha resposta existente btn_name: Publicação a sua resposta add_another_answer: Adicionar outra resposta confirm_title: Continuar a responder @@ -1396,13 +1393,13 @@ ui: title: Reabrir esta postagem content: Você tem certeza que deseja reabrir? list: - confirm_btn: List - title: List this post - content: Are you sure you want to list? + confirm_btn: Lista + title: Liste esta postagem + content: Você tem certeza que deseja listar? unlist: - confirm_btn: Unlist - title: Unlist this post - content: Are you sure you want to unlist? + confirm_btn: Remover da lista + title: Remover da lista de postagens + content: Tem certeza de que deseja remover da lista? pin: title: Fixe esta postagem content: Tem certeza de que deseja fixar globalmente? Esta postagem aparecerá no topo de todas as listas de postagens. @@ -1415,18 +1412,18 @@ ui:

Nós não recomendamos excluir perguntas com respostas porque isso priva os futuros leitores desse conhecimento.

A exclusão repetida de respostas aceitas pode resultar no bloqueio de respostas de sua conta.. Você tem certeza que deseja deletar? other: Você tem certeza que deseja deletar? tip_answer_deleted: Esta resposta foi deletada - undelete_title: Undelete this post - undelete_desc: Are you sure you wish to undelete? + undelete_title: Recuperar esta publicação + undelete_desc: Você tem certeza que deseja recuperar? btns: confirm: Confirmar cancel: Cancelar edit: Editar save: Salvar delete: Excluir - undelete: Undelete - list: List - unlist: Unlist - unlisted: Unlisted + undelete: Recuperar + list: Lista + unlist: Não listar + unlisted: Não listado login: Entrar signup: Cadastrar-se logout: Sair @@ -1443,28 +1440,28 @@ ui: comment: Comentário refresh: Atualizar resend: Reenviar - deactivate: Deactivate - active: Active - suspend: Suspend - unsuspend: Unsuspend - close: Close - reopen: Reopen + deactivate: Desativar + active: Ativar + suspend: Suspender + unsuspend: Suspensão cancelada + close: Fechar + reopen: Reabrir ok: OK - light: Light - dark: Dark - system_setting: System setting - default: Default + light: Claro + dark: Escuro + system_setting: Definições de sistema + default: Padrão reset: Reset - tag: Tag - post_lowercase: post - filter: Filter - ignore: Ignore - submit: Submit + tag: Marcador + post_lowercase: publicação + filter: Filtro + ignore: Ignorar + submit: Submeter normal: Normal - closed: Closed - deleted: Deleted - pending: Pending - more: More + closed: Fechado + deleted: Removido + pending: Pendente + more: Mais search: title: Procurar Resultados keywords: Palavras-chave @@ -1481,7 +1478,7 @@ ui: more: Mais tips: title: Dicas de Pesquisa Avançada - tag: "<1>[tag] search with a tag" + tag: "<1>[tag] pesquisar com 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" @@ -1502,7 +1499,7 @@ ui: success: A sua nova conta está confirmada; você será redirecionado para a página inicial. link: Continuar para a página inicial. oops: Oops! - invalid: The link you used no longer works. + invalid: O link utilizado não funciona mais. confirm_new_email: O seu e-mail foi atualizado. confirm_new_email_invalid: >- Desculpe, este link de confirmação não é mais válido. Talvez o seu e-mail já tenha sido alterado. @@ -1524,8 +1521,8 @@ ui: answers: Respostas newest: Mais recente active: Ativo - hot: Hot - recommend: Recommend + hot: Popular + recommend: Recomendado score: Pontuação unanswered: Não Respondido modified: modificado @@ -1544,7 +1541,7 @@ ui: reputation: Reputação comments: Comentários votes: Votos - badges: Badges + badges: Emblemas newest: Mais recente score: Pontuação edit_profile: Editar Perfil @@ -1559,6 +1556,7 @@ ui: top_questions: Melhores Perguntas stats: Estatísticas list_empty: Postagens não encontradas.
Talvez você queira selecionar uma guia diferente? + content_empty: No posts found. accepted: Aceito answered: respondido asked: perguntado @@ -1569,9 +1567,9 @@ ui: x_votes: votos recebidos x_answers: respostas x_questions: perguntas - recent_badges: Recent Badges + recent_badges: Emblemas recentes install: - title: Installation + title: Instalação next: Proximo done: Completo config_yaml_error: Não é possível criar o arquivo config.yaml. @@ -1610,14 +1608,14 @@ ui: site_name: label: Site Nome msg: Site Nome não pode ser vazio. - msg_max_length: Site name must be at maximum 30 characters in length. + msg_max_length: O nome do site deve ter no máximo 30 caracteres. site_url: label: URL do Site text: O endereço do seu site. msg: empty: Site URL não pode ser vazio. incorrect: URL do site está incorreto. - max_length: Site URL must be at maximum 512 characters in length. + max_length: A URL do site deve ter no máximo 512 caracteres. contact_email: label: E-mail par contato text: O endereço de e-mail do contato principal deste site. @@ -1632,21 +1630,21 @@ ui: label: Nome msg: Nome não pode ser vazio. character: 'Deve usar o conjunto de caracteres "a-z", "0-9", " - . _"' - msg_max_length: Name must be at maximum 30 characters in length. + msg_max_length: O nome deve ter no máximo 30 caracteres. admin_password: label: Senha text: >- You will need this password to log in. Por favor store it in a secure location. msg: Senha não pode ser vazio. - msg_min_length: Password must be at least 8 characters in length. - msg_max_length: Password must be at maximum 32 characters in length. + msg_min_length: A senha deve ser ter pelo menos 8 caracteres. + msg_max_length: A senha deve ter no máximo 32 caracteres. admin_email: label: E-mail text: Você precisará deste e-mail para efetuar o login. msg: empty: Email não pode ser vazio. incorrect: O formato do e-mail está incorreto. - ready_title: Your site is ready + ready_title: Seu site está pronto ready_desc: >- Se você quiser alterar mais configurações, visite <1>seção de administrador; encontre-o no menu do site. good_luck: "Divirta-se, e boa sorte!" @@ -1679,7 +1677,7 @@ ui: questions: Perguntas answers: Respostas users: Usuários - badges: Badges + badges: Emblemas flags: Marcadores settings: Configurações general: Geral @@ -1705,50 +1703,50 @@ ui: login_failed_email_tip: Falha ao entrar, por favor, permita que este aplicativo acesse a informação do seu e-mail antes de tentar novamente. badges: modal: - title: Congratulations - content: You've earned a new badge. - close: Close - confirm: View badges - title: Badges - awarded: Awarded - earned_×: Earned ×{{ number }} - ×_awarded: "{{ number }} awarded" - can_earn_multiple: You can earn this multiple times. - earned: Earned + title: Parabéns + content: Você ganhou um novo emblema. + close: Fechar + confirm: Ver emblemas + title: Emblemas + awarded: Premiado + earned_×: Ganhou ×{{ number }} + ×_awarded: "{{ number }} premiado" + can_earn_multiple: Você pode ganhar isto várias vezes. + earned: Ganhou admin: admin_header: title: Administrador dashboard: title: Painel - welcome: Welcome to Admin! - site_statistics: Site statistics + welcome: Bem-vindo ao Admin! + site_statistics: Estatísticas do site questions: "Perguntas:" answers: "Respostas:" comments: "Comentários:" votes: "Votos:" - users: "Users:" + users: "Usuários:" flags: "Marcadores:" - reviews: "Reviews:" - site_health: Site health + reviews: "Revisão:" + site_health: Saúde do site version: "Versão:" https: "HTTPS:" - upload_folder: "Upload folder:" - run_mode: "Running mode:" - private: Private - public: Public + upload_folder: "Upload da pasta:" + run_mode: "Mode de execução:" + private: Privado + public: Público smtp: "SMTP:" timezone: "Fuso horário:" - system_info: System info - go_version: "Go version:" - database: "Database:" - database_size: "Database size:" + system_info: Informação do sistema + go_version: "Versão do Go:" + database: "Banco de dados:" + database_size: "Tamanho do banco de dados:" storage_used: "Armazenamento usado:" uptime: "Tempo de atividade:" links: Links plugins: Plugins github: GitHub blog: Blog - contact: Contact + contact: Contato forum: Forum documents: Documentos feedback: Opinião @@ -1764,8 +1762,8 @@ ui: allowed: Permitido enabled: Ativo disabled: Disponível - writable: Writable - not_writable: Not writable + writable: Possível escrever + not_writable: Não é possível escrever flags: title: Marcadores pending: Pendente @@ -1790,21 +1788,21 @@ ui: btn_cancel: Cancelar btn_submit: Enviar edit_profile_modal: - title: Edit profile + title: Editar profile form: fields: display_name: - label: Display name - msg_range: Display name up to 30 characters. + label: Nome no display + msg_range: Nome no display pode conter até 30 caracteres. username: - label: Username - msg_range: Username up to 30 characters. + label: Nome do usuário + msg_range: Nome do usuário pode conter até 30 caracteres. email: - label: Email - msg_invalid: Invalid Email Address. - edit_success: Edited successfully - btn_cancel: Cancel - btn_submit: Submit + label: Correio eletrônico + msg_invalid: Correio eletrônico invalido. + edit_success: Editado com sucesso + btn_cancel: Cancelar + btn_submit: Submeter user_modal: title: Adicionar novo usuário form: @@ -1850,26 +1848,26 @@ ui: filter: placeholder: "Filtrar por nome, user:id" set_new_password: Configurar nova senha - edit_profile: Edit profile + edit_profile: Editar profile change_status: Mudar status change_role: Mudar função show_logs: Mostrar registros add_user: Adicionar usuário deactivate_user: - title: Deactivate user - content: An inactive user must re-validate their email. + title: Desativar usuários + content: Um usuário inativo deve revalidar seu e-mail. delete_user: - title: Delete this user - content: Are you sure you want to delete this user? This is permanent! - remove: Remove their content - label: Remove all questions, answers, comments, etc. - text: Don’t check this if you wish to only delete the user’s account. + title: Remover este usuário + content: Tem certeza de que deseja excluir este usuário? Isso é permanente! + remove: Remover o conteúdo dele + label: Remover todas as perguntas, respostas, comentários etc. + text: Não marque isso se deseja excluir apenas a conta do usuário. suspend_user: - title: Suspend this user - content: A suspended user can't log in. + title: Suspender este usuário + content: Um usuário suspenso não pode fazer login. questions: page_title: Perguntas - unlisted: Unlisted + unlisted: Não-listado post: Publicação votes: Votos answers: Respostas @@ -1877,7 +1875,7 @@ ui: status: Estado action: Ação change: Mudar - pending: Pending + pending: Pendente filter: placeholder: "Filtrar por título, question:id" answers: @@ -1915,8 +1913,8 @@ ui: validate: E-mail par contato não é válido. text: Endereço de e-mail do principal contato responsável por este site. check_update: - label: Software updates - text: Automatically check for updates + label: Atualizações de software + text: Verificar se há atualizações automaticamente interface: page_title: Interface language: @@ -1995,28 +1993,28 @@ ui: write: page_title: Escrever restrict_answer: - title: Answer write + title: Escrever resposta label: Each user can only write one answer for each question - text: "Turn off to allow users to write multiple answers to the same question, which may cause answers to be unfocused." + text: "Desative para permitir que os usuários escrevam várias respostas para a mesma pergunta, o que pode fazer com que as respostas fiquem menos focadas." recommend_tags: label: Recommend Marcadores - text: "Recommend tags will show in the dropdown list by default." + text: "Os marcadores recomendados serão exibidos na lista dropdown por padrão." msg: - contain_reserved: "recommended tags cannot contain reserved tags" + contain_reserved: "tags recomendadas não podem conter tags reservadas" required_tag: - title: Set required tags - label: Set “Recommend tags” as required tags + title: Definir tags necessárias + label: Definir "Tags recomendadas" como tags necessárias text: "Every new question must have ao menos one recommend tag." reserved_tags: label: Reserved Marcadores - text: "Reserved tags can only be used by moderator." + text: "Tags reservadas só podem ser usadas pelo moderador." seo: page_title: SEO permalink: label: Link permanente text: Custom URL structures can improve the usability, and forward-compatibility of a sua links. robots: - label: robots.txt + label: robos.txt text: Isto irá substituir permanentemente quaisquer configurações do site relacionadas. themes: page_title: Temas @@ -2024,11 +2022,11 @@ ui: label: Temas text: Selecionar um tema existente. color_scheme: - label: Color scheme + label: Esquema de cores navbar_style: - label: Navbar style + label: Estilo da barra de navegação primary_color: - label: Primary color + label: Cor primária text: Modifica as cores usadas por seus temas css_and_html: page_title: CSS e HTML @@ -2046,7 +2044,7 @@ ui: footer: label: Rodapé - text: This will insert before </body>. + text: Isto será inserido antes de </body>. sidebar: label: Barra lateral text: Isto irá inserir na barra lateral. @@ -2068,12 +2066,12 @@ ui: label: Login requirido text: Somente usuários conectados podem acessar esta comunidade. password_login: - title: Password login - label: Allow email and password login - text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method." + title: Login com senha + label: Permitir login por e-mail e senha + text: "AVISO: Se desativar, você pode ser incapaz de efetuar login se você não tiver configurado anteriormente outro método de login." installed_plugins: title: Extensões instaladas - plugin_link: Plugins extend and expand the functionality. You may find plugins in the <1>Plugin Repository. + plugin_link: Plugins ampliam e expandem a funcionalidade. Você pode encontrar plugins no <1>Repositório de Plugins. filter: all: Todos active: Ativo @@ -2117,23 +2115,24 @@ ui: label: Nível de reputação necessário text: Escolha a reputação necessária para os privilégios msg: - should_be_number: the input should be number - number_larger_1: number should be equal or larger than 1 + should_be_number: o valor de entrada deve ser número + number_larger_1: número deve ser igual ou maior que 1 badges: - action: Action - active: Active + action: Ação + active: Ativo + activate: Ativado activate: Activate - all: All - awards: Awards - deactivate: Deactivate + all: Todos + awards: Prêmios + deactivate: Desativar filter: - placeholder: Filter by name, badge:id - group: Group - inactive: Inactive - name: Name - show_logs: Show logs + placeholder: Filtrar por nome, badge:id + group: Grupo + inactive: Inativo + name: Nome + show_logs: Mostrar registros status: Status - title: Badges + title: Emblemas form: optional: (opcional) empty: não pode ser vazio @@ -2152,22 +2151,22 @@ ui: edit_answer: Editar resposta edit_tag: Editar marcador empty: Nenhuma tarefa de revisão restante. - approve_revision_tip: Do you approve this revision? - approve_flag_tip: Do you approve this flag? - approve_post_tip: Do you approve this post? - approve_user_tip: Do you approve this user? - suggest_edits: Suggested edits - flag_post: Flag post - flag_user: Flag user - queued_post: Queued post - queued_user: Queued user - filter_label: Type - reputation: reputation - flag_post_type: Flagged this post as {{ type }}. - flag_user_type: Flagged this user as {{ type }}. - edit_post: Edit post - list_post: List post - unlist_post: Unlist post + approve_revision_tip: Você aprova esta revisão? + approve_flag_tip: Você aprova esta sinalização? + approve_post_tip: Você aprova esta publicação? + approve_user_tip: Você aprova este usuário? + suggest_edits: Edições sugeridas + flag_post: Post sinalizado + flag_user: Sinalizar usuário + queued_post: Publicação na fila + queued_user: Usuário na fila + filter_label: Tipo + reputation: reputação + flag_post_type: Sinalizou esta publicação como {{ type }}. + flag_user_type: Sinalizou este usuário como {{ type }}. + edit_post: Editar publicação + list_post: Listar postagem + unlist_post: Remover postagem da lista timeline: undeleted: não removido deleted: removido @@ -2218,6 +2217,6 @@ ui: post_hide_list: Esta postagem foi ocultada da lista. post_show_list: Esta postagem foi exibida à lista. post_reopen: Esta publicação foi re-aberta. - post_list: This post has been listed. - post_unlist: This post has been unlisted. - post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_list: Esta postagem foi listada. + post_unlist: Esta publicação foi removida da lista. + post_pending: A sua postagem está aguardando revisão. Ela ficará visível depois que for aprovada. diff --git a/i18n/ro_RO.yaml b/i18n/ro_RO.yaml index c73eb566d..9b7ed2004 100644 --- a/i18n/ro_RO.yaml +++ b/i18n/ro_RO.yaml @@ -326,9 +326,7 @@ backend: name: other: nepoliticos sau abuziv desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: un duplicat @@ -340,10 +338,7 @@ backend: name: other: nu este un răspuns 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: "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." no_longer_needed: name: other: nu mai este necesar @@ -402,9 +397,7 @@ backend: name: other: necesită detalii sau claritate desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: altceva @@ -794,7 +787,7 @@ ui: how_to_format: title: Cum se formatează desc: >- - + pagination: prev: Înapoi next: Înainte @@ -1341,6 +1334,10 @@ ui: related_question: title: Întrebări conexe answers: răspunsuri + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Persoane întrebate desc: Invită persoane care crezi că știu răspunsul. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Intrebari stats: Statistici list_empty: Nici o postare găsită.
Poate doriţi să selectaţi o filă diferită? + content_empty: No posts found. accepted: Acceptat answered: răspunse asked: întrebat diff --git a/i18n/ru_RU.yaml b/i18n/ru_RU.yaml index 9adf491a8..1e370b5ce 100644 --- a/i18n/ru_RU.yaml +++ b/i18n/ru_RU.yaml @@ -326,9 +326,7 @@ backend: name: other: Грубость или оскорбления desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: дубликат @@ -340,10 +338,7 @@ backend: name: 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: "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." no_longer_needed: name: other: Не актуально @@ -402,9 +397,7 @@ backend: name: other: нуждается в деталях или ясности desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: прочее @@ -794,7 +787,7 @@ ui: how_to_format: title: 'Форматирование:' desc: >- - + pagination: prev: Назад next: Следующий @@ -1341,6 +1334,10 @@ ui: related_question: title: Похожие вопросы answers: ответы + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Позвать на помощь desc: Выберите людей, которые, по вашему мнению, могут знать ответ. @@ -1559,6 +1556,7 @@ ui: top_questions: Топ вопросов stats: Статистика list_empty: Сообщений не найдено.
Возможно, вы хотели бы выбрать другую вкладку? + content_empty: No posts found. accepted: Принято answered: отвеченные asked: спросил diff --git a/i18n/sk_SK.yaml b/i18n/sk_SK.yaml index eac4f2043..28e77be00 100644 --- a/i18n/sk_SK.yaml +++ b/i18n/sk_SK.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: potrebuje podrobnosti alebo jasnosť desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: niečo iné @@ -794,7 +787,7 @@ ui: how_to_format: title: Ako formátovať desc: >- - + pagination: prev: Predch next: Ďalšie @@ -1341,6 +1334,10 @@ ui: related_question: title: Súvisiace otázky answers: odpovede + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Najlepšie otázky stats: Štatistiky list_empty: Nenašli sa žiadne príspevky.
Možno by ste chceli vybrať inú kartu? + content_empty: No posts found. accepted: Prijaté answered: zodpovedané asked: opýtané diff --git a/i18n/sv_SE.yaml b/i18n/sv_SE.yaml index 36b59fe6a..b6c5e90eb 100644 --- a/i18n/sv_SE.yaml +++ b/i18n/sv_SE.yaml @@ -146,7 +146,7 @@ backend: invalid_url: other: Ogiltig URL. status_invalid: - other: Invalid status. + other: Ogiltig status. password: space_invalid: other: Password cannot contain spaces. @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: needs details or clarity desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: something else @@ -794,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- - + pagination: prev: Prev next: Nästa @@ -1341,6 +1334,10 @@ ui: related_question: title: Related Questions answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Bjud in personer som du tror kan svara. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Questions stats: Stats list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: asked @@ -1705,9 +1703,9 @@ ui: login_failed_email_tip: Login failed, please allow this app to access your email information before try again. badges: modal: - title: Congratulations + title: Grattis content: You've earned a new badge. - close: Close + close: Stäng confirm: View badges title: Badges awarded: Awarded @@ -1794,7 +1792,7 @@ ui: form: fields: display_name: - label: Display name + label: Visningsnamn msg_range: Display name up to 30 characters. username: label: Username @@ -2121,17 +2119,18 @@ ui: number_larger_1: number should be equal or larger than 1 badges: action: Action - active: Active + active: Aktiv + activate: Aktivera activate: Activate - all: All + all: Alla awards: Awards - deactivate: Deactivate + deactivate: Inaktivera filter: placeholder: Filter by name, badge:id - group: Group - inactive: Inactive - name: Name - show_logs: Show logs + group: Grupp + inactive: Inaktiv + name: Namn + show_logs: Visa loggar status: Status title: Badges form: diff --git a/i18n/te_IN.yaml b/i18n/te_IN.yaml index 638a18706..2b9ea4700 100644 --- a/i18n/te_IN.yaml +++ b/i18n/te_IN.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: needs details or clarity desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: something else @@ -794,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- - + pagination: prev: మునుపటి next: Next @@ -1341,6 +1334,10 @@ ui: related_question: title: Related Questions answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Questions stats: Stats list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: asked diff --git a/i18n/tr_TR.yaml b/i18n/tr_TR.yaml index 656da9973..5bfb1bbd1 100644 --- a/i18n/tr_TR.yaml +++ b/i18n/tr_TR.yaml @@ -183,7 +183,7 @@ backend: verify_url_expired: other: Email verified URL has expired, please resend the email. illegal_email_domain_error: - other: Email is not allowed from that email domain. Please use another one. + other: Bu alan adındaki e-posta adreslerine izin verilmiyor. Lütfen başka bir e-posta deneyin. lang: not_found: other: Dil dosyası bulunamadı. @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -400,23 +395,21 @@ backend: other: This question doesn't meet a community guideline. multiple: name: - other: needs details or clarity + other: açıklanmaya veya detaya ihtiyacı var desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: - other: something else + other: başka bir şey desc: other: This post requires another reason not listed above. operation_type: asked: - other: asked + other: soruldu answered: - other: answered + other: cevaplandı modified: - other: modified + other: düzenlendi deleted_title: other: Deleted question questions_title: @@ -641,7 +634,7 @@ backend: other: Invited a user. campaigner: name: - other: Campaigner + other: Kampanyacı desc: other: Invited 3 basic users. champion: @@ -651,7 +644,7 @@ backend: other: Invited 5 members. thank_you: name: - other: Thank You + other: desc: other: Has 20 up voted posts and gave 10 up votes. gives_back: @@ -794,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- - + pagination: prev: Önceki next: Sonraki @@ -1341,6 +1334,10 @@ ui: related_question: title: Related Questions answers: answers + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Select people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: Top Questions stats: Stats list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: asked diff --git a/i18n/uk_UA.yaml b/i18n/uk_UA.yaml index 58a538e27..a8f29b30b 100644 --- a/i18n/uk_UA.yaml +++ b/i18n/uk_UA.yaml @@ -146,7 +146,7 @@ backend: invalid_url: other: Невірна URL. status_invalid: - other: Invalid status. + other: Неприпустимий статус. password: space_invalid: other: Пароль не може містити пробіли. @@ -315,7 +315,7 @@ backend: other: Конфігурацію сайту не знайдено. badge: object_not_found: - other: Badge object not found + other: Об'єкт значка не знайдено reason: spam: name: @@ -326,9 +326,7 @@ backend: name: other: грубо чи образливо desc: - other: - - Розсудлива людина вважатиме цей контент неприйнятним з точки зору шанобливого ставлення - - дискурс. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: дублікат @@ -340,10 +338,7 @@ backend: name: other: не відповідь desc: - other: - - Це повідомлення було розміщено як відповідь, але воно не є спробою відповісти на - - запитання. Можливо, його слід відредагувати, додати коментар, поставити інше запитання - - або взагалі видалити. + 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." no_longer_needed: name: other: більше не потрібно @@ -402,9 +397,7 @@ backend: name: other: потребує деталей або ясності desc: - other: - - Наразі це запитання містить кілька запитань в одному. Воно має - - зосереджуватися лише на одній проблемі. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: інше @@ -420,10 +413,10 @@ backend: deleted_title: other: Видалене питання questions_title: - other: Questions + other: Питання tag: tags_title: - other: Tags + other: Теґи no_description: other: The tag has no description. notification: @@ -515,7 +508,7 @@ backend: downvote: other: голос "проти" downvoted: - other: downvoted + other: проголосував проти accept: other: прийняти accepted: @@ -541,14 +534,14 @@ backend: other: Filled out profile information. certified: name: - other: Certified + other: Підтверджений desc: other: Completed our new user tutorial. editor: name: - other: Editor + other: Редактор desc: - other: First post edit. + other: Перше редагування посту. first_flag: name: other: First Flag @@ -561,12 +554,12 @@ backend: other: First up voted a post. first_link: name: - other: First Link + other: Перше посилання desc: other: First dirst added a link to another post. first_reaction: name: - other: First Reaction + other: Перша реакція desc: other: First reacted to the post. first_share: @@ -576,34 +569,34 @@ backend: other: First shared a post. scholar: name: - other: Scholar + other: Вчений desc: other: Asked a question and accepted an answer. commentator: name: - other: Commentator + other: Коментатор desc: - other: Leave 5 comments. + other: Залиште 5 коментарів. new_user_of_the_month: name: - other: New User of the Month + other: Новий користувач місяця desc: other: Outstanding contributions in their first month. read_guidelines: name: other: Read Guidelines desc: - other: Read the [community guidelines]. + other: Прочитайте [рекомендації для спільноти]. reader: name: - other: Reader + other: Читач desc: other: Read every answers in a topic with more than 10 answers. welcome: name: - other: Welcome + other: Ласкаво просимо desc: - other: Received a up vote. + other: Отримав голос. nice_share: name: other: Nice Share @@ -636,9 +629,9 @@ backend: other: Used 50 up votes in a day 20 times. promoter: name: - other: Promoter + other: Промоутер desc: - other: Invited a user. + other: Запросив користувача. campaigner: name: other: Campaigner @@ -646,12 +639,12 @@ backend: other: Invited 3 basic users. champion: name: - other: Champion + other: Чемпіон desc: - other: Invited 5 members. + other: Запросив 5 учасників. thank_you: name: - other: Thank You + other: Дякую desc: other: Has 20 up voted posts and gave 10 up votes. gives_back: @@ -691,7 +684,7 @@ backend: other: Received 1 up vote on 20 posts. respected: name: - other: Respected + other: Шанований desc: other: Received 2 up votes on 100 posts. admired: @@ -701,7 +694,7 @@ backend: other: Received 5 up votes on 300 posts. solved: name: - other: Solved + other: Вирішено desc: other: Have an answer be accepted. guidance_counsellor: @@ -785,7 +778,7 @@ backend: other: Getting Started community: name: - other: Community + other: Спільнота posting: name: other: Posting @@ -794,7 +787,7 @@ ui: how_to_format: title: Як відформатувати desc: >- - + pagination: prev: Назад next: Далі @@ -843,7 +836,7 @@ ui: posts: Публікації invites: Запрошення votes: Голоси - answer: Answer + answer: Відповідь question: Question badge_award: Badge suspended: @@ -1037,12 +1030,12 @@ ui: x_minutes_ago: "{{count}}m ago" x_hours_ago: "{{count}}h ago" hour: hour - day: day + day: день hours: hours - days: days + days: дні reaction: heart: heart - smile: smile + smile: посмішка frown: frown btn_label: add or remove reactions undo_emoji: undo {{ emoji }} reaction @@ -1341,6 +1334,10 @@ ui: related_question: title: Пов'язані запитання answers: відповіді + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Люди запитували desc: Виберіть людей, які, на вашу думку, можуть знати відповідь. @@ -1361,7 +1358,7 @@ ui: answered: answered closed_in: Closed in show_exist: Показати наявне запитання. - useful: Useful + useful: Корисне question_useful: It is useful and clear question_un_useful: It is unclear or not useful question_bookmark: Bookmark this question @@ -1372,10 +1369,10 @@ ui: score: Score newest: Newest oldest: Oldest - btn_accept: Accept + btn_accept: Прийняти btn_accepted: Accepted write_answer: - title: Your Answer + title: Ваша відповідь edit_answer: Edit my existing answer btn_name: Post your answer add_another_answer: Add another answer @@ -1383,7 +1380,7 @@ ui: 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. + empty: Відповідь не може бути порожньою. characters: вміст має бути не менше 6 символів. tips: header_1: Дякуємо за відповідь @@ -1424,8 +1421,8 @@ ui: save: Зберегти delete: Видалити undelete: Скасувати видалення - list: List - unlist: Unlist + list: Список + unlist: Вилучити зі списку unlisted: Unlisted login: Увійти signup: Зареєструватися @@ -1449,7 +1446,7 @@ ui: unsuspend: Unsuspend close: Закрити reopen: Відкрити знову - ok: OK + ok: ОК light: Світла dark: Темна system_setting: Налаштування системи @@ -1462,7 +1459,7 @@ ui: submit: Submit normal: Normal closed: Closed - deleted: Deleted + deleted: Видалені pending: Pending more: More search: @@ -1497,11 +1494,11 @@ ui: twitter: Share to Twitter cannot_vote_for_self: You can't vote for your own post. modal_confirm: - title: Error... + title: Помилка... account_result: success: Your new account is confirmed; you will be redirected to the home page. - link: Continue to homepage - oops: Oops! + link: Перейти на головну сторінку + oops: Йой! invalid: The link you used no longer works. confirm_new_email: Your email has been updated. confirm_new_email_invalid: >- @@ -1514,7 +1511,7 @@ ui: question: following_tags: Підписки на теги edit: Edit - save: Save + save: Зберегти follow_tag_tip: Підпишіться на теги, щоб упорядкувати свій список запитань. hot_questions: Hot Questions all_questions: Всі питання @@ -1559,6 +1556,7 @@ ui: top_questions: Найкращі запитання stats: Статистика list_empty: No posts found.
Perhaps you'd like to select a different tab? + content_empty: No posts found. accepted: Accepted answered: answered asked: asked @@ -1576,17 +1574,17 @@ ui: done: Done config_yaml_error: Can't create the config.yaml file. lang: - label: Please choose a language + label: Будь ласка, виберіть мову db_type: label: Database engine db_username: - label: Username + label: Ім'я користувача placeholder: root msg: Username cannot be empty. db_password: - label: Password + label: Пароль placeholder: root - msg: Password cannot be empty. + msg: Поле паролю не може бути порожнім. db_host: label: Database host placeholder: "db:3306" @@ -1664,7 +1662,7 @@ ui: views: views votes: votes answers: answers - accepted: Accepted + accepted: Схвалено page_error: http_error: HTTP Error {{ code }} desc_403: You don't have permission to access this page. @@ -1681,17 +1679,17 @@ ui: users: Users badges: Badges flags: Відмітки - settings: Settings + settings: Налаштування general: General interface: Interface smtp: SMTP branding: Branding legal: Legal - write: Write + write: Написати tos: Terms of Service privacy: Privacy seo: SEO - customize: Customize + customize: Персоналізувати themes: Themes css_html: CSS/HTML login: Login @@ -1707,17 +1705,17 @@ ui: modal: title: Congratulations content: You've earned a new badge. - close: Close + close: Закрити confirm: View badges title: Badges awarded: Awarded earned_×: Earned ×{{ number }} ×_awarded: "{{ number }} awarded" can_earn_multiple: You can earn this multiple times. - earned: Earned + earned: Зароблено admin: admin_header: - title: Admin + title: Адмін dashboard: title: Dashboard welcome: Welcome to Admin! @@ -1744,11 +1742,11 @@ ui: database_size: "Розмір бази даних:" storage_used: "Використаний обсяг пам’яті:" uptime: "Uptime:" - links: Links + links: Посилання plugins: Плаґіни github: GitHub blog: Блоґ - contact: Contact + contact: Контакт forum: Forum documents: Документи feedback: Відгук @@ -1777,20 +1775,20 @@ ui: review: Огляд user_role_modal: title: Change user role to... - btn_cancel: Cancel - btn_submit: Submit + btn_cancel: Скасувати + btn_submit: Надіслати new_password_modal: - title: Set new password + title: Встановити новий пароль form: fields: password: - label: Password + label: Пароль 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 + btn_cancel: Скасувати + btn_submit: Надіслати edit_profile_modal: - title: Edit profile + title: Редагувати профіль form: fields: display_name: @@ -1800,13 +1798,13 @@ ui: label: Username msg_range: Username up to 30 characters. email: - label: Email + label: Електронна пошта msg_invalid: Invalid Email Address. edit_success: Edited successfully - btn_cancel: Cancel - btn_submit: Submit + btn_cancel: Скасувати + btn_submit: Надіслати user_modal: - title: Add new user + title: Додати нового користувача form: fields: users: @@ -1818,17 +1816,17 @@ ui: label: Ім'я для відображення msg: Ім'я для відображення повинно мати довжину від 2 до 30 символів. email: - label: Email + label: Електронна пошта msg: Email is not valid. password: - label: Password + label: Пароль msg: Password must be at 8-32 characters in length. - btn_cancel: Cancel - btn_submit: Submit + btn_cancel: Скасувати + btn_submit: Надіслати users: - title: Users - name: Name - email: Email + title: Користувачі + name: Ім’я + email: Електронна пошта reputation: Reputation created_at: Created Time delete_at: Deleted Time @@ -1870,7 +1868,7 @@ ui: questions: page_title: Запитання unlisted: Unlisted - post: Post + post: Опублікувати votes: Votes answers: Answers created: Створені @@ -1993,7 +1991,7 @@ ui: label: Політика конфіденційности text: "Ви можете додати вміст політики конфіденційності тут. Якщо у вас уже є документ, розміщений деінде, надайте тут повну URL-адресу." write: - page_title: Write + page_title: Написати restrict_answer: title: Answer write label: Кожен користувач може написати лише одну відповідь на кожне запитання @@ -2028,7 +2026,7 @@ ui: navbar_style: label: Navbar style primary_color: - label: Primary color + label: Основний колір text: Modify the colors used by your themes css_and_html: page_title: CSS and HTML @@ -2051,7 +2049,7 @@ ui: label: Sidebar text: This will insert in sidebar. login: - page_title: Login + page_title: Увійти membership: title: Membership label: Дозволити нові реєстрації @@ -2082,15 +2080,15 @@ ui: plugins: label: Plugins text: Select an existing plugin. - name: Name + name: Ім’я version: Version status: Status action: Action deactivate: Deactivate activate: Activate - settings: Settings + settings: Налаштування settings_users: - title: Users + title: Користувачі avatar: label: Default avatar text: For users without a custom avatar of their own. @@ -2130,17 +2128,17 @@ ui: placeholder: Filter by name, badge:id group: Group inactive: Inactive - name: Name + name: Ім’я show_logs: Show logs status: Status title: Badges form: optional: (optional) - empty: cannot be empty + empty: не може бути порожнім invalid: is invalid - btn_submit: Save + btn_submit: Зберегти not_found_props: "Required property {{ key }} not found." - select: Select + select: Вибрати page_review: review: Review proposed: proposed diff --git a/i18n/vi_VN.yaml b/i18n/vi_VN.yaml index 59f56978c..044817fad 100644 --- a/i18n/vi_VN.yaml +++ b/i18n/vi_VN.yaml @@ -146,7 +146,7 @@ backend: invalid_url: other: URL không tồn tại. status_invalid: - other: Invalid status. + other: Trạng thái không hợp lệ password: space_invalid: other: Mật khẩu không thể tồn tại khoảng trắng. @@ -315,35 +315,30 @@ backend: other: Không tìm thấy cấu hình trang. badge: object_not_found: - other: Badge object not found + other: Đối tượng không tìm thấy reason: spam: name: - other: Lạm dụng + other: thư rác desc: - other: Bài đăng này là quảng cáo hoặc phá hoại. Nó không hữu ích hoặc liên quan đến chủ đề hiện tại. + other: Bài đăng này quảng cáo hoặc phá hoại. Nó không hữu ích hoặc liên quan đến chủ đề hiện tại. rude_or_abusive: name: other: thô lỗ hoặc lạm dụng desc: - other: - - Một người lý trí sẽ thấy nội dung này không phù hợp để thảo luận tôn trọng - - Đàm thoại + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: một bản sao desc: - other: Câu hỏi này đã được hỏi trước đó và đã có câu trả lời. + other: Câu hỏi này đã được hỏi trước đó, đã có câu trả lời. placeholder: other: Nhập liên kết câu hỏi hiện tại not_a_answer: name: - other: không phải là câu trả lời + other: không phải câu trả lời desc: - other: - - Nội dung này được đăng dưới dạng câu trả lời, nhưng nó không hề trả lời cho câu hỏi... - - câu hỏi. Nó có thể là một chỉnh sửa, một bình luận, một câu hỏi khác, - - hoặc bị xóa hoàn toàn. + 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." no_longer_needed: name: other: không còn cần thiết @@ -402,9 +397,7 @@ backend: name: other: cần chi tiết hoặc rõ ràng desc: - other: - - Câu hỏi này hiện bao gồm nhiều câu hỏi trong một. Nó nên tập trung vào một vấn đề duy nhất - - chỉ tập trung vào một vấn đề. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: điều gì đó khác @@ -465,7 +458,7 @@ backend: invited_you_to_answer: other: đã mời bạn trả lời earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: Bạn đã nhận được huy hiệu "{{.BadgeName}}" email_tpl: change_email: title: @@ -536,265 +529,265 @@ backend: default_badges: autobiographer: name: - other: Autobiographer + other: Tác giả tự truyện desc: - other: Filled out profile information. + other: Đã điền thông tin hồ sơ. certified: name: - other: Certified + other: Đã xác minh desc: - other: Completed our new user tutorial. + other: Hoàn thành hướng dẫn cho người dùng mới của chúng tôi. editor: name: - other: Editor + other: Trình chỉnh sửa desc: - other: First post edit. + other: Chỉnh sửa bài đăng đầu tiên. first_flag: name: - other: First Flag + other: Cờ đầu tiên desc: - other: First flagged a post. + other: Lần đầu tiên báo cáo một bài viết. first_upvote: name: - other: First Upvote + other: Lượt thích đầu tiên desc: - other: First up voted a post. + other: Lần đầu tiên báo cáo một bài viết. first_link: name: - other: First Link + other: Liên kết đầu tiên desc: - other: First dirst added a link to another post. + other: Đầu tiên, Dirst đã thêm một liên kết đến một bài viết khác. first_reaction: name: - other: First Reaction + other: Phản ứng đầu tiên desc: - other: First reacted to the post. + other: Phản ứng với bài viết đầu tiên. first_share: name: - other: First Share + other: Chia sẻ đầu tiên desc: - other: First shared a post. + other: Lần đầu chia sẻ một bài viết. scholar: name: - other: Scholar + other: Học giả desc: - other: Asked a question and accepted an answer. + other: Đặt một câu hỏi và chấp nhận một câu trả lời. commentator: name: - other: Commentator + other: Bình luận viên desc: - other: Leave 5 comments. + other: Để lại 5 bình luận. new_user_of_the_month: name: - other: New User of the Month + other: Người dùng mới của tháng desc: - other: Outstanding contributions in their first month. + other: Đóng góp nổi bật trong tháng đầu tiên của họ. read_guidelines: name: - other: Read Guidelines + other: Đọc hướng dẫn desc: - other: Read the [community guidelines]. + other: Đọc [nguyên tắc cộng đồng]. reader: name: - other: Reader + other: Người đọc desc: - other: Read every answers in a topic with more than 10 answers. + other: Đọc mọi câu trả lời trong một chủ đề có hơn 10 câu trả lời. welcome: name: - other: Welcome + other: Xin chào desc: - other: Received a up vote. + other: Đã nhận được phiếu tán thành. nice_share: name: - other: Nice Share + other: Chia sẻ hay desc: - other: Shared a post with 25 unique visitors. + other: Đã chia sẻ một bài đăng với 25 khách truy cập. good_share: name: - other: Good Share + other: Chia sẻ tốt desc: - other: Shared a post with 300 unique visitors. + other: Đã chia sẻ một bài đăng với 300 khách truy cập. great_share: name: - other: Great Share + other: Chia sẻ tuyệt vời desc: - other: Shared a post with 1000 unique visitors. + other: Đã chia sẻ một bài đăng với 1000 khách truy cập. out_of_love: name: - other: Out of Love + other: Hết yêu thích desc: - other: Used 50 up votes in a day. + other: Đã sử dụng 50 phiếu bầu trong một ngày. higher_love: name: - other: Higher Love + other: Thích cao hơn desc: - other: Used 50 up votes in a day 5 times. + other: Đã sử dụng 50 phiếu bầu trong một ngày. crazy_in_love: name: - other: Crazy in Love + other: Thích điên cuồng desc: - other: Used 50 up votes in a day 20 times. + other: Đã sử dụng 50 phiếu bầu trong một ngày 20 lần. promoter: name: - other: Promoter + other: Người quảng bá desc: - other: Invited a user. + other: Đã mời một người dùng. campaigner: name: - other: Campaigner + other: Chiến dịch desc: - other: Invited 3 basic users. + other: Đã mời 3 người dùng cơ bản. champion: name: - other: Champion + other: Vô địch desc: - other: Invited 5 members. + other: Mời 5 thành viên. thank_you: name: - other: Thank You + other: Cảm ơn bạn desc: - other: Has 20 up voted posts and gave 10 up votes. + other: Có 20 bài đăng được bình chọn đưa ra 10 phiếu bầu. gives_back: name: - other: Gives Back + other: Trả lại desc: - other: Has 100 up voted posts and gave 100 up votes. + other: Có 100 bài đăng được bình chọn và đưa ra 100 phiếu bầu. empathetic: name: - other: Empathetic + other: Đồng cảm desc: - other: Has 500 up voted posts and gave 1000 up votes. + other: Có 500 bài đăng được bình chọn đưa ra 1000 phiếu bầu. enthusiast: name: - other: Enthusiast + other: Người nhiệt thành desc: - other: Visited 10 consecutive days. + other: Đã truy cập 10 ngày liên tiếp. aficionado: name: - other: Aficionado + other: Người hâm mộ desc: - other: Visited 100 consecutive days. + other: Đã truy cập 100 ngày liên tiếp. devotee: name: - other: Devotee + other: Tín đồ desc: - other: Visited 365 consecutive days. + other: Đã truy cập 365 ngày liên tiếp. anniversary: name: - other: Anniversary + other: Kỉ niệm desc: - other: Active member for a year, posted at least once. + other: Thành viên tích cực trong một năm, đăng ít nhất một lần. appreciated: name: - other: Appreciated + other: Đánh giá cao desc: - other: Received 1 up vote on 20 posts. + other: Nhận được 1 lượt bình chọn cho 20 bài viết. respected: name: - other: Respected + other: Tôn trọng desc: - other: Received 2 up votes on 100 posts. + other: Nhận được 2 lượt bình chọn cho 100 bài viết. admired: name: - other: Admired + other: Ngưỡng mộ desc: - other: Received 5 up votes on 300 posts. + other: Nhận được 5 lượt bình chọn trên 300 bài đăng. solved: name: - other: Solved + other: Đã giải quyết desc: - other: Have an answer be accepted. + other: Có một câu trả lời được chấp nhận. guidance_counsellor: name: - other: Guidance Counsellor + other: Cố vấn hướng dẫn desc: - other: Have 10 answers be accepted. + other: Có 10 câu trả lời được chấp nhận. know_it_all: name: - other: Know-it-All + other: Biết tất cả desc: - other: Have 50 answers be accepted. + other: Có 50 câu trả lời được chấp nhận. solution_institution: name: - other: Solution Institution + other: Viện giải pháp desc: - other: Have 150 answers be accepted. + other: Có 150 câu trả lời được chấp nhận. nice_answer: name: - other: Nice Answer + other: Câu trả lời tốt desc: - other: Answer score of 10 or more. + other: Điểm trả lời từ 10 trở lên. good_answer: name: - other: Good Answer + other: Câu trả lời của bạn desc: - other: Answer score of 25 or more. + other: Điểm trả lời từ 25 trở lên. great_answer: name: - other: Great Answer + other: Câu trả lời tuyệt vời desc: - other: Answer score of 50 or more. + other: Điểm trả lời từ 50 trở lên. nice_question: name: - other: Nice Question + other: Câu trả lời tốt desc: - other: Question score of 10 or more. + other: Điểm trả lời từ 10 trở lên. good_question: name: - other: Good Question + other: Câu trả lời tốt desc: - other: Question score of 25 or more. + other: Điểm trả lời từ 25 trở lên. great_question: name: - other: Great Question + other: Câu trả lời tốt desc: - other: Question score of 50 or more. + other: Điểm trả lời từ 50 trở lên. popular_question: name: - other: Popular Question + other: Câu hỏi phổ biến desc: - other: Question with 500 views. + other: Câu hỏi với 500 lượt xem. notable_question: name: - other: Notable Question + other: Câu hỏi đáng chú ý desc: - other: Question with 1,000 views. + other: Câu hỏi với 1.000 lượt xem. famous_question: name: - other: Famous Question + other: Câu hỏi nổi tiếng desc: - other: Question with 5,000 views. + other: Câu hỏi với 5.000 lượt xem. popular_link: name: - other: Popular Link + other: Liên kết phổ biến desc: - other: Posted an external link with 50 clicks. + other: Đã đăng một liên kết bên ngoài với 50 lần nhấp chuột. hot_link: name: - other: Hot Link + other: Liên kết nổi bật desc: - other: Posted an external link with 300 clicks. + other: Đã đăng một liên kết bên ngoài với 300 lần nhấp chuột. famous_link: name: - other: Famous Link + other: Liên kết nổi tiếng desc: - other: Posted an external link with 100 clicks. + other: Đã đăng một liên kết bên ngoài với 100 lần nhấp chuột. default_badge_groups: getting_started: name: - other: Getting Started + other: Bắt đầu community: name: - other: Community + other: Cộng đồng posting: name: - other: Posting + other: Viết bài thảo luận # The following fields are used for interface presentation(Front-end) ui: how_to_format: title: Cách định dạng desc: >- - + pagination: prev: Trước next: Tiếp @@ -843,9 +836,9 @@ ui: posts: Bài đăng invites: Lời mời votes: Bình chọn - answer: Answer - question: Question - badge_award: Badge + answer: Câu trả lời + question: Câu hỏi + badge_award: Huy hiệu suspended: title: Tài khoản của bạn đã bị đình chỉ until_time: "Tài khoản của bạn đã bị đình chỉ cho đến {{ time }}." @@ -868,8 +861,8 @@ ui: gantt_chart: Biểu đồ Gantt pie_chart: Biểu đồ tròn code: - text: Mẫu mã - add_code: Thêm mẫu mã + text: Mẫu code + add_code: Thêm code mẫu form: fields: code: @@ -938,7 +931,7 @@ ui: form: fields: url: - label: URL + label: Đường link url msg: empty: URL không thể trống. name: @@ -1043,9 +1036,9 @@ ui: reaction: heart: trái tim smile: nụ cười - frown: khắc nghiệt - btn_label: thêm hoặc loại bỏ lại - undo_emoji: trở lại {{ emoji }} lặp lại + frown: nhăn mặt + btn_label: thêm hoặc loại bỏ phản ứng + undo_emoji: bỏ dấu {{ emoji }} phản ứng react_emoji: biểu cảm với {{ emoji }} unreact_emoji: hủy biểu cảm {{ emoji }} comment: @@ -1141,7 +1134,7 @@ ui: question: Câu hỏi tag: Thẻ user: Người dùng - badges: Badges + badges: Danh hiệu profile: Hồ sơ setting: Cài đặt logout: Đăng xuất @@ -1167,11 +1160,11 @@ ui: Bạn gần như đã hoàn tất! Chúng tôi đã gửi một email kích hoạt đến {{mail}}. Vui lòng làm theo hướng dẫn trong email để kích hoạt tài khoản của bạn. info: "Nếu không nhận được, hãy kiểm tra thư mục spam của bạn." another: >- - Chúng tôi đã gửi một email kích hoạt khác cho bạn tại {{mail}}. Có thể mất vài phút để nó đến; hãy chắc chắn kiểm tra thư mục spam của bạn. + Chúng tôi đã gửi một email kích hoạt khác cho bạn tại {{mail}}. Có thể mất vài phút để nó đến; hãy chắc chắn kiểm tra thư mục thư rác của bạn. btn_name: Gửi lại email kích hoạt change_btn_name: Thay đổi email msg: - empty: Không thể trống. + empty: Không thể để trống mục này. resend_email: url_label: Bạn có chắc chắn muốn gửi lại email kích hoạt không? url_text: Bạn cũng có thể cung cấp liên kết kích hoạt ở trên cho người dùng. @@ -1301,7 +1294,7 @@ ui: change_email_info: >- Chúng tôi đã gửi một email đến địa chỉ đó. Vui lòng làm theo hướng dẫn xác nhận. email: - label: Email mới + label: Email new_email: label: Email mới msg: Email mới không được để trống. @@ -1341,6 +1334,10 @@ ui: related_question: title: Các câu hỏi liên quan answers: câu trả lời + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: Mời mọi người desc: Mời những người bạn nghĩ có thể trả lời. @@ -1525,7 +1522,7 @@ ui: newest: Mới nhất active: Hoạt động hot: Được nhiều quan tâm - recommend: Recommend + recommend: Đề xuất score: Điểm unanswered: Chưa được trả lời modified: đã chỉnh sửa @@ -1544,7 +1541,7 @@ ui: reputation: Danh tiếng comments: Bình luận votes: Bình chọn - badges: Badges + badges: Danh hiệu newest: Mới nhất score: Điểm edit_profile: Chỉnh sửa hồ sơ @@ -1558,7 +1555,8 @@ ui: top_answers: Câu trả lời hàng đầu top_questions: Câu hỏi hàng đầu stats: Thống kê - list_empty: Không tìm thấy bài đăng.
Có thể bạn muốn chọn một tab khác? + list_empty: Không tìm thấy bài đăng.
Có thể bạn muốn chọn một thẻ khác? + content_empty: No posts found. accepted: Đã chấp nhận answered: đã trả lời asked: đã hỏi @@ -1569,7 +1567,7 @@ ui: x_votes: phiếu bầu nhận được x_answers: câu trả lời x_questions: câu hỏi - recent_badges: Recent Badges + recent_badges: Huy hiệu gần đây install: title: Cài đặt next: Tiếp theo @@ -1646,7 +1644,7 @@ ui: msg: empty: Email không thể trống. incorrect: Định dạng email không chính xác. - ready_title: Answer của bạn đã sẵn sàng + ready_title: Trang web của bạn đã sẵn sàng ready_desc: >- Nếu bạn cảm thấy muốn thay đổi thêm cài đặt nào đó, hãy truy cập <1>mục quản trị; tìm nó trong menu trang. good_luck: "Chúc bạn vui vẻ và may mắn!" @@ -1679,7 +1677,7 @@ ui: questions: Câu hỏi answers: Câu trả lời users: Người dùng - badges: Badges + badges: Huy hiệu flags: Cờ settings: Cài đặt general: Chung @@ -1696,7 +1694,7 @@ ui: css_html: CSS/HTML login: Đăng nhập privileges: Đặc quyền - plugins: Plugin + plugins: Plugins installed_plugins: Plugin đã cài đặt website_welcome: Chào mừng bạn đến với {{site_name}} user_center: @@ -1705,16 +1703,16 @@ ui: login_failed_email_tip: Đăng nhập thất bại, vui lòng cho phép ứng dụng này truy cập thông tin email của bạn trước khi thử lại. badges: modal: - title: Congratulations - content: You've earned a new badge. - close: Close - confirm: View badges - title: Badges - awarded: Awarded - earned_×: Earned ×{{ number }} - ×_awarded: "{{ number }} awarded" - can_earn_multiple: You can earn this multiple times. - earned: Earned + title: Chúc mừng + content: Bạn đã nhận được huy hiệu mới. + close: Đóng + confirm: Xem huy hiệu + title: Huy hiệu + awarded: Giải Thưởng + earned_×: Nhận được ×{{ number }} + ×_awarded: "{{ number }} được trao tặng" + can_earn_multiple: Bạn có thể kiếm được nhiều lần. + earned: Đã nhận admin: admin_header: title: Quản trị @@ -1774,7 +1772,7 @@ ui: flagged_type: Đã đánh dấu {{ type }} created: Đã tạo action: Hành động - review: Xem xét + review: Đánh giá user_role_modal: title: Thay đổi vai trò người dùng thành... btn_cancel: Hủy @@ -2013,7 +2011,7 @@ ui: seo: page_title: SEO permalink: - label: Permalink + label: Liên kết cố định text: Cấu trúc URL tùy chỉnh có thể cải thiện khả năng sử dụng và khả năng tương thích về sau của liên kết của bạn. robots: label: robots.txt @@ -2073,7 +2071,7 @@ ui: text: "CẢNH BÁO: Nếu tắt, bạn có thể không thể đăng nhập nếu bạn chưa cấu hình phương thức đăng nhập khác trước đó." installed_plugins: title: Plugin đã cài đặt - plugin_link: Plugin mở rộng và mở rộng chức năng của Answer. Bạn có thể tìm thấy plugin trong <1>Kho Plugin Answer. + plugin_link: Plugin mở rộng và mở rộng chức năng của trang web. Bạn có thể tìm thấy plugin trong <1>Kho Plugin Answer. filter: all: Tất cả active: Đang hoạt động @@ -2117,23 +2115,24 @@ ui: label: Mức độ danh tiếng yêu cầu text: Chọn mức danh tiếng yêu cầu cho các đặc quyền msg: - should_be_number: dữ liệu đầu vào phải là số + should_be_number: dữ liệu đầu vào phải là kiểu số number_larger_1: số phải bằng hoặc lớn hơn 1 badges: - action: Action - active: Active + action: Hành động + active: Hoạt động + activate: Kích hoạt activate: Activate - all: All - awards: Awards - deactivate: Deactivate + all: Tất cả + awards: Giải Thưởng + deactivate: Ngừng kích hoạt filter: - placeholder: Filter by name, badge:id - group: Group - inactive: Inactive - name: Name - show_logs: Show logs - status: Status - title: Badges + placeholder: Lọc theo tên, user:id + group: Nhóm + inactive: Không hoạt động + name: Tên + show_logs: Hiển thị nhật ký + status: Trạng thái + title: Danh hiệu form: optional: (tùy chọn) empty: không thể trống @@ -2190,7 +2189,7 @@ ui: title: "Lịch sử cho" tag_title: "Dòng thời gian cho" show_votes: "Hiển thị phiếu bầu" - n_or_a: Không có + n_or_a: N/A title_for_question: "Dòng thời gian cho" title_for_answer: "Dòng thời gian cho câu trả lời của {{ title }} bởi {{ author }}" title_for_tag: "Dòng thời gian cho thẻ" diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml index f6777d899..3a0d56e86 100644 --- a/i18n/zh_CN.yaml +++ b/i18n/zh_CN.yaml @@ -326,9 +326,7 @@ backend: name: other: 粗鲁或辱骂的 desc: - other: - - 一个有理智的人都会认为这种内容不适合进行尊重性的讨论。 - - 论坛 + other: "一个有理智的人都会认为这种内容不适合进行尊重性的讨论。" a_duplicate: name: other: 重复内容 @@ -340,10 +338,7 @@ backend: name: other: 不是答案 desc: - other: - - 这张贴作为答案,但它不会试图回答 - - 这可能是一个编辑、一个评论、另一个问题。 - - 或全部删除。 + other: "该帖是作为答案发布的,但它并没有试图回答这个问题。总之,它可能应该是个编辑、评论、另一个问题或者需要被删除。" no_longer_needed: name: other: 不再需要 @@ -402,9 +397,7 @@ backend: name: other: 需要细节或澄清 desc: - other: - - 该问题目前涵盖多个问题。它应该侧重在一个问题上。 - - 只关注一个问题。 + other: 该问题目前涵盖多个问题。它应该只集中在一个问题上。 other: name: other: 其他原因 @@ -688,7 +681,7 @@ backend: name: other: 欣赏 desc: - other: 20个员额获得1次补票。 + other: 在 20 个帖子中获得 1个投票 respected: name: other: 尊敬 @@ -1185,7 +1178,7 @@ ui: label: 名字 msg: empty: 名字不能为空 - range: 名字应该在 2 到 30 个字符之间 + range: 名称长度必须在 2 至 30 个字符之间。 character: '只能由 "a-z"、"A-Z"、"0-9"、" - . _" 组成' email: label: 邮箱 @@ -1342,8 +1335,9 @@ ui: title: 相关问题 answers: 个回答 linked_question: - title: 关联问题 - no_linked_question: 没有关联的问题。 + title: 关联的问题 + description: 问题关联到 + no_linked_question: 这个问题没有相关联的问题。 invite_to_answer: title: 受邀人 desc: 邀请你认为可能知道答案的人。 diff --git a/i18n/zh_TW.yaml b/i18n/zh_TW.yaml index 32938f4d5..bec0a0b39 100644 --- a/i18n/zh_TW.yaml +++ b/i18n/zh_TW.yaml @@ -326,9 +326,7 @@ backend: name: other: rude or abusive desc: - other: - - A reasonable person would find this content inappropriate for respectful - - discourse. + other: "A reasonable person would find this content inappropriate for respectful discourse." a_duplicate: name: other: a duplicate @@ -340,10 +338,7 @@ backend: name: other: not an answer 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: "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." no_longer_needed: name: other: no longer needed @@ -402,9 +397,7 @@ backend: name: other: 需要細節或明晰 desc: - other: - - This question currently includes multiple questions in one. It should - - focus on one problem only. + other: This question currently includes multiple questions in one. It should focus on one problem only. other: name: other: 其他原因 @@ -794,7 +787,7 @@ ui: how_to_format: title: 如何設定文本格式 desc: >- - + pagination: prev: 上一頁 next: 下一頁 @@ -1341,6 +1334,10 @@ ui: related_question: title: 相關問題 answers: 個回答 + linked_question: + title: Linked Questions + description: Questions linked to + no_linked_question: No questions linked from this question. invite_to_answer: title: People Asked desc: Invite people who you think might know the answer. @@ -1559,6 +1556,7 @@ ui: top_questions: 熱門問題 stats: 狀態 list_empty: 沒有找到相關的內容。
試試看其他標籤? + content_empty: No posts found. accepted: 已採納 answered: 回答於 asked: 提問於 From 5f468c6f054ac096cb1fc31fa5acfbdb8b730c75 Mon Sep 17 00:00:00 2001 From: Sonui Date: Sat, 26 Oct 2024 18:21:14 +0800 Subject: [PATCH 02/40] perf: optimize tag has new tag check --- internal/service/tag_common/tag_common.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/internal/service/tag_common/tag_common.go b/internal/service/tag_common/tag_common.go index 8010b5cd3..71638e18d 100644 --- a/internal/service/tag_common/tag_common.go +++ b/internal/service/tag_common/tag_common.go @@ -290,24 +290,18 @@ func (ts *TagCommonService) ExistRecommend(ctx context.Context, tags []*schema.T func (ts *TagCommonService) HasNewTag(ctx context.Context, tags []*schema.TagItem) (bool, error) { tagNames := make([]string, 0) - tagMap := make(map[string]bool) + tagMap := make(map[string]struct{}) for _, item := range tags { item.SlugName = strings.ReplaceAll(item.SlugName, " ", "-") tagNames = append(tagNames, item.SlugName) - tagMap[item.SlugName] = false + tagMap[item.SlugName] = struct{}{} } list, err := ts.GetTagListByNames(ctx, tagNames) if err != nil { return true, err } for _, item := range list { - _, ok := tagMap[item.SlugName] - if ok { - tagMap[item.SlugName] = true - } - } - for _, has := range tagMap { - if !has { + if _, ok := tagMap[item.SlugName]; !ok { return true, nil } } From ad6387126a890b3e08235a0800f8a2a9cc7cc223 Mon Sep 17 00:00:00 2001 From: Sonui Date: Sun, 27 Oct 2024 13:30:49 +0800 Subject: [PATCH 03/40] fix: add status filter when update tag rel --- internal/repo/tag/tag_rel_repo.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/repo/tag/tag_rel_repo.go b/internal/repo/tag/tag_rel_repo.go index 70187f544..08cff9d14 100644 --- a/internal/repo/tag/tag_rel_repo.go +++ b/internal/repo/tag/tag_rel_repo.go @@ -21,6 +21,7 @@ package tag import ( "context" + "github.com/apache/incubator-answer/internal/base/data" "github.com/apache/incubator-answer/internal/base/handler" "github.com/apache/incubator-answer/internal/base/reason" @@ -85,7 +86,7 @@ func (tr *tagRelRepo) RecoverTagRelListByObjectID(ctx context.Context, objectID func (tr *tagRelRepo) HideTagRelListByObjectID(ctx context.Context, objectID string) (err error) { objectID = uid.DeShortID(objectID) - _, err = tr.data.DB.Context(ctx).Where("object_id = ?", objectID).Cols("status").Update(&entity.TagRel{Status: entity.TagRelStatusHide}) + _, err = tr.data.DB.Context(ctx).Where("object_id = ?", objectID).And("status = ?", entity.TagRelStatusAvailable).Cols("status").Update(&entity.TagRel{Status: entity.TagRelStatusHide}) if err != nil { err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() } @@ -94,7 +95,7 @@ func (tr *tagRelRepo) HideTagRelListByObjectID(ctx context.Context, objectID str func (tr *tagRelRepo) ShowTagRelListByObjectID(ctx context.Context, objectID string) (err error) { objectID = uid.DeShortID(objectID) - _, err = tr.data.DB.Context(ctx).Where("object_id = ?", objectID).Cols("status").Update(&entity.TagRel{Status: entity.TagRelStatusAvailable}) + _, err = tr.data.DB.Context(ctx).Where("object_id = ?", objectID).And("status = ?", entity.TagRelStatusHide).Cols("status").Update(&entity.TagRel{Status: entity.TagRelStatusAvailable}) if err != nil { err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() } From 5546bb55ea683927c2d3f51977a0da2d741d2734 Mon Sep 17 00:00:00 2001 From: Sonui Date: Sun, 27 Oct 2024 13:34:13 +0800 Subject: [PATCH 04/40] fix: wrong status when enable tag rel --- internal/repo/repo_test/tag_rel_repo_test.go | 2 +- internal/repo/tag/tag_rel_repo.go | 21 ++++++++++++++++-- internal/service/tag_common/tag_common.go | 23 ++++++++++++-------- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/internal/repo/repo_test/tag_rel_repo_test.go b/internal/repo/repo_test/tag_rel_repo_test.go index f36965905..1cc96319f 100644 --- a/internal/repo/repo_test/tag_rel_repo_test.go +++ b/internal/repo/repo_test/tag_rel_repo_test.go @@ -104,7 +104,7 @@ func Test_tagListRepo_GetObjectTagRelWithoutStatus(t *testing.T) { assert.NoError(t, err) assert.True(t, exist) - err = tagRelRepo.EnableTagRelByIDs(context.TODO(), ids) + err = tagRelRepo.EnableTagRelByIDs(context.TODO(), ids, false) assert.NoError(t, err) count, err = tagRelRepo.CountTagRelByTagID(context.TODO(), "10030000000000101") diff --git a/internal/repo/tag/tag_rel_repo.go b/internal/repo/tag/tag_rel_repo.go index 08cff9d14..3188295cf 100644 --- a/internal/repo/tag/tag_rel_repo.go +++ b/internal/repo/tag/tag_rel_repo.go @@ -130,8 +130,12 @@ func (tr *tagRelRepo) GetObjectTagRelWithoutStatus(ctx context.Context, objectID } // EnableTagRelByIDs update tag status to available -func (tr *tagRelRepo) EnableTagRelByIDs(ctx context.Context, ids []int64) (err error) { - _, err = tr.data.DB.Context(ctx).In("id", ids).Update(&entity.TagRel{Status: entity.TagRelStatusAvailable}) +func (tr *tagRelRepo) EnableTagRelByIDs(ctx context.Context, ids []int64, hide bool) (err error) { + status := entity.TagRelStatusAvailable + if hide { + status = entity.TagRelStatusHide + } + _, err = tr.data.DB.Context(ctx).In("id", ids).Update(&entity.TagRel{Status: status}) if err != nil { err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() } @@ -186,3 +190,16 @@ func (tr *tagRelRepo) CountTagRelByTagID(ctx context.Context, tagID string) (cou } return } + +// GetTagRelDefaultStatusByObjectID get tag rel default status +func (tr *tagRelRepo) GetTagRelDefaultStatusByObjectID(ctx context.Context, objectID string) (status int, err error) { + question := entity.Question{} + exist, err := tr.data.DB.Context(ctx).ID(objectID).Cols("show", "status").Get(&question) + if err != nil { + err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + if exist && (question.Show == entity.QuestionHide || question.Status == entity.QuestionStatusDeleted) { + return entity.TagRelStatusHide, nil + } + return entity.TagRelStatusAvailable, nil +} diff --git a/internal/service/tag_common/tag_common.go b/internal/service/tag_common/tag_common.go index 71638e18d..ec11fe450 100644 --- a/internal/service/tag_common/tag_common.go +++ b/internal/service/tag_common/tag_common.go @@ -71,11 +71,12 @@ type TagRelRepo interface { ShowTagRelListByObjectID(ctx context.Context, objectID string) (err error) HideTagRelListByObjectID(ctx context.Context, objectID string) (err error) RemoveTagRelListByIDs(ctx context.Context, ids []int64) (err error) - EnableTagRelByIDs(ctx context.Context, ids []int64) (err error) + EnableTagRelByIDs(ctx context.Context, ids []int64, hide bool) (err error) GetObjectTagRelWithoutStatus(ctx context.Context, objectId, tagID string) (tagRel *entity.TagRel, exist bool, err error) GetObjectTagRelList(ctx context.Context, objectId string) (tagListList []*entity.TagRel, err error) BatchGetObjectTagRelList(ctx context.Context, objectIds []string) (tagListList []*entity.TagRel, err error) CountTagRelByTagID(ctx context.Context, tagID string) (count int64, err error) + GetTagRelDefaultStatusByObjectID(ctx context.Context, objectID string) (status int, err error) } // TagCommonService user service @@ -762,10 +763,9 @@ func (ts *TagCommonService) ShowTagRelListByObjectID(ctx context.Context, object // CreateOrUpdateTagRelList if tag relation is exists update status, if not create it func (ts *TagCommonService) CreateOrUpdateTagRelList(ctx context.Context, objectId string, tagIDs []string) (err error) { - addTagIDMapping := make(map[string]bool) - needRefreshTagIDs := make([]string, 0) + addTagIDMapping := make(map[string]struct{}) for _, t := range tagIDs { - addTagIDMapping[t] = true + addTagIDMapping[t] = struct{}{} } // get all old relation @@ -774,8 +774,10 @@ func (ts *TagCommonService) CreateOrUpdateTagRelList(ctx context.Context, object return err } var deleteTagRel []int64 + needRefreshTagIDs := make([]string, 0, len(oldTagRelList)+len(tagIDs)) + needRefreshTagIDs = append(needRefreshTagIDs, tagIDs...) for _, rel := range oldTagRelList { - if !addTagIDMapping[rel.TagID] { + if _, ok := addTagIDMapping[rel.TagID]; !ok { deleteTagRel = append(deleteTagRel, rel.ID) needRefreshTagIDs = append(needRefreshTagIDs, rel.TagID) } @@ -783,8 +785,11 @@ func (ts *TagCommonService) CreateOrUpdateTagRelList(ctx context.Context, object addTagRelList := make([]*entity.TagRel, 0) enableTagRelList := make([]int64, 0) + defaultTagRelStatus, err := ts.tagRelRepo.GetTagRelDefaultStatusByObjectID(ctx, objectId) + if err != nil { + return err + } for _, tagID := range tagIDs { - needRefreshTagIDs = append(needRefreshTagIDs, tagID) rel, exist, err := ts.tagRelRepo.GetObjectTagRelWithoutStatus(ctx, objectId, tagID) if err != nil { return err @@ -792,11 +797,11 @@ func (ts *TagCommonService) CreateOrUpdateTagRelList(ctx context.Context, object // if not exist add tag relation if !exist { addTagRelList = append(addTagRelList, &entity.TagRel{ - TagID: tagID, ObjectID: objectId, Status: entity.TagStatusAvailable, + TagID: tagID, ObjectID: objectId, Status: defaultTagRelStatus, }) } // if exist and has been removed, that should be enabled - if exist && rel.Status != entity.TagStatusAvailable { + if exist && rel.Status != entity.TagRelStatusAvailable && rel.Status != entity.TagRelStatusHide { enableTagRelList = append(enableTagRelList, rel.ID) } } @@ -812,7 +817,7 @@ func (ts *TagCommonService) CreateOrUpdateTagRelList(ctx context.Context, object } } if len(enableTagRelList) > 0 { - if err = ts.tagRelRepo.EnableTagRelByIDs(ctx, enableTagRelList); err != nil { + if err = ts.tagRelRepo.EnableTagRelByIDs(ctx, enableTagRelList, defaultTagRelStatus == entity.TagRelStatusHide); err != nil { return err } } From 68570d727119936c9e40becc4f14f7899cef9da7 Mon Sep 17 00:00:00 2001 From: sy-records <52o@qq52o.cn> Date: Mon, 28 Oct 2024 13:20:14 +0800 Subject: [PATCH 05/40] fix: resolve 404 error on Tags static page --- internal/controller/template_controller.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/controller/template_controller.go b/internal/controller/template_controller.go index 4692e855f..df10931e0 100644 --- a/internal/controller/template_controller.go +++ b/internal/controller/template_controller.go @@ -449,13 +449,13 @@ func (tc *TemplateController) QuestionInfo(ctx *gin.Context) { // TagList tags list func (tc *TemplateController) TagList(ctx *gin.Context) { - req := &schema.GetTagWithPageReq{} + req := &schema.GetTagWithPageReq{ + PageSize: constant.DefaultPageSize, + Page: 1, + } if handler.BindAndCheck(ctx, req) { return } - if req.PageSize == 0 { - req.PageSize = constant.DefaultPageSize - } data, err := tc.templateRenderController.TagList(ctx, req) if err != nil || pager.ValPageOutOfRange(data.Count, req.Page, req.PageSize) { tc.Page404(ctx) From bb73941451b08d25d98e7f82bdfd9607aefe7046 Mon Sep 17 00:00:00 2001 From: shuai Date: Tue, 29 Oct 2024 15:39:37 +0800 Subject: [PATCH 06/40] feat: update template files --- ui/template/header.html | 10 ++- ui/template/homepage.html | 102 ++++++++++++++++--------------- ui/template/question-detail.html | 40 +++++------- ui/template/question.html | 46 +++++++------- ui/template/sort-btns.html | 19 ++++++ ui/template/tag-detail.html | 87 ++++++++++++-------------- ui/template/tags.html | 86 ++++++++++++++------------ 7 files changed, 204 insertions(+), 186 deletions(-) create mode 100644 ui/template/sort-btns.html diff --git a/ui/template/header.html b/ui/template/header.html index 0243a43d7..5c4977d9f 100644 --- a/ui/template/header.html +++ b/ui/template/header.html @@ -189,9 +189,13 @@ -
- {{template "sidenav" . }} - {{end}} +
+
+
+ {{template "sidenav" . }} + {{end}} +
+
diff --git a/ui/template/homepage.html b/ui/template/homepage.html index ad5b02091..2f68200d5 100644 --- a/ui/template/homepage.html +++ b/ui/template/homepage.html @@ -19,59 +19,61 @@ --> {{template "header" . }} -
-
-
-
- -
-
- {{.userinfo.DisplayName}} +
+
+
+
+
+
+ + {{.userinfo.Username}} + +
+ -
@{{.userinfo.Username}}
-
-
- {{.userinfo.Rank}} {{translator $.language "ui.personal.x_reputation"}} -
-
- {{.userinfo.AnswerCount}} {{translator $.language "ui.personal.x_answers"}} -
-
- {{.userinfo.QuestionCount}} {{translator $.language "ui.personal.x_questions"}} -
-
- {{if .userinfo.Website }} - - {{else}} - {{end}} -
-
-
-
-
- -
-
-
- -
-
-
{{translator $.language "ui.personal.about_me"}}
- {{if .bio }} -
{{.bio}}
- {{else}} -
{{translator $.language "ui.personal.about_me_empty"}}
- {{end}} -
-
-
+
+
@{{.userinfo.Username}}
+
+
+ {{.userinfo.Rank}} {{translator $.language "ui.personal.x_reputation"}} +
+
+ {{.userinfo.AnswerCount}} {{translator $.language "ui.personal.x_answers"}} +
+
+ {{.userinfo.QuestionCount}} {{translator $.language "ui.personal.x_questions"}} +
+
+ {{if .userinfo.Website }} + + {{else}} + {{end}} +
+
+
+
+
+
+
-
-
+
+
+
{{translator $.language "ui.personal.about_me"}}
+ {{if .bio }} +
{{.bio}}
+ {{else}} +
{{translator $.language "ui.personal.about_me_empty"}}
+ {{end}}
+
+
+
+
+
+
{{template "footer" .}} diff --git a/ui/template/question-detail.html b/ui/template/question-detail.html index d0e6933d9..fcf98c3d0 100644 --- a/ui/template/question-detail.html +++ b/ui/template/question-detail.html @@ -19,9 +19,9 @@ --> {{template "header" . }} -
-
-
+
+
+

{{if $.useTitle }} @@ -46,14 +46,16 @@

-
- {{formatLinkNofollow .detail.HTML}} -
+
+
+ {{formatLinkNofollow .detail.HTML}} +
+
-
-
+ -
-
-
{{template "footer" .}} diff --git a/ui/template/question.html b/ui/template/question.html index 058645e5b..ca7f1301a 100644 --- a/ui/template/question.html +++ b/ui/template/question.html @@ -19,18 +19,19 @@ --> {{template "header" . }} -
-
-
+
+
+
{{translator $.language "ui.question.all_questions"}}
+ {{template "sort-btns" .}}
-
+
{{range .data}} -
+
{{if $.useTitle }} {{end}}
-
-
+ class="d-flex flex-wrap flex-column flex-md-row align-items-md-center small mb-2 text-secondary"> +
+ -
- {{.VoteCount}} - {{.AnswerCount}} - {{.ViewCount}} +
+
+ + {{.VoteCount}} +
+
+ + {{.AnswerCount}} +
+ + + {{.ViewCount}} +
-
+ +{{end}} diff --git a/ui/template/tag-detail.html b/ui/template/tag-detail.html index f3259949d..a2e314983 100644 --- a/ui/template/tag-detail.html +++ b/ui/template/tag-detail.html @@ -19,14 +19,12 @@ --> {{template "header" . }} -
-
-
+
+
+

- {{$.tag.SlugName}} + {{$.tag.SlugName}}

{{formatLinkNofollow $.tag.ParsedText}}

@@ -36,62 +34,51 @@
{{translator ($.language) "ui.question.x_questions" "count" .questionCount}}
+ {{template "sort-btns" .}}
-
+
{{range .questionList}} -
+
{{if $.useTitle }} - {{.Title}} + {{.Title}} {{else}} {{.Title}} {{end}}
-
-
-
- {{.Operator.DisplayName}}{{.Operator.Rank}} +
+
+
+ {{.Operator.DisplayName}}{{.Operator.Rank}}
• -
-
- {{.VoteCount}} - {{.AnswerCount}} - {{.ViewCount}} +
+
+ + {{.VoteCount}} +
+
+ + {{.AnswerCount}} +
+ + + {{.ViewCount}} +
-
+
{{range .Tags }} - + {{.SlugName}} {{end}} @@ -99,10 +86,14 @@
{{end}}
-
+
+ {{template "page" .}} +
-
{{template "page" .}}
+
+ {{template "hot-question" .}} +
{{template "footer" .}} diff --git a/ui/template/tags.html b/ui/template/tags.html index 292fd477f..8821dd7b8 100644 --- a/ui/template/tags.html +++ b/ui/template/tags.html @@ -19,48 +19,58 @@ --> {{template "header" . }} -
-
-
-
-
-
-

{{translator $.language "ui.page_title.tags"}}

-
-
-
- {{ range .data.List }} -
-
-
- {{.SlugName}} -

{{formatLinkNofollow .ParsedText}} -

-
- {{.QuestionCount}} - {{translator $.language "ui.tags.tag_label"}} -
-
-
-
- {{ end }} - +
+
+
+

+ {{translator $.language "ui.page_title.tags"}} +

+ +
+
+ {{ range .data.List }} +
+
+
+ {{.SlugName}} +
{{formatLinkNofollow .ParsedText}} +
+
+ {{.QuestionCount}} + {{translator $.language "ui.tags.tag_label"}} +
+
+ {{ end }} + +
+
+ {{template "page" .}} +
+
- - {{template "footer" .}} From 6fc8a6e9c7942ff32a5899f285643c50230cc69d Mon Sep 17 00:00:00 2001 From: sy-records <52o@qq52o.cn> Date: Mon, 28 Oct 2024 13:06:23 +0800 Subject: [PATCH 07/40] fix: display timezone on Dashboard when set to UTC --- .../pages/Admin/Dashboard/components/HealthStatus/index.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/src/pages/Admin/Dashboard/components/HealthStatus/index.tsx b/ui/src/pages/Admin/Dashboard/components/HealthStatus/index.tsx index 302cfae92..c19cddbd5 100644 --- a/ui/src/pages/Admin/Dashboard/components/HealthStatus/index.tsx +++ b/ui/src/pages/Admin/Dashboard/components/HealthStatus/index.tsx @@ -94,7 +94,10 @@ const HealthStatus: FC = ({ data }) => { {t('timezone')} - {data.time_zone.split('/')?.[1]?.replaceAll('_', ' ')} + {(data.time_zone.split('/')?.[1] ?? data.time_zone).replaceAll( + '_', + ' ', + )} From fcecc07f5ed54658e4d897b4f62e11dbdb579727 Mon Sep 17 00:00:00 2001 From: robin Date: Wed, 13 Nov 2024 11:49:10 +0800 Subject: [PATCH 08/40] fix: update useRenderHtmlPlugin to target specific HTML element Related issue: https://github.com/apache/incubator-answer-plugins/issues/245 --- ui/src/pages/Questions/Detail/components/Answer/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/pages/Questions/Detail/components/Answer/index.tsx b/ui/src/pages/Questions/Detail/components/Answer/index.tsx index fb4de275b..931b1a755 100644 --- a/ui/src/pages/Questions/Detail/components/Answer/index.tsx +++ b/ui/src/pages/Questions/Detail/components/Answer/index.tsx @@ -60,7 +60,7 @@ const Index: FC = ({ const [searchParams] = useSearchParams(); const answerRef = useRef(null); - useRenderHtmlPlugin(answerRef); + useRenderHtmlPlugin(answerRef.current?.querySelector('.fmt') as HTMLElement); const acceptAnswer = () => { acceptanceAnswer({ From fdd3b4dbf543c8babbc0f2ce97c3b7cbb3c6a1a4 Mon Sep 17 00:00:00 2001 From: sy-records <52o@qq52o.cn> Date: Mon, 11 Nov 2024 15:51:41 +0800 Subject: [PATCH 09/40] fix: Tag summary display is not as expected on tag detail page --- i18n/en_US.yaml | 3 ++- i18n/zh_CN.yaml | 1 + ui/src/pages/Tags/Detail/index.tsx | 34 +++++++++++++++++++----------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml index 8c3c3ddde..9074c8a19 100644 --- a/i18n/en_US.yaml +++ b/i18n/en_US.yaml @@ -1103,6 +1103,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1362,7 +1363,7 @@ ui: answers: answers linked_question: title: Linked Questions - description: Questions linked to + description: Questions linked to no_linked_question: No questions linked from this question. invite_to_answer: title: Invite People diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml index 3a0d56e86..855819689 100644 --- a/i18n/zh_CN.yaml +++ b/i18n/zh_CN.yaml @@ -1086,6 +1086,7 @@ ui: search_placeholder: 通过标签名称过滤 no_desc: 此标签无描述。 more: 更多 + wiki: 维基 ask: title: 新增问题 edit_title: 编辑问题 diff --git a/ui/src/pages/Tags/Detail/index.tsx b/ui/src/pages/Tags/Detail/index.tsx index 33f654145..41b190226 100644 --- a/ui/src/pages/Tags/Detail/index.tsx +++ b/ui/src/pages/Tags/Detail/index.tsx @@ -38,7 +38,7 @@ import { } from '@/services'; import QuestionList, { QUESTION_ORDER_KEYS } from '@/components/QuestionList'; import HotQuestions from '@/components/HotQuestions'; -import { escapeRemove, guard } from '@/utils'; +import { guard } from '@/utils'; import { pathFactory } from '@/router/pathFactory'; const Index: FC = () => { @@ -143,12 +143,10 @@ const Index: FC = () => {

-

- {escapeRemove(tagInfo.excerpt) || t('no_desc')} - - [{t('more')}] - -

+
{tagInfo.is_follower ? ( @@ -156,6 +154,11 @@ const Index: FC = () => { + + {t('wiki')} + @@ -163,11 +166,18 @@ const Index: FC = () => {
) : ( - +
+ + + {t('wiki')} + +
)}
From 1fe3b7d8fcc700bb3f107cecd09a0c7f3a777c8d Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Thu, 14 Nov 2024 14:39:29 +0800 Subject: [PATCH 10/40] refactor(gomock): update gomock dependence and docs --- Makefile | 11 +++-- README.md | 12 +++--- cmd/main.go | 2 +- ...lang-mock.txt => LICENSE-uber-go-mock.txt} | 0 go.mod | 2 +- go.sum | 11 +---- internal/cli/build.go | 2 +- internal/service/mock/siteinfo_repo_mock.go | 41 +++++++++++-------- .../siteinfo_common/siteinfo_service_test.go | 2 +- ui/template/sort-btns.html | 20 +++++++++ 10 files changed, 64 insertions(+), 39 deletions(-) rename docs/release/licenses/{LICENSE-golang-mock.txt => LICENSE-uber-go-mock.txt} (100%) diff --git a/Makefile b/Makefile index 0e398f933..a980a0473 100644 --- a/Makefile +++ b/Makefile @@ -21,15 +21,20 @@ universal: generate @rm -f ${BIN}_amd64 ${BIN}_arm64 generate: - @$(GO) get github.com/google/wire/cmd/wire@v0.5.0 - @$(GO) get github.com/golang/mock/mockgen@v1.6.0 @$(GO) get github.com/swaggo/swag/cmd/swag@v1.16.3 + @$(GO) get github.com/google/wire/cmd/wire@v0.5.0 + @$(GO) get go.uber.org/mock/mockgen@latest @$(GO) install github.com/swaggo/swag/cmd/swag@v1.16.3 @$(GO) install github.com/google/wire/cmd/wire@v0.5.0 - @$(GO) install github.com/golang/mock/mockgen@v1.6.0 + @$(GO) install go.uber.org/mock/mockgen@latest @$(GO) generate ./... @$(GO) mod tidy +check: + @mockgen -version + @swag -v + @wire flags + test: @$(GO) test ./internal/repo/repo_test diff --git a/README.md b/README.md index 351b5f673..4eb1cc7ce 100644 --- a/README.md +++ b/README.md @@ -40,20 +40,20 @@ You can also check out the [plugins here](https://answer.apache.org/plugins). ### Prerequisites -- Golang >= 1.18 +- Golang >= 1.22 - Node.js >= 16.17 - pnpm >= 8 -- mockgen >= 1.6.0 -- wire >= 0.5.0 +- [mockgen](https://github.com/uber-go/mock?tab=readme-ov-file#installation) >= 1.6.0 +- [wire](https://github.com/google/wire/) >= 0.5.0 ### Build ```bash -# install wire and mockgen for building +# Install wire and mockgen for building. You can run `make check` to check if they are installed. $ make generate -# install frontend dependencies and build +# Install frontend dependencies and build $ make ui -# install backend dependencies and build +# Install backend dependencies and build $ make build ``` diff --git a/cmd/main.go b/cmd/main.go index 20cdf0f5d..100c62619 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -49,7 +49,7 @@ var ( // Time is the build time of the project Time = "" // GoVersion is the go version of the project - GoVersion = "1.19" + GoVersion = "1.22" // log level logLevel = os.Getenv("LOG_LEVEL") // log path diff --git a/docs/release/licenses/LICENSE-golang-mock.txt b/docs/release/licenses/LICENSE-uber-go-mock.txt similarity index 100% rename from docs/release/licenses/LICENSE-golang-mock.txt rename to docs/release/licenses/LICENSE-uber-go-mock.txt diff --git a/go.mod b/go.mod index 34ceb7ad8..6d8e88911 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,6 @@ require ( github.com/go-playground/validator/v10 v10.22.1 github.com/go-sql-driver/mysql v1.8.1 github.com/goccy/go-json v0.10.3 - github.com/golang/mock v1.6.0 github.com/google/uuid v1.6.0 github.com/google/wire v0.5.0 github.com/grokify/html-strip-tags-go v0.1.0 @@ -57,6 +56,7 @@ require ( github.com/swaggo/swag v1.16.3 github.com/tidwall/gjson v1.17.3 github.com/yuin/goldmark v1.7.4 + go.uber.org/mock v0.5.0 golang.org/x/crypto v0.27.0 golang.org/x/image v0.20.0 golang.org/x/net v0.29.0 diff --git a/go.sum b/go.sum index 62b94f92c..446401f58 100644 --- a/go.sum +++ b/go.sum @@ -227,8 +227,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -640,7 +638,6 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= @@ -657,6 +654,8 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -703,7 +702,6 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= @@ -731,7 +729,6 @@ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= @@ -745,7 +742,6 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= @@ -774,8 +770,6 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -823,7 +817,6 @@ golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= diff --git a/internal/cli/build.go b/internal/cli/build.go index 6af13c7a2..bba075a97 100644 --- a/internal/cli/build.go +++ b/internal/cli/build.go @@ -62,7 +62,7 @@ func main() { ` goModTpl = `module answer -go 1.19 +go 1.22 ` ) diff --git a/internal/service/mock/siteinfo_repo_mock.go b/internal/service/mock/siteinfo_repo_mock.go index abc1fe072..42be1067d 100644 --- a/internal/service/mock/siteinfo_repo_mock.go +++ b/internal/service/mock/siteinfo_repo_mock.go @@ -19,6 +19,11 @@ // Code generated by MockGen. DO NOT EDIT. // Source: ./siteinfo_service.go +// +// Generated by this command: +// +// mockgen -source=./siteinfo_service.go -destination=../mock/siteinfo_repo_mock.go -package=mock +// // Package mock is a generated GoMock package. package mock @@ -29,13 +34,14 @@ import ( entity "github.com/apache/incubator-answer/internal/entity" schema "github.com/apache/incubator-answer/internal/schema" - gomock "github.com/golang/mock/gomock" + gomock "go.uber.org/mock/gomock" ) // MockSiteInfoRepo is a mock of SiteInfoRepo interface. type MockSiteInfoRepo struct { ctrl *gomock.Controller recorder *MockSiteInfoRepoMockRecorder + isgomock struct{} } // MockSiteInfoRepoMockRecorder is the mock recorder for MockSiteInfoRepo. @@ -66,7 +72,7 @@ func (m *MockSiteInfoRepo) GetByType(ctx context.Context, siteType string) (*ent } // GetByType indicates an expected call of GetByType. -func (mr *MockSiteInfoRepoMockRecorder) GetByType(ctx, siteType interface{}) *gomock.Call { +func (mr *MockSiteInfoRepoMockRecorder) GetByType(ctx, siteType any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByType", reflect.TypeOf((*MockSiteInfoRepo)(nil).GetByType), ctx, siteType) } @@ -80,7 +86,7 @@ func (m *MockSiteInfoRepo) SaveByType(ctx context.Context, siteType string, data } // SaveByType indicates an expected call of SaveByType. -func (mr *MockSiteInfoRepoMockRecorder) SaveByType(ctx, siteType, data interface{}) *gomock.Call { +func (mr *MockSiteInfoRepoMockRecorder) SaveByType(ctx, siteType, data any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveByType", reflect.TypeOf((*MockSiteInfoRepo)(nil).SaveByType), ctx, siteType, data) } @@ -89,6 +95,7 @@ func (mr *MockSiteInfoRepoMockRecorder) SaveByType(ctx, siteType, data interface type MockSiteInfoCommonService struct { ctrl *gomock.Controller recorder *MockSiteInfoCommonServiceMockRecorder + isgomock struct{} } // MockSiteInfoCommonServiceMockRecorder is the mock recorder for MockSiteInfoCommonService. @@ -117,7 +124,7 @@ func (m *MockSiteInfoCommonService) FormatAvatar(ctx context.Context, originalAv } // FormatAvatar indicates an expected call of FormatAvatar. -func (mr *MockSiteInfoCommonServiceMockRecorder) FormatAvatar(ctx, originalAvatarData, email, userStatus interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) FormatAvatar(ctx, originalAvatarData, email, userStatus any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FormatAvatar", reflect.TypeOf((*MockSiteInfoCommonService)(nil).FormatAvatar), ctx, originalAvatarData, email, userStatus) } @@ -131,7 +138,7 @@ func (m *MockSiteInfoCommonService) FormatListAvatar(ctx context.Context, userLi } // FormatListAvatar indicates an expected call of FormatListAvatar. -func (mr *MockSiteInfoCommonServiceMockRecorder) FormatListAvatar(ctx, userList interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) FormatListAvatar(ctx, userList any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FormatListAvatar", reflect.TypeOf((*MockSiteInfoCommonService)(nil).FormatListAvatar), ctx, userList) } @@ -146,7 +153,7 @@ func (m *MockSiteInfoCommonService) GetSiteBranding(ctx context.Context) (*schem } // GetSiteBranding indicates an expected call of GetSiteBranding. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteBranding(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteBranding(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteBranding", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteBranding), ctx) } @@ -161,7 +168,7 @@ func (m *MockSiteInfoCommonService) GetSiteCustomCssHTML(ctx context.Context) (* } // GetSiteCustomCssHTML indicates an expected call of GetSiteCustomCssHTML. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteCustomCssHTML(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteCustomCssHTML(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteCustomCssHTML", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteCustomCssHTML), ctx) } @@ -176,13 +183,13 @@ func (m *MockSiteInfoCommonService) GetSiteGeneral(ctx context.Context) (*schema } // GetSiteGeneral indicates an expected call of GetSiteGeneral. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteGeneral(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteGeneral(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteGeneral", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteGeneral), ctx) } // GetSiteInfoByType mocks base method. -func (m *MockSiteInfoCommonService) GetSiteInfoByType(ctx context.Context, siteType string, resp interface{}) error { +func (m *MockSiteInfoCommonService) GetSiteInfoByType(ctx context.Context, siteType string, resp any) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "GetSiteInfoByType", ctx, siteType, resp) ret0, _ := ret[0].(error) @@ -190,7 +197,7 @@ func (m *MockSiteInfoCommonService) GetSiteInfoByType(ctx context.Context, siteT } // GetSiteInfoByType indicates an expected call of GetSiteInfoByType. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteInfoByType(ctx, siteType, resp interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteInfoByType(ctx, siteType, resp any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteInfoByType", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteInfoByType), ctx, siteType, resp) } @@ -205,7 +212,7 @@ func (m *MockSiteInfoCommonService) GetSiteInterface(ctx context.Context) (*sche } // GetSiteInterface indicates an expected call of GetSiteInterface. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteInterface(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteInterface(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteInterface", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteInterface), ctx) } @@ -220,7 +227,7 @@ func (m *MockSiteInfoCommonService) GetSiteLegal(ctx context.Context) (*schema.S } // GetSiteLegal indicates an expected call of GetSiteLegal. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteLegal(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteLegal(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteLegal", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteLegal), ctx) } @@ -235,7 +242,7 @@ func (m *MockSiteInfoCommonService) GetSiteLogin(ctx context.Context) (*schema.S } // GetSiteLogin indicates an expected call of GetSiteLogin. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteLogin(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteLogin(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteLogin", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteLogin), ctx) } @@ -250,7 +257,7 @@ func (m *MockSiteInfoCommonService) GetSiteSeo(ctx context.Context) (*schema.Sit } // GetSiteSeo indicates an expected call of GetSiteSeo. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteSeo(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteSeo(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteSeo", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteSeo), ctx) } @@ -265,7 +272,7 @@ func (m *MockSiteInfoCommonService) GetSiteTheme(ctx context.Context) (*schema.S } // GetSiteTheme indicates an expected call of GetSiteTheme. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteTheme(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteTheme(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteTheme", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteTheme), ctx) } @@ -280,7 +287,7 @@ func (m *MockSiteInfoCommonService) GetSiteUsers(ctx context.Context) (*schema.S } // GetSiteUsers indicates an expected call of GetSiteUsers. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteUsers(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteUsers(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteUsers", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteUsers), ctx) } @@ -295,7 +302,7 @@ func (m *MockSiteInfoCommonService) GetSiteWrite(ctx context.Context) (*schema.S } // GetSiteWrite indicates an expected call of GetSiteWrite. -func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteWrite(ctx interface{}) *gomock.Call { +func (mr *MockSiteInfoCommonServiceMockRecorder) GetSiteWrite(ctx any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSiteWrite", reflect.TypeOf((*MockSiteInfoCommonService)(nil).GetSiteWrite), ctx) } diff --git a/internal/service/siteinfo_common/siteinfo_service_test.go b/internal/service/siteinfo_common/siteinfo_service_test.go index bda2f3683..387e1e2f0 100644 --- a/internal/service/siteinfo_common/siteinfo_service_test.go +++ b/internal/service/siteinfo_common/siteinfo_service_test.go @@ -26,8 +26,8 @@ import ( "github.com/apache/incubator-answer/internal/base/constant" "github.com/apache/incubator-answer/internal/entity" "github.com/apache/incubator-answer/internal/service/mock" - "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" + "go.uber.org/mock/gomock" ) var ( diff --git a/ui/template/sort-btns.html b/ui/template/sort-btns.html index 7da3485c1..3ea41ec2c 100644 --- a/ui/template/sort-btns.html +++ b/ui/template/sort-btns.html @@ -1,3 +1,23 @@ + {{define "sort-btns"}}
From f29b43b956659395133ee43c3d5501ae92d52cfe Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Thu, 14 Nov 2024 14:42:31 +0800 Subject: [PATCH 11/40] feat(file): update the max image size --- pkg/checker/file_type.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/checker/file_type.go b/pkg/checker/file_type.go index 6c61dca2f..fffcd960c 100644 --- a/pkg/checker/file_type.go +++ b/pkg/checker/file_type.go @@ -35,7 +35,7 @@ import ( ) const ( - maxImageSize = 8192 * 8192 + maxImageSize = 16384 * 16384 ) // IsSupportedImageFile currently answers support image type is From e7ee4ea91d3d6022fd4494b9817fbeb9e7a31ae2 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Thu, 14 Nov 2024 15:22:55 +0800 Subject: [PATCH 12/40] fix(review): reject the review when delete question --- cmd/wire_gen.go | 2 +- internal/repo/review/review_repo.go | 10 ++++++++++ internal/service/content/question_service.go | 12 ++++++++++++ internal/service/review/review_service.go | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go index 801c5a776..5e4d395b0 100644 --- a/cmd/wire_gen.go +++ b/cmd/wire_gen.go @@ -202,7 +202,7 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database, externalNotificationService := notification.NewExternalNotificationService(dataData, userNotificationConfigRepo, followRepo, emailService, userRepo, externalNotificationQueueService, userExternalLoginRepo, siteInfoCommonService) reviewRepo := review.NewReviewRepo(dataData) reviewService := review2.NewReviewService(reviewRepo, objService, userCommon, userRepo, questionRepo, answerRepo, userRoleRelService, externalNotificationQueueService, tagCommonService, questionCommon, notificationQueueService, siteInfoCommonService) - questionService := content.NewQuestionService(activityRepo, questionRepo, answerRepo, tagCommonService, tagService, questionCommon, userCommon, userRepo, userRoleRelService, revisionService, metaCommonService, collectionCommon, answerActivityService, emailService, notificationQueueService, externalNotificationQueueService, activityQueueService, siteInfoCommonService, externalNotificationService, reviewService, configService, eventQueueService) + questionService := content.NewQuestionService(activityRepo, questionRepo, answerRepo, tagCommonService, tagService, questionCommon, userCommon, userRepo, userRoleRelService, revisionService, metaCommonService, collectionCommon, answerActivityService, emailService, notificationQueueService, externalNotificationQueueService, activityQueueService, siteInfoCommonService, externalNotificationService, reviewService, configService, eventQueueService, reviewRepo) answerService := content.NewAnswerService(answerRepo, questionRepo, questionCommon, userCommon, collectionCommon, userRepo, revisionService, answerActivityService, answerCommon, voteRepo, emailService, userRoleRelService, notificationQueueService, externalNotificationQueueService, activityQueueService, reviewService, eventQueueService) reportHandle := report_handle.NewReportHandle(questionService, answerService, commentService) reportService := report2.NewReportService(reportRepo, objService, userCommon, answerRepo, questionRepo, commentCommonRepo, reportHandle, configService, eventQueueService) diff --git a/internal/repo/review/review_repo.go b/internal/repo/review/review_repo.go index 91bc046c5..c87c814c3 100644 --- a/internal/repo/review/review_repo.go +++ b/internal/repo/review/review_repo.go @@ -72,6 +72,16 @@ func (cr *reviewRepo) GetReview(ctx context.Context, reviewID int) ( return } +// GetReviewByObject get review by object +func (cr *reviewRepo) GetReviewByObject(ctx context.Context, objectID string) (review *entity.Review, exist bool, err error) { + review = &entity.Review{} + exist, err = cr.data.DB.Context(ctx).Desc("id").Where("object_id = ?", objectID).Get(review) + if err != nil { + err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + return +} + // GetReviewCount get review count func (cr *reviewRepo) GetReviewCount(ctx context.Context, status int) (count int64, err error) { count, err = cr.data.DB.Context(ctx).Count(&entity.Review{Status: status}) diff --git a/internal/service/content/question_service.go b/internal/service/content/question_service.go index 51f0da9b5..145f7da1b 100644 --- a/internal/service/content/question_service.go +++ b/internal/service/content/question_service.go @@ -91,6 +91,7 @@ type QuestionService struct { reviewService *review.ReviewService configService *config.ConfigService eventQueueService event_queue.EventQueueService + reviewRepo review.ReviewRepo } func NewQuestionService( @@ -116,6 +117,7 @@ func NewQuestionService( reviewService *review.ReviewService, configService *config.ConfigService, eventQueueService event_queue.EventQueueService, + reviewRepo review.ReviewRepo, ) *QuestionService { return &QuestionService{ activityRepo: activityRepo, @@ -140,6 +142,7 @@ func NewQuestionService( reviewService: reviewService, configService: configService, eventQueueService: eventQueueService, + reviewRepo: reviewRepo, } } @@ -559,6 +562,15 @@ func (qs *QuestionService) RemoveQuestion(ctx context.Context, req *schema.Remov } } + // If this question has been reviewed, then delete the review. + reviewInfo, exist, err := qs.reviewRepo.GetReviewByObject(ctx, questionInfo.ID) + if exist && err == nil { + err = qs.reviewRepo.UpdateReviewStatus(ctx, reviewInfo.ID, req.UserID, entity.ReviewStatusRejected) + if err != nil { + return errors.InternalServer(reason.DatabaseError) + } + } + //tag count tagIDs := make([]string, 0) Tags, tagerr := qs.tagCommon.GetObjectEntityTag(ctx, req.ID) diff --git a/internal/service/review/review_service.go b/internal/service/review/review_service.go index fb323178e..dadf58ab2 100644 --- a/internal/service/review/review_service.go +++ b/internal/service/review/review_service.go @@ -49,6 +49,7 @@ type ReviewRepo interface { AddReview(ctx context.Context, review *entity.Review) (err error) UpdateReviewStatus(ctx context.Context, reviewID int, reviewerUserID string, status int) (err error) GetReview(ctx context.Context, reviewID int) (review *entity.Review, exist bool, err error) + GetReviewByObject(ctx context.Context, objectID string) (review *entity.Review, exist bool, err error) GetReviewCount(ctx context.Context, status int) (count int64, err error) GetReviewPage(ctx context.Context, page, pageSize int, cond *entity.Review) (reviewList []*entity.Review, total int64, err error) } From ad956d686ef594b9560bd404e8e7af4bcf3ab03e Mon Sep 17 00:00:00 2001 From: sy-records <52o@qq52o.cn> Date: Thu, 14 Nov 2024 15:45:31 +0800 Subject: [PATCH 13/40] fix: Markdown parsing without incrementing ordered list numbers --- pkg/converter/markdown.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/converter/markdown.go b/pkg/converter/markdown.go index af17d9bdc..082a198aa 100644 --- a/pkg/converter/markdown.go +++ b/pkg/converter/markdown.go @@ -60,6 +60,7 @@ func Markdown2HTML(source string) string { filter.RequireNoFollowOnFullyQualifiedLinks(false) filter.AllowElements("kbd") filter.AllowAttrs("title").Matching(regexp.MustCompile(`^[\p{L}\p{N}\s\-_',\[\]!\./\\\(\)]*$|^@embed?$`)).Globally() + filter.AllowAttrs("start").OnElements("ol") html = filter.Sanitize(html) return html } From 241d6f4c37e2a915bc988c033a06c78fa920b83b Mon Sep 17 00:00:00 2001 From: shuai Date: Thu, 14 Nov 2024 16:19:27 +0800 Subject: [PATCH 14/40] feat: actions add toast tips --- i18n/en_US.yaml | 13 ++++++++++++ .../Admin/Answers/components/Action/index.tsx | 9 +++++++++ ui/src/pages/Admin/Badges/index.tsx | 9 +++++++++ .../Questions/components/Action/index.tsx | 20 +++++++++++++++++-- .../Admin/Users/components/Action/index.tsx | 13 +++++++++++- ui/src/pages/Admin/Users/index.tsx | 6 +++++- 6 files changed, 66 insertions(+), 4 deletions(-) diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml index 9074c8a19..cea0c12fe 100644 --- a/i18n/en_US.yaml +++ b/i18n/en_US.yaml @@ -2250,6 +2250,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2258,3 +2259,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/ui/src/pages/Admin/Answers/components/Action/index.tsx b/ui/src/pages/Admin/Answers/components/Action/index.tsx index 7dc3bb33b..81e21813d 100644 --- a/ui/src/pages/Admin/Answers/components/Action/index.tsx +++ b/ui/src/pages/Admin/Answers/components/Action/index.tsx @@ -23,6 +23,7 @@ import { Link } from 'react-router-dom'; import { Icon, Modal } from '@/components'; import { changeAnswerStatus } from '@/services'; +import { toastStore } from '@/stores'; const AnswerActions = ({ itemData, curFilter, refreshList }) => { const { t } = useTranslation('translation', { keyPrefix: 'delete' }); @@ -37,6 +38,10 @@ const AnswerActions = ({ itemData, curFilter, refreshList }) => { confirmText: t('delete', { keyPrefix: 'btns' }), onConfirm: () => { changeAnswerStatus(itemData.id, 'deleted').then(() => { + toastStore.getState().show({ + msg: t('answer_deleted', { keyPrefix: 'messages' }), + variant: 'success', + }); refreshList(); }); }, @@ -52,6 +57,10 @@ const AnswerActions = ({ itemData, curFilter, refreshList }) => { confirmText: t('undelete', { keyPrefix: 'btns' }), onConfirm: () => { changeAnswerStatus(itemData.id, 'available').then(() => { + toastStore.getState().show({ + msg: t('answer_cancel_deleted', { keyPrefix: 'messages' }), + variant: 'success', + }); refreshList(); }); }, diff --git a/ui/src/pages/Admin/Badges/index.tsx b/ui/src/pages/Admin/Badges/index.tsx index 99bafb432..63b8f348d 100644 --- a/ui/src/pages/Admin/Badges/index.tsx +++ b/ui/src/pages/Admin/Badges/index.tsx @@ -27,6 +27,7 @@ import classNames from 'classnames'; import { Empty, Icon, Pagination, QueryGroup } from '@/components'; import * as Type from '@/common/interface'; import { useQueryBadges, updateBadgeStatus } from '@/services/admin/badges'; +import { useToast } from '@/hooks'; import Action from './components/Action'; @@ -46,6 +47,7 @@ const Badges: FC = () => { const curPage = Number(urlSearchParams.get('page') || '1'); const curFilter = urlSearchParams.get('filter') || BadgeFilterKeys[0]; const curQuery = urlSearchParams.get('query') || ''; + const Toast = useToast(); const { data, isLoading, mutate } = useQueryBadges({ page: curPage, @@ -62,6 +64,13 @@ const Badges: FC = () => { const handleBadgeStatus = (badgeId, status) => { updateBadgeStatus({ id: badgeId, status }).then(() => { + Toast.onShow({ + msg: + status === 'inactive' + ? t('badge_inactivated', { keyPrefix: 'messages' }) + : t('badge_activated', { keyPrefix: 'messages' }), + variant: 'success', + }); mutate(); }); }; diff --git a/ui/src/pages/Admin/Questions/components/Action/index.tsx b/ui/src/pages/Admin/Questions/components/Action/index.tsx index 0dc1fefa3..560d6e698 100644 --- a/ui/src/pages/Admin/Questions/components/Action/index.tsx +++ b/ui/src/pages/Admin/Questions/components/Action/index.tsx @@ -28,11 +28,19 @@ import { reopenQuestion, } from '@/services'; import { useReportModal, useToast } from '@/hooks'; +import { toastStore } from '@/stores'; const AnswerActions = ({ itemData, refreshList, curFilter, show, pin }) => { const { t } = useTranslation('translation', { keyPrefix: 'delete' }); - const closeModal = useReportModal(refreshList); const toast = useToast(); + const closeCallback = () => { + toastStore.getState().show({ + msg: t('post_closed', { keyPrefix: 'messages' }), + variant: 'success', + }); + refreshList(); + }; + const closeModal = useReportModal(closeCallback); const handleAction = (type) => { if (type === 'delete') { @@ -47,6 +55,10 @@ const AnswerActions = ({ itemData, refreshList, curFilter, show, pin }) => { confirmText: t('delete', { keyPrefix: 'btns' }), onConfirm: () => { changeQuestionStatus(itemData.id, 'deleted').then(() => { + toastStore.getState().show({ + msg: t('post_deleted', { keyPrefix: 'messages' }), + variant: 'success', + }); refreshList(); }); }, @@ -62,6 +74,10 @@ const AnswerActions = ({ itemData, refreshList, curFilter, show, pin }) => { confirmText: t('undelete', { keyPrefix: 'btns' }), onConfirm: () => { changeQuestionStatus(itemData.id, 'available').then(() => { + toastStore.getState().show({ + msg: t('post_cancel_deleted', { keyPrefix: 'messages' }), + variant: 'success', + }); refreshList(); }); }, @@ -86,7 +102,7 @@ const AnswerActions = ({ itemData, refreshList, curFilter, show, pin }) => { reopenQuestion({ question_id: itemData.id, }).then(() => { - toast.onShow({ + toastStore.getState().show({ msg: t('post_reopen', { keyPrefix: 'messages' }), variant: 'success', }); diff --git a/ui/src/pages/Admin/Users/components/Action/index.tsx b/ui/src/pages/Admin/Users/components/Action/index.tsx index fa79c24df..9f0847a21 100644 --- a/ui/src/pages/Admin/Users/components/Action/index.tsx +++ b/ui/src/pages/Admin/Users/components/Action/index.tsx @@ -33,6 +33,7 @@ import { changeUserStatus, updateUserProfile, } from '@/services'; +import { toastStore } from '@/stores'; interface Props { showActionPassword?: boolean; @@ -57,7 +58,13 @@ const UserOperation = ({ const Toast = useToast(); const changeUserRoleModal = useChangeUserRoleModal({ - callback: refreshUsers, + callback: () => { + Toast.onShow({ + msg: t('change_user_role', { keyPrefix: 'messages' }), + variant: 'success', + }); + refreshUsers?.(); + }, }); const changePasswordModal = useChangePasswordModal({ onConfirm: (rd) => { @@ -107,6 +114,10 @@ const UserOperation = ({ user_id: userData.user_id, status: statusType, }).then(() => { + toastStore.getState().show({ + msg: t(`user_${statusType}`, { keyPrefix: 'messages' }), + variant: 'success', + }); refreshUsers?.(); // onClose(); }); diff --git a/ui/src/pages/Admin/Users/index.tsx b/ui/src/pages/Admin/Users/index.tsx index cfabd20a6..40152200d 100644 --- a/ui/src/pages/Admin/Users/index.tsx +++ b/ui/src/pages/Admin/Users/index.tsx @@ -33,6 +33,7 @@ import { } from '@/components'; import * as Type from '@/common/interface'; import { useUserModal } from '@/hooks'; +import { toastStore, loggedUserInfoStore, userCenterStore } from '@/stores'; import { useQueryUsers, addUsers, @@ -40,7 +41,6 @@ import { AdminUcAgent, changeUserStatus, } from '@/services'; -import { loggedUserInfoStore, userCenterStore } from '@/stores'; import { formatCount } from '@/utils'; import DeleteUserModal from './components/DeleteUserModal'; @@ -139,6 +139,10 @@ const Users: FC = () => { status: 'deleted', remove_all_content: val, }).then(() => { + toastStore.getState().show({ + msg: t('user_deleted', { keyPrefix: 'messages' }), + variant: 'success', + }); changeDeleteUserModalState({ show: false, userId: '', From 9df9f7a12d796c3f3e713fea3854c47d7b9a5df1 Mon Sep 17 00:00:00 2001 From: Sonui Date: Thu, 14 Nov 2024 23:02:23 +0800 Subject: [PATCH 15/40] perf: add note to email body --- i18n/en_US.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml index cea0c12fe..6f3f5215e 100644 --- a/i18n/en_US.yaml +++ b/i18n/en_US.yaml @@ -465,42 +465,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
\n
{{.ChangeEmailUrl}}

\n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
\n{{.ChangeEmailUrl}}

\n\nIf you did not request this change, please ignore this email.

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
{{.AnswerSummary}}

\nView it on {{.SiteName}}

\n\n--
\nUnsubscribe" + other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
{{.AnswerSummary}}

\nView it on {{.SiteName}}

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

\n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
I think you may know the answer.

\nView it on {{.SiteName}}

\n\n--
\nUnsubscribe" + other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
I think you may know the answer.

\nView it on {{.SiteName}}

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

\n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
{{.CommentSummary}}

\nView it on {{.SiteName}}

\n\n--
\nUnsubscribe" + other: "{{.QuestionTitle}}

\n\n{{.DisplayName}}:
\n
{{.CommentSummary}}

\nView it on {{.SiteName}}

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

\n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
\n{{.Tags}}

\n\n--
\nUnsubscribe" + other: "{{.QuestionTitle}}
\n{{.Tags}}

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

\n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

\n\nIf it was not you, you can safely ignore this email.

\n\nClick the following link to choose a new password:
\n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

\n\nIf it was not you, you can safely ignore this email.

\n\nClick the following link to choose a new password:
\n{{.PassResetUrl}}\n

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

\n\nClick the following link to confirm and activate your new account:
\n{{.RegisterUrl}}

\n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

\n\nClick the following link to confirm and activate your new account:
\n{{.RegisterUrl}}

\n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

\n\n--
\nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote From 98eceff5494a2114cbe0c2846785320acc14addc Mon Sep 17 00:00:00 2001 From: sy-records <52o@qq52o.cn> Date: Thu, 14 Nov 2024 17:37:43 +0800 Subject: [PATCH 16/40] feat: Add key metrics to the dashboard --- i18n/en_US.yaml | 2 ++ i18n/zh_CN.yaml | 2 ++ internal/repo/question/question_repo.go | 23 +++++++++++++++ internal/schema/dashboard_schema.go | 4 +++ .../service/dashboard/dashboard_service.go | 29 ++++++++++++++++++- internal/service/question_common/question.go | 2 ++ ui/src/common/interface.ts | 4 +++ .../Dashboard/components/Statistics/index.tsx | 22 ++++++++++++++ 8 files changed, 87 insertions(+), 1 deletion(-) diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml index 6f3f5215e..775d7456a 100644 --- a/i18n/en_US.yaml +++ b/i18n/en_US.yaml @@ -1762,6 +1762,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Questions:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Answers:" comments: "Comments:" votes: "Votes:" diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml index 855819689..d0feebb92 100644 --- a/i18n/zh_CN.yaml +++ b/i18n/zh_CN.yaml @@ -1722,6 +1722,8 @@ ui: welcome: 欢迎来到管理后台! site_statistics: 站点统计 questions: "问题:" + resolved: "已解决:" + unanswered: "未回复:" answers: "回答:" comments: "评论:" votes: "投票:" diff --git a/internal/repo/question/question_repo.go b/internal/repo/question/question_repo.go index 16b6085f6..1132501ed 100644 --- a/internal/repo/question/question_repo.go +++ b/internal/repo/question/question_repo.go @@ -284,6 +284,29 @@ func (qr *questionRepo) GetQuestionCount(ctx context.Context) (count int64, err return count, nil } +func (qr *questionRepo) GetUnansweredQuestionCount(ctx context.Context) (count int64, err error) { + session := qr.data.DB.Context(ctx) + session.Where(builder.Lt{"status": entity.QuestionStatusDeleted}). + And(builder.Eq{"answer_count": 0}) + count, err = session.Count(&entity.Question{Show: entity.QuestionShow}) + if err != nil { + return 0, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + return count, nil +} + +func (qr *questionRepo) GetResolvedQuestionCount(ctx context.Context) (count int64, err error) { + session := qr.data.DB.Context(ctx) + session.Where(builder.Lt{"status": entity.QuestionStatusDeleted}). + And(builder.Neq{"answer_count": 0}). + And(builder.Neq{"accepted_answer_id": 0}) + count, err = session.Count(&entity.Question{Show: entity.QuestionShow}) + if err != nil { + return 0, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + return count, nil +} + func (qr *questionRepo) GetUserQuestionCount(ctx context.Context, userID string, show int) (count int64, err error) { session := qr.data.DB.Context(ctx) session.Where(builder.Lt{"status": entity.QuestionStatusDeleted}) diff --git a/internal/schema/dashboard_schema.go b/internal/schema/dashboard_schema.go index 2d780b8cb..c2c7677d0 100644 --- a/internal/schema/dashboard_schema.go +++ b/internal/schema/dashboard_schema.go @@ -30,6 +30,10 @@ const ( type DashboardInfo struct { QuestionCount int64 `json:"question_count"` + ResolvedCount int64 `json:"resolved_count"` + ResolvedRate string `json:"resolved_rate"` + UnansweredCount int64 `json:"unanswered_count"` + UnansweredRate string `json:"unanswered_rate"` AnswerCount int64 `json:"answer_count"` CommentCount int64 `json:"comment_count"` VoteCount int64 `json:"vote_count"` diff --git a/internal/service/dashboard/dashboard_service.go b/internal/service/dashboard/dashboard_service.go index 67abc2a7c..ebc9a79d5 100644 --- a/internal/service/dashboard/dashboard_service.go +++ b/internal/service/dashboard/dashboard_service.go @@ -103,7 +103,6 @@ func (ds *dashboardService) Statistical(ctx context.Context) (*schema.DashboardI dashboardInfo := ds.getFromCache(ctx) if dashboardInfo == nil { dashboardInfo = &schema.DashboardInfo{} - dashboardInfo.QuestionCount = ds.questionCount(ctx) dashboardInfo.AnswerCount = ds.answerCount(ctx) dashboardInfo.CommentCount = ds.commentCount(ctx) dashboardInfo.UserCount = ds.userCount(ctx) @@ -121,6 +120,18 @@ func (ds *dashboardService) Statistical(ctx context.Context) (*schema.DashboardI dashboardInfo.DatabaseSize = ds.GetDatabaseSize() } + dashboardInfo.QuestionCount = ds.questionCount(ctx) + dashboardInfo.UnansweredCount = ds.unansweredQuestionCount(ctx) + dashboardInfo.ResolvedCount = ds.resolvedQuestionCount(ctx) + + if dashboardInfo.QuestionCount == 0 { + dashboardInfo.ResolvedRate = "0.00" + dashboardInfo.UnansweredRate = "0.00" + } else { + dashboardInfo.ResolvedRate = fmt.Sprintf("%.2f", float64(dashboardInfo.ResolvedCount)/float64(dashboardInfo.QuestionCount)*100) + dashboardInfo.UnansweredRate = fmt.Sprintf("%.2f", float64(dashboardInfo.UnansweredCount)/float64(dashboardInfo.QuestionCount)*100) + } + dashboardInfo.ReportCount = ds.reportCount(ctx) dashboardInfo.SMTP = ds.smtpStatus(ctx) dashboardInfo.HTTPS = ds.httpsStatus(ctx) @@ -170,6 +181,22 @@ func (ds *dashboardService) questionCount(ctx context.Context) int64 { return questionCount } +func (ds *dashboardService) unansweredQuestionCount(ctx context.Context) int64 { + unansweredQuestionCount, err := ds.questionRepo.GetUnansweredQuestionCount(ctx) + if err != nil { + log.Errorf("get unanswered question count failed: %s", err) + } + return unansweredQuestionCount +} + +func (ds *dashboardService) resolvedQuestionCount(ctx context.Context) int64 { + resolvedQuestionCount, err := ds.questionRepo.GetResolvedQuestionCount(ctx) + if err != nil { + log.Errorf("get resolved question count failed: %s", err) + } + return resolvedQuestionCount +} + func (ds *dashboardService) answerCount(ctx context.Context) int64 { answerCount, err := ds.answerRepo.GetAnswerCount(ctx) if err != nil { diff --git a/internal/service/question_common/question.go b/internal/service/question_common/question.go index 13df33896..08c74f295 100644 --- a/internal/service/question_common/question.go +++ b/internal/service/question_common/question.go @@ -74,6 +74,8 @@ type QuestionRepo interface { FindByID(ctx context.Context, id []string) (questionList []*entity.Question, err error) AdminQuestionPage(ctx context.Context, search *schema.AdminQuestionPageReq) ([]*entity.Question, int64, error) GetQuestionCount(ctx context.Context) (count int64, err error) + GetUnansweredQuestionCount(ctx context.Context) (count int64, err error) + GetResolvedQuestionCount(ctx context.Context) (count int64, err error) GetUserQuestionCount(ctx context.Context, userID string, show int) (count int64, err error) SitemapQuestions(ctx context.Context, page, pageSize int) (questionIDList []*schema.SiteMapQuestionInfo, err error) RemoveAllUserQuestion(ctx context.Context, userID string) (err error) diff --git a/ui/src/common/interface.ts b/ui/src/common/interface.ts index 8a933471b..903c5c284 100644 --- a/ui/src/common/interface.ts +++ b/ui/src/common/interface.ts @@ -524,6 +524,10 @@ export interface SearchRes extends ListResult { export interface AdminDashboard { info: { question_count: number; + resolved_count: number; + resolved_rate: string; + unanswered_count: number; + unanswered_rate: string; answer_count: number; comment_count: number; vote_count: number; diff --git a/ui/src/pages/Admin/Dashboard/components/Statistics/index.tsx b/ui/src/pages/Admin/Dashboard/components/Statistics/index.tsx index c95eaba7a..a3077ba49 100644 --- a/ui/src/pages/Admin/Dashboard/components/Statistics/index.tsx +++ b/ui/src/pages/Admin/Dashboard/components/Statistics/index.tsx @@ -39,6 +39,28 @@ const Statistics: FC = ({ data }) => { {t('questions')} {data.question_count} + + {t('resolved')} + {data.resolved_count} + {data.resolved_count > 0 ? ( + + ({data.resolved_rate}%) + + ) : ( + '' + )} + + + {t('unanswered')} + {data.unanswered_count} + {data.unanswered_count > 0 ? ( + + ({data.unanswered_rate}%) + + ) : ( + '' + )} + {t('answers')} {data.answer_count} From 5060e08771f4a99940a431b5d641af3e391d634d Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Mon, 18 Nov 2024 16:05:01 +0800 Subject: [PATCH 17/40] fix(search): fix the wrong offset when searching --- internal/repo/search_common/search_repo.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/internal/repo/search_common/search_repo.go b/internal/repo/search_common/search_repo.go index cd7de6960..1c4f04ab5 100644 --- a/internal/repo/search_common/search_repo.go +++ b/internal/repo/search_common/search_repo.go @@ -99,7 +99,7 @@ func NewSearchRepo( } // SearchContents search question and answer data -func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs [][]string, userID string, votes int, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) { +func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs [][]string, userID string, votes int, page, pageSize int, order string) (resp []*schema.SearchResult, total int64, err error) { words = filterWords(words) var ( @@ -206,7 +206,8 @@ func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs return } - querySQL, _, err := builder.MySQL().Select("*").From(sql, "t").OrderBy(sr.parseOrder(ctx, order)).Limit(size, page-1).ToSQL() + startNum := (page - 1) * pageSize + querySQL, _, err := builder.MySQL().Select("*").From(sql, "t").OrderBy(sr.parseOrder(ctx, order)).Limit(pageSize, startNum).ToSQL() if err != nil { return } @@ -241,7 +242,7 @@ func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs } // SearchQuestions search question data -func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagIDs [][]string, notAccepted bool, views, answers int, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) { +func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagIDs [][]string, notAccepted bool, views, answers int, page, pageSize int, order string) (resp []*schema.SearchResult, total int64, err error) { words = filterWords(words) var ( qfs = qFields @@ -320,7 +321,8 @@ func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagID return } - querySQL, _, err := b.OrderBy(sr.parseOrder(ctx, order)).Limit(size, page-1).ToSQL() + startNum := (page - 1) * pageSize + querySQL, _, err := b.OrderBy(sr.parseOrder(ctx, order)).Limit(pageSize, startNum).ToSQL() if err != nil { return } @@ -351,7 +353,7 @@ func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagID } // SearchAnswers search answer data -func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, tagIDs [][]string, accepted bool, questionID string, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) { +func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, tagIDs [][]string, accepted bool, questionID string, page, pageSize int, order string) (resp []*schema.SearchResult, total int64, err error) { words = filterWords(words) var ( @@ -415,7 +417,8 @@ func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, tagIDs return } - querySQL, _, err := b.OrderBy(sr.parseOrder(ctx, order)).Limit(size, page-1).ToSQL() + startNum := (page - 1) * pageSize + querySQL, _, err := b.OrderBy(sr.parseOrder(ctx, order)).Limit(pageSize, startNum).ToSQL() if err != nil { return } From 655a7e48e0168bfc07d6eb0d906cc1de64f5a5e2 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Tue, 19 Nov 2024 18:01:38 +0800 Subject: [PATCH 18/40] feat(question): add linked count feature to question --- internal/entity/question_entity.go | 1 + internal/migrations/migrations.go | 1 + internal/migrations/v24.go | 34 +++++++++++++++++ internal/repo/question/question_repo.go | 40 ++++++++++++++++++++ internal/schema/question_schema.go | 4 +- internal/service/question_common/question.go | 23 +++++++++++ 6 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 internal/migrations/v24.go diff --git a/internal/entity/question_entity.go b/internal/entity/question_entity.go index 1931282c9..9e5dcd112 100644 --- a/internal/entity/question_entity.go +++ b/internal/entity/question_entity.go @@ -73,6 +73,7 @@ type Question struct { LastAnswerID string `xorm:"not null default 0 BIGINT(20) last_answer_id"` PostUpdateTime time.Time `xorm:"post_update_time TIMESTAMP"` RevisionID string `xorm:"not null default 0 BIGINT(20) revision_id"` + LinkedCount int `xorm:"not null default 0 INT(11) linked_count"` } // TableName question table name diff --git a/internal/migrations/migrations.go b/internal/migrations/migrations.go index 81a54ae76..00e441985 100644 --- a/internal/migrations/migrations.go +++ b/internal/migrations/migrations.go @@ -99,6 +99,7 @@ var migrations = []Migration{ NewMigration("v1.3.6", "add hot score to question table", addQuestionHotScore, true), NewMigration("v1.4.0", "add badge/badge_group/badge_award table", addBadges, true), NewMigration("v1.4.1", "add question link", addQuestionLink, true), + NewMigration("v1.4.2", "add the number of question links", addQuestionLinkedCount, false), } func GetMigrations() []Migration { diff --git a/internal/migrations/v24.go b/internal/migrations/v24.go new file mode 100644 index 000000000..015352ae5 --- /dev/null +++ b/internal/migrations/v24.go @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package migrations + +import ( + "context" + "github.com/apache/incubator-answer/internal/entity" + + "xorm.io/xorm" +) + +func addQuestionLinkedCount(ctx context.Context, x *xorm.Engine) error { + type Question struct { + LinkedCount int `xorm:"not null default 0 INT(11) linked_count"` + } + return x.Context(ctx).Sync(new(entity.Question)) +} diff --git a/internal/repo/question/question_repo.go b/internal/repo/question/question_repo.go index 1132501ed..e1d94f2ea 100644 --- a/internal/repo/question/question_repo.go +++ b/internal/repo/question/question_repo.go @@ -410,6 +410,8 @@ func (qr *questionRepo) GetQuestionPage(ctx context.Context, page, pageSize int, case "unanswered": session.Where("question.answer_count = 0") session.OrderBy("question.pin desc,question.created_at DESC") + case "frequent": + session.OrderBy("question.pin DESC, question.linked_count DESC") } total, err = pager.Help(page, pageSize, &questionList, &entity.Question{}, session) @@ -708,6 +710,42 @@ func (qr *questionRepo) LinkQuestion(ctx context.Context, link ...*entity.Questi return } +// UpdateQuestionLinkCount update question link count +func (qr *questionRepo) UpdateQuestionLinkCount(ctx context.Context, questionID string) (err error) { + // count the number of links + count, err := qr.data.DB.Context(ctx). + Where("to_question_id = ?", questionID). + Where("status = ?", entity.QuestionLinkStatusAvailable). + Count(&entity.QuestionLink{}) + if err != nil { + return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + + // update the number of links + _, err = qr.data.DB.Context(ctx).ID(questionID). + Cols("linked_count").Update(&entity.Question{LinkedCount: int(count)}) + if err != nil { + return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + return +} + +// GetLinkedQuestionIDs get linked question ids +func (qr *questionRepo) GetLinkedQuestionIDs(ctx context.Context, questionID string, status int) ( + questionIDs []string, err error) { + questionIDs = make([]string, 0) + err = qr.data.DB.Context(ctx). + Select("to_question_id"). + Table(new(entity.QuestionLink).TableName()). + Where("from_question_id = ?", questionID). + Where("status = ?", status). + Find(&questionIDs) + if err != nil { + return nil, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + return questionIDs, nil +} + // RecoverQuestionLink batch recover question link func (qr *questionRepo) RecoverQuestionLink(ctx context.Context, links ...*entity.QuestionLink) (err error) { return qr.UpdateQuestionLinkStatus(ctx, entity.QuestionLinkStatusAvailable, links...) @@ -784,6 +822,8 @@ func (qr *questionRepo) GetQuestionLink(ctx context.Context, page, pageSize int, case "unanswered": session.Where("question.answer_count = 0") session.OrderBy("question.pin desc,question.created_at DESC") + case "frequent": + session.OrderBy("question.pin DESC, question.linked_count DESC") } if page > 0 && pageSize > 0 { diff --git a/internal/schema/question_schema.go b/internal/schema/question_schema.go index de19a8a55..accc3374f 100644 --- a/internal/schema/question_schema.go +++ b/internal/schema/question_schema.go @@ -356,7 +356,7 @@ const ( type QuestionPageReq struct { Page int `validate:"omitempty,min=1" form:"page"` PageSize int `validate:"omitempty,min=1" form:"page_size"` - OrderCond string `validate:"omitempty,oneof=newest active hot score unanswered recommend" form:"order"` + OrderCond string `validate:"omitempty,oneof=newest active hot score unanswered recommend frequent" form:"order"` Tag string `validate:"omitempty,gt=0,lte=100" form:"tag"` Username string `validate:"omitempty,gt=0,lte=100" form:"username"` InDays int `validate:"omitempty,min=1" form:"in_days"` @@ -504,7 +504,7 @@ type GetQuestionLinkReq struct { Page int `validate:"omitempty,min=1" form:"page"` PageSize int `validate:"omitempty,min=1,max=100" form:"page_size"` QuestionID string `validate:"required" form:"question_id"` - OrderCond string `validate:"omitempty,oneof=newest active hot score unanswered recommend" form:"order"` + OrderCond string `validate:"omitempty,oneof=newest active hot score unanswered recommend frequent" form:"order"` InDays int `validate:"omitempty,min=1" form:"in_days"` LoginUserID string `json:"-"` diff --git a/internal/service/question_common/question.go b/internal/service/question_common/question.go index 08c74f295..fc01159ec 100644 --- a/internal/service/question_common/question.go +++ b/internal/service/question_common/question.go @@ -81,6 +81,8 @@ type QuestionRepo interface { RemoveAllUserQuestion(ctx context.Context, userID string) (err error) UpdateSearch(ctx context.Context, questionID string) (err error) LinkQuestion(ctx context.Context, link ...*entity.QuestionLink) (err error) + GetLinkedQuestionIDs(ctx context.Context, questionID string, status int) (questionIDs []string, err error) + UpdateQuestionLinkCount(ctx context.Context, questionID string) (err error) RemoveQuestionLink(ctx context.Context, link ...*entity.QuestionLink) (err error) RecoverQuestionLink(ctx context.Context, link ...*entity.QuestionLink) (err error) UpdateQuestionLinkStatus(ctx context.Context, status int, links ...*entity.QuestionLink) (err error) @@ -704,6 +706,17 @@ func (qs *QuestionCommon) UpdateQuestionLink(ctx context.Context, questionID, an if err != nil { return parsedText, err } + // Update the number of question links that have been removed + linkedQuestionIDs, err := qs.questionRepo.GetLinkedQuestionIDs(ctx, questionID, entity.QuestionLinkStatusDeleted) + if err != nil { + log.Errorf("get linked question ids error %v", err) + } else { + for _, id := range linkedQuestionIDs { + if err := qs.questionRepo.UpdateQuestionLinkCount(ctx, id); err != nil { + log.Errorf("update question link count error %v", err) + } + } + } links := checker.GetQuestionLink(originalText) if len(links) == 0 { @@ -799,6 +812,16 @@ func (qs *QuestionCommon) UpdateQuestionLink(ctx context.Context, questionID, an } } + // update question linked count + for _, link := range validLinks { + if len(link.ToQuestionID) == 0 { + continue + } + if err := qs.questionRepo.UpdateQuestionLinkCount(ctx, link.ToQuestionID); err != nil { + log.Errorf("update question link count error %v", err) + } + } + return parsedText, nil } From b9fb758910ae0ce730884e39f4001716fd6eb17b Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Tue, 19 Nov 2024 18:33:57 +0800 Subject: [PATCH 19/40] feat(question): sort questions by update time for frequent tab --- internal/repo/question/question_repo.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/repo/question/question_repo.go b/internal/repo/question/question_repo.go index e1d94f2ea..9b1d212ee 100644 --- a/internal/repo/question/question_repo.go +++ b/internal/repo/question/question_repo.go @@ -411,7 +411,7 @@ func (qr *questionRepo) GetQuestionPage(ctx context.Context, page, pageSize int, session.Where("question.answer_count = 0") session.OrderBy("question.pin desc,question.created_at DESC") case "frequent": - session.OrderBy("question.pin DESC, question.linked_count DESC") + session.OrderBy("question.pin DESC, question.linked_count DESC, question.updated_at DESC") } total, err = pager.Help(page, pageSize, &questionList, &entity.Question{}, session) @@ -823,7 +823,7 @@ func (qr *questionRepo) GetQuestionLink(ctx context.Context, page, pageSize int, session.Where("question.answer_count = 0") session.OrderBy("question.pin desc,question.created_at DESC") case "frequent": - session.OrderBy("question.pin DESC, question.linked_count DESC") + session.OrderBy("question.pin DESC, question.linked_count DESC, question.updated_at DESC") } if page > 0 && pageSize > 0 { From a955ba065810651b967352928ff0daafa22ef606 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Thu, 21 Nov 2024 15:53:58 +0800 Subject: [PATCH 20/40] feat(upload): add support for file attachments and enhance image upload --- internal/base/constant/site_info.go | 6 ++ internal/controller/upload_controller.go | 6 +- internal/migrations/init.go | 6 +- internal/migrations/v24.go | 38 ++++++++++++ internal/schema/siteinfo_schema.go | 36 +++++++++-- internal/service/uploader/upload.go | 79 +++++++++++++++++++++--- pkg/checker/file_type.go | 53 ++++++++-------- plugin/storage.go | 7 ++- 8 files changed, 186 insertions(+), 45 deletions(-) diff --git a/internal/base/constant/site_info.go b/internal/base/constant/site_info.go index 0509c359d..2d6668347 100644 --- a/internal/base/constant/site_info.go +++ b/internal/base/constant/site_info.go @@ -48,3 +48,9 @@ const ( const ( EmailConfigKey = "email.config" ) + +const ( + DefaultMaxImageMegapixel = 40 * 1000 * 1000 + DefaultMaxImageSize = 4 * 1024 * 1024 + DefaultMaxAttachmentSize = 8 * 1024 * 1024 +) diff --git a/internal/controller/upload_controller.go b/internal/controller/upload_controller.go index 56eba804a..a43ccf641 100644 --- a/internal/controller/upload_controller.go +++ b/internal/controller/upload_controller.go @@ -32,6 +32,8 @@ import ( const ( // file is uploaded by markdown(or something else) editor fileFromPost = "post" + // file is used to upload the post attachment + fileFromPostAttachment = "post_attachment" // file is used to change the user's avatar fileFromAvatar = "avatar" // file is logo/icon images @@ -56,7 +58,7 @@ func NewUploadController(uploaderService uploader.UploaderService) *UploadContro // @Tags Upload // @Accept multipart/form-data // @Security ApiKeyAuth -// @Param source formData string true "identify the source of the file upload" Enums(post, avatar, branding) +// @Param source formData string true "identify the source of the file upload" Enums(post, post_attachment, avatar, branding) // @Param file formData file true "file" // @Success 200 {object} handler.RespBody{data=string} // @Router /answer/api/v1/file [post] @@ -74,6 +76,8 @@ func (uc *UploadController) UploadFile(ctx *gin.Context) { url, err = uc.uploaderService.UploadPostFile(ctx) case fileFromBranding: url, err = uc.uploaderService.UploadBrandingFile(ctx) + case fileFromPostAttachment: + url, err = uc.uploaderService.UploadPostAttachment(ctx) default: handler.HandleResponse(ctx, errors.BadRequest(reason.UploadFileSourceUnsupported), nil) return diff --git a/internal/migrations/init.go b/internal/migrations/init.go index 4558ef60b..6b1055a06 100644 --- a/internal/migrations/init.go +++ b/internal/migrations/init.go @@ -253,7 +253,11 @@ func (m *Mentor) initSiteInfoPrivilegeRank() { func (m *Mentor) initSiteInfoWrite() { writeData := map[string]interface{}{ - "restrict_answer": true, + "restrict_answer": true, + "max_image_size": 4, + "max_attachment_size": 8, + "max_image_megapixel": 40, + "authorized_extensions": []string{"jpg", "jpeg", "png", "gif", "webp"}, } writeDataBytes, _ := json.Marshal(writeData) _, m.err = m.engine.Context(m.ctx).Insert(&entity.SiteInfo{ diff --git a/internal/migrations/v24.go b/internal/migrations/v24.go index 015352ae5..907fd1ef9 100644 --- a/internal/migrations/v24.go +++ b/internal/migrations/v24.go @@ -21,12 +21,50 @@ package migrations import ( "context" + "encoding/json" + "fmt" + "github.com/apache/incubator-answer/internal/base/constant" "github.com/apache/incubator-answer/internal/entity" + "github.com/apache/incubator-answer/internal/schema" "xorm.io/xorm" ) func addQuestionLinkedCount(ctx context.Context, x *xorm.Engine) error { + writeSiteInfo := &entity.SiteInfo{ + Type: constant.SiteTypeWrite, + } + exist, err := x.Context(ctx).Get(writeSiteInfo) + if err != nil { + return fmt.Errorf("get config failed: %w", err) + } + if exist { + type OldSiteWriteReq struct { + RestrictAnswer bool `json:"restrict_answer"` + RequiredTag bool `json:"required_tag"` + RecommendTags []*schema.SiteWriteTag `json:"recommend_tags"` + ReservedTags []*schema.SiteWriteTag `json:"reserved_tags"` + MaxImageSize int `json:"max_image_size"` + MaxAttachmentSize int `json:"max_attachment_size"` + MaxImageMegapixel int `json:"max_image_megapixel"` + AuthorizedImageExtensions []string `json:"authorized_image_extensions"` + AuthorizedAttachmentExtensions []string `json:"authorized_attachment_extensions"` + } + content := &OldSiteWriteReq{} + _ = json.Unmarshal([]byte(writeSiteInfo.Content), content) + content.MaxImageSize = 4 + content.MaxAttachmentSize = 8 + content.MaxImageMegapixel = 40 + content.AuthorizedImageExtensions = []string{"jpg", "jpeg", "png", "gif", "webp"} + content.AuthorizedAttachmentExtensions = []string{} + data, _ := json.Marshal(content) + writeSiteInfo.Content = string(data) + _, err = x.Context(ctx).ID(writeSiteInfo.ID).Cols("content").Update(writeSiteInfo) + if err != nil { + return fmt.Errorf("update site info failed: %w", err) + } + } + type Question struct { LinkedCount int `xorm:"not null default 0 INT(11) linked_count"` } diff --git a/internal/schema/siteinfo_schema.go b/internal/schema/siteinfo_schema.go index 992663086..814465d99 100644 --- a/internal/schema/siteinfo_schema.go +++ b/internal/schema/siteinfo_schema.go @@ -72,11 +72,37 @@ type SiteBrandingReq struct { // SiteWriteReq site write request type SiteWriteReq struct { - RestrictAnswer bool `validate:"omitempty" json:"restrict_answer"` - RequiredTag bool `validate:"omitempty" json:"required_tag"` - RecommendTags []*SiteWriteTag `validate:"omitempty,dive" json:"recommend_tags"` - ReservedTags []*SiteWriteTag `validate:"omitempty,dive" json:"reserved_tags"` - UserID string `json:"-"` + RestrictAnswer bool `validate:"omitempty" json:"restrict_answer"` + RequiredTag bool `validate:"omitempty" json:"required_tag"` + RecommendTags []*SiteWriteTag `validate:"omitempty,dive" json:"recommend_tags"` + ReservedTags []*SiteWriteTag `validate:"omitempty,dive" json:"reserved_tags"` + MaxImageSize int `validate:"omitempty,gt=0" json:"max_image_size"` + MaxAttachmentSize int `validate:"omitempty,gt=0" json:"max_attachment_size"` + MaxImageMegapixel int `validate:"omitempty,gt=0" json:"max_image_megapixel"` + AuthorizedImageExtensions []string `validate:"omitempty,dive,gt=0,lte=128" json:"authorized_image_extensions"` + AuthorizedAttachmentExtensions []string `validate:"omitempty,dive,gt=0,lte=128" json:"authorized_attachment_extensions"` + UserID string `json:"-"` +} + +func (s *SiteWriteResp) GetMaxImageSize() int64 { + if s.MaxImageSize <= 0 { + return constant.DefaultMaxImageSize + } + return int64(s.MaxImageSize) * 1024 * 1024 +} + +func (s *SiteWriteResp) GetMaxAttachmentSize() int64 { + if s.MaxAttachmentSize <= 0 { + return constant.DefaultMaxAttachmentSize + } + return int64(s.MaxAttachmentSize) * 1024 * 1024 +} + +func (s *SiteWriteResp) GetMaxImageMegapixel() int { + if s.MaxImageMegapixel <= 0 { + return constant.DefaultMaxImageMegapixel + } + return s.MaxImageMegapixel * 1000 * 1000 } // SiteWriteTag site write response tag diff --git a/internal/service/uploader/upload.go b/internal/service/uploader/upload.go index 3619a6e19..9b810e534 100644 --- a/internal/service/uploader/upload.go +++ b/internal/service/uploader/upload.go @@ -69,6 +69,7 @@ var ( type UploaderService interface { UploadAvatarFile(ctx *gin.Context) (url string, err error) UploadPostFile(ctx *gin.Context) (url string, err error) + UploadPostAttachment(ctx *gin.Context) (url string, err error) UploadBrandingFile(ctx *gin.Context) (url string, err error) AvatarThumbFile(ctx *gin.Context, fileName string, size int) (url string, err error) } @@ -118,7 +119,7 @@ func (us *uploaderService) UploadAvatarFile(ctx *gin.Context) (url string, err e newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) avatarFilePath := path.Join(avatarSubPath, newFilename) - return us.uploadFile(ctx, fileHeader, avatarFilePath) + return us.uploadImageFile(ctx, fileHeader, avatarFilePath) } func (us *uploaderService) AvatarThumbFile(ctx *gin.Context, fileName string, size int) (url string, err error) { @@ -183,21 +184,56 @@ func (us *uploaderService) UploadPostFile(ctx *gin.Context) ( return url, nil } - // max size - ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, 10*1024*1024) + siteWrite, err := us.siteInfoService.GetSiteWrite(ctx) + if err != nil { + return "", err + } + + ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, siteWrite.GetMaxImageSize()) file, fileHeader, err := ctx.Request.FormFile("file") if err != nil { return "", errors.BadRequest(reason.RequestFormatError).WithError(err) } defer file.Close() + if checker.IsUnAuthorizedExtension(fileHeader.Filename, siteWrite.AuthorizedImageExtensions) { + return "", errors.BadRequest(reason.RequestFormatError).WithError(err) + } + fileExt := strings.ToLower(path.Ext(fileHeader.Filename)) - if _, ok := plugin.DefaultFileTypeCheckMapping[plugin.UserPost][fileExt]; !ok { + newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) + avatarFilePath := path.Join(postSubPath, newFilename) + return us.uploadImageFile(ctx, fileHeader, avatarFilePath) +} + +func (us *uploaderService) UploadPostAttachment(ctx *gin.Context) ( + url string, err error) { + url, err = us.tryToUploadByPlugin(ctx, plugin.UserPostAttachment) + if err != nil { + return "", err + } + if len(url) > 0 { + return url, nil + } + + resp, err := us.siteInfoService.GetSiteWrite(ctx) + if err != nil { + return "", err + } + + ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, resp.GetMaxAttachmentSize()) + file, fileHeader, err := ctx.Request.FormFile("file") + if err != nil { + return "", errors.BadRequest(reason.RequestFormatError).WithError(err) + } + defer file.Close() + if checker.IsUnAuthorizedExtension(fileHeader.Filename, resp.AuthorizedAttachmentExtensions) { return "", errors.BadRequest(reason.RequestFormatError).WithError(err) } + fileExt := strings.ToLower(path.Ext(fileHeader.Filename)) newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) avatarFilePath := path.Join(postSubPath, newFilename) - return us.uploadFile(ctx, fileHeader, avatarFilePath) + return us.uploadAttachmentFile(ctx, fileHeader, avatarFilePath) } func (us *uploaderService) UploadBrandingFile(ctx *gin.Context) ( @@ -210,8 +246,12 @@ func (us *uploaderService) UploadBrandingFile(ctx *gin.Context) ( return url, nil } - // max size - ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, 10*1024*1024) + siteWrite, err := us.siteInfoService.GetSiteWrite(ctx) + if err != nil { + return "", err + } + + ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, siteWrite.GetMaxImageSize()) file, fileHeader, err := ctx.Request.FormFile("file") if err != nil { return "", errors.BadRequest(reason.RequestFormatError).WithError(err) @@ -224,15 +264,19 @@ func (us *uploaderService) UploadBrandingFile(ctx *gin.Context) ( newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) avatarFilePath := path.Join(brandingSubPath, newFilename) - return us.uploadFile(ctx, fileHeader, avatarFilePath) + return us.uploadImageFile(ctx, fileHeader, avatarFilePath) } -func (us *uploaderService) uploadFile(ctx *gin.Context, file *multipart.FileHeader, fileSubPath string) ( +func (us *uploaderService) uploadImageFile(ctx *gin.Context, file *multipart.FileHeader, fileSubPath string) ( url string, err error) { siteGeneral, err := us.siteInfoService.GetSiteGeneral(ctx) if err != nil { return "", err } + siteWrite, err := us.siteInfoService.GetSiteWrite(ctx) + if err != nil { + return "", err + } filePath := path.Join(us.serviceConfig.UploadPath, fileSubPath) if err := ctx.SaveUploadedFile(file, filePath); err != nil { return "", errors.InternalServer(reason.UnknownError).WithError(err).WithStack() @@ -244,7 +288,7 @@ func (us *uploaderService) uploadFile(ctx *gin.Context, file *multipart.FileHead } defer src.Close() - if !checker.IsSupportedImageFile(filePath) { + if !checker.DecodeAndCheckImageFile(filePath, siteWrite.GetMaxImageMegapixel()) { return "", errors.BadRequest(reason.UploadFileUnsupportedFileFormat) } @@ -256,6 +300,21 @@ func (us *uploaderService) uploadFile(ctx *gin.Context, file *multipart.FileHead return url, nil } +func (us *uploaderService) uploadAttachmentFile(ctx *gin.Context, file *multipart.FileHeader, fileSubPath string) ( + url string, err error) { + siteGeneral, err := us.siteInfoService.GetSiteGeneral(ctx) + if err != nil { + return "", err + } + filePath := path.Join(us.serviceConfig.UploadPath, fileSubPath) + if err := ctx.SaveUploadedFile(file, filePath); err != nil { + return "", errors.InternalServer(reason.UnknownError).WithError(err).WithStack() + } + + url = fmt.Sprintf("%s/uploads/%s", siteGeneral.SiteUrl, fileSubPath) + return url, nil +} + func (us *uploaderService) tryToUploadByPlugin(ctx *gin.Context, source plugin.UploadSource) ( url string, err error) { _ = plugin.CallStorage(func(fn plugin.Storage) error { diff --git a/pkg/checker/file_type.go b/pkg/checker/file_type.go index fffcd960c..51f687d6c 100644 --- a/pkg/checker/file_type.go +++ b/pkg/checker/file_type.go @@ -34,39 +34,42 @@ import ( "golang.org/x/image/webp" ) -const ( - maxImageSize = 16384 * 16384 -) +// IsUnAuthorizedExtension check whether the file extension is not in the allowedExtensions +// WANING Only checks the file extension is not reliable, but `http.DetectContentType` and `mimetype` are not reliable for all file types. +func IsUnAuthorizedExtension(fileName string, allowedExtensions []string) bool { + ext := strings.ToLower(strings.Trim(filepath.Ext(fileName), ".")) + for _, extension := range allowedExtensions { + if extension == ext { + return false + } + } + return true +} -// IsSupportedImageFile currently answers support image type is +// DecodeAndCheckImageFile currently answers support image type is // `image/jpeg, image/jpg, image/png, image/gif, image/webp` -func IsSupportedImageFile(localFilePath string) bool { +func DecodeAndCheckImageFile(localFilePath string, maxImageMegapixel int) bool { ext := strings.ToLower(strings.TrimPrefix(filepath.Ext(localFilePath), ".")) switch ext { - case "jpg", "jpeg", "png", "gif": // only allow for `image/jpeg,image/jpg,image/png, image/gif` - if !decodeAndCheckImageFile(localFilePath, standardImageConfigCheck) { + case "jpg", "jpeg", "png", "gif": // only allow for `image/jpeg, image/jpg, image/png, image/gif` + if !decodeAndCheckImageFile(localFilePath, maxImageMegapixel, standardImageConfigCheck) { return false } - if !decodeAndCheckImageFile(localFilePath, standardImageCheck) { + if !decodeAndCheckImageFile(localFilePath, maxImageMegapixel, standardImageCheck) { return false } - case "ico": - // TODO: There is currently no good Golang library to parse whether the image is in ico format. - return true case "webp": - if !decodeAndCheckImageFile(localFilePath, webpImageConfigCheck) { + if !decodeAndCheckImageFile(localFilePath, maxImageMegapixel, webpImageConfigCheck) { return false } - if !decodeAndCheckImageFile(localFilePath, webpImageCheck) { + if !decodeAndCheckImageFile(localFilePath, maxImageMegapixel, webpImageCheck) { return false } - default: - return false } return true } -func decodeAndCheckImageFile(localFilePath string, checker func(io.Reader) error) bool { +func decodeAndCheckImageFile(localFilePath string, maxImageMegapixel int, checker func(file io.Reader, maxImageMegapixel int) error) bool { file, err := os.Open(localFilePath) if err != nil { log.Errorf("open file error: %v", err) @@ -74,25 +77,25 @@ func decodeAndCheckImageFile(localFilePath string, checker func(io.Reader) error } defer file.Close() - if err = checker(file); err != nil { + if err = checker(file, maxImageMegapixel); err != nil { log.Errorf("check image format error: %v", err) return false } return true } -func standardImageConfigCheck(file io.Reader) error { +func standardImageConfigCheck(file io.Reader, maxImageMegapixel int) error { config, _, err := image.DecodeConfig(file) if err != nil { return fmt.Errorf("decode image config error: %v", err) } - if imageSizeTooLarge(config) { + if imageSizeTooLarge(config, maxImageMegapixel) { return fmt.Errorf("image size too large") } return nil } -func standardImageCheck(file io.Reader) error { +func standardImageCheck(file io.Reader, maxImageMegapixel int) error { _, _, err := image.Decode(file) if err != nil { return fmt.Errorf("decode image error: %v", err) @@ -100,18 +103,18 @@ func standardImageCheck(file io.Reader) error { return nil } -func webpImageConfigCheck(file io.Reader) error { +func webpImageConfigCheck(file io.Reader, maxImageMegapixel int) error { config, err := webp.DecodeConfig(file) if err != nil { return fmt.Errorf("decode webp image config error: %v", err) } - if imageSizeTooLarge(config) { + if imageSizeTooLarge(config, maxImageMegapixel) { return fmt.Errorf("image size too large") } return nil } -func webpImageCheck(file io.Reader) error { +func webpImageCheck(file io.Reader, maxImageMegapixel int) error { _, err := webp.Decode(file) if err != nil { return fmt.Errorf("decode webp image error: %v", err) @@ -119,6 +122,6 @@ func webpImageCheck(file io.Reader) error { return nil } -func imageSizeTooLarge(config image.Config) bool { - return config.Width*config.Height > maxImageSize +func imageSizeTooLarge(config image.Config, maxImageMegapixel int) bool { + return config.Width*config.Height > maxImageMegapixel } diff --git a/plugin/storage.go b/plugin/storage.go index c40a17107..39c294886 100644 --- a/plugin/storage.go +++ b/plugin/storage.go @@ -22,9 +22,10 @@ package plugin type UploadSource string const ( - UserAvatar UploadSource = "user_avatar" - UserPost UploadSource = "user_post" - AdminBranding UploadSource = "admin_branding" + UserAvatar UploadSource = "user_avatar" + UserPost UploadSource = "user_post" + UserPostAttachment UploadSource = "user_post_attachment" + AdminBranding UploadSource = "admin_branding" ) var ( From bc20a71a527a503d07fa191f4f2cd8b1ff52704c Mon Sep 17 00:00:00 2001 From: shuai Date: Fri, 22 Nov 2024 10:30:39 +0800 Subject: [PATCH 21/40] feat: The editor has added support for uploading attachments, and the management background has added file upload configuration information. --- i18n/en_US.yaml | 22 ++- ui/src/common/interface.ts | 10 +- ui/src/components/Editor/ToolBars/file.tsx | 130 ++++++++++++++++ ui/src/components/Editor/ToolBars/image.tsx | 86 ++++++++--- ui/src/components/Editor/ToolBars/index.ts | 2 + ui/src/components/Editor/index.tsx | 2 + ui/src/components/Editor/toolItem.tsx | 1 + ui/src/components/QueryGroup/index.tsx | 156 +++++++++++--------- ui/src/components/QuestionList/index.tsx | 5 +- ui/src/pages/Admin/Write/index.tsx | 151 ++++++++++++++++++- ui/src/pages/Tags/Detail/index.tsx | 2 +- ui/src/stores/writeSetting.ts | 5 + ui/src/utils/guard.ts | 7 +- 13 files changed, 482 insertions(+), 97 deletions(-) create mode 100644 ui/src/components/Editor/ToolBars/file.tsx diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml index 775d7456a..776207c29 100644 --- a/i18n/en_US.yaml +++ b/i18n/en_US.yaml @@ -915,7 +915,7 @@ ui: msg: empty: File cannot be empty. only_image: Only image files are allowed. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: Image URL @@ -957,6 +957,10 @@ ui: text: Table heading: Heading cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: I am closing this post as... btn_cancel: Cancel @@ -1557,6 +1561,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -2051,6 +2056,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: diff --git a/ui/src/common/interface.ts b/ui/src/common/interface.ts index 903c5c284..29967e0f8 100644 --- a/ui/src/common/interface.ts +++ b/ui/src/common/interface.ts @@ -173,7 +173,7 @@ export interface UserInfoRes extends UserInfoBase { [prop: string]: any; } -export type UploadType = 'post' | 'avatar' | 'branding'; +export type UploadType = 'post' | 'avatar' | 'branding' | 'post_attachment'; export interface UploadReq { file: FormData; } @@ -301,7 +301,8 @@ export type QuestionOrderBy = | 'active' | 'hot' | 'score' - | 'unanswered'; + | 'unanswered' + | 'frequent'; export interface QueryQuestionsReq extends Paging { order: QuestionOrderBy; @@ -439,6 +440,11 @@ export interface AdminSettingsWrite { recommend_tags?: Tag[]; required_tag?: boolean; reserved_tags?: Tag[]; + max_image_size?: number; + max_attachment_size?: number; + max_image_megapixel?: number; + authorized_image_extensions?: string[]; + authorized_attachment_extensions?: string[]; } export interface AdminSettingsSeo { diff --git a/ui/src/components/Editor/ToolBars/file.tsx b/ui/src/components/Editor/ToolBars/file.tsx new file mode 100644 index 000000000..30544d3e5 --- /dev/null +++ b/ui/src/components/Editor/ToolBars/file.tsx @@ -0,0 +1,130 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useState, memo, useRef } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { Modal as AnswerModal } from '@/components'; +import ToolItem from '../toolItem'; +import { IEditorContext, Editor } from '../types'; +import { uploadImage } from '@/services'; +import { writeSettingStore } from '@/stores'; + +let context: IEditorContext; +const Image = ({ editorInstance }) => { + const { t } = useTranslation('translation', { keyPrefix: 'editor' }); + const { max_attachment_size = 8, authorized_attachment_extensions = [] } = + writeSettingStore((state) => state.write); + const fileInputRef = useRef(null); + const [editor, setEditor] = useState(editorInstance); + + const item = { + label: 'paperclip', + tip: `${t('file.text')}`, + }; + + const addLink = (ctx) => { + context = ctx; + setEditor(context.editor); + fileInputRef.current?.click?.(); + }; + + const verifyFileSize = (files: FileList) => { + if (files.length === 0) { + return false; + } + const unSupportFiles = Array.from(files).filter((file) => { + const fileName = file.name.toLowerCase(); + return !authorized_attachment_extensions.find((v) => + fileName.endsWith(v), + ); + }); + + if (unSupportFiles.length > 0) { + AnswerModal.confirm({ + content: t('file.not_supported', { + file_type: authorized_attachment_extensions.join(', '), + }), + showCancel: false, + }); + return false; + } + + const attachmentOverSizeFiles = Array.from(files).filter( + (file) => file.size / 1024 / 1024 > max_attachment_size, + ); + if (attachmentOverSizeFiles.length > 0) { + AnswerModal.confirm({ + content: t('file.max_size', { size: max_attachment_size }), + showCancel: false, + }); + return false; + } + + return true; + }; + + const onUpload = async (e) => { + if (!editor) { + return; + } + const files = e.target?.files || []; + const bool = verifyFileSize(files); + + if (!bool) { + return; + } + const fileName = files[0].name; + const loadingText = `![${t('image.uploading')} ${fileName}...]()`; + const startPos = editor.getCursor(); + + const endPos = { ...startPos, ch: startPos.ch + loadingText.length }; + editor.replaceSelection(loadingText); + editor.setReadOnly(true); + + uploadImage({ file: e.target.files[0], type: 'post_attachment' }) + .then((url) => { + const text = `[${fileName}](${url})`; + editor.replaceRange('', startPos, endPos); + editor.replaceSelection(text); + }) + .finally(() => { + editor.setReadOnly(false); + editor.focus(); + }); + }; + + if (!authorized_attachment_extensions.length) { + return null; + } + + return ( + + + + ); +}; + +export default memo(Image); diff --git a/ui/src/components/Editor/ToolBars/image.tsx b/ui/src/components/Editor/ToolBars/image.tsx index 4f72e4e1a..fa6609443 100644 --- a/ui/src/components/Editor/ToolBars/image.tsx +++ b/ui/src/components/Editor/ToolBars/image.tsx @@ -25,11 +25,18 @@ import { Modal as AnswerModal } from '@/components'; import ToolItem from '../toolItem'; import { IEditorContext, Editor } from '../types'; import { uploadImage } from '@/services'; +import { writeSettingStore } from '@/stores'; let context: IEditorContext; const Image = ({ editorInstance }) => { const [editor, setEditor] = useState(editorInstance); const { t } = useTranslation('translation', { keyPrefix: 'editor' }); + const { + max_image_size = 4, + max_attachment_size = 8, + authorized_image_extensions = [], + authorized_attachment_extensions = [], + } = writeSettingStore((state) => state.write); const loadingText = `![${t('image.uploading')}...]()`; @@ -52,41 +59,85 @@ const Image = ({ editorInstance }) => { isInvalid: false, errorMsg: '', }); + const verifyImageSize = (files: FileList) => { if (files.length === 0) { return false; } - const filteredFiles = Array.from(files).filter( - (file) => file.type.indexOf('image') === -1, - ); - if (filteredFiles.length > 0) { + /** + * When allowing attachments to be uploaded, verification logic for attachment information has been added. In order to avoid abnormal judgment caused by the order of drag and drop upload, the drag and drop upload verification of attachments and the drag and drop upload of images are put together. + * + */ + const canUploadAttachment = authorized_attachment_extensions.length > 0; + const allowedAllType = [ + ...authorized_image_extensions, + ...authorized_attachment_extensions, + ]; + const unSupportFiles = Array.from(files).filter((file) => { + const fileName = file.name.toLowerCase(); + return canUploadAttachment + ? !allowedAllType.find((v) => fileName.endsWith(v)) + : file.type.indexOf('image') === -1; + }); + + if (unSupportFiles.length > 0) { AnswerModal.confirm({ - content: t('image.form_image.fields.file.msg.only_image'), + content: canUploadAttachment + ? t('file.not_supported', { file_type: allowedAllType.join(', ') }) + : t('image.form_image.fields.file.msg.only_image'), + showCancel: false, }); return false; } - const filteredImages = Array.from(files).filter( - (file) => file.size / 1024 / 1024 > 4, - ); - if (filteredImages.length > 0) { + const otherFiles = Array.from(files).filter((file) => { + return file.type.indexOf('image') === -1; + }); + + if (canUploadAttachment && otherFiles.length > 0) { + const attachmentOverSizeFiles = otherFiles.filter( + (file) => file.size / 1024 / 1024 > max_attachment_size, + ); + if (attachmentOverSizeFiles.length > 0) { + AnswerModal.confirm({ + content: t('file.max_size', { size: max_attachment_size }), + showCancel: false, + }); + return false; + } + } + + const imageFiles = Array.from(files).filter( + (file) => file.type.indexOf('image') > -1, + ); + const oversizedImages = imageFiles.filter( + (file) => file.size / 1024 / 1024 > max_image_size, + ); + if (oversizedImages.length > 0) { AnswerModal.confirm({ - content: t('image.form_image.fields.file.msg.max_size'), + content: t('image.form_image.fields.file.msg.max_size', { + size: max_image_size, + }), + showCancel: false, }); return false; } + return true; }; + const upload = ( files: FileList, - ): Promise<{ url: string; name: string }[]> => { + ): Promise<{ url: string; name: string; type: string }[]> => { const promises = Array.from(files).map(async (file) => { - const url = await uploadImage({ file, type: 'post' }); + const type = file.type.indexOf('image') > -1 ? 'post' : 'post_attachment'; + const url = await uploadImage({ file, type }); return { name: file.name, url, + type, }; }); @@ -103,7 +154,6 @@ const Image = ({ editorInstance }) => { } const drop = async (e) => { const fileList = e.dataTransfer.files; - const bool = verifyImageSize(fileList); if (!bool) { @@ -122,9 +172,9 @@ const Image = ({ editorInstance }) => { const text: string[] = []; if (Array.isArray(urls)) { - urls.forEach(({ name, url }) => { + urls.forEach(({ name, url, type }) => { if (name && url) { - text.push(`![${name}](${url})`); + text.push(`${type === 'post' ? '!' : ''}[${name}](${url})`); } }); } @@ -150,8 +200,8 @@ const Image = ({ editorInstance }) => { editor.replaceSelection(loadingText); editor.setReadOnly(true); const urls = await upload(clipboard.files); - const text = urls.map(({ name, url }) => { - return `![${name}](${url})`; + const text = urls.map(({ name, url, type }) => { + return `${type === 'post' ? '!' : ''}[${name}](${url})`; }); editor.replaceRange(text.join('\n'), startPos, endPos); @@ -252,6 +302,7 @@ const Image = ({ editorInstance }) => { uploadImage({ file: e.target.files[0], type: 'post' }).then((url) => { setLink({ ...link, value: url }); + setImageName({ ...imageName, value: files[0].name }); }); }; @@ -283,6 +334,7 @@ const Image = ({ editorInstance }) => { type="file" onChange={onUpload} isInvalid={currentTab === 'localImage' && link.isInvalid} + accept="image/*" /> diff --git a/ui/src/components/Editor/ToolBars/index.ts b/ui/src/components/Editor/ToolBars/index.ts index ce04587da..05912bc6e 100644 --- a/ui/src/components/Editor/ToolBars/index.ts +++ b/ui/src/components/Editor/ToolBars/index.ts @@ -32,6 +32,7 @@ import BlockQuote from './blockquote'; import Image from './image'; import Help from './help'; import Chart from './chart'; +import File from './file'; export { Table, @@ -49,4 +50,5 @@ export { Image, Help, Chart, + File, }; diff --git a/ui/src/components/Editor/index.tsx b/ui/src/components/Editor/index.tsx index ead37653d..45919b2c9 100644 --- a/ui/src/components/Editor/index.tsx +++ b/ui/src/components/Editor/index.tsx @@ -45,6 +45,7 @@ import { Outdent, Table, UL, + File, } from './ToolBars'; import { htmlRender, useEditor } from './utils'; import Viewer from './Viewer'; @@ -130,6 +131,7 @@ const MDEditor: ForwardRefRenderFunction = (
+
    diff --git a/ui/src/components/Editor/toolItem.tsx b/ui/src/components/Editor/toolItem.tsx index 0c4ca2f10..e7b218670 100644 --- a/ui/src/components/Editor/toolItem.tsx +++ b/ui/src/components/Editor/toolItem.tsx @@ -93,6 +93,7 @@ const ToolItem: FC = (props) => { disabled={disable} tabIndex={-1} onClick={(e) => { + console.log('onClick', e); e.preventDefault(); onClick?.({ editor, diff --git a/ui/src/components/QueryGroup/index.tsx b/ui/src/components/QueryGroup/index.tsx index 9b37c6e9c..7f6a0f3ea 100644 --- a/ui/src/components/QueryGroup/index.tsx +++ b/ui/src/components/QueryGroup/index.tsx @@ -35,8 +35,8 @@ interface Props { className?: string; pathname?: string; wrapClassName?: string; + maxBtnCount?: number; } -const MAX_BUTTON_COUNT = 3; const Index: FC = ({ data = [], currentSort = '', @@ -45,6 +45,7 @@ const Index: FC = ({ className = '', pathname = '', wrapClassName = '', + maxBtnCount = 3, }) => { const [searchParams, setUrlSearchParams] = useSearchParams(); const navigate = useNavigate(); @@ -71,79 +72,94 @@ const Index: FC = ({ } } }; - - const filteredData = data.filter((_, index) => index > MAX_BUTTON_COUNT - 2); - const currentBtn = filteredData.find((btn) => { + const moreBtnData = data.length > 4 ? data.slice(maxBtnCount) : []; + const normalBtnData = data.length > 4 ? data.slice(0, maxBtnCount) : data; + const currentBtn = moreBtnData.find((btn) => { return (typeof btn === 'string' ? btn : btn.name) === currentSort; }); + return ( - - {data.map((btn, index) => { - const key = typeof btn === 'string' ? btn : btn.sort; - const name = typeof btn === 'string' ? btn : btn.name; - return ( - + ); + })} + {moreBtnData.length > 0 && ( + + {moreBtnData.map((btn) => { + const key = typeof btn === 'string' ? btn : btn.sort; + const name = typeof btn === 'string' ? btn : btn.name; + return ( + handleClick(evt, key)}> - {t(name)} - - ); - })} - {data.length > MAX_BUTTON_COUNT && ( - - {filteredData.map((btn) => { - const key = typeof btn === 'string' ? btn : btn.sort; - const name = typeof btn === 'string' ? btn : btn.name; - return ( - handleClick(evt, key)}> - {t(name)} - - ); - })} - - )} - + onClick={(evt) => handleClick(evt, key)}> + {t(name)} + + ); + })} + + )} + + + {data.map((btn) => { + const key = typeof btn === 'string' ? btn : btn.sort; + const name = typeof btn === 'string' ? btn : btn.name; + return ( + handleClick(evt, key)}> + {t(name)} + + ); + })} + + ); }; diff --git a/ui/src/components/QuestionList/index.tsx b/ui/src/components/QuestionList/index.tsx index 82baea6a9..c849de56e 100644 --- a/ui/src/components/QuestionList/index.tsx +++ b/ui/src/components/QuestionList/index.tsx @@ -40,10 +40,10 @@ import { useSkeletonControl } from '@/hooks'; export const QUESTION_ORDER_KEYS: Type.QuestionOrderBy[] = [ 'newest', 'active', - 'hot', - 'score', 'unanswered', 'recommend', + 'frequent', + 'score', ]; interface Props { source: 'questions' | 'tag' | 'linked'; @@ -83,6 +83,7 @@ const QuestionList: FC = ({ currentSort={curOrder} pathname={source === 'questions' ? '/questions' : ''} i18nKeyPrefix="question" + maxBtnCount={source === 'tag' ? 3 : 4} />
diff --git a/ui/src/pages/Admin/Write/index.tsx b/ui/src/pages/Admin/Write/index.tsx index 442c58f61..fcf99c1de 100644 --- a/ui/src/pages/Admin/Write/index.tsx +++ b/ui/src/pages/Admin/Write/index.tsx @@ -52,6 +52,31 @@ const initFormData = { errorMsg: '', isInvalid: false, }, + max_image_size: { + value: 4, + errorMsg: '', + isInvalid: false, + }, + max_attachment_size: { + value: 8, + errorMsg: '', + isInvalid: false, + }, + max_image_megapixel: { + value: 40, + errorMsg: '', + isInvalid: false, + }, + authorized_image_extensions: { + value: 'jpg, jpeg, png, gif, webp', + errorMsg: '', + isInvalid: false, + }, + authorized_attachment_extensions: { + value: '', + errorMsg: '', + isInvalid: false, + }, }; const Index: FC = () => { @@ -111,6 +136,18 @@ const Index: FC = () => { reserved_tags: formData.reserved_tags.value, required_tag: formData.required_tag.value, restrict_answer: formData.restrict_answer.value, + max_image_size: Number(formData.max_image_size.value), + max_attachment_size: Number(formData.max_attachment_size.value), + max_image_megapixel: Number(formData.max_image_megapixel.value), + authorized_image_extensions: formData.authorized_image_extensions.value + .split(',') + ?.map((item) => item.trim().toLowerCase()), + authorized_attachment_extensions: + formData.authorized_attachment_extensions.value.length > 0 + ? formData.authorized_attachment_extensions.value + .split(',') + ?.map((item) => item.trim().toLowerCase()) + : [], }; postRequireAndReservedTag(reqParams) .then(() => { @@ -120,7 +157,7 @@ const Index: FC = () => { }); writeSettingStore .getState() - .update({ restrict_answer: reqParams.restrict_answer }); + .update({ restrict_answer: reqParams.restrict_answer, ...reqParams }); }) .catch((err) => { if (err.isError) { @@ -142,6 +179,13 @@ const Index: FC = () => { if (Array.isArray(res.reserved_tags)) { formData.reserved_tags.value = res.reserved_tags; } + formData.max_image_size.value = res.max_image_size; + formData.max_attachment_size.value = res.max_attachment_size; + formData.max_image_megapixel.value = res.max_image_megapixel; + formData.authorized_image_extensions.value = + res.authorized_image_extensions?.join(', ').toLowerCase(); + formData.authorized_attachment_extensions.value = + res.authorized_attachment_extensions?.join(', ').toLowerCase(); setFormData({ ...formData }); }); }; @@ -243,6 +287,111 @@ const Index: FC = () => { + + {t('image_size.label')} + { + handleValueChange({ + max_image_size: { + value: evt.target.value, + errorMsg: '', + isInvalid: false, + }, + }); + }} + /> + {t('image_size.text')} + + {formData.max_image_size.errorMsg} + + + + + {t('attachment_size.label')} + { + handleValueChange({ + max_attachment_size: { + value: evt.target.value, + errorMsg: '', + isInvalid: false, + }, + }); + }} + /> + {t('attachment_size.text')} + + {formData.max_attachment_size.errorMsg} + + + + + {t('image_megapixels.label')} + { + handleValueChange({ + max_image_megapixel: { + value: evt.target.value, + errorMsg: '', + isInvalid: false, + }, + }); + }} + /> + {t('image_megapixels.text')} + + {formData.max_image_megapixel.errorMsg} + + + + + {t('image_extensions.label')} + { + handleValueChange({ + authorized_image_extensions: { + value: evt.target.value.toLowerCase(), + errorMsg: '', + isInvalid: false, + }, + }); + }} + /> + {t('image_extensions.text')} + + {formData.authorized_image_extensions.errorMsg} + + + + + {t('attachment_extensions.label')} + { + handleValueChange({ + authorized_attachment_extensions: { + value: evt.target.value.toLowerCase(), + errorMsg: '', + isInvalid: false, + }, + }); + }} + /> + {t('attachment_extensions.text')} + + {formData.authorized_attachment_extensions.errorMsg} + + + diff --git a/ui/src/pages/Tags/Detail/index.tsx b/ui/src/pages/Tags/Detail/index.tsx index 41b190226..8bfd5ee8c 100644 --- a/ui/src/pages/Tags/Detail/index.tsx +++ b/ui/src/pages/Tags/Detail/index.tsx @@ -186,7 +186,7 @@ const Index: FC = () => { source="tag" data={listData} order={curOrder} - orderList={QUESTION_ORDER_KEYS.slice(0, 5)} + orderList={QUESTION_ORDER_KEYS.filter((k) => k !== 'recommend')} isLoading={listLoading} /> diff --git a/ui/src/stores/writeSetting.ts b/ui/src/stores/writeSetting.ts index 8e7c1f525..f3a5613c5 100644 --- a/ui/src/stores/writeSetting.ts +++ b/ui/src/stores/writeSetting.ts @@ -32,6 +32,11 @@ const Index = create((set) => ({ recommend_tags: [], required_tag: false, reserved_tags: [], + max_image_size: 4, + max_attachment_size: 8, + max_image_megapixel: 40, + authorized_image_extensions: [], + authorized_attachment_extensions: [], }, update: (params) => set((state) => { diff --git a/ui/src/utils/guard.ts b/ui/src/utils/guard.ts index 5f2e7b525..f3ba42359 100644 --- a/ui/src/utils/guard.ts +++ b/ui/src/utils/guard.ts @@ -408,9 +408,10 @@ export const initAppSettingsStore = async () => { customizeStore.getState().update(appSettings.custom_css_html); themeSettingStore.getState().update(appSettings.theme); seoSettingStore.getState().update(appSettings.site_seo); - writeSettingStore - .getState() - .update({ restrict_answer: appSettings.site_write.restrict_answer }); + writeSettingStore.getState().update({ + restrict_answer: appSettings.site_write.restrict_answer, + ...appSettings.site_write, + }); } }; From 4831f6ef13c1003b0571230d3cc9a0e35828ba2d Mon Sep 17 00:00:00 2001 From: shuai Date: Fri, 22 Nov 2024 11:31:53 +0800 Subject: [PATCH 22/40] fix: Add file upload error handling --- ui/src/components/Editor/ToolBars/file.tsx | 3 ++ ui/src/components/Editor/ToolBars/image.tsx | 36 +++++++++++++-------- ui/src/pages/Admin/Write/index.tsx | 26 ++++++++++----- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/ui/src/components/Editor/ToolBars/file.tsx b/ui/src/components/Editor/ToolBars/file.tsx index 30544d3e5..869d1dc64 100644 --- a/ui/src/components/Editor/ToolBars/file.tsx +++ b/ui/src/components/Editor/ToolBars/file.tsx @@ -104,6 +104,9 @@ const Image = ({ editorInstance }) => { editor.replaceRange('', startPos, endPos); editor.replaceSelection(text); }) + .catch(() => { + editor.replaceRange('', startPos, endPos); + }) .finally(() => { editor.setReadOnly(false); editor.focus(); diff --git a/ui/src/components/Editor/ToolBars/image.tsx b/ui/src/components/Editor/ToolBars/image.tsx index fa6609443..322da08d7 100644 --- a/ui/src/components/Editor/ToolBars/image.tsx +++ b/ui/src/components/Editor/ToolBars/image.tsx @@ -166,9 +166,14 @@ const Image = ({ editorInstance }) => { editor.replaceSelection(loadingText); editor.setReadOnly(true); - const urls = await upload(fileList).catch((ex) => { - console.error('upload file error: ', ex); - }); + const urls = await upload(fileList) + .catch(() => { + editor.replaceRange('', startPos, endPos); + }) + .finally(() => { + editor.setReadOnly(false); + editor.focus(); + }); const text: string[] = []; if (Array.isArray(urls)) { @@ -183,8 +188,6 @@ const Image = ({ editorInstance }) => { } else { editor.replaceRange('', startPos, endPos); } - editor.setReadOnly(false); - editor.focus(); }; const paste = async (event) => { @@ -199,14 +202,21 @@ const Image = ({ editorInstance }) => { editor.replaceSelection(loadingText); editor.setReadOnly(true); - const urls = await upload(clipboard.files); - const text = urls.map(({ name, url, type }) => { - return `${type === 'post' ? '!' : ''}[${name}](${url})`; - }); - - editor.replaceRange(text.join('\n'), startPos, endPos); - editor.setReadOnly(false); - editor.focus(); + upload(clipboard.files) + .then((urls) => { + const text = urls.map(({ name, url, type }) => { + return `${type === 'post' ? '!' : ''}[${name}](${url})`; + }); + + editor.replaceRange(text.join('\n'), startPos, endPos); + }) + .catch(() => { + editor.replaceRange('', startPos, endPos); + }) + .finally(() => { + editor.setReadOnly(false); + editor.focus(); + }); return; } diff --git a/ui/src/pages/Admin/Write/index.tsx b/ui/src/pages/Admin/Write/index.tsx index fcf99c1de..d82f5aa05 100644 --- a/ui/src/pages/Admin/Write/index.tsx +++ b/ui/src/pages/Admin/Write/index.tsx @@ -139,9 +139,12 @@ const Index: FC = () => { max_image_size: Number(formData.max_image_size.value), max_attachment_size: Number(formData.max_attachment_size.value), max_image_megapixel: Number(formData.max_image_megapixel.value), - authorized_image_extensions: formData.authorized_image_extensions.value - .split(',') - ?.map((item) => item.trim().toLowerCase()), + authorized_image_extensions: + formData.authorized_image_extensions.value.length > 0 + ? formData.authorized_image_extensions.value + .split(',') + ?.map((item) => item.trim().toLowerCase()) + : [], authorized_attachment_extensions: formData.authorized_attachment_extensions.value.length > 0 ? formData.authorized_attachment_extensions.value @@ -287,11 +290,12 @@ const Index: FC = () => { - + {t('image_size.label')} { handleValueChange({ max_image_size: { @@ -308,11 +312,12 @@ const Index: FC = () => { - + {t('attachment_size.label')} { handleValueChange({ max_attachment_size: { @@ -329,10 +334,11 @@ const Index: FC = () => { - + {t('image_megapixels.label')} { handleValueChange({ @@ -350,11 +356,12 @@ const Index: FC = () => { - + {t('image_extensions.label')} { handleValueChange({ authorized_image_extensions: { @@ -371,11 +378,14 @@ const Index: FC = () => { - + {t('attachment_extensions.label')} { handleValueChange({ authorized_attachment_extensions: { From aac2370fe8948acc51bb1099e9e0231c7ecde2a4 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Thu, 21 Nov 2024 15:53:58 +0800 Subject: [PATCH 23/40] feat(upload): add support for file attachments and enhance image upload --- internal/schema/siteinfo_schema.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/schema/siteinfo_schema.go b/internal/schema/siteinfo_schema.go index 814465d99..fee6b8cba 100644 --- a/internal/schema/siteinfo_schema.go +++ b/internal/schema/siteinfo_schema.go @@ -79,8 +79,8 @@ type SiteWriteReq struct { MaxImageSize int `validate:"omitempty,gt=0" json:"max_image_size"` MaxAttachmentSize int `validate:"omitempty,gt=0" json:"max_attachment_size"` MaxImageMegapixel int `validate:"omitempty,gt=0" json:"max_image_megapixel"` - AuthorizedImageExtensions []string `validate:"omitempty,dive,gt=0,lte=128" json:"authorized_image_extensions"` - AuthorizedAttachmentExtensions []string `validate:"omitempty,dive,gt=0,lte=128" json:"authorized_attachment_extensions"` + AuthorizedImageExtensions []string `validate:"omitempty" json:"authorized_image_extensions"` + AuthorizedAttachmentExtensions []string `validate:"omitempty" json:"authorized_attachment_extensions"` UserID string `json:"-"` } From 4e792ea460d0811072b84ca0a3a6de0c04623009 Mon Sep 17 00:00:00 2001 From: shuai Date: Fri, 22 Nov 2024 12:42:05 +0800 Subject: [PATCH 24/40] fix: length error --- ui/src/components/Editor/ToolBars/file.tsx | 2 +- ui/src/pages/Admin/Write/index.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/src/components/Editor/ToolBars/file.tsx b/ui/src/components/Editor/ToolBars/file.tsx index 869d1dc64..15238379f 100644 --- a/ui/src/components/Editor/ToolBars/file.tsx +++ b/ui/src/components/Editor/ToolBars/file.tsx @@ -113,7 +113,7 @@ const Image = ({ editorInstance }) => { }); }; - if (!authorized_attachment_extensions.length) { + if (!authorized_attachment_extensions?.length) { return null; } diff --git a/ui/src/pages/Admin/Write/index.tsx b/ui/src/pages/Admin/Write/index.tsx index d82f5aa05..91e41493c 100644 --- a/ui/src/pages/Admin/Write/index.tsx +++ b/ui/src/pages/Admin/Write/index.tsx @@ -140,13 +140,13 @@ const Index: FC = () => { max_attachment_size: Number(formData.max_attachment_size.value), max_image_megapixel: Number(formData.max_image_megapixel.value), authorized_image_extensions: - formData.authorized_image_extensions.value.length > 0 + formData.authorized_image_extensions.value?.length > 0 ? formData.authorized_image_extensions.value .split(',') ?.map((item) => item.trim().toLowerCase()) : [], authorized_attachment_extensions: - formData.authorized_attachment_extensions.value.length > 0 + formData.authorized_attachment_extensions.value?.length > 0 ? formData.authorized_attachment_extensions.value .split(',') ?.map((item) => item.trim().toLowerCase()) From 7b4044c15d313926bb297fc3a78ab5851deca121 Mon Sep 17 00:00:00 2001 From: shuai Date: Mon, 25 Nov 2024 10:31:38 +0800 Subject: [PATCH 25/40] fix: Optimize the mobile style of QueryGroup component --- ui/src/components/QueryGroup/index.scss | 16 ++++++++++++++++ ui/src/components/QueryGroup/index.tsx | 10 +++++----- 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 ui/src/components/QueryGroup/index.scss diff --git a/ui/src/components/QueryGroup/index.scss b/ui/src/components/QueryGroup/index.scss new file mode 100644 index 000000000..9ab5b36d1 --- /dev/null +++ b/ui/src/components/QueryGroup/index.scss @@ -0,0 +1,16 @@ +.md-show { + display: flex !important; +} +.md-hide { + display: none; +} + + +@media screen and (max-width: 768px) { + .md-show { + display: none !important; + } + .md-hide { + display: block; + } +} diff --git a/ui/src/components/QueryGroup/index.tsx b/ui/src/components/QueryGroup/index.tsx index 7f6a0f3ea..52fca6166 100644 --- a/ui/src/components/QueryGroup/index.tsx +++ b/ui/src/components/QueryGroup/index.tsx @@ -27,6 +27,8 @@ import classNames from 'classnames'; import { REACT_BASE_PATH } from '@/router/alias'; import { floppyNavigation } from '@/utils'; +import './index.scss'; + interface Props { data; i18nKeyPrefix: string; @@ -80,9 +82,7 @@ const Index: FC = ({ return ( <> - + {normalBtnData.map((btn) => { const key = typeof btn === 'string' ? btn : btn.sort; const name = typeof btn === 'string' ? btn : btn.name; @@ -132,8 +132,8 @@ const Index: FC = ({ {data.map((btn) => { const key = typeof btn === 'string' ? btn : btn.sort; From 4f01ccd5ded3d980863b67718340c88cde81cbd7 Mon Sep 17 00:00:00 2001 From: shuai Date: Mon, 25 Nov 2024 11:22:54 +0800 Subject: [PATCH 26/40] fix: Optimize the mobile style of QueryGroup component dropdown btns --- ui/src/components/QueryGroup/index.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ui/src/components/QueryGroup/index.tsx b/ui/src/components/QueryGroup/index.tsx index 52fca6166..878e8ed64 100644 --- a/ui/src/components/QueryGroup/index.tsx +++ b/ui/src/components/QueryGroup/index.tsx @@ -143,11 +143,7 @@ const Index: FC = ({ as="a" key={key} active={currentSort === name} - className={classNames( - 'text-capitalize', - 'd-block d-sm-none', - className, - )} + className={classNames('text-capitalize', className)} href={ pathname ? `${REACT_BASE_PATH}${pathname}${handleParams(key)}` From 1ea056609b7b485c1de99889596f2d104c44f883 Mon Sep 17 00:00:00 2001 From: shuai Date: Mon, 25 Nov 2024 11:45:54 +0800 Subject: [PATCH 27/40] fix: The pre tag sets the maximum height #1168 --- ui/src/index.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/src/index.scss b/ui/src/index.scss index 6da6d336f..7586e9a16 100644 --- a/ui/src/index.scss +++ b/ui/src/index.scss @@ -250,6 +250,7 @@ img[src=""] { background-color: var(--an-e9ecef); border-radius: 0.25rem; padding: 1rem; + max-height: 38rem; } blockquote { border-left: 0.25rem solid #ced4da; From 73eb2a1133b96a4f64d6ad40ed180eed923820f2 Mon Sep 17 00:00:00 2001 From: wxt <3264117476@qq.com> Date: Mon, 25 Nov 2024 14:18:57 +0800 Subject: [PATCH 28/40] test: fix TestGetAvatarURL --- pkg/gravatar/gravatar_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/gravatar/gravatar_test.go b/pkg/gravatar/gravatar_test.go index 50bd79b47..cedbb1a3a 100644 --- a/pkg/gravatar/gravatar_test.go +++ b/pkg/gravatar/gravatar_test.go @@ -38,7 +38,7 @@ func TestGetAvatarURL(t *testing.T) { { name: "answer@answer.com", args: args{email: "answer@answer.com"}, - want: "https://www.gravatar.com/avatar/b2be4e4438f08a5e885be8de5f41fdd7", + want: "https://www.gravatar.com/avatar/7296942c1f63d97f6c124705142009867638f7b3dbcdadd0cb1bcb40e427eb8e", }, } for _, tt := range tests { From 43a474b417a1f85fce4407cd5870936335c9e18a Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Tue, 26 Nov 2024 15:23:33 +0800 Subject: [PATCH 29/40] feat(storage): add upload file condition to plugin upload --- internal/controller/upload_controller.go | 5 +++++ internal/service/uploader/upload.go | 22 +++++++++++++++++++--- plugin/storage.go | 17 ++++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/internal/controller/upload_controller.go b/internal/controller/upload_controller.go index a43ccf641..753be375f 100644 --- a/internal/controller/upload_controller.go +++ b/internal/controller/upload_controller.go @@ -21,6 +21,7 @@ package controller import ( "github.com/apache/incubator-answer/internal/base/handler" + "github.com/apache/incubator-answer/internal/base/middleware" "github.com/apache/incubator-answer/internal/base/reason" "github.com/apache/incubator-answer/internal/schema" "github.com/apache/incubator-answer/internal/service/uploader" @@ -75,6 +76,10 @@ func (uc *UploadController) UploadFile(ctx *gin.Context) { case fileFromPost: url, err = uc.uploaderService.UploadPostFile(ctx) case fileFromBranding: + if !middleware.GetIsAdminFromContext(ctx) { + handler.HandleResponse(ctx, errors.Forbidden(reason.ForbiddenError), nil) + return + } url, err = uc.uploaderService.UploadBrandingFile(ctx) case fileFromPostAttachment: url, err = uc.uploaderService.UploadPostAttachment(ctx) diff --git a/internal/service/uploader/upload.go b/internal/service/uploader/upload.go index 9b810e534..a8d9c0ccf 100644 --- a/internal/service/uploader/upload.go +++ b/internal/service/uploader/upload.go @@ -105,8 +105,12 @@ func (us *uploaderService) UploadAvatarFile(ctx *gin.Context) (url string, err e return url, nil } - // max size - ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, 5*1024*1024) + siteWrite, err := us.siteInfoService.GetSiteWrite(ctx) + if err != nil { + return "", err + } + + ctx.Request.Body = http.MaxBytesReader(ctx.Writer, ctx.Request.Body, siteWrite.GetMaxImageSize()) file, fileHeader, err := ctx.Request.FormFile("file") if err != nil { return "", errors.BadRequest(reason.RequestFormatError).WithError(err) @@ -317,8 +321,20 @@ func (us *uploaderService) uploadAttachmentFile(ctx *gin.Context, file *multipar func (us *uploaderService) tryToUploadByPlugin(ctx *gin.Context, source plugin.UploadSource) ( url string, err error) { + siteWrite, err := us.siteInfoService.GetSiteWrite(ctx) + if err != nil { + return "", err + } + cond := plugin.UploadFileCondition{ + Source: source, + MaxImageSize: siteWrite.MaxImageSize, + MaxAttachmentSize: siteWrite.MaxAttachmentSize, + MaxImageMegapixel: siteWrite.MaxImageMegapixel, + AuthorizedImageExtensions: siteWrite.AuthorizedImageExtensions, + AuthorizedAttachmentExtensions: siteWrite.AuthorizedAttachmentExtensions, + } _ = plugin.CallStorage(func(fn plugin.Storage) error { - resp := fn.UploadFile(ctx, source) + resp := fn.UploadFile(ctx, cond) if resp.OriginalError != nil { log.Errorf("upload file by plugin failed, err: %v", resp.OriginalError) err = errors.BadRequest("").WithMsg(resp.DisplayErrorMsg.Translate(ctx)).WithError(err) diff --git a/plugin/storage.go b/plugin/storage.go index 39c294886..599a41c4c 100644 --- a/plugin/storage.go +++ b/plugin/storage.go @@ -52,6 +52,21 @@ var ( } ) +type UploadFileCondition struct { + // Source is the source of the file + Source UploadSource + // MaxImageSize is the maximum size of the image in MB + MaxImageSize int + // MaxAttachmentSize is the maximum size of the attachment in MB + MaxAttachmentSize int + // MaxImageMegapixel is the maximum megapixel of the image + MaxImageMegapixel int + // AuthorizedImageExtensions is the list of authorized image extensions + AuthorizedImageExtensions []string + // AuthorizedAttachmentExtensions is the list of authorized attachment extensions + AuthorizedAttachmentExtensions []string +} + type UploadFileResponse struct { // FullURL is the URL that can be used to access the file FullURL string @@ -66,7 +81,7 @@ type Storage interface { // UploadFile uploads a file to storage. // The file is in the Form of the ctx and the key is "file" - UploadFile(ctx *GinContext, source UploadSource) UploadFileResponse + UploadFile(ctx *GinContext, condition UploadFileCondition) UploadFileResponse } var ( From b558de8a236476c3dc5f338174d3ac663c48d4c7 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Fri, 29 Nov 2024 15:15:23 +0800 Subject: [PATCH 30/40] feat(user): add top questions and answers to user homepage --- internal/controller/template_controller.go | 12 ++++++-- ui/template/homepage.html | 33 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/internal/controller/template_controller.go b/internal/controller/template_controller.go index df10931e0..0b22360fe 100644 --- a/internal/controller/template_controller.go +++ b/internal/controller/template_controller.go @@ -546,12 +546,20 @@ func (tc *TemplateController) UserInfo(ctx *gin.Context) { return } + questionList, answerList, err := tc.questionService.SearchUserTopList(ctx, req.Username, "") + if err != nil { + 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.BioHTML), + "userinfo": userinfo, + "bio": template.HTML(userinfo.BioHTML), + "topQuestions": questionList, + "topAnswers": answerList, }) } diff --git a/ui/template/homepage.html b/ui/template/homepage.html index 2f68200d5..84887a099 100644 --- a/ui/template/homepage.html +++ b/ui/template/homepage.html @@ -63,10 +63,41 @@
{{translator $.language "ui.personal.about_me"}}
{{if .bio }} -
{{.bio}}
+
{{.bio}}
{{else}}
{{translator $.language "ui.personal.about_me_empty"}}
{{end}} +
+
+
Top Answers
+
    + {{ range .topAnswers }} +
  1. + {{.QuestionInfo.Title}} +
    + {{.VoteCount}} votes +
    +
  2. + {{ end }} +
+
+
+
Top Questions
+
    + {{ range .topQuestions }} +
  1. + {{.Title}} +
    + {{.VoteCount}} votes +
    + {{.AnswerCount}} answers +
    +
    +
  2. + {{ end }} +
+
+
From e41a8522fc0f76c6e76f5f195873cafce4f17e5e Mon Sep 17 00:00:00 2001 From: Luffy <52o@qq52o.cn> Date: Fri, 29 Nov 2024 15:37:31 +0800 Subject: [PATCH 31/40] fix: administrator add user failure --- docs/docs.go | 2 +- docs/swagger.json | 2 +- docs/swagger.yaml | 2 +- internal/schema/backyard_user_schema.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/docs.go b/docs/docs.go index 424bd669c..9863b0c04 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -7829,7 +7829,7 @@ const docTemplate = `{ "display_name": { "type": "string", "maxLength": 30, - "minLength": 4 + "minLength": 2 }, "email": { "type": "string", diff --git a/docs/swagger.json b/docs/swagger.json index 7ec493b2c..5c2f459c9 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -7802,7 +7802,7 @@ "display_name": { "type": "string", "maxLength": 30, - "minLength": 4 + "minLength": 2 }, "email": { "type": "string", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 4622e9648..811b3c288 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -270,7 +270,7 @@ definitions: properties: display_name: maxLength: 30 - minLength: 4 + minLength: 2 type: string email: maxLength: 500 diff --git a/internal/schema/backyard_user_schema.go b/internal/schema/backyard_user_schema.go index 9f8733b25..7c690aee3 100644 --- a/internal/schema/backyard_user_schema.go +++ b/internal/schema/backyard_user_schema.go @@ -120,7 +120,7 @@ type EditUserProfileReq struct { // AddUserReq add user request type AddUserReq struct { - DisplayName string `validate:"required,gte=4,lte=30" json:"display_name"` + DisplayName string `validate:"required,gte=2,lte=30" json:"display_name"` Email string `validate:"required,email,gt=0,lte=500" json:"email"` Password string `validate:"required,gte=8,lte=32" json:"password"` LoginUserID string `json:"-"` From 565ee3cc1b49ed0f836ba6fc1eef9b028abaab49 Mon Sep 17 00:00:00 2001 From: shuai Date: Tue, 3 Dec 2024 10:18:18 +0800 Subject: [PATCH 32/40] fix: Attachment accept type adjustment, editor plug-in insertion position added conditional restrictions --- ui/src/components/Editor/ToolBars/file.tsx | 4 +++- ui/src/components/PluginRender/index.tsx | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ui/src/components/Editor/ToolBars/file.tsx b/ui/src/components/Editor/ToolBars/file.tsx index 15238379f..9e6e7399c 100644 --- a/ui/src/components/Editor/ToolBars/file.tsx +++ b/ui/src/components/Editor/ToolBars/file.tsx @@ -122,7 +122,9 @@ const Image = ({ editorInstance }) => { diff --git a/ui/src/components/PluginRender/index.tsx b/ui/src/components/PluginRender/index.tsx index 9de283f56..002d5a585 100644 --- a/ui/src/components/PluginRender/index.tsx +++ b/ui/src/components/PluginRender/index.tsx @@ -20,6 +20,7 @@ import React, { FC, ReactNode } from 'react'; import PluginKit, { Plugin, PluginType } from '@/utils/pluginKit'; +import { writeSettingStore } from '@/stores'; /** * Note:Please set at least either of the `slug_name` and `type` attributes, otherwise no plugins will be rendered. * @@ -47,6 +48,9 @@ const Index: FC = ({ }) => { const pluginSlice: Plugin[] = []; const plugins = PluginKit.getPlugins().filter((plugin) => plugin.activated); + const { authorized_attachment_extensions = [] } = writeSettingStore( + (state) => state.write, + ); plugins.forEach((plugin) => { if (type && slug_name) { @@ -76,8 +80,10 @@ const Index: FC = ({ } if (type === 'editor') { + const showAttachFile = authorized_attachment_extensions?.length > 0; + const pendIndex = showAttachFile ? 16 : 15; const nodes = React.Children.map(children, (child, index) => { - if (index === 15) { + if (index === pendIndex) { return ( <> {child} From 9fcf1836537597eee425361f99fa5ce7345a238e Mon Sep 17 00:00:00 2001 From: robin Date: Tue, 3 Dec 2024 15:41:19 +0800 Subject: [PATCH 33/40] refactor: remove unused heading options and clean up icon styles --- ui/src/components/Editor/ToolBars/heading.tsx | 7 +- ui/src/components/Editor/index.scss | 75 ------------------- 2 files changed, 1 insertion(+), 81 deletions(-) diff --git a/ui/src/components/Editor/ToolBars/heading.tsx b/ui/src/components/Editor/ToolBars/heading.tsx index 123b55795..8b0cb6043 100644 --- a/ui/src/components/Editor/ToolBars/heading.tsx +++ b/ui/src/components/Editor/ToolBars/heading.tsx @@ -28,11 +28,6 @@ let context: IEditorContext; const Heading = () => { const { t } = useTranslation('translation', { keyPrefix: 'editor' }); const headerList = [ - { - text: `

${t('heading.options.h1')}

`, - level: 1, - label: t('heading.options.h1'), - }, { text: `

${t('heading.options.h2')}

`, level: 2, @@ -60,7 +55,7 @@ const Heading = () => { }, ]; const item = { - label: 'type', + label: 'type-h2', keyMap: ['Ctrl-h'], tip: `${t('heading.text')} (Ctrl+h)`, }; diff --git a/ui/src/components/Editor/index.scss b/ui/src/components/Editor/index.scss index 6cdc4b8c1..afd158715 100644 --- a/ui/src/components/Editor/index.scss +++ b/ui/src/components/Editor/index.scss @@ -69,81 +69,6 @@ &:focus { background-color: var(--ans-editor-toolbar-focus); } - &.icon-heading { - background-position: 0px -144px; - } - &.icon-bold { - background-position: -24px -144px; - } - &.icon-italic { - background-position: -48px -144px; - } - - &.icon-code { - background-position: -72px -144px; - } - - &.icon-link { - background-position: -120px -144px; - } - &.icon-blockquote { - background-position: -144px -144px; - } - &.icon-image { - background-position: -168px -144px; - } - &.icon-video { - background-position: -192px -144px; - } - &.icon-table { - background-position: -216px -144px; - &.disabled { - background-position: -216px -168px !important; - } - } - - &.icon-formula { - background-position: -528px -144px; - } - &.icon-indent { - background-position: -288px -144px; - } - &.icon-outdent { - background-position: -312px -144px; - } - &.icon-orderedList { - background-position: -240px -144px; - } - &.icon-unorderedList { - background-position: -264px -144px; - } - &.icon-hr { - background-position: -336px -144px; - } - &.icon-help { - background-position: -360px -144px; - } - &.icon-full { - background-position: -456px -144px; - } - &.icon-exit-sync-scroll { - background-position: -432px -144px; - } - &.icon-sync-scroll { - background-position: -432px -192px; - } - &.icon-exit-preview { - background-position: -408px -144px; - } - &.icon-preview { - background-position: -408px -192px; - } - &.icon-exit-full { - background-position: -480px -144px; - } - &.icon-chart { - background-position: -552px -144px; - } } .popup-wrap { position: absolute; From 7f77647048000c31c51d0736ff0ae254dda12a0f Mon Sep 17 00:00:00 2001 From: robin Date: Tue, 3 Dec 2024 15:43:14 +0800 Subject: [PATCH 34/40] refactor(i18n): update formatting instructions to mention post IDs --- i18n/en_US.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml index 776207c29..f4c67a188 100644 --- a/i18n/en_US.yaml +++ b/i18n/en_US.yaml @@ -789,7 +789,7 @@ ui: how_to_format: title: How to Format desc: >- -
  • link question or answer: #10010000000000001

  • +
    • mention a post: #post_id

    • to make links

      <https://url.com>

      [Title](https://url.com)
    • put returns between paragraphs

    • Date: Tue, 3 Dec 2024 17:36:01 +0800 Subject: [PATCH 35/40] feat(file): implement file download functionality --- internal/router/static_router.go | 17 +++++++++++++++++ internal/service/uploader/upload.go | 19 ++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/internal/router/static_router.go b/internal/router/static_router.go index 5b0874313..3fbb12dab 100644 --- a/internal/router/static_router.go +++ b/internal/router/static_router.go @@ -22,6 +22,8 @@ package router import ( "github.com/apache/incubator-answer/internal/service/service_config" "github.com/gin-gonic/gin" + "path/filepath" + "strings" ) // StaticRouter static api router @@ -39,4 +41,19 @@ func NewStaticRouter(serviceConfig *service_config.ServiceConfig) *StaticRouter // RegisterStaticRouter register static api router func (a *StaticRouter) RegisterStaticRouter(r *gin.RouterGroup) { r.Static("/uploads", a.serviceConfig.UploadPath) + + r.GET("/download/*filepath", func(c *gin.Context) { + // The filePath such as /download/hash/123.png + filePath := c.Param("filepath") + // The download filename is 123.png + downloadFilename := filepath.Base(filePath) + + // After trimming, the downloadLink is /uploads/hash + downloadLink := strings.TrimSuffix(filePath, "/"+downloadFilename) + // After add the extension, the downloadLink is /uploads/hash.png + downloadLink += filepath.Ext(downloadFilename) + + downloadLink = filepath.Join(a.serviceConfig.UploadPath, downloadLink) + c.FileAttachment(downloadLink, downloadFilename) + }) } diff --git a/internal/service/uploader/upload.go b/internal/service/uploader/upload.go index a8d9c0ccf..6baf00d15 100644 --- a/internal/service/uploader/upload.go +++ b/internal/service/uploader/upload.go @@ -25,6 +25,7 @@ import ( "io" "mime/multipart" "net/http" + "net/url" "os" "path" "path/filepath" @@ -237,7 +238,7 @@ func (us *uploaderService) UploadPostAttachment(ctx *gin.Context) ( fileExt := strings.ToLower(path.Ext(fileHeader.Filename)) newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) avatarFilePath := path.Join(postSubPath, newFilename) - return us.uploadAttachmentFile(ctx, fileHeader, avatarFilePath) + return us.uploadAttachmentFile(ctx, fileHeader, fileHeader.Filename, avatarFilePath) } func (us *uploaderService) UploadBrandingFile(ctx *gin.Context) ( @@ -304,8 +305,8 @@ func (us *uploaderService) uploadImageFile(ctx *gin.Context, file *multipart.Fil return url, nil } -func (us *uploaderService) uploadAttachmentFile(ctx *gin.Context, file *multipart.FileHeader, fileSubPath string) ( - url string, err error) { +func (us *uploaderService) uploadAttachmentFile(ctx *gin.Context, file *multipart.FileHeader, originalFilename, fileSubPath string) ( + downloadUrl string, err error) { siteGeneral, err := us.siteInfoService.GetSiteGeneral(ctx) if err != nil { return "", err @@ -315,8 +316,16 @@ func (us *uploaderService) uploadAttachmentFile(ctx *gin.Context, file *multipar return "", errors.InternalServer(reason.UnknownError).WithError(err).WithStack() } - url = fmt.Sprintf("%s/uploads/%s", siteGeneral.SiteUrl, fileSubPath) - return url, nil + // The original filename is 123.png + // The local saved path is /UploadPath/hash.png + // The download link wil be /download/hash/123.png. + // When downloading, the download link will be redirect to the local saved path. And the download filename will be 123.png. + ext := filepath.Ext(fileSubPath) + // Need url encode the original filename. Because the filename may contain special characters that conflict with the markdown syntax. + originalFilename = url.QueryEscape(originalFilename) + downloadPath := strings.TrimSuffix(fileSubPath, ext) + "/" + originalFilename + downloadUrl = fmt.Sprintf("%s/download/%s", siteGeneral.SiteUrl, downloadPath) + return downloadUrl, nil } func (us *uploaderService) tryToUploadByPlugin(ctx *gin.Context, source plugin.UploadSource) ( From 7a8cc6a5712401904a9bb5c600530b777f63064f Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Wed, 4 Dec 2024 14:55:19 +0800 Subject: [PATCH 36/40] refactor(uploader): improve file upload and download functionality subpath constants - Adjust file download --- internal/base/constant/upload.go | 9 ++++++ internal/router/static_router.go | 28 ++++++++--------- internal/service/uploader/upload.go | 48 +++++++++++++---------------- 3 files changed, 44 insertions(+), 41 deletions(-) create mode 100644 internal/base/constant/upload.go diff --git a/internal/base/constant/upload.go b/internal/base/constant/upload.go new file mode 100644 index 000000000..5a884ae7f --- /dev/null +++ b/internal/base/constant/upload.go @@ -0,0 +1,9 @@ +package constant + +const ( + AvatarSubPath = "avatar" + AvatarThumbSubPath = "avatar_thumb" + PostSubPath = "post" + BrandingSubPath = "branding" + FilesPostSubPath = "files/post" +) diff --git a/internal/router/static_router.go b/internal/router/static_router.go index 3fbb12dab..71457f49e 100644 --- a/internal/router/static_router.go +++ b/internal/router/static_router.go @@ -20,6 +20,7 @@ package router import ( + "github.com/apache/incubator-answer/internal/base/constant" "github.com/apache/incubator-answer/internal/service/service_config" "github.com/gin-gonic/gin" "path/filepath" @@ -40,20 +41,19 @@ func NewStaticRouter(serviceConfig *service_config.ServiceConfig) *StaticRouter // RegisterStaticRouter register static api router func (a *StaticRouter) RegisterStaticRouter(r *gin.RouterGroup) { - r.Static("/uploads", a.serviceConfig.UploadPath) - - r.GET("/download/*filepath", func(c *gin.Context) { - // The filePath such as /download/hash/123.png + r.Static("/uploads/"+constant.AvatarSubPath, filepath.Join(a.serviceConfig.UploadPath, constant.AvatarSubPath)) + r.Static("/uploads/"+constant.AvatarThumbSubPath, filepath.Join(a.serviceConfig.UploadPath, constant.AvatarThumbSubPath)) + r.Static("/uploads/"+constant.PostSubPath, filepath.Join(a.serviceConfig.UploadPath, constant.PostSubPath)) + r.Static("/uploads/"+constant.BrandingSubPath, filepath.Join(a.serviceConfig.UploadPath, constant.BrandingSubPath)) + r.GET("/uploads/"+constant.FilesPostSubPath+"/*filepath", func(c *gin.Context) { + // The filepath such as hash/123.pdf filePath := c.Param("filepath") - // The download filename is 123.png - downloadFilename := filepath.Base(filePath) - - // After trimming, the downloadLink is /uploads/hash - downloadLink := strings.TrimSuffix(filePath, "/"+downloadFilename) - // After add the extension, the downloadLink is /uploads/hash.png - downloadLink += filepath.Ext(downloadFilename) - - downloadLink = filepath.Join(a.serviceConfig.UploadPath, downloadLink) - c.FileAttachment(downloadLink, downloadFilename) + // The original filename is 123.pdf + originalFilename := filepath.Base(filePath) + // The real filename is hash.pdf + realFilename := strings.TrimSuffix(filePath, "/"+originalFilename) + filepath.Ext(originalFilename) + // The file local path is /uploads/files/post/hash.pdf + fileLocalPath := filepath.Join(a.serviceConfig.UploadPath, constant.FilesPostSubPath, realFilename) + c.FileAttachment(fileLocalPath, originalFilename) }) } diff --git a/internal/service/uploader/upload.go b/internal/service/uploader/upload.go index 6baf00d15..8530d17ff 100644 --- a/internal/service/uploader/upload.go +++ b/internal/service/uploader/upload.go @@ -31,6 +31,7 @@ import ( "path/filepath" "strings" + "github.com/apache/incubator-answer/internal/base/constant" "github.com/apache/incubator-answer/internal/base/reason" "github.com/apache/incubator-answer/internal/service/service_config" "github.com/apache/incubator-answer/internal/service/siteinfo_common" @@ -45,19 +46,13 @@ import ( "github.com/segmentfault/pacman/log" ) -const ( - avatarSubPath = "avatar" - avatarThumbSubPath = "avatar_thumb" - postSubPath = "post" - brandingSubPath = "branding" -) - var ( subPathList = []string{ - avatarSubPath, - avatarThumbSubPath, - postSubPath, - brandingSubPath, + constant.AvatarSubPath, + constant.AvatarThumbSubPath, + constant.PostSubPath, + constant.BrandingSubPath, + constant.FilesPostSubPath, } supportedThumbFileExtMapping = map[string]imaging.Format{ ".jpg": imaging.JPEG, @@ -123,7 +118,7 @@ func (us *uploaderService) UploadAvatarFile(ctx *gin.Context) (url string, err e } newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) - avatarFilePath := path.Join(avatarSubPath, newFilename) + avatarFilePath := path.Join(constant.AvatarSubPath, newFilename) return us.uploadImageFile(ctx, fileHeader, avatarFilePath) } @@ -131,19 +126,19 @@ func (us *uploaderService) AvatarThumbFile(ctx *gin.Context, fileName string, si fileSuffix := path.Ext(fileName) if _, ok := supportedThumbFileExtMapping[fileSuffix]; !ok { // if file type is not supported, return original file - return path.Join(us.serviceConfig.UploadPath, avatarSubPath, fileName), nil + return path.Join(us.serviceConfig.UploadPath, constant.AvatarSubPath, fileName), nil } if size > 1024 { size = 1024 } thumbFileName := fmt.Sprintf("%d_%d@%s", size, size, fileName) - thumbFilePath := fmt.Sprintf("%s/%s/%s", us.serviceConfig.UploadPath, avatarThumbSubPath, thumbFileName) + thumbFilePath := fmt.Sprintf("%s/%s/%s", us.serviceConfig.UploadPath, constant.AvatarThumbSubPath, thumbFileName) avatarFile, err := os.ReadFile(thumbFilePath) if err == nil { return thumbFilePath, nil } - filePath := fmt.Sprintf("%s/%s/%s", us.serviceConfig.UploadPath, avatarSubPath, fileName) + filePath := fmt.Sprintf("%s/%s/%s", us.serviceConfig.UploadPath, constant.AvatarSubPath, fileName) avatarFile, err = os.ReadFile(filePath) if err != nil { return "", errors.InternalServer(reason.UnknownError).WithError(err).WithStack() @@ -160,11 +155,11 @@ func (us *uploaderService) AvatarThumbFile(ctx *gin.Context, fileName string, si return "", errors.InternalServer(reason.UnknownError).WithError(err).WithStack() } - if err = dir.CreateDirIfNotExist(path.Join(us.serviceConfig.UploadPath, avatarThumbSubPath)); err != nil { + if err = dir.CreateDirIfNotExist(path.Join(us.serviceConfig.UploadPath, constant.AvatarThumbSubPath)); err != nil { return "", errors.InternalServer(reason.UnknownError).WithError(err).WithStack() } - avatarFilePath := path.Join(avatarThumbSubPath, thumbFileName) + avatarFilePath := path.Join(constant.AvatarThumbSubPath, thumbFileName) saveFilePath := path.Join(us.serviceConfig.UploadPath, avatarFilePath) out, err := os.Create(saveFilePath) if err != nil { @@ -206,7 +201,7 @@ func (us *uploaderService) UploadPostFile(ctx *gin.Context) ( fileExt := strings.ToLower(path.Ext(fileHeader.Filename)) newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) - avatarFilePath := path.Join(postSubPath, newFilename) + avatarFilePath := path.Join(constant.PostSubPath, newFilename) return us.uploadImageFile(ctx, fileHeader, avatarFilePath) } @@ -237,7 +232,7 @@ func (us *uploaderService) UploadPostAttachment(ctx *gin.Context) ( fileExt := strings.ToLower(path.Ext(fileHeader.Filename)) newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) - avatarFilePath := path.Join(postSubPath, newFilename) + avatarFilePath := path.Join(constant.FilesPostSubPath, newFilename) return us.uploadAttachmentFile(ctx, fileHeader, fileHeader.Filename, avatarFilePath) } @@ -268,7 +263,7 @@ func (us *uploaderService) UploadBrandingFile(ctx *gin.Context) ( } newFilename := fmt.Sprintf("%s%s", uid.IDStr12(), fileExt) - avatarFilePath := path.Join(brandingSubPath, newFilename) + avatarFilePath := path.Join(constant.BrandingSubPath, newFilename) return us.uploadImageFile(ctx, fileHeader, avatarFilePath) } @@ -316,15 +311,14 @@ func (us *uploaderService) uploadAttachmentFile(ctx *gin.Context, file *multipar return "", errors.InternalServer(reason.UnknownError).WithError(err).WithStack() } - // The original filename is 123.png - // The local saved path is /UploadPath/hash.png - // The download link wil be /download/hash/123.png. - // When downloading, the download link will be redirect to the local saved path. And the download filename will be 123.png. - ext := filepath.Ext(fileSubPath) // Need url encode the original filename. Because the filename may contain special characters that conflict with the markdown syntax. originalFilename = url.QueryEscape(originalFilename) - downloadPath := strings.TrimSuffix(fileSubPath, ext) + "/" + originalFilename - downloadUrl = fmt.Sprintf("%s/download/%s", siteGeneral.SiteUrl, downloadPath) + + // The original filename is 123.pdf + // The local saved path is /UploadPath/hash.pdf + // When downloading, the download link will be redirect to the local saved path. And the download filename will be 123.png. + downloadPath := strings.TrimSuffix(fileSubPath, filepath.Ext(fileSubPath)) + "/" + originalFilename + downloadUrl = fmt.Sprintf("%s/uploads/%s", siteGeneral.SiteUrl, downloadPath) return downloadUrl, nil } From 9c266c5f33e63333bd372f0f1c9afff0f53ca156 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Wed, 4 Dec 2024 14:58:27 +0800 Subject: [PATCH 37/40] feat(upload): add support for attachment uploads and improve image handling --- docs/docs.go | 49 ++++++++++++++++++++++++- docs/swagger.json | 49 ++++++++++++++++++++++++- docs/swagger.yaml | 31 ++++++++++++++++ internal/base/constant/upload.go | 19 ++++++++++ ui/src/components/QueryGroup/index.scss | 19 ++++++++++ 5 files changed, 163 insertions(+), 4 deletions(-) diff --git a/docs/docs.go b/docs/docs.go index 9863b0c04..da050e10b 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -3145,6 +3145,7 @@ const docTemplate = `{ { "enum": [ "post", + "post_attachment", "avatar", "branding" ], @@ -4483,7 +4484,8 @@ const docTemplate = `{ "hot", "score", "unanswered", - "recommend" + "recommend", + "frequent" ], "type": "string", "name": "order", @@ -9666,7 +9668,8 @@ const docTemplate = `{ "hot", "score", "unanswered", - "recommend" + "recommend", + "frequent" ] }, "page": { @@ -10641,6 +10644,27 @@ const docTemplate = `{ "schema.SiteWriteReq": { "type": "object", "properties": { + "authorized_attachment_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "authorized_image_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "max_attachment_size": { + "type": "integer" + }, + "max_image_megapixel": { + "type": "integer" + }, + "max_image_size": { + "type": "integer" + }, "recommend_tags": { "type": "array", "items": { @@ -10664,6 +10688,27 @@ const docTemplate = `{ "schema.SiteWriteResp": { "type": "object", "properties": { + "authorized_attachment_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "authorized_image_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "max_attachment_size": { + "type": "integer" + }, + "max_image_megapixel": { + "type": "integer" + }, + "max_image_size": { + "type": "integer" + }, "recommend_tags": { "type": "array", "items": { diff --git a/docs/swagger.json b/docs/swagger.json index 5c2f459c9..bcce7817d 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -3118,6 +3118,7 @@ { "enum": [ "post", + "post_attachment", "avatar", "branding" ], @@ -4456,7 +4457,8 @@ "hot", "score", "unanswered", - "recommend" + "recommend", + "frequent" ], "type": "string", "name": "order", @@ -9639,7 +9641,8 @@ "hot", "score", "unanswered", - "recommend" + "recommend", + "frequent" ] }, "page": { @@ -10614,6 +10617,27 @@ "schema.SiteWriteReq": { "type": "object", "properties": { + "authorized_attachment_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "authorized_image_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "max_attachment_size": { + "type": "integer" + }, + "max_image_megapixel": { + "type": "integer" + }, + "max_image_size": { + "type": "integer" + }, "recommend_tags": { "type": "array", "items": { @@ -10637,6 +10661,27 @@ "schema.SiteWriteResp": { "type": "object", "properties": { + "authorized_attachment_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "authorized_image_extensions": { + "type": "array", + "items": { + "type": "string" + } + }, + "max_attachment_size": { + "type": "integer" + }, + "max_image_megapixel": { + "type": "integer" + }, + "max_image_size": { + "type": "integer" + }, "recommend_tags": { "type": "array", "items": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 811b3c288..5e22186a9 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -1556,6 +1556,7 @@ definitions: - score - unanswered - recommend + - frequent type: string page: minimum: 1 @@ -2221,6 +2222,20 @@ definitions: type: object schema.SiteWriteReq: properties: + authorized_attachment_extensions: + items: + type: string + type: array + authorized_image_extensions: + items: + type: string + type: array + max_attachment_size: + type: integer + max_image_megapixel: + type: integer + max_image_size: + type: integer recommend_tags: items: $ref: '#/definitions/schema.SiteWriteTag' @@ -2236,6 +2251,20 @@ definitions: type: object schema.SiteWriteResp: properties: + authorized_attachment_extensions: + items: + type: string + type: array + authorized_image_extensions: + items: + type: string + type: array + max_attachment_size: + type: integer + max_image_megapixel: + type: integer + max_image_size: + type: integer recommend_tags: items: $ref: '#/definitions/schema.SiteWriteTag' @@ -4767,6 +4796,7 @@ paths: - description: identify the source of the file upload enum: - post + - post_attachment - avatar - branding in: formData @@ -5601,6 +5631,7 @@ paths: - score - unanswered - recommend + - frequent in: query name: order type: string diff --git a/internal/base/constant/upload.go b/internal/base/constant/upload.go index 5a884ae7f..c01c92790 100644 --- a/internal/base/constant/upload.go +++ b/internal/base/constant/upload.go @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package constant const ( diff --git a/ui/src/components/QueryGroup/index.scss b/ui/src/components/QueryGroup/index.scss index 9ab5b36d1..3a05069f3 100644 --- a/ui/src/components/QueryGroup/index.scss +++ b/ui/src/components/QueryGroup/index.scss @@ -1,3 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + .md-show { display: flex !important; } From a4752957841a9c524325f535aadad685ce2be571 Mon Sep 17 00:00:00 2001 From: Luffy <52o@qq52o.cn> Date: Fri, 6 Dec 2024 14:34:30 +0800 Subject: [PATCH 38/40] feat: Add delete external user login info by user ID --- cmd/wire_gen.go | 2 +- .../user_external_login/user_external_login_repo.go | 10 ++++++++++ internal/service/user_admin/user_backyard.go | 11 +++++++++++ .../user_external_login_service.go | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go index 5e4d395b0..3f2679847 100644 --- a/cmd/wire_gen.go +++ b/cmd/wire_gen.go @@ -228,7 +228,7 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database, revisionController := controller.NewRevisionController(contentRevisionService, rankService) rankController := controller.NewRankController(rankService) userAdminRepo := user.NewUserAdminRepo(dataData, authRepo) - userAdminService := user_admin.NewUserAdminService(userAdminRepo, userRoleRelService, authService, userCommon, userActiveActivityRepo, siteInfoCommonService, emailService, questionRepo, answerRepo, commentCommonRepo) + userAdminService := user_admin.NewUserAdminService(userAdminRepo, userRoleRelService, authService, userCommon, userActiveActivityRepo, siteInfoCommonService, emailService, questionRepo, answerRepo, commentCommonRepo, userExternalLoginRepo) userAdminController := controller_admin.NewUserAdminController(userAdminService) reasonRepo := reason.NewReasonRepo(configService) reasonService := reason2.NewReasonService(reasonRepo) diff --git a/internal/repo/user_external_login/user_external_login_repo.go b/internal/repo/user_external_login/user_external_login_repo.go index 8b78b8b4c..c2d131086 100644 --- a/internal/repo/user_external_login/user_external_login_repo.go +++ b/internal/repo/user_external_login/user_external_login_repo.go @@ -104,6 +104,16 @@ func (ur *userExternalLoginRepo) DeleteUserExternalLogin(ctx context.Context, us return } +// DeleteUserExternalLoginByUserID delete external user login info by user ID +func (ur *userExternalLoginRepo) DeleteUserExternalLoginByUserID(ctx context.Context, userID string) (err error) { + cond := &entity.UserExternalLogin{} + _, err = ur.data.DB.Context(ctx).Where("user_id = ?", userID).Delete(cond) + if err != nil { + err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack() + } + return +} + // SetCacheUserExternalLoginInfo cache user info for external login func (ur *userExternalLoginRepo) SetCacheUserExternalLoginInfo( ctx context.Context, key string, info *schema.ExternalLoginUserInfoCache) (err error) { diff --git a/internal/service/user_admin/user_backyard.go b/internal/service/user_admin/user_backyard.go index 52c0d6300..ebe1ea741 100644 --- a/internal/service/user_admin/user_backyard.go +++ b/internal/service/user_admin/user_backyard.go @@ -45,6 +45,7 @@ import ( "github.com/apache/incubator-answer/internal/service/role" "github.com/apache/incubator-answer/internal/service/siteinfo_common" usercommon "github.com/apache/incubator-answer/internal/service/user_common" + "github.com/apache/incubator-answer/internal/service/user_external_login" "github.com/apache/incubator-answer/pkg/checker" "github.com/jinzhu/copier" "github.com/segmentfault/pacman/errors" @@ -76,6 +77,7 @@ type UserAdminService struct { questionCommonRepo questioncommon.QuestionRepo answerCommonRepo answercommon.AnswerRepo commentCommonRepo comment_common.CommentCommonRepo + userExternalLoginRepo user_external_login.UserExternalLoginRepo } // NewUserAdminService new user admin service @@ -90,6 +92,7 @@ func NewUserAdminService( questionCommonRepo questioncommon.QuestionRepo, answerCommonRepo answercommon.AnswerRepo, commentCommonRepo comment_common.CommentCommonRepo, + userExternalLoginRepo user_external_login.UserExternalLoginRepo, ) *UserAdminService { return &UserAdminService{ userRepo: userRepo, @@ -102,6 +105,7 @@ func NewUserAdminService( questionCommonRepo: questionCommonRepo, answerCommonRepo: answerCommonRepo, commentCommonRepo: commentCommonRepo, + userExternalLoginRepo: userExternalLoginRepo, } } @@ -148,6 +152,13 @@ func (us *UserAdminService) UpdateUserStatus(ctx context.Context, req *schema.Up us.removeAllUserCreatedContent(ctx, userInfo.ID) } + if req.IsDeleted() { + err := us.userExternalLoginRepo.DeleteUserExternalLoginByUserID(ctx, userInfo.ID) + if err != nil { + log.Errorf("remove all user external login error: %v", err) + } + } + // if user reputation is zero means this user is inactive, so try to activate this user. if req.IsNormal() && userInfo.Rank == 0 { return us.userActivity.UserActive(ctx, userInfo.ID) diff --git a/internal/service/user_external_login/user_external_login_service.go b/internal/service/user_external_login/user_external_login_service.go index e0afbd377..9107fcc0a 100644 --- a/internal/service/user_external_login/user_external_login_service.go +++ b/internal/service/user_external_login/user_external_login_service.go @@ -51,6 +51,7 @@ type UserExternalLoginRepo interface { GetByUserID(ctx context.Context, provider, userID string) (userInfo *entity.UserExternalLogin, exist bool, err error) GetUserExternalLoginList(ctx context.Context, userID string) (resp []*entity.UserExternalLogin, err error) DeleteUserExternalLogin(ctx context.Context, userID, externalID string) (err error) + DeleteUserExternalLoginByUserID(ctx context.Context, userID string) (err error) SetCacheUserExternalLoginInfo(ctx context.Context, key string, info *schema.ExternalLoginUserInfoCache) (err error) GetCacheUserExternalLoginInfo(ctx context.Context, key string) (info *schema.ExternalLoginUserInfoCache, err error) } From f6d517b93025104fdf66591d4cc8ffd811281762 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Mon, 9 Dec 2024 11:43:23 +0800 Subject: [PATCH 39/40] docs(Makefile): upgrade version to 1.4.2 --- Makefile | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a980a0473..8b054aab2 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ .PHONY: build clean ui -VERSION=1.4.1 +VERSION=1.4.2 BIN=answer DIR_SRC=./cmd/answer DOCKER_CMD=docker diff --git a/README.md b/README.md index 4eb1cc7ce..bdf036c7a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ To learn more about the project, visit [answer.apache.org](https://answer.apache ### Running with docker ```bash -docker run -d -p 9080:80 -v answer-data:/data --name answer apache/answer:1.4.1 +docker run -d -p 9080:80 -v answer-data:/data --name answer apache/answer:1.4.2 ``` For more information, see [Installation](https://answer.apache.org/docs/installation). From 6ae189010b8e87d303465dbdb91e164954826373 Mon Sep 17 00:00:00 2001 From: LinkinStars Date: Mon, 9 Dec 2024 14:40:43 +0800 Subject: [PATCH 40/40] Update translation (#1199) --- i18n/cs_CZ.yaml | 510 ++++++----- i18n/cy_GB.yaml | 56 +- i18n/da_DK.yaml | 56 +- i18n/de_DE.yaml | 56 +- i18n/es_ES.yaml | 56 +- i18n/fa_IR.yaml | 56 +- i18n/fr_FR.yaml | 56 +- i18n/hi_IN.yaml | 56 +- i18n/id_ID.yaml | 56 +- i18n/it_IT.yaml | 58 +- i18n/ja_JP.yaml | 2188 ++++++++++++++++++++++++----------------------- i18n/ko_KR.yaml | 56 +- i18n/ml_IN.yaml | 40 +- i18n/pl_PL.yaml | 74 +- i18n/pt_PT.yaml | 76 +- i18n/ro_RO.yaml | 62 +- i18n/ru_RU.yaml | 58 +- i18n/sk_SK.yaml | 56 +- i18n/sv_SE.yaml | 70 +- i18n/te_IN.yaml | 56 +- i18n/tr_TR.yaml | 56 +- i18n/uk_UA.yaml | 1196 +++++++++++++------------- i18n/vi_VN.yaml | 56 +- i18n/zh_CN.yaml | 57 +- i18n/zh_TW.yaml | 66 +- 25 files changed, 3041 insertions(+), 2142 deletions(-) diff --git a/i18n/cs_CZ.yaml b/i18n/cs_CZ.yaml index 65438419f..72179edfb 100644 --- a/i18n/cs_CZ.yaml +++ b/i18n/cs_CZ.yaml @@ -19,116 +19,116 @@ backend: base: success: - other: Success. + other: Úspěch. unknown: - other: Unknown error. + other: Neznámá chyba. request_format_error: - other: Request format is not valid. + other: Formát požadavku není platný. unauthorized_error: - other: Unauthorized. + other: Neautorizováno. database_error: - other: Data server error. + other: Chyba datového serveru. forbidden_error: - other: Forbidden. + other: Zakázáno. duplicate_request_error: - other: Duplicate submission. + other: Duplicitní odeslání. action: report: - other: Flag + other: Nahlásit edit: - other: Edit + other: Upravit delete: - other: Delete + other: Smazat close: - other: Close + other: Zavřít reopen: - other: Reopen + other: Znovu otevřít forbidden_error: - other: Forbidden. + other: Zakázáno. pin: - other: Pin + other: Připnout hide: - other: Unlist + other: Skrýt unpin: - other: Unpin + other: Odepnout show: - other: List + other: Zobrazit invite_someone_to_answer: - other: Edit + other: Upravit undelete: - other: Undelete + other: Obnovit role: name: user: - other: User + other: Uživatel admin: - other: Admin + other: Administrátor moderator: - other: Moderator + other: Moderátor description: user: - other: Default with no special access. + other: Výchozí bez zvláštního přístupu. admin: - other: Have the full power to access the site. + other: Má plnou kontrolu nad stránkou. moderator: - other: Has access to all posts except admin settings. + other: Má přístup ke všem příspěvkům kromě admin nastavení. privilege: level_1: description: - other: Level 1 (less reputation required for private team, group) + other: Úroveň 1 (méně reputace je vyžadováno pro soukromý tým, skupinu) level_2: description: - other: Level 2 (low reputation required for startup community) + other: Úroveň 2 (nízká reputace je vyžadována pro startovací komunitu) level_3: description: - other: Level 3 (high reputation required for mature community) + other: Úroveň 3 (vysoká reputace je vyžadována pro vyspělou komunitu) level_custom: description: - other: Custom Level + other: Vlastní úroveň rank_question_add_label: - other: Ask question + other: Položit dotaz rank_answer_add_label: - other: Write answer + other: Napsat odpověď rank_comment_add_label: - other: Write comment + other: Napsat komentář rank_report_add_label: - other: Flag + other: Nahlásit rank_comment_vote_up_label: - other: Upvote comment + other: Hlasovat pro komentář rank_link_url_limit_label: - other: Post more than 2 links at a time + other: Zveřejnit více než 2 odkazy najednou rank_question_vote_up_label: - other: Upvote question + other: Hlasovat pro dotaz rank_answer_vote_up_label: - other: Upvote answer + other: Hlasovat pro odpověď rank_question_vote_down_label: - other: Downvote question + other: Hlasovat proti otázce rank_answer_vote_down_label: - other: Downvote answer + other: Hlasovat proti odpovědi rank_invite_someone_to_answer_label: - other: Invite someone to answer + other: Pozvěte někoho, aby odpověděl rank_tag_add_label: - other: Create new tag + other: Vytvořit nový štítek rank_tag_edit_label: - other: Edit tag description (need to review) + other: Upravit popis štítku (vyžaduje kontrolu) rank_question_edit_label: - other: Edit other's question (need to review) + other: Upravit dotaz někoho jiného (vyžaduje kontrolu) rank_answer_edit_label: - other: Edit other's answer (need to review) + other: Upravit odpověď někoho jiného (vyžaduje kontrolu) rank_question_edit_without_review_label: - other: Edit other's question without review + other: Upravit dotaz někoho jiného (bez kontroly) rank_answer_edit_without_review_label: - other: Edit other's answer without review + other: Upravit odpověď někoho jiného (bez kontroly) rank_question_audit_label: - other: Review question edits + other: Zkontrolovat úpravy dotazu rank_answer_audit_label: - other: Review answer edits + other: Zkontrolovat úpravy odpovědí rank_tag_audit_label: - other: Review tag edits + other: Zkontrolovat úpravy štítků rank_tag_edit_without_review_label: - other: Edit tag description without review + other: Upravit popis štítku (bez kontroly) rank_tag_synonym_label: - other: Manage tag synonyms + other: Správa synonym štítků email: other: Email e_mail: @@ -136,17 +136,17 @@ backend: password: other: Heslo pass: - other: Password + other: Heslo original_text: - other: This post + other: Tento příspěvek email_or_password_wrong_error: - other: Email and password do not match. + other: Email a heslo nesouhlasí. error: common: invalid_url: - other: Invalid URL. + other: Neplatná URL. status_invalid: - other: Invalid status. + other: Neplatný stav. password: space_invalid: other: Heslo nesmí obsahovat mezery. @@ -154,7 +154,7 @@ backend: cannot_update_their_password: other: Nemůžete změnit své heslo. cannot_edit_their_profile: - other: You cannot modify your profile. + other: Nemůžete upravovat svůj profil. cannot_modify_self_status: other: Nemůžete změnit svůj stav. email_or_password_wrong: @@ -167,7 +167,7 @@ backend: cannot_update: other: Nemáte právo aktualizovat. question_closed_cannot_add: - other: Otázky jsou uzavřené a není možno je přidávat. + other: Dotazy jsou uzavřené a není možno je přidávat. comment: edit_without_permission: other: Nejsou povoleny úpravy komentáře. @@ -186,375 +186,375 @@ backend: other: Email z této domény není povolen. Použijte jinou doménu. lang: not_found: - other: Language file not found. + other: Jazykový soubor nenalezen. object: captcha_verification_failed: other: Nesprávně vyplněná Captcha. disallow_follow: - other: You are not allowed to follow. + other: Nemáte oprávnění sledovat. disallow_vote: - other: You are not allowed to vote. + other: Nemáte oprávnění hlasovat. disallow_vote_your_self: - other: You can't vote for your own post. + other: Nemůžete hlasovat pro svůj vlastní příspěvek. not_found: - other: Object not found. + other: Objekt nenalezen. verification_failed: - other: Verification failed. + other: Ověření se nezdařilo. email_or_password_incorrect: - other: Email and password do not match. + other: Email a heslo nesouhlasí. old_password_verification_failed: - other: The old password verification failed + other: Ověření starého hesla selhalo new_password_same_as_previous_setting: - other: The new password is the same as the previous one. + other: Nové heslo je stejné jako předchozí. already_deleted: - other: This post has been deleted. + other: Tento příspěvek byl odstraněn. meta: object_not_found: - other: Meta object not found + other: Meta objekt nenalezen question: already_deleted: - other: This post has been deleted. + other: Tento příspěvek byl odstraněn. under_review: - other: Your post is awaiting review. It will be visible after it has been approved. + other: Váš příspěvek čeká na kontrolu. Bude viditelný po jeho schválení. not_found: - other: Question not found. + other: Dotaz nenalezen. cannot_deleted: - other: No permission to delete. + other: Nemáte oprávnění k mazání. cannot_close: - other: No permission to close. + other: Nemáte oprávnění k uzavření. cannot_update: - other: No permission to update. + other: Nemáte oprávnění pro aktualizaci. rank: fail_to_meet_the_condition: - other: Reputation rank fail to meet the condition. + other: Hodnost reputace nesplňuje podmínku. vote_fail_to_meet_the_condition: - other: Thanks for the feedback. You need at least {{.Rank}} reputation to cast a vote. + other: Děkujeme za zpětnou vazbu. Potřebujete alespoň úroveň {{.Rank}}, abyste mohli hlasovat. no_enough_rank_to_operate: - other: You need at least {{.Rank}} reputation to do this. + other: Potřebujete alespoň úroveň {{.Rank}} k provedení této akce. report: handle_failed: - other: Report handle failed. + other: Report selhal. not_found: - other: Report not found. + other: Report nebyl nalezen. tag: already_exist: - other: Tag already exists. + other: Štítek již existuje. not_found: - other: Tag not found. + other: Štítek nebyl nalezen. recommend_tag_not_found: - other: Recommend tag is not exist. + other: Doporučený štítek nebyl nalezen. recommend_tag_enter: - other: Please enter at least one required tag. + other: Zadejte prosím alespoň jeden povinný štítek. not_contain_synonym_tags: - other: Should not contain synonym tags. + other: Nemělo by obsahovat synonyma štítků. cannot_update: - other: No permission to update. + other: Nemáte oprávnění pro aktualizaci. is_used_cannot_delete: - other: You cannot delete a tag that is in use. + other: Nemůžete odstranit štítek, který se používá. cannot_set_synonym_as_itself: - other: You cannot set the synonym of the current tag as itself. + other: Aktuální štítek nelze jako synonymum stejného štítku. smtp: config_from_name_cannot_be_email: - other: The from name cannot be a email address. + other: Jméno odesílatele nemůže být emailová adresa. theme: not_found: - other: Theme not found. + other: Motiv nebyl nalezen. revision: review_underway: - other: Can't edit currently, there is a version in the review queue. + other: V současné době nelze upravit, čeká na kontrolu. no_permission: - other: No permission to revise. + other: Nemáte oprávnění k revizi. user: external_login_missing_user_id: - other: The third-party platform does not provide a unique UserID, so you cannot login, please contact the website administrator. + other: Platforma třetí strany neposkytuje unikátní UserID, takže se nemůžete přihlásit, kontaktujte prosím správce webových stránek. external_login_unbinding_forbidden: - other: Please set a login password for your account before you remove this login. + other: Před odebráním tohoto typu přihlášení nastavte přihlašovací heslo pro svůj účet. email_or_password_wrong: other: - other: Email and password do not match. + other: Email a heslo nesouhlasí. not_found: - other: User not found. + other: Uživatel nebyl nalezen. suspended: - other: User has been suspended. + other: Uživatelský účet byl pozastaven. username_invalid: - other: Username is invalid. + other: Uživatelské jméno je neplatné. username_duplicate: - other: Username is already in use. + other: Uživatelské jméno je již použito. set_avatar: - other: Avatar set failed. + other: Nastavení avataru se nezdařilo. cannot_update_your_role: - other: You cannot modify your role. + other: Nemůžete upravovat svoji roli. not_allowed_registration: - other: Currently the site is not open for registration. + other: Registrace nejsou povolené. not_allowed_login_via_password: - other: Currently the site is not allowed to login via password. + other: Přihlášení přes heslo není povolené. access_denied: - other: Access denied + other: Přístup zamítnut page_access_denied: - other: You do not have access to this page. + other: Nemáte přístup k této stránce. add_bulk_users_format_error: - other: "Error {{.Field}} format near '{{.Content}}' at line {{.Line}}. {{.ExtraMessage}}" + other: "Chyba formátu pole {{.Field}} poblíž '{{.Content}}' na řádku {{.Line}}. {{.ExtraMessage}}" add_bulk_users_amount_error: - other: "The number of users you add at once should be in the range of 1-{{.MaxAmount}}." + other: "Počet uživatelů, které přidáte najednou, by měl být v rozsahu 1-{{.MaxAmount}}." config: read_config_failed: - other: Read config failed + other: Načtení konfigurace selhalo database: connection_failed: - other: Database connection failed + other: Spojení s databází selhalo create_table_failed: - other: Create table failed + other: Vytvoření tabulky selhalo install: create_config_failed: - other: Can't create the config.yaml file. + other: Soubor config.yaml nelze vytvořit. upload: unsupported_file_format: - other: Unsupported file format. + other: Nepodporovaný formát souboru. site_info: config_not_found: - other: Site config not found. + other: Konfigurace webu nebyla nalezena. badge: object_not_found: - other: Badge object not found + other: Objekt odznaku nebyl nalezen reason: spam: name: other: spam desc: - other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic. + other: Tento příspěvek je reklama nebo vandalismus. Není užitečný ani relevantní pro aktuální téma. rude_or_abusive: name: - other: rude or abusive + other: hrubý nebo zneužívající desc: - other: "A reasonable person would find this content inappropriate for respectful discourse." + other: "Rozumný člověk by tento obsah považoval za nevhodný pro slušnou konverzaci." a_duplicate: name: - other: a duplicate + other: duplicita desc: - other: This question has been asked before and already has an answer. + other: Tento dotaz byl položen dříve a již má odpověď. placeholder: - other: Enter the existing question link + other: Zadejte existující odkaz na dotaz not_a_answer: name: - other: not an answer + other: není odpověď 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: "Toto bylo zveřejněno jako odpověď, ale nesnaží se odpovědět na dotaz. Měla by to být úprava, komentář, nebo úplně jiný dotaz." no_longer_needed: name: - other: no longer needed + other: již není potřeba desc: - other: This comment is outdated, conversational or not relevant to this post. + other: Tento komentář je zastaralý, konverzační nebo není relevantní pro tento příspěvek. something: name: - other: something else + other: jiný důvod desc: - other: This post requires staff attention for another reason not listed above. + other: Tento příspěvek vyžaduje pozornost moderátorů z jiného důvodu, který není uveden výše. placeholder: - other: Let us know specifically what you are concerned about + other: Dejte nám vědět konkrétně, v čem je problém community_specific: name: - other: a community-specific reason + other: důvod specifický pro komunitu desc: - other: This question doesn't meet a community guideline. + other: Tento dotaz nesplňuje pravidla komunity. not_clarity: name: - other: needs details or clarity + other: vyžaduje detaily nebo upřesnění desc: - other: This question currently includes multiple questions in one. It should focus on one problem only. + other: Tento dotaz v současné době obsahuje více otázek. Měl by se zaměřit pouze na jeden problém. looks_ok: name: - other: looks OK + other: vypadá v pořádku desc: - other: This post is good as-is and not low quality. + other: Tento příspěvek je dobrý tak jak je, nemá nízkou kvalitu. needs_edit: name: - other: needs edit, and I did it + other: potřebuje úpravu, kterou jsem udělal(a) desc: - other: Improve and correct problems with this post yourself. + other: Zlepšete a opravte problémy s tímto příspěvkem. needs_close: name: - other: needs close + other: potřebuje zavřít desc: - other: A closed question can't answer, but still can edit, vote and comment. + other: Na uzavřený dotaz není možné odpovídat, ale stále může být upraven a je možné pro něj hlasovat a komentovat jej. needs_delete: name: - other: needs delete + other: potřebuje smazat desc: - other: This post will be deleted. + other: Tento příspěvek bude odstraněn. question: close: duplicate: name: other: spam desc: - other: This question has been asked before and already has an answer. + other: Tento dotaz byl položena dříve a již má odpověď. guideline: name: - other: a community-specific reason + other: důvod specifický pro komunitu desc: - other: This question doesn't meet a community guideline. + other: Tento dotaz nesplňuje pravidla komunity. multiple: name: - other: needs details or clarity + other: vyžaduje detaily nebo upřesnění desc: - other: This question currently includes multiple questions in one. It should focus on one problem only. + other: Tento dotaz v současné době obsahuje více otázek. Měla by se zaměřit pouze na jeden problém. other: name: - other: something else + other: jiný důvod desc: - other: This post requires another reason not listed above. + other: Tento příspěvek vyžaduje pozornost moderátorů z jiného důvodu, který není uveden výše. operation_type: asked: - other: asked + other: dotázáno answered: - other: answered + other: zodpovězeno modified: - other: modified + other: upraveno deleted_title: - other: Deleted question + other: Smazat dotaz questions_title: - other: Questions + other: Dotazy tag: tags_title: - other: Tags + other: Štítky no_description: - other: The tag has no description. + other: Štítek nemá žádný popis. notification: action: update_question: - other: updated question + other: upravený dotaz answer_the_question: - other: answered question + other: položil(a) dotaz update_answer: - other: updated answer + other: upravil(a) odpověď accept_answer: - other: accepted answer + other: přijal(a) odpověď comment_question: - other: commented question + other: okomentoval(a) dotaz comment_answer: - other: commented answer + other: okomentoval(a) odpověď reply_to_you: - other: replied to you + other: vám odpověděl(a) mention_you: - other: mentioned you + other: vás zmínil(a) your_question_is_closed: - other: Your question has been closed + other: Váš dotaz byl uzavřen your_question_was_deleted: - other: Your question has been deleted + other: Váš dotaz byl odstraněn your_answer_was_deleted: - other: Your answer has been deleted + other: Vaše odpověď byla smazána your_comment_was_deleted: - other: Your comment has been deleted + other: Váš komentář byl odstraněn up_voted_question: - other: upvoted question + other: hlasoval(a) pro dotaz down_voted_question: - other: downvoted question + other: hlasoval(a) proti dotazu up_voted_answer: - other: upvoted answer + other: hlasoval(a) pro odpověď down_voted_answer: - other: downvoted answer + other: hlasoval(a) proti odpovědi up_voted_comment: - other: upvoted comment + other: hlasoval(a) pro komentář invited_you_to_answer: - other: invited you to answer + other: vás pozval, abyste odpověděl(a) earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: Získali jste odznak "{{.BadgeName}}" email_tpl: change_email: title: - other: "[{{.SiteName}}] Confirm your new email address" + other: "[{{.SiteName}}] Potvrďte svůj nový email" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: - other: "[{{.SiteName}}] {{.DisplayName}} answered your question" + other: "[{{.SiteName}}] {{.DisplayName}} odpověděl(a) na váš dotaz" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n

      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: - other: "[{{.SiteName }}] Password reset" + other: "[{{.SiteName }}] Obnova hesla" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: - other: "[{{.SiteName}}] Confirm your new account" + other: "[{{.SiteName}}] Potvrďte svůj nový účet" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: - other: "[{{.SiteName}}] Test Email" + other: "[{{.SiteName}}] Zkušební email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: - other: upvote + other: hlasovat pro upvoted: - other: upvoted + other: hlasováno pro downvote: - other: downvote + other: hlasovat proti downvoted: - other: downvoted + other: hlasováno proti accept: - other: accept + other: přijmout accepted: - other: accepted + other: přijato edit: - other: edit + other: upravit review: queued_post: - other: Queued post + other: Příspěvek ve frontě flagged_post: - other: Flagged post + other: Nahlášený příspěvek suggested_post_edit: - other: Suggested edits + other: Navrhované úpravy reaction: tooltip: - other: "{{ .Names }} and {{ .Count }} more..." + other: "{{ .Names }} a {{ .Count }} dalších..." badge: default_badges: autobiographer: name: - other: Autobiographer + other: Životopisec desc: - other: Filled out profile information. + other: Profil vyplněn. certified: name: - other: Certified + other: Certifikovaný desc: - other: Completed our new user tutorial. + other: Tutoriál pro nové uživatele dokončen. editor: name: other: Editor desc: - other: First post edit. + other: První úprava příspěvku. first_flag: name: - other: First Flag + other: První nahlášení desc: - other: First flagged a post. + other: První nahlášení příspěvku. first_upvote: name: - other: First Upvote + other: První hlas pro desc: - other: First up voted a post. + other: První hlas pro příspěvek. first_link: name: - other: First Link + other: První odkaz desc: other: First dirst added a link to another post. first_reaction: @@ -564,9 +564,9 @@ backend: other: First reacted to the post. first_share: name: - other: First Share + other: První sdílení desc: - other: First shared a post. + other: První sdílení příspěvku. scholar: name: other: Scholar @@ -576,67 +576,67 @@ backend: name: other: Commentator desc: - other: Leave 5 comments. + other: Napište 5 komentářů. new_user_of_the_month: name: - other: New User of the Month + other: Nový uživatel měsíce desc: - other: Outstanding contributions in their first month. + other: Výjimečný přínos ve svém prvním měsíci na stránce. read_guidelines: name: - other: Read Guidelines + other: Přečíst pravidla desc: - other: Read the [community guidelines]. + other: Přečtěte si [pravidla komunity]. reader: name: - other: Reader + other: Čtenář desc: - other: Read every answers in a topic with more than 10 answers. + other: Přečtěte si všechny odpovědi v tématu s více než 10 odpověďmi. welcome: name: - other: Welcome + other: Vítejte desc: - other: Received a up vote. + other: Obdržel(a) hlas. nice_share: name: - other: Nice Share + other: Povedené sdílení desc: - other: Shared a post with 25 unique visitors. + other: Sdílel(a) příspěvek s 25 unikátními návštěvníky. good_share: name: - other: Good Share + other: Dobré sdílení desc: - other: Shared a post with 300 unique visitors. + other: Sdílel(a) příspěvek s 300 unikátními návštěvníky. great_share: name: - other: Great Share + other: Skvělé sdílení desc: - other: Shared a post with 1000 unique visitors. + other: Sdílel(a) příspěvek s 1000 unikátními návštěvníky. out_of_love: name: - other: Out of Love + other: Optimista desc: - other: Used 50 up votes in a day. + other: Využito 50 hlasů pro za den. higher_love: name: - other: Higher Love + other: Vytrvalý optimista desc: - other: Used 50 up votes in a day 5 times. + other: 5 krát využito 50 hlasů pro za den. crazy_in_love: name: - other: Crazy in Love + other: Bláznivý optimista desc: - other: Used 50 up votes in a day 20 times. + other: 20 krát využito 50 hlasů pro za den. promoter: name: - other: Promoter + other: Promotér desc: - other: Invited a user. + other: Pozval(a) uživatele. campaigner: name: other: Campaigner desc: - other: Invited 3 basic users. + other: Pozval(a) 3 uživatele. champion: name: other: Champion @@ -787,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Prev next: Next @@ -904,7 +904,7 @@ ui: msg: empty: File cannot be empty. only_image: Only image files are allowed. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: Image URL @@ -946,6 +946,10 @@ ui: text: Table heading: Heading cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: I am closing this post as... btn_cancel: Cancel @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1339,8 +1344,8 @@ ui: description: Questions linked to no_linked_question: No questions linked from this question. invite_to_answer: - title: People Asked - desc: Select people who you think might know the answer. + title: Pozvěte další uživatele + desc: Pozvěte lidi, o kterých si myslíte, že mohou odpovědět. invite: Invite to answer add: Add people search: Search people @@ -1522,6 +1527,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Questions:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Answers:" comments: "Comments:" votes: "Votes:" @@ -1994,7 +2002,7 @@ ui: page_title: Write restrict_answer: title: Answer write - label: Each user can only write one answer for each question + label: Každý uživatel může napsat pouze jednu odpověď na stejný dotaz text: "Turn off to allow users to write multiple answers to the same question, which may cause answers to be unfocused." recommend_tags: label: Recommend tags @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/cy_GB.yaml b/i18n/cy_GB.yaml index af605269b..9283c851d 100644 --- a/i18n/cy_GB.yaml +++ b/i18n/cy_GB.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: Sut i Fformatio desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Cynt next: Nesaf @@ -904,7 +904,7 @@ ui: msg: empty: Ni all ffeil fod yn wag. only_image: Dim ond ffeiliau delwedd a ganiateir. - max_size: Ni all maint y ffeil fod yn fwy na 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Disgrifiad tab_url: URL delwedd @@ -946,6 +946,10 @@ ui: text: Tabl heading: Pennawd cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Rwy'n cau'r post hon fel... btn_cancel: Canslo @@ -1086,6 +1090,7 @@ ui: search_placeholder: Hidlo yn ôl enw tag no_desc: Nid oes gan y tag unrhyw ddisgrifiad. more: Mwy + wiki: Wiki ask: title: Ychwanegu Cwestiwn edit_title: Golygu Cwestiwn @@ -1522,6 +1527,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Questions:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Answers:" comments: "Comments:" votes: "Votes:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/da_DK.yaml b/i18n/da_DK.yaml index bd19779fe..a9b23acfa 100644 --- a/i18n/da_DK.yaml +++ b/i18n/da_DK.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Bekræft din nye e-mailadresse" body: - other: "Bekræft din nye e-mailadresse for {{.SiteName}} ved at klikke på følgende link:
      \n{{.ChangeEmailUrl}}

      \n\nHvis du ikke anmodede om denne ændring, ignorér venligst denne e-mail.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} besvarede dit spørgsmål" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nSe den på {{.SiteName}}

      \n\n--
      \nAfmeld" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} inviterede dig til at svare" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Jeg tror du måske kender svaret.

      \nSe den på {{.SiteName}}

      \n\n--
      \nAfmeld" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} kommenterede dit indlæg" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nSe den på {{.SiteName}}

      \n\n--
      \nAfmeld" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Nyt spørgsmål: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nAfmeld" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Nulstilling af adgangskode" body: - other: "Nogen bad om at nulstille din adgangskode på {{.SiteName}}.

      \n\nHvis det ikke var dig, kan du trygt ignorere denne e-mail.

      \n\nKlik på følgende link for at vælge en ny adgangskode:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Bekræft din nye konto" body: - other: "Velkommen til {{.SiteName}}!

      \n\nKlik på følgende link for at bekræfte og aktivere din nye konto:
      \n{{.RegisterUrl}}

      \n\nHvis ovenstående link ikke kan klikkes på, prøv at kopiere og indsætte det i adresselinjen i din webbrowser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test E-Mail" body: - other: "Dette er en test e-mail." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: stem op @@ -787,7 +787,7 @@ ui: how_to_format: title: Sådan formaterer du desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Forrige next: Næste @@ -904,7 +904,7 @@ ui: msg: empty: Filen skal udfyldes. only_image: Kun billedfiler er tilladt. - max_size: Filstørrelse må ikke overstige 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Beskriveslse tab_url: Billede-URL @@ -946,6 +946,10 @@ ui: text: Tabel heading: Overskrift cell: Celle + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Jeg lukker dette indlæg fordi... btn_cancel: Annuller @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtrer efter tag-navn no_desc: Tag har ingen beskrivelse. more: Mere + wiki: Wiki ask: title: Tilføj spørgsmål edit_title: Rediger spørgsmål @@ -1522,6 +1527,7 @@ ui: newest: Nyeste active: Aktiv hot: Populært + frequent: Frequent recommend: Recommend score: Bedømmelse unanswered: Ubesvaret @@ -1721,6 +1727,8 @@ ui: welcome: Velkommen til Administration! site_statistics: Statistik for webstedet questions: "Spørgsmål:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Svar:" comments: "Kommentarer:" votes: "Stemmer:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserverede tags text: "Reserverede tags kan kun bruges af moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Er du sikker på, at du vil kassere dit udkast? messages: post_deleted: Dette indlæg er blevet slettet. + post_cancel_deleted: This post has been undeleted. post_pin: Dette indlæg er blevet fastgjort. post_unpin: Dette indlæg er blevet frigjort. post_hide_list: Dette indlæg er blevet skjult fra listen. @@ -2219,3 +2243,15 @@ ui: post_list: Dette indlæg er blevet listet. post_unlist: Dette indlæg er blevet aflistet. post_pending: Dit indlæg afventer gennemgang. Dette er en forhåndsvisning, det vil være synligt, når det er blevet godkendt. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/de_DE.yaml b/i18n/de_DE.yaml index 9eee7c030..42a024934 100644 --- a/i18n/de_DE.yaml +++ b/i18n/de_DE.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Bestätige deine neue E-Mail-Adresse" body: - other: "Bestätige deine neue E-Mail-Adresse für {{.SiteName}}, indem du auf den folgenden Link klickst:
      \n{{.ChangeEmailUrl}}

      \n\nWenn du diese Änderung nicht beantragt hast, ignoriere bitte diese E-Mail." + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} hat deine Frage beantwortet" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nAuf {{.SiteName}} ansehen

      \n\n--
      \nAbbestellen" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} hat dich eingeladen zu antworten" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Ich glaube, du kennst die Antwort.

      \nAuf {{.SiteName}} ansehen

      \n\n--
      \nAbbestellen" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} hat deinen Beitrag kommentiert" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nAuf {{.SiteName}} ansehen

      \n\n--
      \nAbbestellen" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Neue Frage: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nAbbestellen" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Passwort zurücksetzen" body: - other: "Jemand hat dich gebeten, dein Passwort auf {{.SiteName}} zurückzusetzen.

      \n\nWenn du es nicht warst, kannst du diese E-Mail getrost ignorieren.

      \n\nKlicke auf den folgenden Link, um ein neues Passwort zu wählen:
      \n{{.PassResetUrl}}" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Bestätige dein neues Konto" body: - other: "Willkommen bei {{.SiteName}}!

      \n\nKlicke auf den folgenden Link, um dein neues Konto zu bestätigen und zu aktivieren:
      \n{{.RegisterUrl}}

      \n\nWenn du den obigen Link nicht anklicken kannst, kopiere ihn und füge ihn in die Adresszeile deines Webbrowsers ein." + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test-E-Mail" body: - other: "Dies ist eine Test-Email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: positiv bewerten @@ -787,7 +787,7 @@ ui: how_to_format: title: Wie man formatiert desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Zurück next: Weiter @@ -904,7 +904,7 @@ ui: msg: empty: Datei darf nicht leer sein. only_image: Nur Bilddateien sind erlaubt. - max_size: Die Dateigröße darf 4 MB nicht überschreiten. + max_size: File size cannot exceed {{size}} MB. desc: label: Beschreibung tab_url: Bild URL @@ -946,6 +946,10 @@ ui: text: Tabelle heading: Überschrift cell: Zelle + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Ich schließe diesen Beitrag als... btn_cancel: Abbrechen @@ -1086,6 +1090,7 @@ ui: search_placeholder: Nach Tagnamen filtern no_desc: Der Tag hat keine Beschreibung. more: Mehr + wiki: Wiki ask: title: Frage stellen edit_title: Frage bearbeiten @@ -1522,6 +1527,7 @@ ui: newest: Neueste active: Aktiv hot: Hot + frequent: Frequent recommend: Recommend score: Punktzahl unanswered: Unbeantwortet @@ -1721,6 +1727,8 @@ ui: welcome: Willkommen im Admin Bereich! site_statistics: Website-Statistiken questions: "Fragen:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Antworten:" comments: "Kommentare:" votes: "Stimmen:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reservierte Tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Bist du sicher, dass du deinen Entwurf verwerfen willst? messages: post_deleted: Dieser Beitrag wurde gelöscht. + post_cancel_deleted: This post has been undeleted. post_pin: Dieser Beitrag wurde angepinnt. post_unpin: Dieser Beitrag wurde losgelöst. post_hide_list: Dieser Beitrag wurde aus der Liste verborgen. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/es_ES.yaml b/i18n/es_ES.yaml index 561b461d4..7165aa548 100644 --- a/i18n/es_ES.yaml +++ b/i18n/es_ES.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirma tu nueva dirección de correo" body: - other: "Confirme su nueva dirección de correo para {{.SiteName}} haciendo clic en el siguiente enlace:
      \n{{.ChangeEmailUrl}}

      \n\nSi no ha solicitado este cambio, por favor ignore este correo.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} respondió tu pregunta" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nMirarlo en {{.SiteName}}

      \n\n--
      \nDesuscribirse" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} te invitó a responder" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Creo que podrías saber la respuesta.

      \nMirarlo en {{.SiteName}}

      \n\n--
      \nDesuscribirse" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} comentó en tu publicación" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nMirarlo en {{.SiteName}}

      \n\n--
      \nDesuscribirse" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Nueva pregunta: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nDesuscribirse" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Reestablecimiento de contraseña" body: - other: "Alguien solicitó restablecer tu contraseña en {{.SiteName}}.

      \n\nSi no fuiste tú, puedes ignorar este correo.

      \n\nHaz clic en el siguiente enlace para elegir una nueva contraseña:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirma tu nueva cuenta" body: - other: "Bienvenido a {{.SiteName}}!

      \n\nHaz clic en el siguiente enlace para confirmar y activar tu nueva cuenta:
      \n{{.RegisterUrl}}

      \n\nSi el enlace de arriba no es cliqueable, intenta copiar y pegar en la barra de direcciones de tu navegador.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Correo de prueba" body: - other: "Este es un correo de prueba." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: votar a favor @@ -787,7 +787,7 @@ ui: how_to_format: title: Cómo formatear desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Anterior next: Siguiente @@ -904,7 +904,7 @@ ui: msg: empty: El título no puede estar vacío. only_image: Solo se permiten archivos de imagen. - max_size: El tamaño del archivo no puede superar 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Descripción tab_url: URL de la imagen @@ -946,6 +946,10 @@ ui: text: Tabla heading: Encabezado cell: Celda + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Estoy cerrando este post como... btn_cancel: Cancelar @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtrar por nombre de etiqueta no_desc: La etiqueta no tiene descripción. more: Mas + wiki: Wiki ask: title: Agregar una pregunta edit_title: Editar pregunta @@ -1522,6 +1527,7 @@ ui: newest: Más reciente active: Activo hot: Hot + frequent: Frequent recommend: Recommend score: Puntuación unanswered: Sin respuesta @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Estadísticas del sitio questions: "Preguntas:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Respuestas:" comments: "Comentarios:" votes: "Votos:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Etiquetas reservadas text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: '¿Está seguro de que desea descartar este borrador?' messages: post_deleted: Esta publicación ha sido eliminada. + post_cancel_deleted: This post has been undeleted. post_pin: Esta publicación ha sido fijada. post_unpin: Esta publicación ha sido desfijada. post_hide_list: Esta publicación ha sido ocultada de la lista. @@ -2219,3 +2243,15 @@ ui: post_list: Esta publicación ha sido listada. post_unlist: Esta publicación ha sido retirado de la lista.. post_pending: Su publicación está pendiente de revisión. Esto es una vista previa, será visible después de que haya sido aprobado. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/fa_IR.yaml b/i18n/fa_IR.yaml index 55cc98052..332ea8fcf 100644 --- a/i18n/fa_IR.yaml +++ b/i18n/fa_IR.yaml @@ -464,42 +464,42 @@ backend: title: other: "آدرس ایمیل جدید خود را تایید کنید{{.SiteName}}" body: - other: "آدرس ایمیل جدید خود را برای {{.SiteName}} با کلیک بر روی پیوند زیر تأیید کنید:\n
      \n{{.ChangeEmailUrl}}

      \n\nاگر این تغییر را درخواست نکرده‌اید، لطفاً این ایمیل را نادیده بگیرید.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} به سؤال شما پاسخ داد" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nمشاهده آن در {{.SiteName}}

      \n\n--
      \nلغو اشتراک" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} شما را به پاسخ دعوت کرد" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      من فکر می کنم شما ممکن است پاسخ را بدانید.

      \nمشاهده آن در {{.SiteName}}

      \n\n--
      \nلغو اشتراک" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} روی پست شما نظر داد" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nمشاهده آن در {{.SiteName}}

      \n\n--
      \nلغو اشتراک" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] سؤال جدید: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nلغو اشتراک" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] گذرواژه بازنشانی شد" body: - other: "شخصی بازنشانی رمز عبور شما در {{.SiteName}} می‌باشد.

      \n\nاگر این شخص شما نبوده اید، می‌توانید با خیال راحت این ایمیل را نادیده بگیرید.

      \n\nبرای انتخاب رمز عبور جدید روی پیوند زیر کلیک کنید:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] حساب کاربری جدید خود را تأیید کنید" body: - other: "به {{.SiteName}} خوش آمدید!

      \n\nبرای تأیید و فعال سازی حساب کاربری جدید خود روی پیوند زیر کلیک کنید:
      \n{{.RegisterUrl}}

      \n\nاگر پیوند بالا قابل بازشدن نیست، آن را کپی کرده و در نوار آدرس مرورگر وب خود قرار دهید.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] ایمیل آزمایشی" body: - other: "این یک ایمیل تست است." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: رأی مثبت @@ -787,7 +787,7 @@ ui: how_to_format: title: نحوه فرمت کردن desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: قبلی next: بعدی @@ -904,7 +904,7 @@ ui: msg: empty: فایل نمی تواند خالی باشد. only_image: فقط فایل های تصویری مجاز هستند. - max_size: حجم فایل نباید بیشتر از 4 مگابایت باشد. + max_size: File size cannot exceed {{size}} MB. desc: label: توضیحات tab_url: لینک عکس @@ -946,6 +946,10 @@ ui: text: جدول heading: سرفصل cell: تلفن همراه + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: این پست را می بندم بدلیل... btn_cancel: لغو @@ -1086,6 +1090,7 @@ ui: search_placeholder: فیلتر بر اساس اسم برچسب no_desc: برچسب هیچ توضیحی ندارد. more: بیشتر + wiki: Wiki ask: title: سوالی اضافه کنید edit_title: سوال را ویرایش کنید @@ -1522,6 +1527,7 @@ ui: newest: جدیدترین active: فعال hot: Hot + frequent: Frequent recommend: Recommend score: امتیاز unanswered: بدون پاسخ @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "سوالات:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "جواب ها:" comments: "نظرات:" votes: "آرا:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: بهینه‌سازی عملیات موتورهای جستجو permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/fr_FR.yaml b/i18n/fr_FR.yaml index 52ad13755..b08ee953f 100644 --- a/i18n/fr_FR.yaml +++ b/i18n/fr_FR.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirmez votre nouvelle adresse e-mail" body: - other: "Confirmez votre nouvelle adresse e-mail pour {{.SiteName}} en cliquant sur le lien suivant :
      \n{{.ChangeEmailUrl}}

      \n\nSi vous n'avez pas demandé ce changement, veuillez ignorer cet e-mail.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} a répondu à votre question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nVoir sur {{.SiteName}}

      \n\n--
      \nDésabonnez-vous" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} vous a invité à répondre" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Je pense que vous connaissez la réponse.

      \nVoir sur {{.SiteName}}

      \n\n--
      \nDésabonnez-vous" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} a commenté votre message" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nVoir sur {{.SiteName}}

      \n\n--
      \nDésabonnez-vous" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Nouvelle question : {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nDésabonnez-vous" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Réinitialisation du mot de passe" body: - other: "Quelqu'un a demandé à réinitialiser votre mot de passe sur {{.SiteName}}.

      \n\nSi ce n'était pas vous, vous pouvez ignorer cet e-mail en toute sécurité.

      \n\nCliquez sur le lien suivant pour choisir un nouveau mot de passe :
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirmez la création de votre compte" body: - other: "Bienvenue sur {{.SiteName}} !

      \n\nCliquez sur le lien suivant pour confirmer et activer votre nouveau compte :
      {{.RegisterUrl}}

      \n\nSi le lien ci-dessus n'est pas cliquable, essayez de le copier et coller dans la barre d'adresse de votre navigateur web.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Email de test" body: - other: "Ceci est un mail de test." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: Comment mettre en forme desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Préc next: Suivant @@ -904,7 +904,7 @@ ui: msg: empty: Le fichier ne doit pas être vide. only_image: Seules les images sont autorisées. - max_size: La taille du fichier ne doit pas dépasser 4 Mo. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: URL de l'image @@ -946,6 +946,10 @@ ui: text: Tableau heading: Titre cell: Cellule + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Je ferme ce post comme... btn_cancel: Annuler @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtrer par étiquette no_desc: L'étiquette n'a pas de description. more: Plus + wiki: Wiki ask: title: Ajouter une question edit_title: Modifier la question @@ -1522,6 +1527,7 @@ ui: newest: Les plus récents active: Actif hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Sans réponse @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Statistiques du site questions: "Questions :" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Réponses :" comments: "Commentaires:" votes: "Votes :" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Tags réservés text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Êtes-vous sûr de vouloir abandonner ce brouillon ? messages: post_deleted: Ce message a été supprimé. + post_cancel_deleted: This post has been undeleted. post_pin: Ce message a été épinglé. post_unpin: Ce message a été déépinglé. post_hide_list: Ce message a été masqué de la liste. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/hi_IN.yaml b/i18n/hi_IN.yaml index 8a9da4d56..5577e1e9a 100644 --- a/i18n/hi_IN.yaml +++ b/i18n/hi_IN.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Prev next: Next @@ -904,7 +904,7 @@ ui: msg: empty: File cannot be empty. only_image: Only image files are allowed. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: Image URL @@ -946,6 +946,10 @@ ui: text: Table heading: Heading cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: I am closing this post as... btn_cancel: Cancel @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1522,6 +1527,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Questions:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Answers:" comments: "Comments:" votes: "Votes:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/id_ID.yaml b/i18n/id_ID.yaml index bf8e827d4..8ab840a06 100644 --- a/i18n/id_ID.yaml +++ b/i18n/id_ID.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: Cara memformat desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Sebelumnya next: Selanjutnya @@ -904,7 +904,7 @@ ui: msg: empty: File tidak boleh kosong. only_image: Hanya file Gambar yang diperbolehkan. - max_size: Ukuran file tidak boleh melebihi 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: URL gambar @@ -946,6 +946,10 @@ ui: text: Table heading: Heading cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Postingan ini saya tutup sebagai... btn_cancel: Batal @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1522,6 +1527,7 @@ ui: newest: Terbaru active: Aktif hot: Hot + frequent: Frequent recommend: Recommend score: Nilai unanswered: Belum dijawab @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Pertanyaan:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Jawaban:" comments: "Komentar:" votes: "Vote:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/it_IT.yaml b/i18n/it_IT.yaml index 3cc901716..84eb5ab49 100644 --- a/i18n/it_IT.yaml +++ b/i18n/it_IT.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Conferma il tuo nuovo indirizzo email" body: - other: "Conferma il tuo nuovo indirizzo email per {{.SiteName}} cliccando sul seguente link:
      \n{{.ChangeEmailUrl}}

      \n\nSe non hai richiesto questa modifica, ignora questa email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} ha risposto alla tua domanda" body: - other: "\n{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nVisualizzalo su {{.SiteName}}

      \n\n--
      \nAnnulla iscrizione" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} ti ha invitato a rispondere" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Credo che potresti sapere la risposta.

      \nVisualizzalo su {{.SiteName}}

      \n\n--
      \nAnnulla iscrizione" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} ha commentato il tuo post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nVisualizzalo su {{.SiteName}}

      \n\n--
      \nAnnulla iscrizione" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Nuova domanda: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nAnnulla l'iscrizione" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Reimpostazione della password" body: - other: "Qualcuno ha chiesto di reimpostare la tua password su {{.SiteName}}.

      \n\nSe non sei stato tu, ignora questa email.

      \n\nClicca sul seguente link per scegliere una nuova password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Conferma il tuo nuovo account" body: - other: "Benvenuto su {{.SiteName}}!

      \n\nClicca il seguente link per confermare e attivare il tuo nuovo account:
      \n{{.RegisterUrl}}

      \n\nSe il link qui sopra non è cliccabile, prova a copiarlo e incollarlo nella barra degli indirizzi del tuo browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Email di prova" body: - other: "Questa è una email di prova." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: voto a favore @@ -787,7 +787,7 @@ ui: how_to_format: title: Come formattare desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Prec next: Successivo @@ -904,7 +904,7 @@ ui: msg: empty: Il file non può essere vuoto. only_image: Sono ammesse solo le immagini - max_size: La dimensione del file non può superare i 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Descrizione tab_url: Url dell'Immagine @@ -946,6 +946,10 @@ ui: text: Tabella heading: Intestazione cell: Cella + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Sto chiudendo questo post come... btn_cancel: Cancella @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtra per nome del tag no_desc: Il tag non ha descrizioni. more: Altro + wiki: Wiki ask: title: Aggiungi una domanda edit_title: Modifica Domanda @@ -1522,6 +1527,7 @@ ui: newest: Più recenti active: Attivo hot: Caldo + frequent: Frequent recommend: Raccomandato score: Punteggio unanswered: Senza risposta @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Statistiche del sito questions: "Domande:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Risposte:" comments: "Commenti:" votes: "Voti:" @@ -1814,7 +1822,7 @@ ui: msg: "Inserisci l'email dell'utente, una per riga." display_name: label: Nome da visualizzare - msg: Il nome visualizzato deve avere una lunghezza compresa tra 2 e 30 caratteri. + msg: Il nome visualizzato deve avere una lunghezza compresa tra 4 e 30 caratteri. email: label: E-mail msg: L'email non è valida. @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Tag riservati text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Sei sicuro di voler eliminare la bozza? messages: post_deleted: Questo post è stato eliminato. + post_cancel_deleted: This post has been undeleted. post_pin: Questo post è stato selezionato. post_unpin: Questo post è stato sbloccato. post_hide_list: Questo post è stato nascosto dall'elenco. @@ -2219,3 +2243,15 @@ ui: post_list: Questo post è stato inserito. post_unlist: Questo post è stato rimosso. post_pending: Il tuo post è in attesa di revisione. Sarà visibile dopo essere stato approvato. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/ja_JP.yaml b/i18n/ja_JP.yaml index 433831f46..0ffce9d05 100644 --- a/i18n/ja_JP.yaml +++ b/i18n/ja_JP.yaml @@ -29,34 +29,34 @@ backend: database_error: other: データサーバーエラー forbidden_error: - other: Forbidden. + other: アクセス権限がありません。 duplicate_request_error: - other: Duplicate submission. + other: 重複しています action: report: - other: フラグ + other: 通報 edit: other: 編集 delete: other: 削除 close: - other: 閉じる + other: 解決済み reopen: - other: Reopen + other: 再オープン forbidden_error: - other: Forbidden. + other: アクセス権限がありません。 pin: - other: Pin + other: ピン留めする hide: - other: Unlist + other: 限定公開にする unpin: - other: Unpin + other: ピン留め解除 show: - other: リスト + other: 限定公開を解除する invite_someone_to_answer: other: 編集 undelete: - other: Undelete + other: 復元する role: name: user: @@ -67,24 +67,24 @@ backend: other: モデレーター description: user: - other: Default with no special access. + other: 一般的なアクセスしか持ちません。 admin: - other: Have the full power to access the site. + other: すべてにアクセスできる大いなる力を持っています。 moderator: - other: Has access to all posts except admin settings. + other: 管理者以外のすべての投稿へのアクセス権を持っています。 privilege: level_1: description: - other: Level 1 (less reputation required for private team, group) + other: レベル1 必要最低の評判レベルで利用可(クローズサイト・グループ・特定の人数下での利用) level_2: description: - other: Level 2 (low reputation required for startup community) + other: レベル2 少しだけ評判レベルが必要(スタートアップコミュニティ・不特定多数の人数での利用) level_3: description: - other: Level 3 (high reputation required for mature community) + other: レベル3 高い評判レベルが必要(成熟したコミュニティ) level_custom: description: - other: Custom Level + other: カスタムレベル rank_question_add_label: other: 質問する rank_answer_add_label: @@ -92,69 +92,69 @@ backend: rank_comment_add_label: other: コメントを書く rank_report_add_label: - other: フラグ + other: 通報 rank_comment_vote_up_label: - other: Upvote comment + other: コメントを高評価 rank_link_url_limit_label: - other: Post more than 2 links at a time + other: 一度に2つ以上のリンクを投稿する rank_question_vote_up_label: - other: Upvote question + other: 質問を高評価 rank_answer_vote_up_label: - other: Upvote answer + other: 回答を高評価 rank_question_vote_down_label: - other: Downvote question + other: 質問を低評価 rank_answer_vote_down_label: - other: Downvote answer + other: 回答を低評価 rank_invite_someone_to_answer_label: - other: Invite someone to answer + other: 誰かを回答に招待する rank_tag_add_label: other: 新しいタグを作成 rank_tag_edit_label: - other: Edit tag description (need to review) + other: タグの説明を編集(レビューが必要) rank_question_edit_label: - other: Edit other's question (need to review) + other: 他の質問を編集(レビューが必要) rank_answer_edit_label: - other: Edit other's answer (need to review) + other: 他の回答を編集(レビューが必要) rank_question_edit_without_review_label: - other: Edit other's question without review + other: レビューなしで他の質問を編集する rank_answer_edit_without_review_label: - other: Edit other's answer without review + other: レビューなしで他の回答を編集する rank_question_audit_label: - other: Review question edits + other: 質問の編集をレビュー rank_answer_audit_label: - other: Review answer edits + other: 回答の編集をレビュー rank_tag_audit_label: - other: Review tag edits + other: タグの編集をレビュー rank_tag_edit_without_review_label: - other: Edit tag description without review + other: レビューなしでタグの説明を編集 rank_tag_synonym_label: - other: Manage tag synonyms + other: タグの同義語を管理する email: other: メールアドレス e_mail: - other: Email + other: メールアドレス password: other: パスワード pass: other: パスワード original_text: - other: This post + other: 投稿 email_or_password_wrong_error: other: メールアドレスとパスワードが一致しません。 error: common: invalid_url: - other: Invalid URL. + other: 無効なURL status_invalid: - other: Invalid status. + other: 無効なステータス password: space_invalid: - other: Password cannot contain spaces. + other: パスワードにスペースを含めることはできません。 admin: cannot_update_their_password: other: パスワードは変更できません。 cannot_edit_their_profile: - other: You cannot modify your profile. + other: プロフィールを変更できません。 cannot_modify_self_status: other: ステータスを変更できません。 email_or_password_wrong: @@ -183,7 +183,7 @@ backend: verify_url_expired: other: メール認証済みURLの有効期限が切れています。メールを再送信してください。 illegal_email_domain_error: - other: Email is not allowed from that email domain. Please use another one. + other: そのメールドメインからのメールは許可されていません。別のメールアドレスを使用してください。 lang: not_found: other: 言語ファイルが見つかりません。 @@ -207,15 +207,15 @@ backend: new_password_same_as_previous_setting: other: 新しいパスワードは前のパスワードと同じです。 already_deleted: - other: This post has been deleted. + other: この投稿は削除されました。 meta: object_not_found: - other: Meta object not found + other: メタオブジェクトが見つかりません question: already_deleted: other: この投稿は削除されました。 under_review: - other: Your post is awaiting review. It will be visible after it has been approved. + other: あなたの投稿はレビュー待ちです。承認されると表示されます。 not_found: other: 質問が見つかりません。 cannot_deleted: @@ -226,11 +226,11 @@ backend: other: 更新する権限がありません。 rank: fail_to_meet_the_condition: - other: Reputation rank fail to meet the condition. + other: 評判ランクが条件を満たしていません vote_fail_to_meet_the_condition: - other: Thanks for the feedback. You need at least {{.Rank}} reputation to cast a vote. + other: フィードバックをありがとうございます。投票には少なくとも {{.Rank}} の評判が必要です。 no_enough_rank_to_operate: - other: You need at least {{.Rank}} reputation to do this. + other: 少なくとも {{.Rank}} の評判が必要です。 report: handle_failed: other: レポートの処理に失敗しました。 @@ -242,167 +242,167 @@ backend: not_found: other: タグが見つかりません。 recommend_tag_not_found: - other: Recommend tag is not exist. + other: おすすめタグは存在しません。 recommend_tag_enter: other: 少なくとも 1 つの必須タグを入力してください。 not_contain_synonym_tags: other: 同義語のタグを含めないでください。 cannot_update: - other: No permission to update. + other: 更新する権限がありません。 is_used_cannot_delete: - other: You cannot delete a tag that is in use. + 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: Fromの名前はメールアドレスにできません。 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 revise. + other: 編集する権限がありません。 user: external_login_missing_user_id: - other: The third-party platform does not provide a unique UserID, so you cannot login, please contact the website administrator. + other: サードパーティのプラットフォームは一意のユーザーIDを提供していないため、ログインできません。ウェブサイト管理者にお問い合わせください。 external_login_unbinding_forbidden: - other: Please set a login password for your account before you remove this login. + other: ログインを削除する前に、アカウントのログインパスワードを設定してください。 email_or_password_wrong: other: other: メールアドレスとパスワードが一致しません。 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: 現在、このサイトは新規登録を受け付けておりません not_allowed_login_via_password: - other: Currently the site is not allowed to login via password. + other: 現在、このサイトはパスワードでログインできません access_denied: other: アクセスが拒否されました page_access_denied: - other: You do not have access to this page. + other: このページへのアクセス権がありません add_bulk_users_format_error: other: "Error {{.Field}} format near '{{.Content}}' at line {{.Line}}. {{.ExtraMessage}}" add_bulk_users_amount_error: - other: "The number of users you add at once should be in the range of 1-{{.MaxAmount}}." + other: "一度に追加するユーザーの数は、1 -{{.MaxAmount}} の範囲にする必要があります。" config: read_config_failed: - other: Read config failed + other: configの読み込みに失敗しました database: connection_failed: - other: Database connection 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: サポートされていないファイル形式です。 site_info: config_not_found: - other: Site config not found. + other: configが見つかりません。 badge: object_not_found: - other: Badge object not found + other: バッジオブジェクトが見つかりません reason: 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_or_abusive: name: - other: rude or abusive + other: 誹謗中傷 desc: - other: "A reasonable person would find this content inappropriate for respectful discourse." + other: "合理的な人は、このコンテンツを尊重する言説には不適切と判断するでしょう。" a_duplicate: name: - other: a duplicate + other: 重複 desc: - other: This question has been asked before and already has an answer. + other: この質問は以前に質問されており、すでに回答があります。 placeholder: - other: Enter the existing question link + other: 既存の質問リンクを入力してください not_a_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: "これは答えとして投稿されましたが、質問に答えようとしません。 それはおそらく編集、コメント、別の質問、または完全に削除されるべきです。" no_longer_needed: name: - other: no longer needed + other: 必要では無い desc: - other: This comment is outdated, conversational or not relevant to this post. + other: このコメントは古く、この投稿とは関係がありません。 something: name: - other: something else + other: その他 desc: - other: This post requires staff attention for another reason not listed above. + other: 上記以外の理由でスタッフの注意が必要です。 placeholder: - other: Let us know specifically what you are concerned about + other: あなたが懸念していることを私たちに教えてください community_specific: name: - other: a community-specific reason + other: コミュニティ固有の理由です desc: - other: This question doesn't meet a community guideline. + other: この質問はコミュニティガイドラインを満たしていません not_clarity: 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: この質問には現在複数の質問が含まれています。1つの問題にのみ焦点を当てる必要があります。 looks_ok: name: - other: looks OK + other: LGTM desc: - other: This post is good as-is and not low quality. + other: この投稿はそのままで良く、改善する必要はありません! needs_edit: name: - other: needs edit, and I did it + other: 編集する必要があったため変更しました。 desc: - other: Improve and correct problems with this post yourself. + other: 自分自身でこの投稿の問題を改善し修正します。 needs_close: name: - other: needs close + other: クローズする必要がある desc: - other: A closed question can't answer, but still can edit, vote and comment. + other: クローズされた質問は回答できませんが、編集、投票、コメントはできます。 needs_delete: name: - other: needs delete + other: 削除が必要です desc: - other: This post will be deleted. + other: この投稿は削除されました question: close: duplicate: name: 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: この質問には現在複数の質問が含まれています。1つの問題にのみ焦点を当てる必要があります。 other: name: - other: something else + other: その他 desc: - other: This post requires another reason not listed above. + other: 上記以外の理由でスタッフの注意が必要です。 operation_type: asked: other: 質問済み @@ -411,383 +411,383 @@ backend: modified: other: 修正済み deleted_title: - other: Deleted question + other: 質問を削除 questions_title: - other: Questions + other: 質問 tag: tags_title: - other: Tags + other: タグ no_description: - other: The tag has no description. + 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: あなたのコメントは削除されました up_voted_question: - other: upvoted question + other: 質問を高評価 down_voted_question: - other: downvoted question + other: 質問を低評価 up_voted_answer: - other: upvoted answer + other: 回答を高評価 down_voted_answer: - other: downvoted answer + other: 回答を低評価 up_voted_comment: - other: upvoted comment + other: コメントを高評価 invited_you_to_answer: - other: invited you to answer + other: あなたを回答に招待しました earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: '"{{.BadgeName}}"バッジを獲得しました' email_tpl: change_email: title: - other: "[{{.SiteName}}] Confirm your new email address" + other: "[{{.SiteName}}] 新しいメールアドレスを確認してください" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: - other: "[{{.SiteName}}] {{.DisplayName}} answered your question" + other: "[{{.SiteName}}] {{.DisplayName}} があなたの質問に回答しました" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: - other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" + other: "[{{.SiteName}}] {{.DisplayName}} があなたを回答に招待しました" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: - other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" + other: "[{{.SiteName}}] {{.DisplayName}} があなたの投稿にコメントしました" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: - other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" + other: "[{{.SiteName}}] 新しい質問: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: - other: "[{{.SiteName }}] Password reset" + other: "[{{.SiteName }}] パスワードリセット" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: - other: "[{{.SiteName}}] Confirm your new account" + other: "[{{.SiteName}}] 新しいアカウントを確認" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: - other: "[{{.SiteName}}] Test Email" + other: "[{{.SiteName}}] テストメール" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: - other: upvote + other: 高評価 upvoted: - other: upvoted + other: 高評価しました downvote: - other: downvote + other: 低評価 downvoted: - other: downvoted + other: 低評価しました accept: - other: accept + other: 承認 accepted: - other: accepted + other: 承認済み edit: - other: edit + other: 編集 review: queued_post: - other: Queued post + other: キューに入れられた投稿 flagged_post: - other: Flagged post + other: 投稿を通報 suggested_post_edit: - other: Suggested edits + other: 提案された編集 reaction: tooltip: - other: "{{ .Names }} and {{ .Count }} more..." + other: "{{ .Names }} と {{ .Count }} もっと..." badge: default_badges: autobiographer: name: - other: Autobiographer + other: 自伝作家 desc: - other: Filled out profile information. + other: プロファイル 情報を入力しました。 certified: name: - other: Certified + other: 認定済み desc: - other: Completed our new user tutorial. + other: 新しいユーザーがチュートリアルを完了しました。 editor: name: - other: Editor + other: 編集者 desc: - other: First post edit. + other: 最初の投稿の編集 first_flag: name: - other: First Flag + other: 初めての報告 desc: - other: First flagged a post. + other: 初めての報告 first_upvote: name: - other: First Upvote + other: はじめての高評価 desc: - other: First up voted a post. + other: はじめて投稿に高評価した first_link: name: - other: First Link + other: はじめてのリンク desc: - other: First dirst added a link to another post. + other: "初めて別の記事へのリンクを追加した。\n" first_reaction: name: - other: First Reaction + other: 初めてのリアクション desc: - other: First reacted to the post. + other: はじめて投稿にリアクションした first_share: name: - other: First Share + other: はじめての共有 desc: - other: First shared a post. + other: はじめて投稿を共有した scholar: name: - other: Scholar + other: 研究生 desc: - other: Asked a question and accepted an answer. + other: 質問をして回答が承認された commentator: name: - other: Commentator + other: コメントマン desc: - other: Leave 5 comments. + other: 5つコメントをした new_user_of_the_month: name: - other: New User of the Month + other: 今月の新しいユーザー desc: - other: Outstanding contributions in their first month. + other: 最初の月に優れた貢献 read_guidelines: name: - other: Read Guidelines + other: ガイドラインを読んだ desc: - other: Read the [community guidelines]. + other: '「コミュニティガイドライン」をご覧ください。' reader: name: - other: Reader + other: リーダー desc: - other: Read every answers in a topic with more than 10 answers. + other: 10以上の回答を持つトピックのすべての回答を読んだ welcome: name: - other: Welcome + other: ようこそ! desc: - other: Received a up vote. + other: 高評価をされた nice_share: name: other: Nice Share desc: - other: Shared a post with 25 unique visitors. + other: 25人の訪問者と投稿を共有した good_share: name: other: Good Share desc: - other: Shared a post with 300 unique visitors. + other: 300の訪問者と投稿を共有した great_share: name: other: Great Share desc: - other: Shared a post with 1000 unique visitors. + other: 1000人の訪問者と投稿を共有した out_of_love: name: - other: Out of Love + other: お隣さん desc: - other: Used 50 up votes in a day. + other: 1日に50票いれた higher_love: name: - other: Higher Love + other: お友達 desc: - other: Used 50 up votes in a day 5 times. + other: 5日目に50回投票した crazy_in_love: name: - other: Crazy in Love + other: 崇拝 desc: - other: Used 50 up votes in a day 20 times. + other: 一日に50回投票を20回した promoter: name: - other: Promoter + other: プロモーター desc: - other: Invited a user. + other: ユーザーを招待した campaigner: name: - other: Campaigner + other: キャンペーン desc: - other: Invited 3 basic users. + other: 3人のベーシックユーザーを招待しました。 champion: name: - other: Champion + other: チャンピオン desc: - other: Invited 5 members. + other: 5人のメンバーを招待しました。 thank_you: name: - other: Thank You + other: Thank you desc: - other: Has 20 up voted posts and gave 10 up votes. + other: 投稿が20件!投票数が10件! gives_back: name: - other: Gives Back + other: 返品 desc: - other: Has 100 up voted posts and gave 100 up votes. + other: 投稿が100件 !?!? 投票数が100件 !?!? empathetic: name: - other: Empathetic + other: 共感性 desc: - other: Has 500 up voted posts and gave 1000 up votes. + other: 500の投稿を投票し、1000の投票を与えた。 enthusiast: name: - other: Enthusiast + other: 楽天家 desc: - other: Visited 10 consecutive days. + other: 10日間連続ログイン aficionado: name: other: Aficionado desc: - other: Visited 100 consecutive days. + other: 100日連続ログイン!!! devotee: name: - other: Devotee + other: 献身者 desc: - other: Visited 365 consecutive days. + other: 365日連続訪問!!!!!!!! anniversary: name: - other: Anniversary + other: 周年記念 desc: - other: Active member for a year, posted at least once. + other: 年に一回は... appreciated: name: - other: Appreciated + other: ありがとう! desc: - other: Received 1 up vote on 20 posts. + other: 20件の投稿に1件の投票を受け取った respected: name: - other: Respected + other: 尊敬される desc: - other: Received 2 up votes on 100 posts. + other: 100件の投稿で2件の投票を受け取った admired: name: - other: Admired + other: 崇拝された desc: - other: Received 5 up votes on 300 posts. + other: 300の投稿に5票を獲得した solved: name: - other: Solved + other: 解決 desc: - other: Have an answer be accepted. + other: 答えを受け入れられた guidance_counsellor: name: - other: Guidance Counsellor + other: アドバイザー desc: - other: Have 10 answers be accepted. + other: 10個の回答が承認された know_it_all: name: - other: Know-it-All + other: 物知り博士 desc: - other: Have 50 answers be accepted. + other: 50個の回答が承認された solution_institution: name: - other: Solution Institution + other: 解決機関 desc: - other: Have 150 answers be accepted. + other: 150個の回答が承認された nice_answer: name: - other: Nice Answer + other: 素敵な回答 desc: - other: Answer score of 10 or more. + other: 回答スコアは10以上!! good_answer: name: - other: Good Answer + other: 良い回答 desc: - other: Answer score of 25 or more. + other: 回答スコアは25以上!?! great_answer: name: - other: Great Answer + other: 素晴らしい回答 desc: - other: Answer score of 50 or more. + other: 回答スコアは50以上!!!!1 nice_question: name: - other: Nice Question + other: ナイスな質問 desc: - other: Question score of 10 or more. + other: 質問スコアは10以上!! good_question: name: - other: Good Question + other: よい質問 desc: - other: Question score of 25 or more. + other: 質問スコアは25以上!?! great_question: name: - other: Great Question + other: 素晴らしい質問 desc: - other: Question score of 50 or more. + other: 50人の閲覧者!! popular_question: name: - other: Popular Question + other: 人気のある質問 desc: - other: Question with 500 views. + other: 500人の閲覧者!!! notable_question: name: - other: Notable Question + other: 注目すべき質問 desc: - other: Question with 1,000 views. + other: 1,000人の閲覧者!!!! famous_question: name: - other: Famous Question + other: 偉大な質問 desc: - other: Question with 5,000 views. + other: 5,000人の閲覧者!!!!! popular_link: name: - other: Popular Link + other: 人気のリンク desc: - other: Posted an external link with 50 clicks. + other: 外部リンクを50回クリック hot_link: name: - other: Hot Link + other: 激アツリンク desc: - other: Posted an external link with 300 clicks. + other: 外部リンクを300回クリック famous_link: name: - other: Famous Link + other: 有名なリンク desc: - other: Posted an external link with 100 clicks. + other: 外部リンクを100回クリック default_badge_groups: getting_started: name: - other: Getting Started + other: はじめに community: name: - other: Community + other: コミュニティ posting: name: - other: Posting + other: 投稿中 # The following fields are used for interface presentation(Front-end) ui: how_to_format: - title: How to Format + title: 書式設定 desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: 前へ next: 次へ @@ -796,79 +796,79 @@ ui: questions: 質問 tag: タグ tags: タグ - tag_wiki: tag wiki + tag_wiki: タグ wiki create_tag: タグを作成 edit_tag: タグを編集 ask_a_question: 質問を追加 edit_question: 質問を編集 edit_answer: 回答を編集 search: 検索 - posts_containing: Posts containing + posts_containing: 記事を含む投稿 settings: 設定 - notifications: Notifications + notifications: お知らせ login: ログイン sign_up: 新規登録 account_recovery: アカウントの復旧 - account_activation: Account Activation + account_activation: アカウント有効化 confirm_email: メールアドレスを確認 - account_suspended: Account Suspended + account_suspended: アカウントは凍結されています admin: 管理者 change_email: メールアドレスを変更 - install: Answer Installation - upgrade: Answer Upgrade - maintenance: Website Maintenance + install: 回答に応答する + upgrade: 回答を改善する + maintenance: ウェブサイトのメンテナンス users: ユーザー - oauth_callback: Processing + oauth_callback: 処理中 http_404: HTTP エラー 404 http_50X: HTTP エラー 500 http_403: HTTP エラー 403 - logout: Log Out + logout: ログアウト notifications: title: 通知 inbox: 受信トレイ - achievement: Achievements - new_alerts: New alerts - all_read: Mark all as read + achievement: 実績 + new_alerts: 新しい通知 + all_read: すべて既読にする show_more: もっと見る - someone: Someone + someone: 誰か inbox_type: all: すべて posts: 投稿 invites: 招待 votes: 投票 - answer: Answer - question: Question - badge_award: Badge + answer: 回答 + question: 質問 + badge_award: バッジ suspended: title: あなたのアカウントは停止されています。 until_time: "あなたのアカウントは {{ time }} まで停止されました。" forever: このユーザーは永久に停止されました。 - end: You don't meet a community guideline. + end: コミュニティガイドラインを満たしていません。 contact_us: お問い合わせ editor: blockquote: text: 引用 bold: - text: Strong + text: 強い chart: - text: Chart + text: チャート 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 + sequence_diagram: シーケンス図 + class_diagram: クラス図 + state_diagram: 状態図 + entity_relationship_diagram: ER図 + user_defined_diagram: ユーザー定義図 + gantt_chart: ガントチャート + pie_chart: 円グラフ code: - text: Code Sample - add_code: Add code sample + text: コードサンプル + add_code: コードサンプルを追加 form: fields: code: label: コード msg: - empty: Code cannot be empty. + empty: Code を空にすることはできません。 language: label: 言語 placeholder: 自動検出 @@ -877,8 +877,8 @@ ui: formula: text: 数式 options: - inline: Inline formula - block: Block formula + inline: インライン数式 + block: ブロック数式 heading: text: 見出し options: @@ -891,7 +891,7 @@ ui: help: text: ヘルプ hr: - text: Horizontal rule + text: 水平方向の罫線 image: text: 画像 add_image: 画像を追加する @@ -899,12 +899,12 @@ ui: form_image: fields: file: - label: Image file + label: 画像ファイル btn: 画像を選択する msg: empty: ファイルは空にできません。 only_image: 画像ファイルのみが許可されています。 - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: 説明 tab_url: 画像URL @@ -922,12 +922,12 @@ ui: indent: text: インデント outdent: - text: Outdent + text: アウトデント italic: - text: Emphasis + text: 斜体 link: - text: Hyperlink - add_link: Add hyperlink + text: ハイパーリンク + add_link: ハイパーリンクを追加 form: fields: url: @@ -939,15 +939,19 @@ ui: btn_cancel: キャンセル btn_confirm: 追加 ordered_list: - text: Numbered list + text: 順序付きリスト unordered_list: - text: Bulleted list + text: 箇条書きリスト table: text: ' テーブル' heading: 見出し cell: セル + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: - title: I am closing this post as... + title: この投稿を次のように閉じます... btn_cancel: キャンセル btn_submit: 送信 remark: @@ -955,25 +959,25 @@ ui: msg: 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 + flag_title: この投稿を報告するフラグを立てています... + close_title: この投稿を次のように閉じます... + review_question_title: 質問の編集をレビュー + review_answer_title: 答えをレビューする + review_comment_title: レビューコメント btn_cancel: キャンセル btn_submit: 送信 remark: empty: 入力してください。 msg: empty: 理由を選んでください。 - not_a_url: URL format is incorrect. - url_not_match: URL origin does not match the current website. + not_a_url: URL形式が正しくありません。 + url_not_match: URL の原点が現在のウェブサイトと一致しません。 tag_modal: title: 新しいタグを作成 form: fields: display_name: - label: Display name + label: 表示名 msg: empty: 表示名を入力してください。 range: 表示名は最大 35 文字までです。 @@ -982,16 +986,16 @@ ui: desc: '文字セット「a-z」、「0-9」、「+ # -」を使用する必要があります。' msg: empty: URL スラッグを空にすることはできません。 - range: URL slug up to 35 characters. - character: URL slug contains unallowed character set. + range: タイトルは最大35文字までです. + character: URL スラグに許可されていない文字セットが含まれています。 desc: label: 説明 revision: - label: Revision + label: 修正 edit_summary: - label: Edit summary + label: 概要を編集 placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) + 簡単にあなたの変更を説明します(修正スペル、固定文法、改善されたフォーマット) btn_cancel: キャンセル btn_submit: 送信 btn_post: 新しいタグを投稿 @@ -1001,61 +1005,61 @@ ui: history: 履歴 synonyms: title: 類義語 - text: The following tags will be remapped to - empty: No synonyms found. - btn_add: Add a synonym + text: 次のタグが再マップされます + empty: 同義語は見つかりません。 + btn_add: 同義語を追加 btn_edit: 編集 btn_save: 保存 - synonyms_text: The following tags will be remapped to + synonyms_text: 次のタグが再マップされます delete: title: このタグを削除 tip_with_posts: >- -

      We do not allow deleting tag with posts.

      Please remove this tag from the posts first.

      +

      同義語でタグを削除することはできません。

      最初にこのタグから同義語を削除してください。

      tip_with_synonyms: >- -

      We do not allow deleting tag with synonyms.

      Please remove the synonyms from this tag first.

      - tip: Are you sure you wish to delete? - close: 閉じる +

      同義語でタグを削除することはできません。

      最初にこのタグから同義語を削除してください。

      + tip: 本当に削除してもよろしいですか? + close: クローズ edit_tag: title: タグを編集 default_reason: タグを編集 - default_first_reason: Add tag - btn_save_edits: Save edits + default_first_reason: タグを追加 + btn_save_edits: 編集を保存 btn_cancel: キャンセル dates: long_date: MMM D - long_date_with_year: "MMM D, YYYY" + long_date_with_year: "YYYY年MM月D日" 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" + now: 今 + x_seconds_ago: "{{count}}秒前" + x_minutes_ago: "{{count}}分前" + x_hours_ago: "{{count}}時間前" hour: 時 day: 日 hours: 時 days: 日 reaction: - heart: heart - smile: smile - frown: frown - btn_label: add or remove reactions - undo_emoji: undo {{ emoji }} reaction - react_emoji: react with {{ emoji }} - unreact_emoji: unreact with {{ emoji }} + heart: ハート + smile: 笑顔 + frown: 眉をひそめる + btn_label: リアクションの追加または削除 + undo_emoji: '{{ emoji }} のリアクションを元に戻す' + react_emoji: '{{ emoji }} に反応する' + unreact_emoji: '{{ emoji }} に反応しない' comment: btn_add_comment: コメントを追加 - reply_to: Reply to + reply_to: 返信: btn_reply: 返信 btn_edit: 編集 btn_delete: 削除 btn_flag: フラグ btn_save_edits: 編集内容を保存 btn_cancel: キャンセル - show_more: "{{count}} more comments" + show_more: "{{count}} 件のその他のコメント" 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. - tip_vote: It adds something useful to the post + コメントを使用して他のユーザーに返信したり、変更を通知します。新しい情報を追加する場合は、コメントの代わりに投稿を編集します。 + tip_vote: 投稿に役に立つものを追加します edit_answer: title: 回答を編集 default_reason: 回答を編集 @@ -1063,16 +1067,16 @@ ui: 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 + label: 概要を編集 placeholder: >- - Briefly explain your changes (corrected spelling, fixed grammar, improved formatting) - btn_save_edits: Save edits + 簡単にあなたの変更を説明します(修正スペル、固定文法、改善されたフォーマット) + btn_save_edits: 編集を保存 btn_cancel: キャンセル tags: title: タグ @@ -1084,8 +1088,9 @@ ui: button_following: フォロー中 tag_label: 質問 search_placeholder: タグ名でフィルタ - no_desc: The tag has no description. - more: More + no_desc: タグには説明がありません。 + more: もっと見る + wiki: Wiki ask: title: 質問を追加 edit_title: 質問を編集 @@ -1095,53 +1100,53 @@ ui: 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 + label: 概要を編集 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 + 簡単にあなたの変更を説明します(修正スペル、固定文法、改善されたフォーマット) + 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: "質問について説明してください。少なくとも1つのタグが必要です。" + no_result: 一致するタグはありません + tag_required_text: 必須タグ (少なくとも 1 つ) header: nav: - question: Questions - tag: Tags - user: Users - badges: Badges - profile: Profile - setting: Settings - logout: Log out + question: 質問 + tag: タグ + user: ユーザー + badges: バッジ + profile: プロフィール + setting: 設定 + logout: ログアウト admin: 管理者 review: レビュー bookmark: ブックマーク - moderation: Moderation + moderation: モデレーション search: placeholder: 検索 footer: @@ -1151,35 +1156,35 @@ ui: name: 変更 loading: 読み込み中… pic_auth_code: - title: Captcha - placeholder: Type the text above + title: CAPTCHA + placeholder: 上記のテキストを入力してください msg: - empty: Captcha cannot be empty. + empty: Code を空にすることはできません。 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." + {{mail}}にアクティベーションメールを送信しました。メールの指示に従ってアカウントをアクティベーションしてください。 + info: "届かない場合は、迷惑メールフォルダを確認してください。" 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 + {{mail}}に別のアクティベーションメールを送信しました。 到着には数分かかる場合があります。スパムフォルダを確認してください。 + btn_name: 認証メールを再送信 change_btn_name: メールアドレスを変更 msg: - empty: Cannot be empty. + empty: 空にすることはできません resend_email: - url_label: Are you sure you want to resend the activation email? - url_text: You can also give the activation link above to the user. + url_label: 本当に認証メールを再送信してもよろしいですか? + url_text: ユーザーに上記のアクティベーションリンクを渡すこともできます。 login: - 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. + 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 must be between 2 to 30 characters in length. - character: 'Must use the character set "a-z", "A-Z", "0-9", " - . _"' + empty: 名前を空にすることはできません。 + range: 2~30文字の名前を設定してください。 + character: '文字セット "a-z", "A-Z", "0-9", " - " を使用する必要があります。' email: label: メールアドレス msg: @@ -1188,12 +1193,12 @@ ui: label: パスワード msg: empty: パスワードを入力してください。 - different: The passwords entered on both sides are inconsistent + different: 入力されたパスワードが一致しません account_forgot: page_title: パスワードを忘れた方はこちら - btn_name: Send me recovery email + btn_name: 回復用のメールを送る send_success: >- - If an account matches {{mail}}, you should receive an email with instructions on how to reset your password shortly. + アカウントが {{mail}}と一致する場合は、パスワードをすぐにリセットする方法に関するメールが送信されます。 email: label: メールアドレス msg: @@ -1202,333 +1207,336 @@ ui: btn_cancel: キャンセル btn_update: メールアドレスを更新 send_success: >- - If an account matches {{mail}}, you should receive an email with instructions on how to reset your password shortly. + アカウントが {{mail}}と一致する場合は、パスワードをすぐにリセットする方法に関するメールが送信されます。 email: - label: New email + label: 新しいメールアドレス msg: - empty: Email cannot be empty. + empty: メールアドレス欄を空白にしておくことはできません oauth: - connect: Connect with {{ auth_name }} - remove: Remove {{ auth_name }} + connect: '{{ auth_name }} と接続' + remove: '{{ auth_name }} を削除' oauth_bind_email: - subtitle: Add a recovery email to your account. - btn_update: Update email address + subtitle: アカウントに回復用のメールアドレスを追加します。 + btn_update: メールアドレスを更新 email: - label: Email + label: メールアドレス msg: - empty: Email cannot be empty. - modal_title: Email already existes. - modal_content: This email address already registered. Are you sure you want to connect to the existing account? - modal_cancel: Change email - modal_confirm: Connect to the existing account + empty: メールアドレスは空にできません。 + modal_title: このメールアドレスはすでに存在しています。 + modal_content: このメールアドレスは既に登録されています。既存のアカウントに接続してもよろしいですか? + modal_cancel: メールアドレスを変更する + modal_confirm: 既存のアカウントに接続 password_reset: page_title: パスワード再設定 btn_name: パスワードをリセット 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 + 申し訳ありませんが、このパスワードリセットのリンクは無効になりました。パスワードが既にリセットされている可能性がありますか? + to_login: ログインページへ password: label: パスワード msg: empty: パスワードを入力してください。 - length: The length needs to be between 8 and 32 - different: The passwords entered on both sides are inconsistent + length: 長さは 8 から 32 の間である必要があります + different: 両側に入力されたパスワードが一致しません password_confirm: - label: Confirm new password + label: 新しいパスワードの確認 settings: page_title: 設定 - goto_modify: Go to modify + goto_modify: 変更を開く 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: ユーザー名 - 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", " - . _"' + caption: ユーザーは "@username" としてあなたをメンションできます。 + msg: ユーザー名は空にできません。 + msg_range: 表示名は最大 30 文字までです。 + character: '文字セット "a-z", "0-9", " - . _" を使用してください。' avatar: label: プロフィール画像 gravatar: Gravatar - gravatar_text: You can change image on - custom: Custom - custom_text: You can upload your image. + gravatar_text: 画像を変更できます: + custom: カスタム + custom_text: 画像をアップロードできます。 default: システム - msg: Please upload an avatar + msg: アバターをアップロードしてください bio: - label: About me + label: 自己紹介 website: label: ウェブサイト placeholder: "http://example.com" - msg: Website incorrect format + msg: ウェブサイトの形式が正しくありません location: - label: Location - placeholder: "City, Country" + label: ロケーション + placeholder: "都道府県,国" notification: - heading: Email Notifications - turn_on: Turn on + heading: メール通知 + turn_on: ONにする inbox: - label: Inbox notifications - description: Answers to your questions, comments, invites, and more. + label: 受信トレイの通知 + description: 質問、コメント、招待状などへの回答。 all_new_question: - label: All new questions - description: Get notified of all new questions. Up to 50 questions per week. + label: すべての新規質問 + description: すべての新しい質問の通知を受け取ります。週に最大50問まで。 all_new_question_for_following_tags: - label: All new questions for following tags - description: Get notified of new questions for following tags. + label: 以下のタグに対するすべての新しい質問 + description: タグをフォローするための新しい質問の通知を受け取る。 account: heading: アカウント change_email_btn: メールアドレスを変更する change_pass_btn: パスワードを変更する change_email_info: >- - We've sent an email to that address. Please follow the confirmation instructions. + このアドレスにメールを送信しました。メールの指示に従って確認処理を行ってください。 email: - label: Email + label: メールアドレス new_email: - label: New email - msg: New email cannot be empty. + label: 新しいメールアドレス + msg: 新しいメールアドレスは空にできません。 pass: - label: Current password - msg: Password cannot be empty. + 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: ユーザーインターフェイスの言語。ページを更新すると変更されます。 my_logins: - title: My logins - label: Log in or sign up on this site using these accounts. - modal_title: Remove login - modal_content: Are you sure you want to remove this login from your account? - modal_confirm_btn: Remove - remove_success: Removed successfully + title: ログイン情報 + label: これらのアカウントを使用してログインまたはこのサイトでサインアップします。 + modal_title: ログイン情報を削除 + modal_content: このログイン情報をアカウントから削除してもよろしいですか? + modal_confirm_btn: 削除 + remove_success: 削除に成功しました 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. - sent_success: Sent successfully + update: 更新に成功しました + update_password: パスワードの変更に成功しました。 + flag_success: フラグを付けてくれてありがとう + forbidden_operate_self: 自分自身で操作することはできません + review: レビュー後にあなたのリビジョンが表示されます。 + sent_success: 正常に送信されました。 related_question: - title: Related Questions - answers: answers + title: 関係のある質問 + answers: 回答 linked_question: - title: Linked Questions - description: Questions linked to - no_linked_question: No questions linked from this question. + title: リンクされた質問 + description: リンクされている質問 + no_linked_question: この質問からリンクされた質問はありません。 invite_to_answer: title: People Asked desc: Select people who you think might know the answer. - invite: Invite to answer - add: Add people - search: Search people + invite: 回答に招待する + add: ユーザーを追加 + search: ユーザーを検索 question_detail: - action: Action - Asked: Asked - asked: asked - update: Modified - edit: edited - commented: commented - Views: Viewed - Follow: Follow - Following: Following - follow_tip: Follow this question to receive notifications - answered: answered - closed_in: Closed in - show_exist: Show existing question. - useful: Useful - question_useful: It is useful and clear - question_un_useful: It is unclear or not useful - question_bookmark: Bookmark this question - answer_useful: It is useful - answer_un_useful: It is not useful + action: 動作 + Asked: 質問済み + asked: 質問済み + update: 修正済み + edit: 編集済み + commented: コメントしました + Views: 閲覧回数 + Follow: フォロー + Following: フォロー中 + follow_tip: この質問をフォローして通知を受け取る + answered: 回答済み + closed_in: クローズまで + show_exist: 既存の質問を表示します + useful: 役に立った + question_useful: それは有用で明確です。 + question_un_useful: 不明確または有用ではない + question_bookmark: この質問をブックマークする + answer_useful: 役に立った + answer_un_useful: 役に立たない answers: title: 回答 score: スコア newest: 最新 - oldest: Oldest + oldest: 古い順 btn_accept: 承認 - btn_accepted: Accepted + btn_accepted: 承認済み write_answer: - title: Your Answer - edit_answer: Edit my existing answer - btn_name: Post your answer - add_another_answer: Add another answer - confirm_title: Continue to answer - continue: Continue + title: あなたの回答 + edit_answer: 既存の回答を編集する + btn_name: 回答を投稿する + add_another_answer: 別の回答を追加 + confirm_title: 回答を続ける + 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. +

      本当に別の答えを追加したいのですか?

      代わりに、編集リンクを使って既存の答えを洗練させ、改善することができます。

      + empty: 回答は空欄にできません + characters: コンテンツは6文字以上でなければなりません。 tips: - header_1: Thanks for your answer - li1_1: Please be sure to answer the question. Provide details and share your research. - li1_2: Back up any statements you make with references or personal experience. - header_2: But avoid ... - li2_1: Asking for help, seeking clarification, or responding to other answers. + header_1: ご回答ありがとうございます。 + li1_1: " 必ず質問に答えてください。詳細を述べ、あなたの研究を共有してください。\n" + li1_2: 参考文献や個人的な経験による裏付けを取ること。. + header_2: しかし、 を避けてください... + li2_1: 助けを求める、説明を求める、または他の答えに応答する。 reopen: - confirm_btn: Reopen - title: Reopen this post - content: Are you sure you want to reopen? + confirm_btn: 再オープン + title: この投稿を再度開く + content: 再オープンしてもよろしいですか? list: - confirm_btn: List - title: List this post - content: Are you sure you want to list? + confirm_btn: 一覧 + title: この投稿の一覧 + content: 一覧表示してもよろしいですか? unlist: - confirm_btn: Unlist - title: Unlist this post - content: Are you sure you want to unlist? + confirm_btn: 限定公開にする + title: この投稿を元に戻す + content: 本当に元に戻しますか? pin: - title: Pin this post - content: Are you sure you wish to pinned globally? This post will appear at the top of all post lists. - confirm_btn: Pin + title: この投稿をピン留めする + content: "グローバルに固定してもよろしいですか?\nこの投稿はすべての投稿リストの上部に表示されます。" + confirm_btn: ピン留めする delete: - title: Delete this post + title: この投稿を削除 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_answer_deleted: This answer has been deleted - undelete_title: Undelete this post - undelete_desc: Are you sure you wish to undelete? +

      承認された回答を削除することはお勧めしません。削除すると、今後の読者がこの知識を得られなくなってしまうからです。

      承認された回答を繰り返し削除すると、回答機能が制限され、アカウントがブロックされる場合があります。本当に削除しますか? + + other: 本当に削除してもよろしいですか? + tip_answer_deleted: この回答は削除されました + undelete_title: この投稿を元に戻す + undelete_desc: 本当に元に戻しますか? btns: - confirm: Confirm - cancel: Cancel - edit: Edit - save: Save - delete: Delete - undelete: Undelete - list: List - unlist: Unlist - unlisted: Unlisted - login: Log in + confirm: 確認 + cancel: キャンセル + edit: 編集 + save: 保存 + delete: 削除 + undelete: 元に戻す + list: 限定公開を解除する + unlist: 限定公開にする + unlisted: 限定公開済み + login: ログイン signup: 新規登録 - logout: Log out - verify: Verify - add_question: Add question - approve: Approve - reject: Reject - skip: Skip - discard_draft: Discard draft - pinned: Pinned - all: All - question: Question - answer: Answer - comment: Comment - refresh: Refresh - resend: Resend - deactivate: Deactivate - active: Active - suspend: Suspend - unsuspend: Unsuspend - close: Close - reopen: Reopen + logout: ログアウト + verify: 認証 + add_question: 質問を追加 + approve: 承認 + reject: 却下 + skip: スキップする + discard_draft: 下書きを破棄 + pinned: ピン留めしました + all: すべて + question: 質問 + answer: 回答 + comment: コメント + refresh: 更新 + resend: 再送 + deactivate: 無効化する + active: 有効 + suspend: 凍結 + unsuspend: 凍結解除 + close: クローズ + reopen: 再オープン ok: OK - light: Light - dark: Dark - system_setting: System setting - default: Default - reset: Reset - tag: Tag - post_lowercase: post - filter: Filter - ignore: Ignore - submit: Submit - normal: Normal - closed: Closed - deleted: Deleted - pending: Pending - more: More + light: ライト + dark: ダーク + system_setting: システム設定 + default: 既定 + reset: リセット + tag: タグ + post_lowercase: 投稿 + filter: フィルター + ignore: 除外 + submit: 送信 + normal: 通常 + closed: クローズ済み + deleted: 削除済み + pending: 処理待ち + more: もっと見る 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 with 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>ユーザー:ユーザー名作成者による検索" + answer: "<1>回答:0未回答の質問" + score: "<1>スコア:33以上のスコアを持つ投稿" + question: "<1>質問質問を検索" + is_answer: "<1>は答え答えを検索" + empty: 何も見つかりませんでした。
      別のキーワードまたはそれ以下の特定のキーワードをお試しください。 share: name: シェア copy: リンクをコピー - via: Share post via... - copied: Copied + via: 投稿を共有... + copied: コピーしました facebook: Facebookで共有 twitter: Twitterで共有 - cannot_vote_for_self: You can't vote for your own post. + cannot_vote_for_self: 自分の投稿には投票できません。 modal_confirm: - title: Error... + title: エラー... account_result: - success: Your new account is confirmed; you will be redirected to the home page. - link: Continue to homepage - oops: Oops! - invalid: The link you used no longer works. - confirm_new_email: Your email has been updated. + success: 新しいアカウントが確認されました。ホームページにリダイレクトされます。 + link: ホームページへ + oops: おっと! + invalid: 使用したリンクは機能しません。 + confirm_new_email: メールアドレスが更新されました。 confirm_new_email_invalid: >- - Sorry, this confirmation link is no longer valid. Perhaps your email was already changed? + 申し訳ありませんが、この確認リンクは無効です。メールアドレスが既に変更されている可能性があります。 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" + following_tags: フォロー中のタグ + edit: 編集 + save: 保存 + follow_tag_tip: タグに従って質問のリストをキュレートします。 + hot_questions: ホットな質問 + all_questions: すべての質問 + x_questions: "{{ count }} の質問" + x_answers: "{{ count }} の回答" questions: 質問 answers: 回答 newest: 最新 active: 有効 - hot: Hot - recommend: Recommend + hot: 人気 + frequent: Frequent + recommend: おすすめ score: スコア unanswered: 未回答 modified: 修正済み answered: 回答済み asked: 質問済み - closed: 終了 + closed: 解決済み follow_a_tag: タグをフォロー more: その他 personal: @@ -1536,686 +1544,716 @@ ui: answers: 回答 answer: 回答 questions: 質問 - question: question - bookmarks: Bookmarks - reputation: Reputation - comments: Comments - votes: Votes - badges: Badges - newest: Newest - score: Score - edit_profile: Edit profile - visited_x_days: "Visited {{ count }} days" - viewed: Viewed - joined: Joined + question: 質問 + bookmarks: ブックマーク + reputation: 評判 + comments: コメント + votes: 投票 + badges: バッジ + newest: 最新 + score: スコア + edit_profile: プロファイルを編集 + visited_x_days: "{{ count }}人の閲覧者" + viewed: 閲覧回数 + joined: 参加しました comma: "," - last_login: Seen - about_me: About Me + last_login: 閲覧数 + 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? - content_empty: No posts found. - accepted: Accepted - answered: answered + top_answers: よくある回答 + top_questions: よくある質問 + stats: 統計情報 + list_empty: 投稿が見つかりませんでした。
      他のタブを選択しますか? + content_empty: 投稿が見つかりませんでした。 + accepted: 承認済み + answered: 回答済み asked: 質問済み - downvoted: downvoted + downvoted: 低評価しました mod_short: MOD mod_long: モデレーター - x_reputation: reputation - x_votes: votes received + x_reputation: 評価 + x_votes: 投票を受け取りました x_answers: 回答 x_questions: 質問 - recent_badges: Recent Badges + recent_badges: 最近のバッジ install: title: Installation next: 次へ done: 完了 - config_yaml_error: Can't create the config.yaml file. + config_yaml_error: config.yaml を作成できません。 lang: - label: Please choose a language + label: 言語を選択してください db_type: - label: Database engine + label: データベースエンジン db_username: label: ユーザー名 placeholder: root - msg: Username cannot be empty. + msg: ユーザー名は空にできません。 db_password: label: パスワード placeholder: root msg: パスワードを入力してください。 db_host: - label: Database host + label: データベースのホスト。 placeholder: "db:3306" - msg: Database host cannot be empty. + 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. + title: config.yamlを作成 + label: config.yaml ファイルが作成されました。 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 + <1>/var/www/xxx/ディレクトリに<1>config.yamlファイルを手動で作成し、その中に次のテキストを貼り付けます。 + info: 完了したら、「次へ」ボタンをクリックします。 + site_information: サイト情報 admin_account: 管理者アカウント site_name: - label: Site name - msg: Site name cannot be empty. - msg_max_length: Site name must be at maximum 30 characters in length. + label: サイト名: + msg: サイト名は空にできません. + msg_max_length: サイト名は最大30文字でなければなりません。 site_url: label: サイトURL - text: The address of your site. + text: あなたのサイトのアドレス msg: - empty: Site URL cannot be empty. - incorrect: Site URL incorrect format. - max_length: Site URL must be at maximum 512 characters in length. + empty: サイト URL は空にできません. + incorrect: サイトURLの形式が正しくありません。 + max_length: サイトのURLは最大512文字でなければなりません 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: 連絡先メールアドレスの形式が正しくありません。 login_required: - label: Private - switch: Login required - text: Only logged in users can access this community. + label: 非公開 + switch: ログインが必要です + text: ログインしているユーザーのみがこのコミュニティにアクセスできます。 admin_name: - label: Name - msg: Name cannot be empty. - character: 'Must use the character set "a-z", "0-9", " - . _"' - msg_max_length: Name must be at maximum 30 characters in length. + label: 名前 + msg: 名前を空にすることはできません。 + character: '文字セット "a-z", "0-9", " - . _" を使用してください。' + msg_max_length: 名前は最大30文字でなければなりません。 admin_password: label: パスワード text: >- - You will need this password to log in. Please store it in a secure location. - msg: Password cannot be empty. - msg_min_length: Password must be at least 8 characters in length. - msg_max_length: Password must be at maximum 32 characters in length. + ログインするにはこのパスワードが必要です。安全な場所に保存してください。 + msg: パスワードは空白にできません + msg_min_length: パスワードは8文字以上でなければなりません。 + msg_max_length: パスワードは最大 32 文字でなければなりません。 admin_email: label: メールアドレス - text: You will need this email to log in. + text: ログインするにはこのメールアドレスが必要です。 msg: - empty: Email cannot be empty. - incorrect: Email incorrect format. - ready_title: Your site is ready + empty: メールアドレスは空にできません。 + incorrect: メールアドレスの形式が正しくありません. + ready_title: サイトの準備ができました 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 + もっと設定を変更したいと思ったことがある場合は、<1>管理者セクションをご覧ください。サイトメニューで見つけてください。 + good_luck: "楽しんで、幸運を!" + warn_title: 警告 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 + ファイル<1>config.yamlは既に存在します。このファイルのいずれかの設定アイテムをリセットする必要がある場合は、最初に削除してください。 + install_now: <1>今すぐインストールを試してみてください。 + 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: データベースの接続が失敗しました 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>設定内のデータベース情報を意味します。 amlファイルが正しくないか、データベースサーバーとの連絡先が確立できませんでした。ホストのデータベースサーバーがダウンしている可能性があります。 counts: - views: views - votes: votes - answers: answers - accepted: Accepted + views: ビュー + votes: 投票数 + answers: 回答 + accepted: 承認済み page_error: http_error: HTTP Error {{ code }} - desc_403: You don't have permission to access this page. - desc_404: Unfortunately, this page doesn't exist. - desc_50X: The server encountered an error and could not complete your request. - back_home: Back to homepage + desc_403: このページにアクセスする権限がありません。 + desc_404: 残念ながら、このページは存在しません。 + desc_50X: サーバーにエラーが発生し、リクエストを完了できませんでした。 + 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 - badges: Badges + dashboard: ダッシュボード + contents: コンテンツ + questions: 質問 + answers: 回答 + users: ユーザー + badges: バッジ 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: カスタマイズ themes: テーマ css_html: CSS/HTML login: ログイン - privileges: Privileges - plugins: Plugins - installed_plugins: Installed Plugins - website_welcome: Welcome to {{site_name}} + privileges: 特典 + plugins: プラグイン + installed_plugins: 使用中のプラグイン + website_welcome: '{{site_name}} へようこそ' user_center: - login: Login - qrcode_login_tip: Please use {{ agentName }} to scan the QR code and log in. - login_failed_email_tip: Login failed, please allow this app to access your email information before try again. + login: ログイン + qrcode_login_tip: QRコードをスキャンしてログインするには {{ agentName }} を使用してください。 + login_failed_email_tip: ログインに失敗しました。もう一度やり直す前に、このアプリがあなたのメール情報にアクセスすることを許可してください。 badges: modal: - title: Congratulations - content: You've earned a new badge. - close: Close - confirm: View badges - title: Badges - awarded: Awarded - earned_×: Earned ×{{ number }} - ×_awarded: "{{ number }} awarded" - can_earn_multiple: You can earn this multiple times. - earned: Earned + title: お疲れ様でした! + content: 新しいバッジを獲得しました。 + close: クローズ + confirm: バッジを表示 + title: バッジ + awarded: 受賞済み + earned_×: 獲得×{{ number }} + ×_awarded: "{{ number }} 受賞" + can_earn_multiple: これを複数回獲得できます。 + earned: 獲得済み admin: admin_header: title: 管理者 dashboard: title: ダッシュボード - welcome: Welcome to Admin! - site_statistics: Site statistics + welcome: Adminへようこそ! + site_statistics: サイト統計 questions: "質問:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "回答:" comments: "評論:" votes: "投票:" - users: "Users:" - flags: "Flags:" - reviews: "Reviews:" - site_health: Site health - version: "Version:" - https: "HTTPS:" - upload_folder: "Upload folder:" - run_mode: "Running mode:" - private: Private - public: Public + users: "ユーザー数:" + flags: "フラグ:" + reviews: "レビュー:" + site_health: サイトの状態 + version: "バージョン:" + https: "HTTPS:" + upload_folder: "フォルダを上げる" + run_mode: "実行中モード:" + private: 非公開 + public: 公開 smtp: "SMTP:" timezone: "Timezone:" - system_info: System info - go_version: "Go version:" - database: "Database:" - database_size: "Database size:" - storage_used: "Storage used:" - uptime: "Uptime:" - links: Links - plugins: Plugins + system_info: システム情報 + go_version: "バージョン:" + database: "データベース:" + database_size: "データベースのサイズ:" + storage_used: "使用されているストレージ" + uptime: "稼働時間:" + links: リンク + plugins: プラグイン github: GitHub - blog: Blog - contact: Contact + blog: ブログ + contact: 連絡先 forum: Forum - documents: Documents + documents: ドキュメント feedback: フィードバック support: サポート review: レビュー config: 設定 - update_to: Update to - latest: Latest - check_failed: Check failed + update_to: 更新日時 + latest: 最新 + check_failed: チェックに失敗しました "yes": "はい" "no": "いいえ" - not_allowed: Not allowed - allowed: Allowed - enabled: Enabled - disabled: Disabled - writable: Writable - not_writable: Not writable + not_allowed: 許可されていません + allowed: 許可 + enabled: 有効 + disabled: 無効 + writable: 書き込み可 + not_writable: 書き込み不可 flags: - title: Flags - pending: Pending - completed: Completed - flagged: Flagged - flagged_type: Flagged {{ type }} - created: Created - action: Action - review: Review + title: フラグ + pending: 処理待ち + completed: 完了済 + flagged: フラグ付き + flagged_type: フラグを立てた {{ type }} + created: 作成 + action: 動作 + review: レビュー user_role_modal: - title: Change user role to... - btn_cancel: Cancel - btn_submit: Submit + title: ユーザーロールを変更... + btn_cancel: キャンセル + btn_submit: 送信 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: 送信 edit_profile_modal: - title: Edit profile + title: プロファイルを編集 form: fields: display_name: - label: Display name - msg_range: Display name up to 30 characters. + label: 表示名 + msg_range: 表示名は最大 30 文字までです。 username: - label: Username - msg_range: Username up to 30 characters. + label: ユーザー名 + msg_range: ユーザー名は30文字までです。 email: - label: Email - msg_invalid: Invalid Email Address. - edit_success: Edited successfully - btn_cancel: Cancel - btn_submit: Submit + label: メールアドレス + msg_invalid: 無効なメールアドレス + edit_success: 更新が成功しました + btn_cancel: キャンセル + btn_submit: 送信 user_modal: - title: Add new user + title: 新しいユーザーを追加 form: fields: users: - label: Bulk add user + label: ユーザーを一括追加 placeholder: "John Smith, john@example.com, BUSYopr2\nAlice, alice@example.com, fpDntV8q" - text: Separate “name, email, password” with commas. One user per line. - msg: "Please enter the user's email, one per line." + text: '「名前、メールアドレス、パスワード」をカンマで区切ってください。' + msg: "ユーザーのメールアドレスを1行に1つ入力してください。" display_name: - label: Display name - msg: Display name must be 2-30 characters in length. + label: 表示名 + msg: 表示名の長さは 2 ~ 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: 送信 users: - title: Users - name: Name + title: ユーザー + name: 名前 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 - more: More - inactive: Inactive - suspended: Suspended - deleted: Deleted - normal: Normal + reputation: 評価 + created_at: 作成日時 + delete_at: 削除日時 + suspend_at: サスペンド時間 + status: ステータス + role: ロール + action: 操作 + change: 変更 + all: すべて + staff: スタッフ + more: もっと見る + inactive: 非アクティブ + suspended: 凍結済み + deleted: 削除済み + normal: 通常 Moderator: モデレーター Admin: 管理者 User: ユーザー filter: - placeholder: "Filter by name, user:id" + placeholder: "ユーザー名でフィルタ" set_new_password: 新しいパスワードを設定します。 - edit_profile: Edit profile + edit_profile: プロファイルを編集 change_status: ステータスを変更 change_role: ロールを変更 show_logs: ログを表示 add_user: ユーザを追加 deactivate_user: - title: Deactivate user - content: An inactive user must re-validate their email. + title: ユーザーを非アクティブにする + content: アクティブでないユーザーはメールアドレスを再認証する必要があります。 delete_user: - title: Delete this user - content: Are you sure you want to delete this user? This is permanent! - remove: Remove their content - label: Remove all questions, answers, comments, etc. - text: Don’t check this if you wish to only delete the user’s account. + title: このユーザの削除 + content: このユーザーを削除してもよろしいですか?これは永久的です! + remove: このコンテンツを削除 + label: すべての質問、回答、コメントなどを削除 + text: ユーザーのアカウントのみ削除したい場合は、これを確認しないでください。 suspend_user: - title: Suspend this user - content: A suspended user can't log in. + title: ユーザーをサスペンドにする + content: 一時停止中のユーザーはログインできません。 questions: page_title: 質問 - unlisted: Unlisted + unlisted: 限定公開済み post: 投稿 votes: 投票 answers: 回答 created: 作成 status: ステータス - action: Action - change: Change - pending: Pending + action: 動作 + change: 変更 + pending: 処理待ち filter: - placeholder: "Filter by title, question:id" + placeholder: "タイトル、質問:id でフィルター" answers: - page_title: Answers - post: Post - votes: Votes - created: Created - status: Status - action: Action - change: Change + page_title: 回答 + post: 投稿 + votes: 投票 + created: 作成 + status: ステータス + action: 操作 + change: 変更 filter: - placeholder: "Filter by title, answer:id" + placeholder: "タイトル、質問: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: サイトURL - msg: Site url cannot be empty. - validate: Please enter a valid URL. - text: The address of your site. + msg: サイト URL は空にできません. + validate: 正しいURLを入力してください。 + text: あなたのサイトのアドレス short_desc: - label: Short site description - 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 - msg: Site description cannot be empty. - text: "Describe this site in one sentence, as used in the meta description tag." + label: サイトの説明 + msg: サイト説明を空にすることはできません。 + text: "メタ説明タグで使用されるように、このサイトを1つの文で説明します。" 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: このサイトを担当するキーコンタクトのメールアドレスです。 check_update: - label: Software updates - text: Automatically check for updates + label: ソフトウェアアップデート + text: 自動的に更新を確認 interface: - page_title: Interface + 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 tls: TLS none: なし smtp_port: - label: SMTP port + label: SMTPポート msg: SMTPポートは1〜65535でなければなりません。 - text: The port to your mail server. + text: メールサーバーへのポート番号 smtp_username: - label: SMTP username + label: SMTPユーザ名 msg: SMTP ユーザー名を空にすることはできません。 smtp_password: - label: SMTP password + 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. + label: 認証を有効にする + title: SMTP認証 + msg: SMTP認証は空にできません。 "yes": "はい" "no": "いいえ" branding: - page_title: Branding + page_title: ブランディング logo: - 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. + label: ロゴ + msg: ロゴは空にできません。 + text: あなたのサイトの左上にあるロゴ画像。 高さが56、アスペクト比が3:1を超える広い矩形画像を使用します。 空白の場合、サイトタイトルテキストが表示されます。 mobile_logo: - 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. + label: モバイルロゴ + text: サイトのモバイル版で使用されるロゴです。高さが56の横長の長方形の画像を使用してください。空白のままにすると、"ロゴ"設定の画像が使用されます。 square_icon: - label: Square icon - 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 - 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. + 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: 編集 restrict_answer: - title: Answer write - label: Each user can only write one answer for each question - text: "Turn off to allow users to write multiple answers to the same question, which may cause answers to be unfocused." + title: 回答を書く + label: 各ユーザーは同じ質問に対して1つの回答しか書けません + text: "ユーザが同じ質問に複数の回答を書き込めるようにするにはオフにします。これにより回答がフォーカスされていない可能性があります。" recommend_tags: - label: Recommend tags - text: "Recommend tags will show in the dropdown list by default." + label: おすすめタグ + text: "デフォルトでドロップダウンリストに推奨タグが表示されます。" msg: - contain_reserved: "recommended tags cannot contain reserved tags" + contain_reserved: "推奨されるタグは予約済みタグを含めることはできません" required_tag: - title: Set required tags - label: Set “Recommend tags” as required tags - text: "Every new question must have at least one recommend tag." + title: 必須タグを設定 + label: 必須タグに「推奨タグ」を設定 + text: "新しい質問には少なくとも1つの推奨タグが必要です。" reserved_tags: - label: Reserved tags - text: "Reserved tags can only be used by moderator." + label: 予約済みタグ + text: "予約済みのタグはモデレータのみ使用できます。" + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO 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: 既存のテーマを選択してください color_scheme: - label: Color scheme + label: 配色 navbar_style: - label: Navbar style + label: ナビゲーションバーのスタイル 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 + label: カスタム CSS text: > head: - label: Head + label: ヘッド text: > header: - label: Header + label: ヘッダー text: > footer: - label: Footer - text: This will insert before </body>. + label: フッター + text: これは </body> の前に挿入されます。 sidebar: - label: Sidebar - text: This will insert in sidebar. + 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: 誰もが新しいアカウントを作成できないようにするには、オフにしてください。 email_registration: - title: Email registration - label: Allow email registration - text: Turn off to prevent anyone creating new account through email. + title: メールアドレスの登録 + label: メールアドレスの登録を許可 + text: オフにすると、メールで新しいアカウントを作成できなくなります。 allowed_email_domains: - title: Allowed email domains - text: Email domains that users must register accounts with. One domain per line. Ignored when empty. + title: 許可されたメールドメイン + text: ユーザーがアカウントを登録する必要があるメールドメインです。1行に1つのドメインがあります。空の場合は無視されます。 private: - title: Private - label: Login required - text: Only logged in users can access this community. + title: 非公開 + label: ログインが必要です + text: ログインしているユーザーのみがこのコミュニティにアクセスできます。 password_login: - title: Password login - label: Allow email and password login - text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method." + title: パスワードログイン + label: メールアドレスとパスワードのログインを許可する + text: "警告: オフにすると、他のログイン方法を設定していない場合はログインできない可能性があります。" installed_plugins: - title: Installed Plugins - plugin_link: Plugins extend and expand the functionality. You may find plugins in the <1>Plugin Repository. + title: インストール済みプラグイン + plugin_link: プラグインは機能を拡張します。<1>プラグインリポジトリにプラグインがあります。 filter: - all: All - active: Active - inactive: Inactive - outdated: Outdated + all: すべて + active: アクティブ + inactive: 非アクティブ + outdated: 期限切れ plugins: - label: Plugins - text: Select an existing plugin. + label: プラグイン + text: 既存のプラグインを選択します name: 名前 - version: Version - status: Status - action: Action - deactivate: Deactivate - activate: Activate - settings: Settings + version: バージョン + status: ステータス + action: 操作 + deactivate: 非アクティブ化 + activate: アクティベート + settings: 設定 settings_users: - title: Users + title: ユーザー avatar: - label: Default avatar - text: For users without a custom avatar of their own. + label: デフォルトのアバター + text: 自分のカスタムアバターのないユーザー向け。 gravatar_base_url: label: Gravatar Base URL - text: URL of the Gravatar provider's API base. Ignored when empty. + text: GravatarプロバイダーのAPIベースのURL。空の場合は無視されます。 profile_editable: - title: Profile editable + title: プロフィール編集可能 allow_update_display_name: - label: Allow users to change their display name + label: ユーザーが表示名を変更できるようにする allow_update_username: - label: Allow users to change their username + label: ユーザー名の変更を許可する allow_update_avatar: - label: Allow users to change their profile image + label: ユーザーのプロフィール画像の変更を許可する allow_update_bio: - label: Allow users to change their about me + label: ユーザーが自分についての変更を許可する allow_update_website: - label: Allow users to change their website + label: ユーザーのウェブサイトの変更を許可する allow_update_location: - label: Allow users to change their location + label: ユーザーの位置情報の変更を許可する privilege: - title: Privileges + title: 特権 level: - label: Reputation required level - text: Choose the reputation required for the privileges + label: 評判の必要レベル + text: 特権に必要な評判を選択します msg: - should_be_number: the input should be number - number_larger_1: number should be equal or larger than 1 + should_be_number: 入力は数値でなければなりません + number_larger_1: 数値は 1 以上でなければなりません badges: - action: Action - active: Active - activate: Activate - all: All - awards: Awards - deactivate: Deactivate + action: 操作 + active: アクティブ + activate: アクティベート + all: すべて + awards: 賞 + deactivate: 非アクティブ化 filter: - placeholder: Filter by name, badge:id - group: Group - inactive: Inactive - name: Name - show_logs: Show logs - status: Status - title: Badges + placeholder: 名前、バッジ:id でフィルター + group: グループ + inactive: 非アクティブ + name: 名前 + show_logs: ログを表示 + status: ステータス + title: バッジ form: - optional: (optional) - empty: cannot be empty - invalid: is invalid + optional: (任意) + empty: 空にすることはできません + invalid: 無効です btn_submit: 保存 - not_found_props: "Required property {{ key }} not found." - select: Select + not_found_props: "必須プロパティ {{ key }} が見つかりません。" + select: 選択 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. - approve_revision_tip: Do you approve this revision? - approve_flag_tip: Do you approve this flag? - approve_post_tip: Do you approve this post? - approve_user_tip: Do you approve this user? - suggest_edits: Suggested edits - flag_post: Flag post - flag_user: Flag user - queued_post: Queued post - queued_user: Queued user - filter_label: Type - reputation: reputation - flag_post_type: Flagged this post as {{ type }}. - flag_user_type: Flagged this user as {{ type }}. - edit_post: Edit post - list_post: List post - unlist_post: Unlist post + review: レビュー + proposed: 提案された + question_edit: 質問の編集 + answer_edit: 回答の編集 + tag_edit: タグの編集 + edit_summary: 概要を編集 + edit_question: 質問を編集 + edit_answer: 回答を編集 + edit_tag: タグを編集 + empty: レビュータスクは残っていません。 + approve_revision_tip: この修正を承認しますか? + approve_flag_tip: このフラグを承認しますか? + approve_post_tip: この投稿を承認しますか? + approve_user_tip: このユーザーを承認しますか? + suggest_edits: 提案された編集 + flag_post: 報告された投稿 + flag_user: 報告されたユーザー + queued_post: キューに入れられた投稿 + queued_user: キューに入れられたユーザー + filter_label: タイプ + reputation: 評価 + flag_post_type: この投稿は {{ type }} として報告されました + flag_user_type: このユーザーは {{ type }} として報告されました + edit_post: 投稿を編集 + list_post: 投稿一覧 + unlist_post: 限定公開投稿 timeline: - undeleted: undeleted - deleted: deleted - downvote: downvote - upvote: upvote - accept: accept - cancelled: cancelled - commented: commented + undeleted: 復元する + deleted: 削除済み + downvote: 低評価 + upvote: 高評価 + accept: 承認 + cancelled: キャンセル済み + commented: コメントしました rollback: rollback - edited: edited - answered: answered - asked: asked - closed: closed - reopened: reopened - created: created - pin: pinned - unpin: unpinned - show: listed - hide: unlisted - title: "History for" - tag_title: "Timeline for" - show_votes: "Show votes" + edited: 編集済み + answered: 回答済み + asked: 質問済み + closed: クローズ済み + reopened: 再オープン + created: 作成済み + pin: ピン留め済 + unpin: ピン留め解除 + show: 限定公開解除済み + hide: 限定公開済み + 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 + title_for_question: "タイムライン:" + title_for_answer: "{{ title }} の {{ author }} 回答のタイムライン" + title_for_tag: "タグのタイムライン:" + datetime: 日付時刻 + type: タイプ by: By - comment: Comment - no_data: "We couldn't find anything." + comment: コメント + no_data: "何も見つけられませんでした" users: title: ユーザー - users_with_the_most_reputation: Users with the highest reputation scores this week - users_with_the_most_vote: Users who voted the most this week - staffs: Our community staff - reputation: reputation - votes: votes + users_with_the_most_reputation: 今週最も高い評価スコアを持つユーザ + users_with_the_most_vote: 今週一番多く投票したユーザー + staffs: コミュニティのスタッフ + reputation: 評価 + votes: 投票 prompt: - leave_page: Are you sure you want to leave the page? - changes_not_save: Your changes may not be saved. + leave_page: このページから移動してもよろしいですか? + changes_not_save: 変更が保存されない可能性があります draft: - discard_confirm: Are you sure you want to discard your draft? + discard_confirm: 下書きを破棄してもよろしいですか? messages: - post_deleted: This post has been deleted. - post_pin: This post has been pinned. - post_unpin: This post has been unpinned. - post_hide_list: This post has been hidden from list. - post_show_list: This post has been shown to list. - post_reopen: This post has been reopened. - post_list: This post has been listed. - post_unlist: This post has been unlisted. + post_deleted: この投稿は削除されました。 + post_cancel_deleted: This post has been undeleted. + post_pin: この投稿はピン留めされています。 + post_unpin: この投稿のピン留めが解除されました。 + post_hide_list: この投稿は一覧から非表示になっています。 + post_show_list: この投稿は一覧に表示されています。 + post_reopen: この投稿は再オープンされました。 + post_list: この投稿は一覧に表示されています。 + post_unlist: この投稿は一覧に登録されていません。 post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/ko_KR.yaml b/i18n/ko_KR.yaml index 53b413f31..9fca850f5 100644 --- a/i18n/ko_KR.yaml +++ b/i18n/ko_KR.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] 새 이메일 주소 확인" body: - other: "{{.SiteName}}에서 새 이메일 주소를 확인하세요. 다음 링크를 클릭하여 확인하세요:
      \n{{.ChangeEmailUrl}}

      \n\n이 변경을 요청하지 않았다면 이 이메일을 무시해 주세요.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} 님이 답변을 작성했습니다" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}} 님이 답변을 작성했습니다:
      \n
      {{.AnswerSummary}}

      \n자세히 보기 ({{.SiteName}})

      \n\n--
      \n구독 취소" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} 님이 답변을 요청했습니다" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}} 님이 답변을 요청했습니다:
      \n
      아마 당신이 답을 알고 있을 것입니다.

      \n자세히 보기 ({{.SiteName}})

      \n\n--
      \n구독 취소" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} 님이 당신의 게시물에 댓글을 남겼습니다" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}} 님이 당신의 게시물에 댓글을 남겼습니다:
      \n
      {{.CommentSummary}}

      \n자세히 보기 ({{.SiteName}})

      \n\n--
      \n구독 취소" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] 새 질문: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \n구독 취소" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] 비밀번호 재설정" body: - other: "{{.SiteName}}에서 비밀번호 재설정 요청이 있었습니다.

      \n\n만약 이 요청이 여러분이 하지 않았다면, 이 이메일을 무시하셔도 됩니다.

      \n\n새 비밀번호를 설정하려면 다음 링크를 클릭하세요:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] 새 계정 확인" body: - other: "{{.SiteName}}에 오신 것을 환영합니다!

      \n\n다음 링크를 클릭하여 계정을 확인하고 활성화하세요:
      \n{{.RegisterUrl}}

      \n\n위 링크가 클릭이 되지 않을 경우, 웹 브라우저 주소창에 복사하여 붙여넣어 보세요.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] 테스트 이메일" body: - other: "이것은 테스트용 이메일입니다." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: 추천 @@ -787,7 +787,7 @@ ui: how_to_format: title: 포맷 방법 desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: 이전 next: 다음 @@ -904,7 +904,7 @@ ui: msg: empty: 파일을 선택하세요. only_image: 이미지 파일만 허용됩니다. - max_size: 파일 크기는 4MB를 초과할 수 없습니다. + max_size: File size cannot exceed {{size}} MB. desc: label: 설명 tab_url: 이미지 URL @@ -946,6 +946,10 @@ ui: text: 표 heading: 제목 cell: 셀 + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: 이 게시물을 다음과 같은 이유로 닫습니다... btn_cancel: 취소 @@ -1086,6 +1090,7 @@ ui: search_placeholder: 태그 이름으로 필터링 no_desc: 이 태그에는 설명이 없습니다. more: 더 보기 + wiki: Wiki ask: title: 질문 하기 edit_title: 질문 수정 @@ -1522,6 +1527,7 @@ ui: newest: 최신순 active: 활성순 hot: Hot + frequent: Frequent recommend: Recommend score: 평점순 unanswered: 답변이 없는 질문 @@ -1721,6 +1727,8 @@ ui: welcome: 관리자에 오신 것을 환영합니다! site_statistics: 사이트 통계 questions: "질문:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "답변:" comments: "댓글:" votes: "투표:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: 예약된 태그 text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: 검색 엔진 최적화 permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: 초안을 삭제하시겠습니까? messages: post_deleted: 이 게시물은 삭제되었습니다. + post_cancel_deleted: This post has been undeleted. post_pin: 이 게시물이 고정되었습니다. post_unpin: 이 게시물의 고정이 해제되었습니다. post_hide_list: 이 게시물이 목록에서 숨겨졌습니다. @@ -2219,3 +2243,15 @@ ui: post_list: 이 게시물이 목록에 등록되었습니다. post_unlist: 이 게시물이 목록에서 등록 해제되었습니다. post_pending: 회원님의 게시물이 검토를 기다리고 있습니다. 미리보기입니다. 승인 후에 공개됩니다. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/ml_IN.yaml b/i18n/ml_IN.yaml index c2d2af8f4..0783863b2 100644 --- a/i18n/ml_IN.yaml +++ b/i18n/ml_IN.yaml @@ -787,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Prev next: Next @@ -904,7 +904,7 @@ ui: msg: empty: File cannot be empty. only_image: Only image files are allowed. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: Image URL @@ -946,6 +946,10 @@ ui: text: Table heading: Heading cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: I am closing this post as... btn_cancel: Cancel @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1522,6 +1527,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Questions:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Answers:" comments: "Comments:" votes: "Votes:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/pl_PL.yaml b/i18n/pl_PL.yaml index 9c0adc78a..df4f6c1f2 100644 --- a/i18n/pl_PL.yaml +++ b/i18n/pl_PL.yaml @@ -315,7 +315,7 @@ backend: other: Nie znaleziono konfiguracji strony. badge: object_not_found: - other: Badge object not found + other: Nie znaleziono obiektu odznaki reason: spam: name: @@ -326,7 +326,7 @@ backend: name: other: niegrzeczny lub obraźliwy desc: - other: "A reasonable person would find this content inappropriate for respectful discourse." + other: "Rozsądna osoba uznałaby tę treść za nieodpowiednią do dyskusji opartej na szacunku." a_duplicate: name: other: duplikat @@ -338,7 +338,7 @@ backend: name: other: nie jest odpowiedzią 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: "Ta wiadomość została zamieszczona jako odpowiedź, ale nie próbuje odpowiedzieć na pytanie. Powinna być prawdopodobnie edycją, komentarzem, kolejnym pytaniem lub całkowicie usunięta." no_longer_needed: name: other: nie jest już potrzebne @@ -397,7 +397,7 @@ backend: name: other: wymaga szczegółów lub wyjaśnienia desc: - other: This question currently includes multiple questions in one. It should focus on one problem only. + other: To pytanie obecnie zawiera wiele pytań w jednym. Powinno się skupić tylko na jednym problemie. other: name: other: coś innego @@ -458,48 +458,48 @@ backend: invited_you_to_answer: other: zaproszono Cię do odpowiedzi earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: Zdobyłeś odznakę "{{.BadgeName}}" email_tpl: change_email: title: other: "[{{.SiteName}}] Potwierdź swój nowy adres e-mail" body: - other: "Potwierdź swój nowy adres e-mail dla {{.SiteName}} klikając na poniższy link:

      \n{{.ChangeEmailUrl}}

      \n\nJeśli to nie Ty wysyłałeś to żądanie zignoruj ten e-mail.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} odpowiedział(-a) na pytanie" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nZobacz to na {{.SiteName}}

      \n\n--
      \nZrezygnuj z subskrypcji" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} zaprosił(a) Cię do odpowiedzi" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Myślę, że na to pytani możesz znać odpowiedź.

      \nZobacz to na {{.SiteName}}

      \n\n--
      \nZrezygnuj z subskrypcji" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} skomentował/-a Twój wpis" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nZobacz to na {{.SiteName}}

      \n\n--
      \nZrezygnuj z subskrypcji" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Nowe pytanie: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nZrezygnuj z subskrypcji" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Reset hasła" body: - other: "Ktoś poprosił o zresetowanie hasła [{{.SiteName}}].

      \n\nJeśli to nie Ty, możesz bezpiecznie zignorować ten e-mail.

      \n\nKliknij na poniższy link, aby utworzyć nowe hasło:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Potwierdź swoje nowe konto" body: - other: "Witaj w {{.SiteName}}

      \n\nKliknij na poniższy link, aby potwierdzić i aktywować nowe konto:
      \n{{.RegisterUrl}}

      \n\nJeśli w powyższy link nie można kliknąć, spróbuj skopiować i wkleić go do paska adresu przeglądarki internetowej.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Wiadomość testowa" body: - other: "To jest wiadomość testowa." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: oceń pozytywnie @@ -531,7 +531,7 @@ backend: name: other: Autobiografista desc: - other: Filled out profile information. + other: Wypełniono informacje profil. certified: name: other: Certyfikowany @@ -541,12 +541,12 @@ backend: name: other: Edytor desc: - other: First post edit. + other: Pierwsza edycja posta. first_flag: name: other: Pierwsza flaga desc: - other: First flagged a post. + other: Po raz pierwszy oznaczono post. first_upvote: name: other: Pierwszy pozytywny głos @@ -787,7 +787,7 @@ ui: how_to_format: title: Jak formatować desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Poprzedni next: Następny @@ -904,7 +904,7 @@ ui: msg: empty: Plik nie może być pusty. only_image: Dozwolone są tylko pliki obrazków. - max_size: Rozmiar pliku nie może przekroczyć 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Opis tab_url: Adres URL obrazka @@ -946,6 +946,10 @@ ui: text: Tabela heading: Nagłówek cell: Komórka + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Zamykam ten post jako... btn_cancel: Anuluj @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtruj według nazwy tagu no_desc: Tag nie posiada opisu. more: Więcej + wiki: Wiki ask: title: Dodaj pytanie edit_title: Edytuj pytanie @@ -1178,7 +1183,7 @@ ui: label: Imię msg: empty: Imię nie może być puste. - range: Długość nazwy powinna wynosić od 2 do 30 znaków. + range: Name must be between 2 to 30 characters in length. character: 'Możesz użyć dozwolone znaki "a-z", "A-Z", "0-9", " - . _"' email: label: Adres e-mail @@ -1522,6 +1527,7 @@ ui: newest: Najnowsze active: Aktywne hot: Gorące + frequent: Frequent recommend: Polecane score: Ocena unanswered: Bez odpowiedzi @@ -1721,6 +1727,8 @@ ui: welcome: Witaj Administratorze! site_statistics: Statystyki witryny questions: "Pytania:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Odpowiedzi:" comments: "Komentarze:" votes: "Głosy:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Zarezerwowane tagi text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Czy na pewno chcesz odrzucić swoją wersję roboczą? messages: post_deleted: Ten post został usunięty. + post_cancel_deleted: This post has been undeleted. post_pin: Ten post został przypięty. post_unpin: Ten post został odpięty. post_hide_list: Ten post został ukryty na liście. @@ -2219,3 +2243,15 @@ ui: post_list: Ten wpis został umieszczony na liście. post_unlist: Ten wpis został usunięty z listy. post_pending: Twój wpis oczekuje na recenzje. Będzie widoczny po jej akceptacji. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/pt_PT.yaml b/i18n/pt_PT.yaml index 670fc83f9..0526b64c8 100644 --- a/i18n/pt_PT.yaml +++ b/i18n/pt_PT.yaml @@ -326,7 +326,7 @@ backend: name: other: rude ou abusivo desc: - other: "A reasonable person would find this content inappropriate for respectful discourse." + other: "Uma pessoa razoável consideraria esse conteúdo inapropriado para um discurso respeitoso." a_duplicate: name: other: uma duplicação @@ -338,7 +338,7 @@ backend: name: 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: "Foi apresentada como resposta, mas não tenta responder à pergunta. Talvez deva ser uma edição, um comentário, outra pergunta ou totalmente apagada." no_longer_needed: name: other: não é mais necessário @@ -397,7 +397,7 @@ backend: name: 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: algo mais @@ -464,32 +464,32 @@ backend: title: other: "[{{.SiteName}}] Confirme seu novo endereço de e-mail" body: - other: "Confirme seu novo endereço de e-mail para o {{.SiteName}} clicando no seguinte link:
      \n{{.ChangeEmailUrl}}

      \n\nSe você não solicitou esta alteração, por favor, ignore este e-mail.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} respondeu à sua pergunta" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nVisualizado em {{.SiteName}}

      \n\n--
      \nCancelar inscrição" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} convidou-lhe para responder" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I ach que sei a resposta.

      \nVisualiza em {{.SiteName}}

      \n\n--
      \nCancelar inscrição" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} comentou em sua publicação" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nVisualizar no {{.SiteName}}

      \n\n--
      \nCancelar inscrição" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Nova pergunta: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nCancelar inscrição" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Redefinição de senha" body: - other: "Alguém pediu para redefinir a sua senha em {{.SiteName}}.

      \n\nSe não foi você, você pode ignorar este e-mail.

      \n\nClique no seguinte link para escolher uma nova senha:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirme seu novo endereço de e-mail" @@ -499,7 +499,7 @@ backend: title: other: "[{{.SiteName}}] E-mail de teste" body: - other: "Esse é um email de teste." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: voto positivo @@ -787,7 +787,7 @@ ui: how_to_format: title: Como formatar desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Anterior next: Próximo @@ -904,7 +904,7 @@ ui: msg: 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 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Descrição (opcional) tab_url: URL da imagem @@ -946,6 +946,10 @@ ui: text: Tabela heading: heading cell: Célula + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Estou fechando este post como... btn_cancel: Cancelar @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtrar por nome de marcador no_desc: O marcador não possui descrição. more: Mais + wiki: Wiki ask: title: Adicionar Pergunta edit_title: Editar Pergunta @@ -1146,7 +1151,7 @@ ui: placeholder: Procurar footer: build_on: >- - . + Powered by <1> Apache Answer - the open-source software that powers Q&A communities.
      Made with love © {{cc}}. upload_img: name: Mudar loading: carregando... @@ -1335,9 +1340,9 @@ ui: title: Perguntas relacionadas answers: respostas linked_question: - title: Linked Questions - description: Questions linked to - no_linked_question: No questions linked from this question. + title: Perguntas relacionadas + description: Questões ligadas a + no_linked_question: Nenhuma pergunta relacionada a esta questão. invite_to_answer: title: Pessoas Perguntaram desc: Select people who you think might know the answer. @@ -1522,6 +1527,7 @@ ui: newest: Mais recente active: Ativo hot: Popular + frequent: Frequent recommend: Recomendado score: Pontuação unanswered: Não Respondido @@ -1556,7 +1562,7 @@ ui: top_questions: Melhores Perguntas stats: Estatísticas list_empty: Postagens não encontradas.
      Talvez você queira selecionar uma guia diferente? - content_empty: No posts found. + content_empty: Nenhum post encontrado. accepted: Aceito answered: respondido asked: perguntado @@ -1615,7 +1621,7 @@ ui: msg: empty: Site URL não pode ser vazio. incorrect: URL do site está incorreto. - max_length: A URL do site deve ter no máximo 512 caracteres. + max_length: O nome do site deve ter no máximo 512 caracteres. contact_email: label: E-mail par contato text: O endereço de e-mail do contato principal deste site. @@ -1721,6 +1727,8 @@ ui: welcome: Bem-vindo ao Admin! site_statistics: Estatísticas do site questions: "Perguntas:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Respostas:" comments: "Comentários:" votes: "Votos:" @@ -1747,7 +1755,7 @@ ui: github: GitHub blog: Blog contact: Contato - forum: Forum + forum: Fórum documents: Documentos feedback: Opinião support: Supporte @@ -1814,7 +1822,7 @@ ui: msg: "Por favor insira o e-mail do usuário, um por linha." display_name: label: Nome de exibição - msg: O nome de exibição deve ter de 2 a 30 caracteres. + msg: O nome de exibição deve ter de 2-30 caracteres. email: label: E-mail msg: E-mail inválido. @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved Marcadores text: "Tags reservadas só podem ser usadas pelo moderador." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Tem certeza que deseja descartar o rascunho? messages: post_deleted: Esta publicação foi removida. + post_cancel_deleted: This post has been undeleted. post_pin: Esta publicação foi fixada. post_unpin: Esta postagem foi desafixada. post_hide_list: Esta postagem foi ocultada da lista. @@ -2219,3 +2243,15 @@ ui: post_list: Esta postagem foi listada. post_unlist: Esta publicação foi removida da lista. post_pending: A sua postagem está aguardando revisão. Ela ficará visível depois que for aprovada. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/ro_RO.yaml b/i18n/ro_RO.yaml index 9b7ed2004..c124206ef 100644 --- a/i18n/ro_RO.yaml +++ b/i18n/ro_RO.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirmați noua dvs. adresă de e-mail" body: - other: "Confirmați noua dvs. adresă de e-mail pentru {{.SiteName}} făcând clic pe următorul link:
      \n{{.ChangeEmailUrl}}

      \n\nDacă nu ați solicitat această modificare, vă rugăm să ignorați acest e-mail.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} a răspuns la întrebarea dvs" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nVizualizați-l pe {{.SiteName}}

      \n\n--
      \nDezabonare" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} vă invită să răspundeți" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Cred că ai putea ști răspunsul.

      \nVizualizaţi-l pe {{.SiteName}}

      \n\n--
      \nDezabonare" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} a răspuns la întrebarea dvs" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nVizualizați-l pe {{.SiteName}}

      \n\n--
      \nDezabonare" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Întrebare nouă: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nDezabonare" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Resetare parolă" body: - other: "Cineva a cerut resetarea parolei pe {{.SiteName}}.

      \n\nDacă nu ai fost, poți ignora în siguranță acest e-mail.

      \n\nFaceţi clic pe următorul link pentru a alege o parolă nouă:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirmă noul tău cont" body: - other: "Bun venit la {{.SiteName}}!

      \n\nFaceţi clic pe următorul link pentru a confirma şi activa noul cont:
      \n{{.RegisterUrl}}

      \n\nDacă link-ul de mai sus nu este clickabil, încearcă să o copiezi și să o inserezi în bara de adrese a browser-ului tău.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test de e-mail" body: - other: "Acesta este un e-mail de test." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: votat @@ -581,7 +581,7 @@ backend: name: other: New User of the Month desc: - other: Outstanding contributions in their first month. + other: Contribuții restante în prima lor lună. read_guidelines: name: other: Read Guidelines @@ -609,7 +609,7 @@ backend: other: Shared a post with 300 unique visitors. great_share: name: - other: Great Share + other: Distribuire grozavă desc: other: Shared a post with 1000 unique visitors. out_of_love: @@ -787,7 +787,7 @@ ui: how_to_format: title: Cum se formatează desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Înapoi next: Înainte @@ -904,7 +904,7 @@ ui: msg: empty: Fișierul nu poate fi gol. only_image: Sunt permise doar fișierele imagine. - max_size: Dimensiunea fişierului nu poate depăşi 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Descriere tab_url: URL-ul imaginii @@ -946,6 +946,10 @@ ui: text: Tabelă heading: Titlu cell: Celulă + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Închid această postare ca... btn_cancel: Anulează @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtrare după numele etichetei no_desc: Această echipă nu are o descriere. more: Mai multe + wiki: Wiki ask: title: Adăugați întrebarea edit_title: Editați întrebarea @@ -1522,6 +1527,7 @@ ui: newest: Cele mai noi active: Activ hot: Hot + frequent: Frequent recommend: Recommend score: Scor unanswered: Fără răspuns @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Statisticile site-ului questions: "Întrebări:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Răspunsuri:" comments: "Comentarii:" votes: "Voturi:" @@ -1814,7 +1822,7 @@ ui: msg: "Te rugăm să introduci e-mailul utilizatorului, câte unul pe linie." display_name: label: Nume afișat - msg: Numele afișat trebuie să aibă între 2 și 30 de caractere. + msg: Display name must be 2-30 characters in length. email: label: E-mail msg: E-mail nu este validă. @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Etichete rezervate text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Ești sigur că vrei să renunți la ciornă? messages: post_deleted: Această postare a fost ștearsă. + post_cancel_deleted: This post has been undeleted. post_pin: Această postare a fost fixată. post_unpin: Această postare nu a fost fixată. post_hide_list: Această postare a fost ascunsă din listă. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/ru_RU.yaml b/i18n/ru_RU.yaml index 1e370b5ce..fdb427396 100644 --- a/i18n/ru_RU.yaml +++ b/i18n/ru_RU.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Подтвердите новый адрес электронной почты" body: - other: "Подтвердите свой новый адрес электронной почты для {{.SiteName}}, перейдя по следующей ссылке:
      {{.ChangeEmailUrl}}

      Если вы не запрашивали это изменение, пожалуйста, проигнорируйте это электронное письмо.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} ответил на ваш вопрос" body: - other: "{{.QuestionTitle}}

      {{.DisplayName}}:
      \n
      Я думаю, вы можете знать ответ.

      Просмотрите его на {{.SiteName}}

      --
      Отказаться от подписки" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} приглашает вас в Answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Я думаю что вы знаете ответ на этот вопрос.

      \nОткрыть вопрос в {{.SiteName}}

      \n\n--
      \nОтписаться" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} прокомментировал под вашей публикацией" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nОткрыть вопрос в {{.SiteName}}

      \n\n--
      \nОтписаться" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Новый вопрос: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nОтписаться" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Пароль сброшен" body: - other: "Кто-то сделал запрос на сброс пароля на {{.SiteName}}.

      \n\nЕсли это были не Вы, можете проигнорировать это письмо.

      \n\nНажмите на следующую ссылку, чтобы выбрать новый пароль:
      {{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Подтвердите Ваш новый аккаунт" body: - other: "Добро пожаловать в {{.SiteName}}!

      Перейдите по следующей ссылке, чтобы подтвердить и активировать свою новую учетную запись:
      {{.RegisterUrl}}

      Если приведенная выше ссылка недоступна, попробуйте скопировать и вставить ее в адресную строку вашего веб-браузера.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Проверочное электронное письмо" body: - other: "Это тестовое письмо." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: проголосовать за @@ -787,7 +787,7 @@ ui: how_to_format: title: 'Форматирование:' desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Назад next: Следующий @@ -904,7 +904,7 @@ ui: msg: empty: Файл не может быть пустым. only_image: Разрешены только изображения. - max_size: Размер файла не может превышать 4МБ. + max_size: File size cannot exceed {{size}} MB. desc: label: Описание tab_url: URL изображения @@ -946,6 +946,10 @@ ui: text: Таблица heading: Заголовок cell: Ячейка + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Я закрываю этот пост как... btn_cancel: Отменить @@ -1086,6 +1090,7 @@ ui: search_placeholder: Фильтр по названию тега no_desc: Тег не имеет описания. more: Подробнее + wiki: Wiki ask: title: Задать вопрос edit_title: Редактировать вопрос @@ -1522,6 +1527,7 @@ ui: newest: Последние active: Активные hot: Hot + frequent: Frequent recommend: Recommend score: Оценка unanswered: Без ответа @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Статистика сайта questions: "Вопросы:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Ответы:" comments: "Комментарии:" votes: "Голоса:" @@ -1814,7 +1822,7 @@ ui: msg: "Пожалуйста, введите адрес электронной почты пользователя, по одному на строку." display_name: label: Отображаемое имя - msg: Отображаемое имя должно содержать не менее 2-30 символов. + msg: Display name must be 2-30 characters in length. email: label: Email msg: Некорректный email. @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Зарезервированные теги text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Вы уверены, что хотите отказаться от своего черновика? messages: post_deleted: Этот пост был удалён. + post_cancel_deleted: This post has been undeleted. post_pin: Этот пост был закреплен. post_unpin: Этот пост был откреплен. post_hide_list: Это сообщение было скрыто из списка. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/sk_SK.yaml b/i18n/sk_SK.yaml index 28e77be00..53bdf38f6 100644 --- a/i18n/sk_SK.yaml +++ b/i18n/sk_SK.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: Ako formátovať desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Predch next: Ďalšie @@ -904,7 +904,7 @@ ui: msg: empty: Názov súboru nemôže byť prázdny. only_image: Povolené sú iba obrázkové súbory. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Popis tab_url: URL obrázka @@ -946,6 +946,10 @@ ui: text: Table heading: Heading cell: Bunka + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Tento príspevok uzatváram ako... btn_cancel: Zrušiť @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filtrujte podľa názvu značky no_desc: Značka nemá popis. more: Viac + wiki: Wiki ask: title: Pridať otázku edit_title: Upraviť otázku @@ -1522,6 +1527,7 @@ ui: newest: Najnovšie active: Aktívne hot: Hot + frequent: Frequent recommend: Recommend score: Skóre unanswered: Nezodpovedané @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Otázky:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Odpovede:" comments: "Komentáre:" votes: "Hlasy:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Naozaj chcete zahodiť svoj koncept? messages: post_deleted: Tento príspevok bol odstránený. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/sv_SE.yaml b/i18n/sv_SE.yaml index 93dbb9621..b9ba3cec7 100644 --- a/i18n/sv_SE.yaml +++ b/i18n/sv_SE.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Bekräfta din nya e-postadress" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Ny fråga: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Bekräfta ditt nya konto" body: - other: "Välkommen till {{.SiteName}}!

      \n\nKlicka på följande länk för att bekräfta och aktivera ditt nya konto:
      \n{{.RegisterUrl}}

      \n\nOm ovanstående länk inte går att klicka på, kan du kopiera och klistra in den i adressfältet i din webbläsare.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Prev next: Nästa @@ -832,7 +832,7 @@ ui: show_more: Visa mer someone: Someone inbox_type: - all: All + all: Alla posts: Inlägg invites: Inbjudningar votes: Röster @@ -904,7 +904,7 @@ ui: msg: empty: File cannot be empty. only_image: Only image files are allowed. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Beskrivning tab_url: Image URL @@ -946,6 +946,10 @@ ui: text: Tabell heading: Heading cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: I am closing this post as... btn_cancel: Avbryt @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1236,7 +1241,7 @@ ui: length: The length needs to be between 8 and 32 different: The passwords entered on both sides are inconsistent password_confirm: - label: Confirm new password + label: Bekräfta nytt lösenord settings: page_title: Inställningar goto_modify: Go to modify @@ -1522,6 +1527,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Frågor:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Svar:" comments: "Kommentarer:" votes: "Röster:" @@ -1788,21 +1796,21 @@ ui: btn_cancel: Avbryt btn_submit: Skicka edit_profile_modal: - title: Edit profile + title: Redigera profil form: fields: display_name: label: Visningsnamn msg_range: Display name up to 30 characters. username: - label: Username + label: Användarnamn msg_range: Username up to 30 characters. email: label: Email - msg_invalid: Invalid Email Address. + msg_invalid: Ogiltig e-postadress. edit_success: Edited successfully - btn_cancel: Cancel - btn_submit: Submit + btn_cancel: Avbryt + btn_submit: Skicka user_modal: title: Lägg till ny användare form: @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/te_IN.yaml b/i18n/te_IN.yaml index 2b9ea4700..19ab2e313 100644 --- a/i18n/te_IN.yaml +++ b/i18n/te_IN.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: మునుపటి next: Next @@ -904,7 +904,7 @@ ui: msg: empty: File cannot be empty. only_image: Only image files are allowed. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: Image URL @@ -946,6 +946,10 @@ ui: text: Table heading: Heading cell: Cell + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: I am closing this post as... btn_cancel: Cancel @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1522,6 +1527,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Questions:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Answers:" comments: "Comments:" votes: "Votes:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/tr_TR.yaml b/i18n/tr_TR.yaml index 5bfb1bbd1..232ea4980 100644 --- a/i18n/tr_TR.yaml +++ b/i18n/tr_TR.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: How to Format desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Önceki next: Sonraki @@ -904,7 +904,7 @@ ui: msg: empty: File cannot be empty. only_image: Only image files are allowed. - max_size: File size cannot exceed 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Description tab_url: Image URL @@ -946,6 +946,10 @@ ui: text: Tablo heading: Başlık cell: Hücre + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: I am closing this post as... btn_cancel: İptal Et @@ -1086,6 +1090,7 @@ ui: search_placeholder: Filter by tag name no_desc: The tag has no description. more: More + wiki: Wiki ask: title: Add Question edit_title: Edit Question @@ -1522,6 +1527,7 @@ ui: newest: Newest active: Active hot: Hot + frequent: Frequent recommend: Recommend score: Score unanswered: Unanswered @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "Questions:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Answers:" comments: "Comments:" votes: "Votes:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/uk_UA.yaml b/i18n/uk_UA.yaml index a8f29b30b..65c89f16c 100644 --- a/i18n/uk_UA.yaml +++ b/i18n/uk_UA.yaml @@ -326,7 +326,7 @@ backend: name: other: грубо чи образливо desc: - other: "A reasonable person would find this content inappropriate for respectful discourse." + other: "Розумна людина вважатиме такий зміст неприйнятним для ввічливого спілкування." a_duplicate: name: other: дублікат @@ -338,7 +338,7 @@ backend: name: 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: "Це повідомлення було опубліковане як відповідь, але воно не є спробою відповісти на запитання. Можливо, його слід відредагувати, прокоментувати, поставити інше запитання або взагалі видалити." no_longer_needed: name: other: більше не потрібно @@ -397,7 +397,7 @@ backend: name: other: потребує деталей або ясності desc: - other: This question currently includes multiple questions in one. It should focus on one problem only. + other: Наразі це питання включає кілька запитань в одному. Воно має зосереджуватися лише на одній проблемі. other: name: other: інше @@ -418,13 +418,13 @@ backend: tags_title: other: Теґи no_description: - other: The tag has no description. + other: Тег не має опису. notification: action: update_question: other: оновлене питання answer_the_question: - other: answered question + other: питання з відповіддю update_answer: other: оновлена відповідь accept_answer: @@ -446,60 +446,60 @@ backend: your_comment_was_deleted: other: Ваш коментар видалено up_voted_question: - other: upvoted question + other: питання, за яке найбільше проголосували down_voted_question: - other: downvoted question + other: питання, за яке проголосували менше up_voted_answer: - other: upvoted answer + other: відповідь, за яку проголосували найбільше down_voted_answer: other: downvoted answer up_voted_comment: - other: upvoted comment + other: коментар, за який проголосували invited_you_to_answer: other: запросив(-ла) вас відповісти earned_badge: - other: You've earned the "{{.BadgeName}}" badge + other: Ви заробили бейдж "{{.BadgeName}}" email_tpl: change_email: title: other: "[{{.SiteName}}] Підтвердіть нову адресу електронної пошти" body: - other: "Підтвердіть нову електронну адресу для {{.SiteName}}, натиснувши на наступне посилання:
      {{.ChangeEmailUrl}}

      \n\nЯкщо ви не надсилали запит на цю зміну, не звертайте уваги на цей електронний лист.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} відповів(-ла) на ваше запитання" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}
      \n
      {{.AnswerSummary}}

      \nПереглянути на {{.SiteName}}

      \n\n--
      \nВідписатися" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} запросив(-ла) вас відповісти" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Я думаю, ти маєш знати відповідь.

      \nПереглянути на {{.SiteName}}

      \n\n--
      \nВідписатися" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} прокоментували ваш допис" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nПереглянути на {{.SiteName}}

      \n\n--
      \nВідписатися" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Нове питання: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nВідписатися" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Скидання пароля" body: - other: "Хтось попросив скинути ваш пароль на сайті {{.SiteName}}.

      \n\nЯкщо це були не ви, можете спокійно проігнорувати цей електронний лист.

      \n\nНатисніть це посилання, щоб вибрати новий пароль:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Підтвердьте свій новий обліковий запис" body: - other: "Вітаємо на {{.SiteName}}!

      \n\nНатисніть це посилання, щоб підтвердити й активувати свій новий обліковий запис:
      \n{{.RegisterUrl}}

      \n\nЯкщо наведене вище посилання не можна натиснути, спробуйте скопіювати та вставити його в адресний рядок веб-переглядача.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Тестовий електронний лист" body: - other: "Це тестовий електронний лист." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: підтримати @@ -517,26 +517,26 @@ backend: other: редагувати review: queued_post: - other: Queued post + other: Допис у черзі flagged_post: other: Відмічений пост suggested_post_edit: - other: Suggested edits + other: Запропоновані зміни reaction: tooltip: - other: "{{ .Names }} and {{ .Count }} more..." + other: "{{ .Names }} і {{ .Count }} більше..." badge: default_badges: autobiographer: name: - other: Autobiographer + other: Автобіограф desc: - other: Filled out profile information. + other: Заповнена інформація про профіль. certified: name: other: Підтверджений desc: - other: Completed our new user tutorial. + other: Завершено наш новий посібник користувача. editor: name: other: Редактор @@ -544,34 +544,34 @@ backend: other: Перше редагування посту. first_flag: name: - other: First Flag + other: Перший прапор desc: - other: First flagged a post. + other: Спочатку позначено допис. first_upvote: name: - other: First Upvote + other: Перший голос за desc: - other: First up voted a post. + other: Першим голосував за допис. first_link: name: other: Перше посилання desc: - other: First dirst added a link to another post. + other: Перший дирст додав посилання на інший допис. first_reaction: name: other: Перша реакція desc: - other: First reacted to the post. + other: Першим відреагував на допис. first_share: name: - other: First Share + other: Перше поширення desc: - other: First shared a post. + other: Перший поділився публікацією. scholar: name: other: Вчений desc: - other: Asked a question and accepted an answer. + other: Поставив питання і прийняв відповідь. commentator: name: other: Коментатор @@ -581,17 +581,17 @@ backend: name: other: Новий користувач місяця desc: - other: Outstanding contributions in their first month. + other: Видатні внески за їх перший місяць. read_guidelines: name: - other: Read Guidelines + other: Прочитайте Інструкцію desc: other: Прочитайте [рекомендації для спільноти]. reader: name: other: Читач desc: - other: Read every answers in a topic with more than 10 answers. + other: Прочитайте кожну відповідь у темі з більш ніж 10 відповідями. welcome: name: other: Ласкаво просимо @@ -599,34 +599,34 @@ backend: other: Отримав голос. nice_share: name: - other: Nice Share + other: Гарне поширення desc: - other: Shared a post with 25 unique visitors. + other: Поділилися постом з 25 унікальними відвідувачами. good_share: name: - other: Good Share + other: Хороше поширення desc: - other: Shared a post with 300 unique visitors. + other: Поділилися постом з 300 унікальними відвідувачами. great_share: name: - other: Great Share + other: Відмінне поширення desc: - other: Shared a post with 1000 unique visitors. + other: Поділилися постом з 1000 унікальними відвідувачами. out_of_love: name: - other: Out of Love + other: З любові desc: - other: Used 50 up votes in a day. + other: Використав 50 голосів «за» за день. higher_love: name: - other: Higher Love + other: Вище кохання desc: - other: Used 50 up votes in a day 5 times. + other: Використав 50 голосів «за» за день 5 разів. crazy_in_love: name: - other: Crazy in Love + other: Божевільний в любові desc: - other: Used 50 up votes in a day 20 times. + other: Використав 50 голосів «за» за день 20 разів. promoter: name: other: Промоутер @@ -634,9 +634,9 @@ backend: other: Запросив користувача. campaigner: name: - other: Campaigner + other: Агітатор desc: - other: Invited 3 basic users. + other: Запрошено 3 основних користувачів. champion: name: other: Чемпіон @@ -646,148 +646,148 @@ backend: name: other: Дякую desc: - other: Has 20 up voted posts and gave 10 up votes. + other: Має 20 дописів, за які проголосували, і віддав 10 голосів «за». gives_back: name: - other: Gives Back + other: Дає назад desc: - other: Has 100 up voted posts and gave 100 up votes. + other: Має 100 дописів, за які проголосували, і віддав 100 голосів «за». empathetic: name: - other: Empathetic + other: Емпатичний desc: - other: Has 500 up voted posts and gave 1000 up votes. + other: Має 500 дописів, за які проголосували, і віддав 1000 голосів «за». enthusiast: name: - other: Enthusiast + other: Ентузіаст desc: - other: Visited 10 consecutive days. + other: Відвідано 10 днів поспіль. aficionado: name: - other: Aficionado + other: Шанувальник desc: - other: Visited 100 consecutive days. + other: Відвідано 100 днів поспіль. devotee: name: - other: Devotee + other: Відданий desc: - other: Visited 365 consecutive days. + other: Відвідано 365 днів поспіль. anniversary: name: - other: Anniversary + other: Річниця desc: - other: Active member for a year, posted at least once. + other: Активний учасник на рік, опублікував принаймні один раз. appreciated: name: - other: Appreciated + other: Оцінений desc: - other: Received 1 up vote on 20 posts. + other: Отримано 1 голос за 20 дописів. respected: name: other: Шанований desc: - other: Received 2 up votes on 100 posts. + other: Отримано 2 голоси за 100 дописів. admired: name: - other: Admired + other: Захоплений desc: - other: Received 5 up votes on 300 posts. + other: Отримано 5 голосів за 300 дописів. solved: name: other: Вирішено desc: - other: Have an answer be accepted. + other: Нехай відповідь буде прийнята. guidance_counsellor: name: - other: Guidance Counsellor + other: Радник супроводу desc: - other: Have 10 answers be accepted. + other: Прийміть 10 відповідей. know_it_all: name: - other: Know-it-All + other: Усезнайко desc: - other: Have 50 answers be accepted. + other: Було прийнято 50 відповідей. solution_institution: name: - other: Solution Institution + other: Інституція рішення desc: - other: Have 150 answers be accepted. + other: Було прийнято 150 відповідей. nice_answer: name: - other: Nice Answer + other: Чудова відповідь desc: - other: Answer score of 10 or more. + other: Оцінка відповіді на 10 або більше. good_answer: name: - other: Good Answer + other: Гарна відповідь desc: - other: Answer score of 25 or more. + other: Оцінка відповіді на 25 або більше. great_answer: name: - other: Great Answer + other: Чудова відповідь desc: - other: Answer score of 50 or more. + other: Оцінка відповіді на 50 або більше. nice_question: name: - other: Nice Question + other: Гарне питання desc: - other: Question score of 10 or more. + other: Оцінка питання на 10 або більше. good_question: name: - other: Good Question + other: Хороше питання desc: - other: Question score of 25 or more. + other: Оцінка питання на 25 або більше. great_question: name: - other: Great Question + other: Відмінне питання desc: - other: Question score of 50 or more. + other: Оцінка питання на 50 або більше. popular_question: name: - other: Popular Question + other: Популярне питання desc: - other: Question with 500 views. + other: Питання з 500 переглядами. notable_question: name: - other: Notable Question + other: Помітне питання desc: - other: Question with 1,000 views. + other: Питання з 1000 переглядами. famous_question: name: - other: Famous Question + other: Знамените питання desc: - other: Question with 5,000 views. + other: Питання з 5000 переглядами. popular_link: name: - other: Popular Link + other: Популярне посилання desc: - other: Posted an external link with 50 clicks. + other: Опубліковано зовнішнє посилання з 50 натисканнями. hot_link: name: - other: Hot Link + other: Гаряче посилання desc: - other: Posted an external link with 300 clicks. + other: Опубліковано зовнішнє посилання з 300 натисканнями. famous_link: name: - other: Famous Link + other: Знамените Посилання desc: - other: Posted an external link with 100 clicks. + other: Опубліковано зовнішнє посилання зі 100 натисканнями. default_badge_groups: getting_started: name: - other: Getting Started + other: Початок роботи community: name: other: Спільнота posting: name: - other: Posting + other: Публікація # The following fields are used for interface presentation(Front-end) ui: how_to_format: title: Як відформатувати desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Назад next: Далі @@ -796,7 +796,7 @@ ui: questions: Запитання tag: Теґ tags: Теґи - tag_wiki: tag wiki + tag_wiki: тег вікі create_tag: Створити теґ edit_tag: Редагувати теґ ask_a_question: Додати запитання @@ -837,8 +837,8 @@ ui: invites: Запрошення votes: Голоси answer: Відповідь - question: Question - badge_award: Badge + question: Запитання + badge_award: Значок suspended: title: Ваш обліковий запис було призупинено until_time: "Ваш обліковий запис призупинено до {{ time }}." @@ -847,16 +847,16 @@ ui: contact_us: Зв'яжіться з нами editor: blockquote: - text: Blockquote + text: Блок Цитування bold: - text: Strong + text: Надійний chart: text: Діаграма flow_chart: Блок-схема sequence_diagram: Діаграма послідовності class_diagram: Діаграма класів state_diagram: Діаграма станів - entity_relationship_diagram: Entity relationship diagram + entity_relationship_diagram: Діаграма зв'язків сутностей user_defined_diagram: Визначена користувачем діаграма gantt_chart: Діаграма Ґанта pie_chart: Кругова діаграма @@ -878,7 +878,7 @@ ui: text: Формула options: inline: Вбудована формула - block: Block formula + block: Формула блоку heading: text: Заголовок options: @@ -904,7 +904,7 @@ ui: msg: empty: Файл не може бути порожнім. only_image: Допустимі лише файли зображень. - max_size: Розмір файлу не може перевищувати 4 МБ. + max_size: File size cannot exceed {{size}} MB. desc: label: Опис tab_url: URL зображення @@ -924,7 +924,7 @@ ui: outdent: text: Відступ italic: - text: Emphasis + text: Акцент link: text: Гіперпосилання add_link: Додати гіперпосилання @@ -946,10 +946,14 @@ ui: text: Таблиця heading: Заголовок cell: Клітинка + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Я закриваю цей пост, оскільки... btn_cancel: Скасувати - btn_submit: Submit + btn_submit: Надіслати remark: empty: Не може бути порожнім. msg: @@ -961,13 +965,13 @@ ui: review_answer_title: Переглянути відповідь review_comment_title: Переглянути коментар btn_cancel: Скасувати - btn_submit: Submit + btn_submit: Надіслати remark: empty: Не може бути порожнім. msg: empty: Будь ласка, оберіть причину. - not_a_url: URL format is incorrect. - url_not_match: URL origin does not match the current website. + not_a_url: Формат URL неправильний. + url_not_match: Походження URL не збігається з поточним вебсайтом. tag_modal: title: Створити новий теґ form: @@ -978,22 +982,22 @@ ui: empty: Ім'я для відображення не може бути порожнім. range: Ім'я для відображення до 35 символів. slug_name: - label: URL slug - desc: URL slug up to 35 characters. + label: Скорочена URL-адреса + desc: Скорочення URL до 35 символів. 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: Опис revision: - label: Revision + label: Редакція edit_summary: - label: Edit summary + label: Підсумок редагування placeholder: >- Коротко поясніть ваші зміни (виправлена орфографія, виправлена граматика, покращене форматування) btn_cancel: Скасувати - btn_submit: Submit + btn_submit: Надіслати btn_post: Опублікувати новий теґ tag_info: created_at: Створено @@ -1010,9 +1014,9 @@ ui: delete: title: Видалити цей теґ tip_with_posts: >- -

      We do not allow deleting tag with posts.

      Please remove this tag from the posts first.

      +

      Ми не дозволяємо видаляти тег з дописами.

      Передусім, будь ласка, вилучіть цей тег з дописів.

      tip_with_synonyms: >- -

      We do not allow deleting tag with synonyms.

      Please remove the synonyms from this tag first.

      +

      Ми не дозволяємо видаляти тег із синонімами.

      Передусім, будь ласка, вилучіть синоніми з цього тега.

      tip: Ви впевнені, що хочете видалити? close: Закрити edit_tag: @@ -1026,21 +1030,21 @@ ui: long_date_with_year: "МММ Д, РРРР" long_date_with_time: "МММ Д, РРРР [о] ГГ:хв" now: зараз - x_seconds_ago: "{{count}}s ago" - x_minutes_ago: "{{count}}m ago" - x_hours_ago: "{{count}}h ago" - hour: hour + x_seconds_ago: "{{count}}сек назад" + x_minutes_ago: "{{count}}хв назад" + x_hours_ago: "{{count}}год назад" + hour: година day: день - hours: hours + hours: годин days: дні reaction: - heart: heart + heart: серце smile: посмішка - frown: frown - btn_label: add or remove reactions - undo_emoji: undo {{ emoji }} reaction - react_emoji: react with {{ emoji }} - unreact_emoji: unreact with {{ emoji }} + frown: насупився + btn_label: додавати або вилучати реакції + undo_emoji: скасувати реакцію {{ emoji }} + react_emoji: реагувати з {{ emoji }} + unreact_emoji: не реагувати з {{ emoji }} comment: btn_add_comment: Додати коментар reply_to: Відповісти на @@ -1086,6 +1090,7 @@ ui: search_placeholder: Фільтрувати за назвою теґу no_desc: Цей теґ не має опису. more: Більше + wiki: Wiki ask: title: Додати питання edit_title: Редагувати питання @@ -1134,7 +1139,7 @@ ui: question: Запитання tag: Теґи user: Користувачі - badges: Badges + badges: Значки profile: Профіль setting: Налаштування logout: Вийти @@ -1178,7 +1183,7 @@ ui: label: Ім’я msg: empty: Ім'я не може бути порожнім. - range: Довжина імені має бути від 2 до 30 символів. + range: Ім'я повинно мати довжину від 2 до 30 символів. character: 'Необхідно використовувати набір символів "a-z", "A-Z", "0-9", " - . _"' email: label: Електронна пошта @@ -1228,7 +1233,7 @@ ui: Ви успішно змінили пароль; вас буде перенаправлено на сторінку входу в систему. link_invalid: >- На жаль, це посилання для зміни пароля більше недійсне. Можливо, ваш пароль уже скинуто? - to_login: Continue to log in page + to_login: Продовжити вхід на сторінку password: label: Пароль msg: @@ -1335,9 +1340,9 @@ ui: title: Пов'язані запитання answers: відповіді linked_question: - title: Linked Questions - description: Questions linked to - no_linked_question: No questions linked from this question. + title: Пов'язані питання + description: Питання, пов'язані з + no_linked_question: Немає питань, пов'язаних з цього питання. invite_to_answer: title: Люди запитували desc: Виберіть людей, які, на вашу думку, можуть знати відповідь. @@ -1346,7 +1351,7 @@ ui: search: Шукати людей question_detail: action: Дія - Asked: Asked + Asked: Запитали asked: запитали update: Змінено edit: відредаговано @@ -1355,51 +1360,51 @@ ui: Follow: Підписатися Following: Підписані follow_tip: Підпишіться на це запитання, щоб отримувати сповіщення - answered: answered - closed_in: Closed in + answered: дано відповідь + closed_in: Зачинено в show_exist: Показати наявне запитання. useful: Корисне - question_useful: It is useful and clear - question_un_useful: It is unclear or not useful - question_bookmark: Bookmark this question - answer_useful: It is useful - answer_un_useful: It is not useful + question_useful: Це корисно і ясно + question_un_useful: Це неясно або некорисно + question_bookmark: Додати в закладки це питання + answer_useful: Це корисно + answer_un_useful: Це некорисно answers: - title: Answers - score: Score - newest: Newest - oldest: Oldest + title: Відповіді + score: Оцінка + newest: Найновіші + oldest: Найдавніші btn_accept: Прийняти - btn_accepted: Accepted + btn_accepted: Прийнято write_answer: title: Ваша відповідь - edit_answer: Edit my existing answer - btn_name: Post your answer - add_another_answer: Add another answer - confirm_title: Continue to answer - continue: Continue + edit_answer: Редагувати мою чинну відповідь + btn_name: Опублікувати свою відповідь + add_another_answer: Додати ще одну відповідь + confirm_title: Перейти до відповіді + 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: Відповідь не може бути порожньою. characters: вміст має бути не менше 6 символів. tips: header_1: Дякуємо за відповідь li1_1: Будь ласка, не забудьте відповісти на запитання. Надайте детальну інформацію та поділіться своїми дослідженнями. li1_2: Підкріплюйте будь-які ваші твердження посиланнями чи особистим досвідом. - header_2: But avoid ... - li2_1: Asking for help, seeking clarification, or responding to other answers. + header_2: Але уникайте... + li2_1: Просити про допомогу, шукати роз'яснення або реагувати на інші відповіді. reopen: confirm_btn: Відкрити знову title: Повторно відкрити цей допис content: Ви впевнені, що хочете повторно відкрити? list: - confirm_btn: List - title: List this post - content: Are you sure you want to list? + confirm_btn: Список + title: Показати цей допис + content: Ви впевнені, що хочете скласти список? unlist: - confirm_btn: Unlist - title: Unlist this post - content: Are you sure you want to unlist? + confirm_btn: Вилучити зі списку + title: Вилучити допис зі списку + content: Ви впевнені, що хочете вилучити зі списку? pin: title: Закріпити цей допис content: Ви впевнені, що хочете закріпити глобально? Цей допис відображатиметься вгорі всіх списків публікацій. @@ -1423,116 +1428,117 @@ ui: undelete: Скасувати видалення list: Список unlist: Вилучити зі списку - unlisted: Unlisted + unlisted: Вилучене зі списку login: Увійти signup: Зареєструватися logout: Вийти verify: Підтвердити add_question: Додати питання - approve: Approve - reject: Reject + approve: Затвердити + reject: Відхилити skip: Пропустити discard_draft: Видалити чернетку - pinned: Pinned - all: All + pinned: Закріплено + all: Усі question: Запитання answer: Відповідь comment: Коментар refresh: Оновити resend: Надіслати повторно deactivate: Деактивувати - active: Active - suspend: Suspend - unsuspend: Unsuspend + active: Активні + suspend: Призупинити + unsuspend: Відновити close: Закрити reopen: Відкрити знову ok: ОК light: Світла dark: Темна system_setting: Налаштування системи - default: Default + default: За замовчуванням reset: Скинути - tag: Tag - post_lowercase: post - filter: Filter - ignore: Ignore - submit: Submit - normal: Normal - closed: Closed + tag: Тег + post_lowercase: допис + filter: Фільтр + ignore: Ігнорувати + submit: Надіслати + normal: Нормальний + closed: Закриті deleted: Видалені - pending: Pending - more: More + pending: Очікування + more: Більше search: title: Результати пошуку keywords: Ключові слова - options: Options + options: Параметри follow: Підписатися following: Підписані - counts: "{{count}} Results" - more: More + 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 with 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>користувач:ім'я користувача пошук за автором" + answer: "<1>відповіді:0 питання без відповіді" + score: "<1>рахунок: 3 записи із 3+ рахунком" + question: "<1>є:питання пошукові питання" + is_answer: "<1>є:відповідь пошукові відповіді" + 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: Помилка... account_result: - success: Your new account is confirmed; you will be redirected to the home page. + success: Ваш новий обліковий запис підтверджено; вас буде перенаправлено на головну сторінку. link: Перейти на головну сторінку oops: Йой! - invalid: The link you used no longer works. - confirm_new_email: Your email has been updated. + invalid: Посилання, яке ви використовували, більше не працює. + confirm_new_email: Вашу адресу електронної пошти було оновлено. confirm_new_email_invalid: >- - Sorry, this confirmation link is no longer valid. Perhaps your email was already changed? + На жаль, це посилання для підтвердження більше не дійсне. Можливо, ваша електронна пошта вже була змінена? 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: Підписки на теги - edit: Edit + edit: Редагувати save: Зберегти follow_tag_tip: Підпишіться на теги, щоб упорядкувати свій список запитань. - hot_questions: Hot Questions + hot_questions: Гарячі питання all_questions: Всі питання - x_questions: "{{ count }} Questions" - x_answers: "{{ count }} answers" + x_questions: "{{ count }} Питань" + x_answers: "{{ count }} відповідей" questions: Запитання answers: Відповіді newest: Найновіші active: Активні - hot: Hot - recommend: Recommend + hot: Гаряче + frequent: Frequent + recommend: Рекомендовано score: Оцінка unanswered: Без відповідей - modified: modified - answered: answered - asked: asked - closed: closed + modified: змінено + answered: дано відповідь + asked: запитано + closed: закрито follow_a_tag: Підписатися на тег more: Більше personal: - overview: Overview + overview: Загальний огляд answers: Відповіді answer: відповідь questions: Запитання @@ -1541,77 +1547,77 @@ ui: reputation: Репутація comments: Коментарі votes: Голоси - badges: Badges + badges: Значки newest: Найновіше - score: Score + score: Оцінка edit_profile: Редагувати профіль - visited_x_days: "Visited {{ count }} days" - viewed: Viewed - joined: Joined + visited_x_days: "Відвідано {{ count }} днів" + viewed: Переглянуто + joined: Приєднано comma: "," - last_login: Seen + last_login: Переглянуто about_me: Про мене about_me_empty: "// Привіт, світ!" top_answers: Найкращі відповіді top_questions: Найкращі запитання stats: Статистика - list_empty: No posts found.
      Perhaps you'd like to select a different tab? - content_empty: No posts found. - accepted: Accepted - answered: answered - asked: asked - downvoted: downvoted + list_empty: Не знайдено жодного допису.
      Можливо, ви хочете вибрати іншу вкладку? + content_empty: Постів не знайдено. + accepted: Прийнято + answered: дано відповідь + asked: запитано + downvoted: проголосовано проти mod_short: MOD mod_long: Модератори x_reputation: репутація x_votes: отримані голоси x_answers: відповіді x_questions: запитання - recent_badges: Recent Badges + recent_badges: Нещодавні значки install: - title: Installation + title: Встановлення next: Далі - done: Done - config_yaml_error: Can't create the config.yaml file. + done: Готово + config_yaml_error: Не вдалося створити config.yaml файл. lang: label: Будь ласка, виберіть мову db_type: - label: Database engine + label: Рушій бази даних db_username: label: Ім'я користувача - placeholder: root - msg: Username cannot be empty. + placeholder: корінь + msg: Ім’я користувача не може бути порожнім. db_password: label: Пароль - placeholder: root + placeholder: корінь msg: Поле паролю не може бути порожнім. db_host: - label: Database host + label: Хост бази даних placeholder: "db:3306" - msg: Database host cannot be empty. + 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. + title: Створити config.yaml + label: Файл config.yaml створено. desc: >- Ви можете створити файл <1>config.yaml вручну в каталозі <1>/var/www/xxx/ і вставити в нього наступний текст. - info: After you've done that, click "Next" button. - site_information: Site Information - admin_account: Admin Account + info: Після цього натисніть кнопку "Далі". + site_information: Інформація про сайт + admin_account: Обліковий запис адміністратора site_name: - label: Site name - msg: Site name cannot be empty. - msg_max_length: Site name must be at maximum 30 characters in length. + label: Назва сайту + msg: Назва сайту не може бути порожньою. + msg_max_length: Назва сайту повинна містити не більше 30 символів. site_url: - label: Site URL - text: The address of your site. + label: URL сайту + text: Адреса вашого сайту. msg: empty: URL-адреса сайту не може бути пустою. incorrect: Неправильний формат URL-адреси сайту. @@ -1623,8 +1629,8 @@ ui: empty: Контактна електронна адреса не може бути порожньою. incorrect: Неправильний формат контактної електронної пошти. login_required: - label: Private - switch: Login required + label: Приватний + switch: Вхід обов'язковий text: Лише авторизовані користувачі можуть отримати доступ до цієї спільноти. admin_name: label: Ім’я @@ -1643,118 +1649,120 @@ ui: text: Вам знадобиться ця електронна адреса для входу. msg: empty: Поле електронної пошти не може бути пустим. - incorrect: Email incorrect format. - ready_title: Your site is ready + incorrect: Невірний формат електронної пошти. + ready_title: Ваш сайт готовий ready_desc: >- - If you ever feel like changing more settings, visit <1>admin section; find it in the site menu. + Якщо ви коли-небудь захочете змінити інші налаштування, відвідайте <1>розділ адміністрування; знайдіть його в меню сайту. good_luck: "Веселіться, і хай щастить!" - warn_title: Warning + warn_title: Попередження 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. + Файл <1>config.yaml вже існує. Якщо вам потрібно скинути будь-який з елементів конфігурації в цьому файлі, будь ласка, спочатку видаліть його. + install_now: Ви можете спробувати <1>встановити зараз. installed: Уже встановлено installed_desc: >- Ви, здається, уже встановили. Щоб перевстановити, спочатку очистіть старі таблиці бази даних. - db_failed: Database connection failed + 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 + views: перегляди + votes: голоси + answers: відповіді accepted: Схвалено page_error: - http_error: HTTP Error {{ code }} - desc_403: You don't have permission to access this page. - desc_404: Unfortunately, this page doesn't exist. - desc_50X: The server encountered an error and could not complete your request. - back_home: Back to homepage + http_error: Помилка HTTP {{ code }} + desc_403: Ви не маєте дозволу на доступ до цієї сторінки. + desc_404: На жаль, такої сторінки не існує. + desc_50X: Сервер виявив помилку і не зміг виконати ваш запит. + 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 - badges: Badges + dashboard: Панель + contents: Зміст + questions: Питання + answers: Відповіді + users: Користувачі + badges: Значки flags: Відмітки settings: Налаштування - general: General - interface: Interface + general: Основне + interface: Інтерфейс smtp: SMTP - branding: Branding - legal: Legal + branding: Брендинг + legal: Правила та умови write: Написати - tos: Terms of Service - privacy: Privacy + tos: Умови використання + privacy: Приватність seo: SEO customize: Персоналізувати - themes: Themes + themes: Теми css_html: CSS/HTML - login: Login - privileges: Privileges - plugins: Plugins - installed_plugins: Installed Plugins - website_welcome: Welcome to {{site_name}} + login: Вхід + privileges: Привілеї + plugins: Плагіни + installed_plugins: Встановлені плагіни + website_welcome: Ласкаво просимо до {{site_name}} user_center: - login: Login - qrcode_login_tip: Please use {{ agentName }} to scan the QR code and log in. - login_failed_email_tip: Login failed, please allow this app to access your email information before try again. + login: Вхід + qrcode_login_tip: Будь ласка, використовуйте {{ agentName }}, щоб просканувати QR-код і увійти в систему. + login_failed_email_tip: Не вдалося увійти, будь ласка, дозвольте цьому додатку отримати доступ до вашої електронної пошти, перш ніж спробувати ще раз. badges: modal: - title: Congratulations - content: You've earned a new badge. + title: Вітаємо + content: Ти отримав новий значок. close: Закрити - confirm: View badges - title: Badges - awarded: Awarded - earned_×: Earned ×{{ number }} - ×_awarded: "{{ number }} awarded" - can_earn_multiple: You can earn this multiple times. + confirm: Переглянути значки + title: Значки + awarded: Присвоєно + earned_×: Зароблено ×{{ number }} + ×_awarded: "Присвоєно {{ number }}" + can_earn_multiple: Ви можете заробити це багато разів. earned: Зароблено admin: admin_header: title: Адмін dashboard: - title: Dashboard - welcome: Welcome to Admin! - site_statistics: Site statistics + title: Панель + welcome: Ласкаво просимо до адміністратора! + site_statistics: Статистика сайту questions: "Запитання:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Відповіді:" comments: "Коментарі:" votes: "Голоси:" users: "Користувачі:" flags: "Відмітки:" - reviews: "Reviews:" - site_health: Site health - version: "Version:" + reviews: "Відгуки:" + site_health: Стан сайту + version: "Версія:" https: "HTTPS:" upload_folder: "Завантажити теку:" - run_mode: "Running mode:" - private: Private - public: Public + run_mode: "Активний режим:" + private: Приватний + public: Публічний smtp: "SMTP:" timezone: "Часовий пояс:" system_info: Інформація про систему - go_version: "Go version:" + go_version: "Перейти до версії:" database: "База даних:" database_size: "Розмір бази даних:" storage_used: "Використаний обсяг пам’яті:" - uptime: "Uptime:" + uptime: "Час роботи:" links: Посилання plugins: Плаґіни github: GitHub blog: Блоґ contact: Контакт - forum: Forum + forum: Форум documents: Документи feedback: Відгук support: Підтримка - review: Review + review: Огляд config: Конфігурація - update_to: Update to - latest: Latest + update_to: Оновити до + latest: Останній check_failed: Не вдалося перевірити "yes": "Так" "no": "Ні" @@ -1762,8 +1770,8 @@ ui: allowed: Дозволено enabled: Увімкнено disabled: Вимкнено - writable: Writable - not_writable: Not writable + writable: Записуваний + not_writable: Не можна записувати flags: title: Відмітки pending: В очікуванні @@ -1774,7 +1782,7 @@ ui: action: Дія review: Огляд user_role_modal: - title: Change user role to... + title: Змінити роль користувача на... btn_cancel: Скасувати btn_submit: Надіслати new_password_modal: @@ -1783,8 +1791,8 @@ ui: fields: password: label: Пароль - text: The user will be logged out and need to login again. - msg: Password must be at 8-32 characters in length. + text: Користувача буде виведено з системи, і йому потрібно буде увійти знову. + msg: Пароль повинен мати довжину від 8 до 32 символів. btn_cancel: Скасувати btn_submit: Надіслати edit_profile_modal: @@ -1792,15 +1800,15 @@ ui: form: fields: display_name: - label: Display name - msg_range: Display name up to 30 characters. + label: Зображуване ім'я + msg_range: Зображуване ім'я до 30 символів. username: - label: Username - msg_range: Username up to 30 characters. + label: Ім'я користувача + msg_range: Ім'я користувача до 30 символів. email: label: Електронна пошта - msg_invalid: Invalid Email Address. - edit_success: Edited successfully + msg_invalid: Невірна адреса електронної пошти. + edit_success: Успішно відредаговано btn_cancel: Скасувати btn_submit: Надіслати user_modal: @@ -1808,50 +1816,50 @@ ui: form: fields: users: - label: Bulk add user - placeholder: "John Smith, john@example.com, BUSYopr2\nAlice, alice@example.com, fpDntV8q" - text: Separate “name, email, password” with commas. One user per line. - msg: "Please enter the user's email, one per line." + label: Масове додавання користувача + placeholder: "Джон Сміт, john@example.com, BUSYopr2\nАліса, alice@example.com, fpDntV8q" + text: '“Ім''я, електронну пошту, пароль” розділити комами. Один користувач у рядку.' + msg: "Будь ласка, введіть електронну пошту користувача, по одній на рядок." display_name: label: Ім'я для відображення - msg: Ім'я для відображення повинно мати довжину від 2 до 30 символів. + msg: Ім'я для показу повинно мати довжину від 2 до 30 символів. email: label: Електронна пошта - msg: Email is not valid. + msg: Електронна пошта недійсна. password: label: Пароль - msg: Password must be at 8-32 characters in length. + msg: Пароль повинен мати довжину від 8 до 32 символів. btn_cancel: Скасувати btn_submit: Надіслати users: title: Користувачі name: Ім’я email: Електронна пошта - reputation: Reputation - created_at: Created Time - delete_at: Deleted Time + reputation: Репутація + created_at: Створений час + delete_at: Видалений час suspend_at: Час призупинення status: Статус role: Роль - action: Action - change: Change - all: All - staff: Staff + action: Дія + change: Зміна + all: Усі + staff: Персонал more: Більше - inactive: Inactive - suspended: Suspended - deleted: Deleted - normal: Normal + inactive: Неактивні + suspended: Призупинено + deleted: Видалено + normal: Нормальний Moderator: Модератор Admin: Адмін User: Користувач filter: - placeholder: "Filter by name, user:id" + placeholder: "Фільтр на ім'я, користувач:id" set_new_password: Встановити новий пароль - edit_profile: Edit profile + edit_profile: Редагувати профіль change_status: Змінити статус change_role: Змінити роль - show_logs: Show logs + show_logs: Показати записи журналу add_user: Додати користувача deactivate_user: title: Деактивувати користувача @@ -1859,72 +1867,72 @@ ui: delete_user: title: Видалити цього користувача content: Ви впевнені, що хочете видалити цього користувача? Це назавжди! - remove: Remove their content + remove: Вилучити їх вміст label: Видалити всі запитання, відповіді, коментарі тощо. - text: Don’t check this if you wish to only delete the user’s account. + text: Не позначайте цю опцію, якщо ви хочете лише видалити обліковий запис користувача. suspend_user: title: Призупинити цього користувача content: Призупинений користувач не може увійти в систему. questions: page_title: Запитання - unlisted: Unlisted + unlisted: Вилучене зі списку post: Опублікувати - votes: Votes - answers: Answers + votes: Голоси + answers: Відповіді created: Створені status: Статус - action: Action - change: Change - pending: Pending + action: Дія + change: Зміна + pending: Очікування filter: - placeholder: "Filter by title, question:id" + placeholder: "Фільтр за назвою, питання:id" answers: page_title: Відповіді - post: Post - votes: Votes - created: Created + post: Допис + votes: Голоси + created: Створено status: Статус - action: Action - change: Change + action: Дія + change: Зміна filter: - placeholder: "Filter by title, answer:id" + placeholder: "Фільтр за назвою, відповідь: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: URL сайту + msg: Url сайту не може бути порожньою. + validate: Будь ласка, введіть дійсну URL. + text: Адреса вашого сайту. short_desc: - label: Short site description - 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 - msg: Site description cannot be empty. - text: "Describe this site in one sentence, as used in the meta description tag." + label: Опис сайту + msg: Опис сайту не може бути порожнім. + text: "Опишіть цей сайт одним реченням, як у тезі метаопису." 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: Адреса електронної пошти ключової особи, відповідальної за цей сайт. check_update: - label: Software updates - text: Automatically check for updates + label: Оновлення програмного забезпечення + text: Автоматично перевіряти оновлення interface: - page_title: Interface + 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: @@ -1934,56 +1942,56 @@ ui: from_name: label: Від імені msg: Поле від імені не може бути пустим. - text: The name which emails are sent from. + text: Ім'я, з якого надсилаються електронні листи. smtp_host: - label: SMTP host - msg: SMTP host cannot be empty. + label: SMTP-хост + msg: SMTP хост не може бути порожнім. text: Ваш поштовий сервер. encryption: label: Шифрування msg: Поле шифрування не може бути пустим. - text: For most servers SSL is the recommended option. + text: Для більшості серверів SSL є рекомендованим параметром. ssl: SSL tls: TLS - 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 + label: Тест отримувачів електронної пошти text: Вкажіть адресу електронної пошти, на яку будуть надходити тестові надсилання. - msg: Test email recipients is invalid + msg: Тест отримувачів електронної пошти не вірний smtp_authentication: label: Увімкнути автентифікацію - title: SMTP authentication - msg: SMTP authentication cannot be empty. + title: SMTP аутентифікація + msg: SMTP аутентифікація не може бути порожньою. "yes": "Так" "no": "Ні" branding: - page_title: Branding + page_title: Брендинг logo: - 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. + label: Логотип + msg: Логотип не може бути порожнім. + text: Зображення логотипу у верхньому лівому кутку вашого сайту. Використовуйте широке прямокутне зображення з висотою 56 і співвідношенням сторін більше 3:1. Якщо залишити це поле порожнім, буде показано текст заголовка сайту. mobile_logo: - 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. + label: Мобільний логотип + text: Логотип, що використовується на мобільній версії вашого сайту. Використовуйте широке прямокутне зображення висотою 56. Якщо залишити поле порожнім, буде використано зображення з налаштування "логотип". square_icon: - label: Square icon - 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 - 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. + text: Іконка для вашого сайту. Для коректної роботи через CDN має бути у форматі png. Буде змінено розмір до 32x32. Якщо залишити порожнім, буде використовуватися "квадратна іконка". legal: - page_title: Legal + page_title: Правила та умови terms_of_service: label: Умови використання text: "Ви можете додати вміст про умови використання тут. Якщо у вас уже є документ, розміщений деінде, надайте тут повну URL-адресу." @@ -1993,229 +2001,257 @@ ui: write: page_title: Написати restrict_answer: - title: Answer write + title: Відповідь на запис label: Кожен користувач може написати лише одну відповідь на кожне запитання - text: "Turn off to allow users to write multiple answers to the same question, which may cause answers to be unfocused." + text: "Вимкнути, щоб дозволити користувачам писати кілька відповідей на одне і те ж питання, що може призвести до розфокусування відповідей." recommend_tags: - label: Recommend tags - text: "Recommend tags will show in the dropdown list by default." + label: Рекомендовані теги + text: "За замовчуванням рекомендовані теги будуть показані у спадному списку." msg: - contain_reserved: "recommended tags cannot contain reserved tags" + contain_reserved: "рекомендовані теги не можуть містити зарезервовані теги" required_tag: - title: Set required tags - label: Set “Recommend tags” as required tags - 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 used by moderator." + label: Зарезервовані теги + text: "Зарезервовані теги можуть використовуватися лише модератором." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO 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: Виберіть наявну тему. color_scheme: - label: Color scheme + label: Схема кольорів navbar_style: - label: Navbar style + label: Стиль панелі навігації primary_color: label: Основний колір - text: Modify the colors used by your themes + text: Змінюйте кольори, що використовуються у ваших темах css_and_html: - page_title: CSS and HTML + page_title: CSS та HTML custom_css: - label: Custom CSS + label: Користувацький CSS text: > head: - label: Head + label: Головний text: > header: - label: Header + label: Заголовок text: > footer: - label: Footer - text: This will insert before </body>. + label: Низ + text: Це вставить перед </body>. sidebar: - label: Sidebar - text: This will insert in sidebar. + label: Бічна панель + text: Це буде вставлено в бічну панель. login: page_title: Увійти membership: - title: Membership + title: Членство label: Дозволити нові реєстрації - text: Turn off to prevent anyone from creating a new account. + text: Вимкнути, щоб ніхто не міг створити новий обліковий запис. email_registration: title: Реєстрація за електронною поштою label: Дозволити реєстрацію за електронною поштою - text: Turn off to prevent anyone creating new account through email. + text: Вимкніть, щоб запобігти створенню нових облікових записів через електронну пошту. allowed_email_domains: - title: Allowed email domains - text: Email domains that users must register accounts with. One domain per line. Ignored when empty. + title: Дозволені домени електронної пошти + text: Домени електронної пошти, на які користувачі повинні зареєструвати облікові записи. Один домен у рядку. Ігнорується, якщо порожній. private: - title: Private - label: Login required - text: Only logged in users can access this community. + title: Приватний + label: Вхід обов'язковий + text: Доступ до цієї спільноти мають лише зареєстровані користувачі. password_login: - title: Password login - label: Allow email and password login - text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method." + title: Вхід через пароль + label: Дозволити вхід через електронну пошту і пароль + text: "ПОПЕРЕДЖЕННЯ: Якщо вимкнути, ви не зможете увійти в систему, якщо раніше не налаштували інший метод входу." installed_plugins: - title: Installed Plugins - plugin_link: Plugins extend and expand the functionality. You may find plugins in the <1>Plugin Repository. + title: Встановлені плагіни + plugin_link: Плагіни розширюють і поглиблюють функціональність. Ви можете знайти плагіни у <1>Сховищі плагінів. filter: - all: All - active: Active - inactive: Inactive - outdated: Outdated + all: Усі + active: Активні + inactive: Неактивні + outdated: Застарілі plugins: - label: Plugins - text: Select an existing plugin. + label: Плагіни + text: Виберіть наявний плагін. name: Ім’я - version: Version - status: Status - action: Action - deactivate: Deactivate - activate: Activate + version: Версія + status: Статус + action: Дія + deactivate: Деактивувати + activate: Активувати settings: Налаштування settings_users: title: Користувачі avatar: - label: Default avatar - text: For users without a custom avatar of their own. + label: Аватар за замовчуванням + text: Для користувачів без аватара власного. gravatar_base_url: - label: Gravatar base URL - text: URL of the Gravatar provider's API base. Ignored when empty. + label: Основна URL Gravatar + text: URL бази API постачальника Gravatar. Ігнорується, якщо порожній. profile_editable: - title: Profile editable + title: Профіль можна редагувати allow_update_display_name: label: Дозволити користувачам змінювати ім'я для відображення allow_update_username: - label: Allow users to change their username + label: Дозволити користувачам змінювати своє ім'я користувача allow_update_avatar: - label: Allow users to change their profile image + label: Дозволити користувачам змінювати зображення свого профілю allow_update_bio: - label: Allow users to change their about me + label: Дозволити користувачам змінювати дані про себе allow_update_website: - label: Allow users to change their website + label: Дозволити користувачам змінювати свій вебсайт allow_update_location: - label: Allow users to change their location + label: Дозволити користувачам змінювати своє місцеперебування privilege: - title: Privileges + title: Привілеї level: - label: Reputation required level - text: Choose the reputation required for the privileges + label: Рівень репутації необхідний + text: Виберіть репутацію, необхідну для привілеїв msg: - should_be_number: the input should be number - number_larger_1: number should be equal or larger than 1 + should_be_number: введення має бути числом + number_larger_1: число має бути рівним або більшим за 1 badges: - action: Action - active: Active - activate: Activate - all: All - awards: Awards - deactivate: Deactivate + action: Дія + active: Активні + activate: Активувати + all: Усі + awards: Нагороди + deactivate: Деактивувати filter: - placeholder: Filter by name, badge:id - group: Group - inactive: Inactive + placeholder: Фільтрувати за іменем, значок:id + group: Група + inactive: Неактивні name: Ім’я - show_logs: Show logs - status: Status - title: Badges + show_logs: Показати записи журналу + status: Статус + title: Значки form: - optional: (optional) + optional: (необов'язково) empty: не може бути порожнім - invalid: is invalid + invalid: недійсне btn_submit: Зберегти - not_found_props: "Required property {{ key }} not found." + not_found_props: "Необхідний параметр {{ key }} не знайдено." select: Вибрати 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. - approve_revision_tip: Do you approve this revision? + review: Огляд + proposed: запропоновано + question_edit: Редагування питання + answer_edit: Редагування відповіді + tag_edit: Редагування тегу + edit_summary: Редагувати звіт + edit_question: Редагувати питання + edit_answer: Редагувати відповідь + edit_tag: Редагувати тег + empty: Не залишилось завдань огляду. + approve_revision_tip: Ви схвалюєте цю редакцію? approve_flag_tip: Ви схвалюєте цю відмітку? - approve_post_tip: Do you approve this post? - approve_user_tip: Do you approve this user? - suggest_edits: Suggested edits + approve_post_tip: Ви схвалюєте цей допис? + approve_user_tip: Ви схвалюєте цього користувача? + suggest_edits: Запропоновані зміни flag_post: Відмітити публікацію flag_user: Відмітити користувача - queued_post: Queued post - queued_user: Queued user - filter_label: Type - reputation: reputation + queued_post: Черговий допис + queued_user: Черговий користувач + filter_label: Тип + reputation: репутація flag_post_type: Відмічено цей пост як {{ type }}. flag_user_type: Відмічено цього користувача як {{ type }}. - edit_post: Edit post - list_post: List post - unlist_post: Unlist post + edit_post: Редагувати допис + list_post: Додати допис до списку + unlist_post: Видалити допис зі списку 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 - pin: pinned - unpin: unpinned - show: listed - hide: unlisted - title: "History for" - tag_title: "Timeline for" - show_votes: "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." + undeleted: не видалений + deleted: видалений + downvote: голос "проти" + upvote: голос "за" + accept: прийняти + cancelled: скасовано + commented: прокоментовано + rollback: відкат назад + edited: відредаговано + answered: дано відповідь + asked: запитано + closed: закрито + reopened: знову відкрито + created: створено + pin: закріплено + unpin: відкріплено + show: додано до списку + hide: не внесено до списку + title: "Історія для" + tag_title: "Хронологія для" + show_votes: "Показати голоси" + n_or_a: Н/Д + 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 this week - users_with_the_most_vote: Users who voted the most this week - 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: Are you sure you want to leave the page? - changes_not_save: Your changes may not be saved. + leave_page: Ви дійсно хочете покинути сторінку? + changes_not_save: Ваші зміни можуть не зберегтися. draft: - discard_confirm: Are you sure you want to discard your draft? + discard_confirm: Ви дійсно бажаєте скасувати чернетку? messages: - post_deleted: This post has been deleted. - post_pin: This post has been pinned. - post_unpin: This post has been unpinned. - post_hide_list: This post has been hidden from list. - post_show_list: This post has been shown to list. - post_reopen: This post has been reopened. - post_list: This post has been listed. - post_unlist: This post has been unlisted. - post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_deleted: Цей допис було видалено. + post_cancel_deleted: This post has been undeleted. + post_pin: Цей допис було закріплено. + post_unpin: Цей допис було відкріплено. + post_hide_list: Цей допис було приховано зі списку. + post_show_list: Цей допис було показано у списку. + post_reopen: Цей допис було знову відкрито. + post_list: Цей допис було додано до списку. + post_unlist: Цей допис було приховано. + post_pending: Ваш допис очікує на розгляд. Це попередній перегляд, його буде видно після того, як його буде схвалено. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/vi_VN.yaml b/i18n/vi_VN.yaml index 495d9333a..247fd2e0c 100644 --- a/i18n/vi_VN.yaml +++ b/i18n/vi_VN.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Xác nhận địa chỉ email mới của bạn" body: - other: "Xác nhận địa chỉ email mới của bạn cho {{.SiteName}} bằng cách nhấp vào liên kết sau:
      \n{{.ChangeEmailUrl}}

      \n\nNếu bạn không yêu cầu thay đổi này, vui lòng bỏ qua email này.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} đã trả lời câu hỏi của bạn" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nXem trên {{.SiteName}}

      \n\n--
      \nHủy đăng ký" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} mời bạn trả lời" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      Tôi nghĩ bạn có thể biết câu trả lời.

      \nXem trên {{.SiteName}}

      \n\n--
      \nHủy đăng ký" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} đã bình luận về bài đăng của bạn" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nXem trên {{.SiteName}}

      \n\n--
      \nHủy đăng ký" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] Câu hỏi mới: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nHủy đăng ký" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName}}] Đặt lại mật khẩu" body: - other: "Ai đó đã yêu cầu đặt lại mật khẩu của bạn trên {{.SiteName}}.

      \n\nNếu đó không phải là bạn, bạn có thể bỏ qua email này.

      \n\nNhấp vào liên kết sau để chọn một mật khẩu mới:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Xác nhận tài khoản mới của bạn" body: - other: "Chào mừng bạn đến với {{.SiteName}}!

      \n\nNhấp vào liên kết sau để xác nhận và kích hoạt tài khoản mới của bạn:
      \n{{.RegisterUrl}}

      \n\nNếu liên kết trên không thể nhấp, hãy thử sao chép và dán nó vào thanh địa chỉ của trình duyệt web của bạn.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Email kiểm tra" body: - other: "Đây là một email kiểm tra." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: bình chọn lên @@ -787,7 +787,7 @@ ui: how_to_format: title: Cách định dạng desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: Trước next: Tiếp @@ -904,7 +904,7 @@ ui: msg: empty: Tệp không thể trống. only_image: Chỉ cho phép tệp hình ảnh. - max_size: Kích thước tệp không vượt quá 4 MB. + max_size: File size cannot exceed {{size}} MB. desc: label: Mô tả tab_url: URL hình ảnh @@ -946,6 +946,10 @@ ui: text: Bảng heading: Tiêu đề cell: Ô + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: Tôi đang đóng bài đăng này với lý do... btn_cancel: Hủy @@ -1086,6 +1090,7 @@ ui: search_placeholder: Lọc theo tên thẻ no_desc: Thẻ không có mô tả. more: Thêm + wiki: Wiki ask: title: Thêm Câu hỏi edit_title: Chỉnh sửa Câu hỏi @@ -1522,6 +1527,7 @@ ui: newest: Mới nhất active: Hoạt động hot: Được nhiều quan tâm + frequent: Frequent recommend: Đề xuất score: Điểm unanswered: Chưa được trả lời @@ -1721,6 +1727,8 @@ ui: welcome: Chào mừng bạn đến với Answer Admin! site_statistics: Thống kê trang questions: "Câu hỏi:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "Câu trả lời:" comments: "Bình luận:" votes: "Phiếu bầu:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Thẻ dành riêng text: "Thẻ dành riêng chỉ có thể được thêm vào một bài đăng bởi điều hành viên." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: SEO permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Bạn có chắc chắn muốn hủy bản nháp của mình không? messages: post_deleted: Bài đăng này đã bị xóa. + post_cancel_deleted: This post has been undeleted. post_pin: Bài đăng này đã được ghim. post_unpin: Bài đăng này đã bị bỏ ghim. post_hide_list: Bài đăng này đã được ẩn khỏi danh sách. @@ -2219,3 +2243,15 @@ ui: post_list: Bài đăng này đã được liệt kê. post_unlist: Bài đăng này đã được gỡ bỏ khỏi danh sách. post_pending: Bài đăng của bạn đang chờ xem xét. Đây là bản xem trước, nó sẽ được hiển thị sau khi được phê duyệt. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + + diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml index d0feebb92..07f8d2ea4 100644 --- a/i18n/zh_CN.yaml +++ b/i18n/zh_CN.yaml @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] 确认你的新邮箱地址" body: - other: "请点击以下链接确认你在 {{.SiteName}} 上的新邮箱地址:
      \n{{.ChangeEmailUrl}}

      \n\n如果你没有请求此更改,请忽略此邮件。\n" + other: "请点击以下链接确认你在 {{.SiteName}} 上的新邮箱地址:
      \n{{.ChangeEmailUrl}}

      \n\n如果你没有请求此更改,请忽略此邮件。\n\n--
      \n这是系统自动发送的电子邮件,请勿回复,因为您的回复将不会被看到

      " new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} 回答了你的问题" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \n在 {{.SiteName}} 上查看

      \n\n--
      \n取消订阅" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \n在 {{.SiteName}} 上查看

      \n\n--
      \n这是系统自动发送的电子邮件,请勿回复,因为您的回复将不会被看到

      \n\n取消订阅" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} 邀请您回答问题" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      我想你可能知道答案。

      \n在 {{.SiteName}} 上查看

      \n\n--
      \n取消订阅" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      我想你可能知道答案。

      \n在 {{.SiteName}} 上查看

      \n\n--
      \n这是系统自动发送的电子邮件,请勿回复,因为您的回复将不会被看到

      \n\n取消订阅" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} 评论了你的帖子" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \n在 {{.SiteName}} 上查看

      \n\n--
      \n取消订阅" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \n在 {{.SiteName}} 上查看

      \n\n--
      \n这是系统自动发送的电子邮件,请勿回复,因为您的回复将不会被看到

      \n\n取消订阅" new_question: title: other: "[{{.SiteName}}] 新问题: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \n取消订阅" + other: "{{.QuestionTitle}}

      \n{{.Tags}}

      \n\n--
      \n这是系统自动发送的电子邮件,请勿回复,因为您的回复将不会被看到

      \n\n取消订阅" pass_reset: title: other: "[{{.SiteName }}] 重置密码" body: - other: "有人要求在 [{{.SiteName}}] 上重置你的密码。

      \n\n如果这不是你的操作,请安心忽略此电子邮件。

      \n\n请点击以下链接设置一个新密码:
      \n{{.PassResetUrl}}\n" + other: "有人要求在 [{{.SiteName}}] 上重置你的密码。

      \n\n如果这不是你的操作,请安心忽略此电子邮件。

      \n\n请点击以下链接设置一个新密码:
      \n{{.PassResetUrl}}\n\n如果你没有请求此更改,请忽略此邮件。\n" register: title: other: "[{{.SiteName}}] 确认你的新账户" body: - other: "欢迎加入 {{.SiteName}}!

      \n\n请点击以下链接确认并激活你的新账户:
      \n{{.RegisterUrl}}

      \n\n如果上面的链接不能点击,请将其复制并粘贴到你的浏览器地址栏中。\n" + other: "欢迎加入 {{.SiteName}}!

      \n\n请点击以下链接确认并激活你的新账户:
      \n{{.RegisterUrl}}

      \n\n如果上面的链接不能点击,请将其复制并粘贴到你的浏览器地址栏中。\n

      \n\n--
      \n这是系统自动发送的电子邮件,请勿回复,因为您的回复将不会被看到" test: title: other: "[{{.SiteName}}] 测试邮件" body: - other: "这是一封测试邮件。" + other: "这是测试电子邮件。\n

      \n\n-
      \n注意:这是一个自动的系统电子邮件, 请不要回复此消息,因为您的回复将不会被看到。" action_activity_type: upvote: other: 点赞 @@ -787,7 +787,7 @@ ui: how_to_format: title: 如何排版 desc: >- -
      • 引用问题或答案: #10010000000000001

      • 添加链接

        <https://url.com>

        [标题](https://url.com)
      • 段落之间使用空行分隔

      • _斜体_ 或者 **粗体**

      • 使用 4 个空格缩进代码

      • 在行首添加 > 表示引用

      • 反引号进行转义 `像 _这样_`

      • 使用 ``` 创建代码块

        ```
        这是代码块
        ```
      +
      • 引用问题或答案: #post_id

      • 添加链接

        <https://url.com>

        [标题](https://url.com)
      • 段落之间使用空行分隔

      • _斜体_ 或者 **粗体**

      • 使用 个空格缩进代码

      • 在行首添加 > 表示引用

      • 反引号进行转义 `像 _这样_`

      • 使用 ``` 创建代码块

        ```
        这是代码块
        ```
      pagination: prev: 上一页 next: 下一页 @@ -904,7 +904,7 @@ ui: msg: empty: 请选择图片文件。 only_image: 只能上传图片文件。 - max_size: 文件大小不能超过 4 MB。 + max_size: 文件大小不能超过 {{size}} MB。 desc: label: 描述 tab_url: 图片地址 @@ -946,6 +946,10 @@ ui: text: 表格 heading: 表头 cell: 单元格 + file: + text: 附件 + not_supported: "不支持的文件类型。请尝试上传其他类型的文件如: {{file_type}}。" + max_size: "上传文件超过 {{size}} MB。" close_modal: title: 关闭原因是... btn_cancel: 取消 @@ -1523,6 +1527,7 @@ ui: newest: 最新 active: 活跃 hot: 热门 + frequent: 频繁的 recommend: 推荐 score: 评分 unanswered: 未回答 @@ -1557,7 +1562,7 @@ ui: top_questions: 高分问题 stats: 状态 list_empty: 没有找到相关的内容。
      试试看其他选项卡? - content_empty: 没有找到相关的内容。 + content_empty: 未找到帖子。 accepted: 已采纳 answered: 回答于 asked: 提问于 @@ -1723,7 +1728,7 @@ ui: site_statistics: 站点统计 questions: "问题:" resolved: "已解决:" - unanswered: "未回复:" + unanswered: "未回答:" answers: "回答:" comments: "评论:" votes: "投票:" @@ -2011,6 +2016,21 @@ ui: reserved_tags: label: 保留标签 text: "只有版主才能使用保留的标签。" + image_size: + label: 最大图像大小 (MB) + text: "最大图像上传大小." + attachment_size: + label: 最大附件大小 (MB) + text: "最大附件文件上传大小。" + image_megapixels: + label: 最大图像兆像素 + text: "允许图像的最大兆位数。" + image_extensions: + label: 允许的图像后缀 + text: "允许图像显示的文件扩展名的列表,用英文逗号分隔。" + attachment_extensions: + label: 允许的附件后缀 + text: "允许上传的文件扩展名列表与英文逗号分开。警告:允许上传可能会导致安全问题。" seo: page_title: 搜索引擎优化 permalink: @@ -2214,6 +2234,7 @@ ui: discard_confirm: 您确定要丢弃您的草稿吗? messages: post_deleted: 该帖子已被删除。 + post_cancel_deleted: 此帖子已被删除 post_pin: 该帖子已被置顶。 post_unpin: 该帖子已被取消置顶。 post_hide_list: 此帖子已经从列表中隐藏。 @@ -2222,3 +2243,15 @@ ui: post_list: 这个帖子已经被显示 post_unlist: 这个帖子已经被隐藏 post_pending: 您的帖子正在等待审核。它将在它获得批准后可见。 + post_closed: 此帖已关闭。 + answer_deleted: 该回答已被删除. + answer_cancel_deleted: 此答案已取消删除。 + change_user_role: 此用户的角色已被更改。 + user_inactive: 此用户已经处于未激活状态。 + user_normal: 此用户已经是正常的。 + user_suspended: 此用户已被封禁。 + user_deleted: 此用户已被删除 + badge_activated: 此徽章已被激活。 + badge_inactivated: 此徽章已被禁用。 + + diff --git a/i18n/zh_TW.yaml b/i18n/zh_TW.yaml index bec0a0b39..fbe8eb8b2 100644 --- a/i18n/zh_TW.yaml +++ b/i18n/zh_TW.yaml @@ -48,15 +48,15 @@ backend: pin: other: 置頂 hide: - other: Unlist + other: 不公開 unpin: - other: Unpin + other: 取消置頂 show: - other: List + other: 清單 invite_someone_to_answer: - other: Edit + other: 編輯 undelete: - other: Undelete + other: 還原 role: name: user: @@ -464,42 +464,42 @@ backend: title: other: "[{{.SiteName}}] Confirm your new email address" body: - other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.\n" + other: "Confirm your new email address for {{.SiteName}} by clicking on the following link:
      \n{{.ChangeEmailUrl}}

      \n\nIf you did not request this change, please ignore this email.

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." new_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} answered your question" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.AnswerSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" invited_you_to_answer: title: other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      I think you may know the answer.

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_comment: title: other: "[{{.SiteName}}] {{.DisplayName}} commented on your post" body: - other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}

      \n\n{{.DisplayName}}:
      \n
      {{.CommentSummary}}

      \nView it on {{.SiteName}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" new_question: title: other: "[{{.SiteName}}] New question: {{.QuestionTitle}}" body: - other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nUnsubscribe" + other: "{{.QuestionTitle}}
      \n{{.Tags}}

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen.

      \n\nUnsubscribe" pass_reset: title: other: "[{{.SiteName }}] Password reset" body: - other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n" + other: "Somebody asked to reset your password on {{.SiteName}}.

      \n\nIf it was not you, you can safely ignore this email.

      \n\nClick the following link to choose a new password:
      \n{{.PassResetUrl}}\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." register: title: other: "[{{.SiteName}}] Confirm your new account" body: - other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n" + other: "Welcome to {{.SiteName}}!

      \n\nClick the following link to confirm and activate your new account:
      \n{{.RegisterUrl}}

      \n\nIf the above link is not clickable, try copying and pasting it into the address bar of your web browser.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." test: title: other: "[{{.SiteName}}] Test Email" body: - other: "This is a test email." + other: "This is a test email.\n

      \n\n--
      \nNote: This is an automatic system email, please do not reply to this message as your response will not be seen." action_activity_type: upvote: other: upvote @@ -787,7 +787,7 @@ ui: how_to_format: title: 如何設定文本格式 desc: >- -
      • link question or answer: #10010000000000001

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      +
      • mention a post: #post_id

      • to make links

        <https://url.com>

        [Title](https://url.com)
      • put returns between paragraphs

      • _italic_ or **bold**

      • indent code by 4 spaces

      • quote by placing > at start of line

      • backtick escapes `like _this_`

      • create code fences with backticks `

        ```
        code here
        ```
      pagination: prev: 上一頁 next: 下一頁 @@ -904,7 +904,7 @@ ui: msg: empty: 文件不能為空。 only_image: 只能上傳圖片文件。 - max_size: 文件大小不能超過4MB + max_size: File size cannot exceed {{size}} MB. desc: label: 圖片描述 tab_url: 圖片地址 @@ -946,6 +946,10 @@ ui: text: 表格 heading: 表頭 cell: 單元格 + file: + text: Attach files + not_supported: "Don’t support that file type. Try again with {{file_type}}." + max_size: "Attach files size cannot exceed {{size}} MB." close_modal: title: 關閉原因是... btn_cancel: 取消 @@ -1086,6 +1090,7 @@ ui: search_placeholder: 通過標籤名過濾 no_desc: 此標籤無描述。 more: 更多 + wiki: Wiki ask: title: 發問 edit_title: 編輯問題 @@ -1522,6 +1527,7 @@ ui: newest: 最新的 active: 活躍的 hot: Hot + frequent: Frequent recommend: Recommend score: 評分 unanswered: 未回答 @@ -1721,6 +1727,8 @@ ui: welcome: Welcome to Admin! site_statistics: Site statistics questions: "問題:" + resolved: "Resolved:" + unanswered: "Unanswered:" answers: "回答:" comments: "評論:" votes: "投票:" @@ -2008,6 +2016,21 @@ ui: reserved_tags: label: Reserved tags text: "Reserved tags can only be used by moderator." + image_size: + label: Max image size (MB) + text: "The maximum image upload size." + attachment_size: + label: Max attachment size (MB) + text: "The maximum attachment files upload size." + image_megapixels: + label: Max image megapixels + text: "Maximum number of megapixels allowed for an image." + image_extensions: + label: Authorized image extensions + text: "A list of file extensions allowed for image display, separate with commas." + attachment_extensions: + label: Authorized attachment extensions + text: "A list of file extensions allowed for upload, separate with commas. WARNING: Allowing uploads may cause security issues." seo: page_title: 搜尋引擎優化 permalink: @@ -2211,6 +2234,7 @@ ui: discard_confirm: Are you sure you want to discard your draft? messages: post_deleted: This post has been deleted. + post_cancel_deleted: This post has been undeleted. post_pin: This post has been pinned. post_unpin: This post has been unpinned. post_hide_list: This post has been hidden from list. @@ -2219,3 +2243,15 @@ ui: post_list: This post has been listed. post_unlist: This post has been unlisted. post_pending: Your post is awaiting review. This is a preview, it will be visible after it has been approved. + post_closed: This post has been closed. + answer_deleted: This answer has been deleted. + answer_cancel_deleted: This answer has been undeleted. + change_user_role: This user's role has been changed. + user_inactive: This user is already inactive. + user_normal: This user is already normal. + user_suspended: This user has been suspended. + user_deleted: This user has been deleted. + badge_activated: This badge has been activated. + badge_inactivated: This badge has been inactivated. + +