Merge branch 'github-main' into feat/1.1.0/context

This commit is contained in:
LinkinStars 2023-06-06 17:09:35 +08:00
commit 420667cd3e
137 changed files with 6683 additions and 1956 deletions

View File

@ -1,4 +1,8 @@
# url path reserves the keywords list
questions:
- ask
tags:
- create
users:
- unsubscribe
- settings
@ -12,5 +16,3 @@ users:
- account-suspended
- confirm-email
- auth-landing
questions:
- ask

View File

@ -11,25 +11,31 @@ backend:
other: Anawdurdodedig.
database_error:
other: Gwall gweinydd data.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
other: Tynnu sylw
edit:
other: Edit
other: Golygu
delete:
other: Delete
other: Dileu
close:
other: Close
other: Cau
reopen:
other: Reopen
other: Ailagor
forbidden_error:
other: Forbidden.
pin:
other: Pin
other: Pinio
hide:
other: Unlist
other: Dad-restru
unpin:
other: Unpin
other: Dadbinio
show:
other: List
other: Rhestr
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Bod â'r pŵer llawn i gael mynediad i'r safle.
moderator:
other: Mae ganddo fynediad i bob post ac eithrio gosodiadau gweinyddol.
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)
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: Ebost
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: Nid yw e-bost a chyfrinair yn cyfateb.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: Ni allwch addasu eich cyfrinair.
@ -82,6 +145,8 @@ backend:
other: Dylid gwirio e-bost.
verify_url_expired:
other: Mae'r URL wedi'i wirio gan e-bost wedi dod i ben, anfonwch yr e-bost eto.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Ffeil iaith heb ei chanfod.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: Rank yn methu â bodloni'r amod.
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: Methodd handlen yr adroddiad.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Dim caniatâd i adolygu.
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: Nid yw e-bost a chyfrinair yn cyfateb.
@ -171,6 +242,10 @@ backend:
other: Ni allwch addasu eich rôl.
not_allowed_registration:
other: Ar hyn o bryd nid yw'r safle ar agor i'w gofrestru
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Wedi methu darllen y ffurfwedd
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Fformat ffeil heb ei gefnogi.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: sbam
other: spam
desc:
other: Mae'r swydd hon yn hysbyseb, neu fandaliaeth. Nid yw'n ddefnyddiol nac yn berthnasol i'r pwnc cyfredol.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: anghwrtais neu sarhaus
other: rude or abusive
desc:
other: Byddai person rhesymol yn gweld y cynnwys hwn yn amhriodol ar gyfer trafodaeth barchus.
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: dyblyg
other: a duplicate
desc:
other: Mae'r cwestiwn hwn wedi'i ofyn o'r blaen ac mae ganddo ateb yn barod.
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: nid ateb
other: not an answer
desc:
other: Postiwyd hwn fel ateb, ond nid yw'n ceisio ateb y cwestiwn. Mae'n bosibl y dylai fod yn olygiad, yn sylwad, yn gwestiwn arall, neu'n cael ei ddileu yn gyfan gwbl.
not_need:
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: nad oes ei angen mwyach
other: no longer needed
desc:
other: Mae'r sylw hwn yn hen ffasiwn, yn sgyrsiol neu ddim yn berthnasol i'r post hwn.
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: rhywbeth arall
other: something else
desc:
other: Mae'r swydd hon angen sylw staff am reswm arall nad yw wedi'i restru uchod.
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: atebodd
modified:
other: wedi newid
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: Mae eich ateb wedii dileu
your_comment_was_deleted:
other: Mae eich sylw wedii dileu
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,20 +482,28 @@ ui:
upgrade: Ateb Uwchraddio
maintenance: Cynnal a Chadw Gwefan
users: Defnyddwyr
oauth_callback: Processing
http_404: Gwall HTTP 404
http_50X: Gwall HTTP 500
http_403: HTTP Error 403
http_403: Gwall HTTP 403
notifications:
title: Hysbysiadau
inbox: Mewnflwch
achievement: Llwyddiannau
all_read: Marciwch y cyfan fel wedi'i ddarllen
show_more: Dangos mwy
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Mae'ch Cyfrif wedi'i Atal
until_time: "Cafodd eich cyfrif ei atal tan {{ time }}."
forever: Cafodd y defnyddiwr hwn ei atal am byth.
end: Nid ydych yn arwain cymunedol.
contact_us: Contact us
editor:
blockquote:
text: Dyfyniad
@ -412,64 +595,64 @@ ui:
empty: Ni all URL fod yn wag.
name:
label: Disgrifiad
btn_cancel: Cancel
btn_confirm: Add
btn_cancel: Canslo
btn_confirm: Ychwanegu
ordered_list:
text: Numbered List
text: Rhestr wedi'i rhifo
unordered_list:
text: Bulleted List
text: Rhestr Bwled
table:
text: Table
heading: Heading
text: Tabl
heading: Pennawd
cell: Cell
close_modal:
title: I am closing this post as...
btn_cancel: Cancel
btn_submit: Submit
title: Rwy'n cau'r post hon fel...
btn_cancel: Canslo
btn_submit: Cyflwyno
remark:
empty: Cannot be empty.
empty: Ni all fod yn wag.
msg:
empty: Please select a reason.
empty: Dewis rheswm.
report_modal:
flag_title: I am flagging to report this post as...
close_title: I am closing this post as...
review_question_title: Review question
review_answer_title: Review answer
review_comment_title: Review comment
btn_cancel: Cancel
btn_submit: Submit
flag_title: Dwi'n tynnu sylw i adrodd y swydd hon fel...
close_title: Rwy'n cau'r post hon fel...
review_question_title: Adolygu cwestiwn
review_answer_title: Adolygu ateb
review_comment_title: Adolygu sylwad
btn_cancel: Canslo
btn_submit: Cyflwyno
remark:
empty: Cannot be empty.
empty: Ni all fod yn wag.
msg:
empty: Please select a reason.
empty: Dewis rheswm.
tag_modal:
title: Create new tag
title: Creu tag newydd
form:
fields:
display_name:
label: Display Name
label: Enw dangos
msg:
empty: Display name cannot be empty.
range: Display name up to 35 characters.
empty: Ni all fod enw dangos yn wag.
range: Enw arddangos hyd at 35 nod.
slug_name:
label: URL Slug
desc: URL slug up to 35 characters.
desc: Slug URL hyd at 35 nod.
msg:
empty: URL slug cannot be empty.
range: URL slug up to 35 characters.
character: URL slug contains unallowed character set.
empty: Ni all Slug URL fod yn wag.
range: Slug URL hyd at 35 nod.
character: Mae slug URL yn cynnwys set nodau na caniateir.
desc:
label: Description
btn_cancel: Cancel
btn_submit: Submit
btn_post: Post new tag
label: Disgrifiad
btn_cancel: Canslo
btn_submit: Cyflwyno
btn_post: Post tag newydd
tag_info:
created_at: Created
edited_at: Edited
history: History
created_at: Creuwyd
edited_at: Golygwyd
history: Hanes
synonyms:
title: Synonyms
text: The following tags will be remapped to
title: Cyfystyron
text: Bydd y tagiau canlynol yn cael eu hail-fapio i
empty: No synonyms found.
btn_add: Add a synonym
btn_edit: Edit
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Edit Answer
default_reason: Edit answer
@ -544,59 +727,59 @@ ui:
placeholder: >-
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
btn_save_edits: Save edits
btn_cancel: Cancel
btn_cancel: Canslo
tags:
title: Tags
title: Tagiau
sort_buttons:
popular: Popular
name: Name
newest: newest
button_follow: Follow
button_following: Following
tag_label: questions
search_placeholder: Filter by tag name
no_desc: The tag has no description.
more: More
popular: Poblogaidd
name: Enw
newest: mwyaf newydd
button_follow: Dilyn
button_following: Yn dilyn
tag_label: cwestiynau
search_placeholder: Hidlo yn ôl enw tag
no_desc: Nid oes gan y tag unrhyw ddisgrifiad.
more: Mwy
ask:
title: Add Question
edit_title: Edit Question
default_reason: Edit question
similar_questions: Similar questions
title: Ychwanegu Cwestiwn
edit_title: Golygu Cwestiwn
default_reason: Golygu Cwestiwn
similar_questions: Cwestiynau tebyg
form:
fields:
revision:
label: Revision
label: Diwygiad
title:
label: Title
placeholder: Be specific and imagine you're asking a question to another person
label: Teitl
placeholder: Byddwch yn benodol a dychmygwch eich bod yn gofyn cwestiwn i berson arall
msg:
empty: Title cannot be empty.
range: Title up to 150 characters
empty: Ni all teitl fod yn wag.
range: Teitl hyd at 20 nod
body:
label: Body
label: Corff
msg:
empty: Body cannot be empty.
empty: Ni all corff fod yn wag.
tags:
label: Tags
label: Tagiau
msg:
empty: Tags cannot be empty.
empty: Ni all tagiau fod yn wag.
answer:
label: Answer
label: Ateb
msg:
empty: Answer cannot be empty.
empty: Ni all ateb fod yn wag.
edit_summary:
label: Edit Summary
label: Golygu Crynodeb
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
Eglurwch yn fyr eich newidiadau (sillafu wedi'i gywiro, gramadeg sefydlog, fformatio gwell)
btn_post_question: Post cweistiwn
btn_save_edits: Cadw golygiadau
answer_question: Atebwch eich cwestiwn eich hun
post_question&answer: Postiwch eich cwestiwn ac ateb
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."
add_btn: Ychwanegu tag
create_btn: Creu tag newydd
search_tag: Chwilio tag
hint: "Disgrifiwch beth yw eich cwestiwn, mae angen o leiaf un tag."
no_result: No tags matched
tag_required_text: Required tag (at least one)
header:
@ -609,6 +792,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Cannot be empty.
login:
page_title: Welcome to {{site_name}}
login_to_continue: Log in to continue
info_sign: Don't have an account? <1>Sign up</1>
info_login: Already have an account? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Name cannot be empty.
range: Name up to 30 characters.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: Email cannot be empty.
change_email:
page_title: Welcome to {{site_name}}
btn_cancel: Cancel
btn_update: Update email address
send_success: >-
@ -672,6 +856,17 @@ ui:
label: New Email
msg:
empty: Email cannot be empty.
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
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: Email
msg: Email cannot be empty.
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
@ -756,6 +955,13 @@ ui:
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.
@ -766,6 +972,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -775,12 +987,13 @@ ui:
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_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Welcome to {{site_name}}
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepted
answered: answered
asked: asked
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderators
x_reputation: reputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Password
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Customize
themes: Themes
css-html: CSS/HTML
css_html: CSS/HTML
login: Login
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
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

View File

@ -11,25 +11,31 @@ backend:
other: Nicht autorisiert.
database_error:
other: Datenbank-Fehler.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
other: Melden
edit:
other: Edit
other: Bearbeiten
delete:
other: Delete
other: Löschen
close:
other: Close
other: Schließen
reopen:
other: Reopen
other: Wieder öffnen
forbidden_error:
other: Forbidden.
pin:
other: Pin
other: Anpinnen
hide:
other: Unlist
other: Nicht Aufführen
unpin:
other: Unpin
other: Loslösen
show:
other: List
other: Liste
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Haben Sie die volle Berechtigung, auf die Website zuzugreifen.
moderator:
other: Hat Zugriff auf alle Beiträge außer Admin-Einstellungen.
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)
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: E-Mail
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: E-Mail und Passwort stimmen nicht überein.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: Sie können Ihr Passwort nicht ändern.
@ -82,6 +145,8 @@ backend:
other: E-Mail muss überprüft werden.
verify_url_expired:
other: E-Mail-verifizierte URL ist abgelaufen, bitte senden Sie die E-Mail erneut.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Sprachdatei nicht gefunden.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: Rang erfüllt die Bedingung nicht.
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: Berichtshandle fehlgeschlagen.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Keine Berechtigung zum Revision.
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: E-Mail und Passwort stimmen nicht überein.
@ -171,6 +242,10 @@ backend:
other: Du kannst deine Rolle nicht ändern.
not_allowed_registration:
other: Derzeit ist die Website nicht zur Registrierung geöffnet
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Lesekonfiguration fehlgeschlagen
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Dateiformat nicht unterstützt.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: spam
desc:
other: Dieser Beitrag ist eine Werbung oder Vandalismus. Er ist nicht nützlich oder relevant für das aktuelle Thema.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: unhöflich oder beleidigend
other: rude or abusive
desc:
other: Eine vernünftige Person würde diesen Inhalt für respektvoll diskutierten Diskurs für unangemessen halten.
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: ein Duplikat
other: a duplicate
desc:
other: Diese Frage ist bereits gestellt worden und hat bereits eine Antwort.
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: keine Antwort
other: not an answer
desc:
other: Dies wurde als Antwort veröffentlicht, aber es versucht nicht, die Frage zu beantworten. Es sollte möglicherweise eine Bearbeitung, ein Kommentar, eine andere Frage oder komplett gelöscht werden.
not_need:
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
other: no longer needed
desc:
other: Dieser Kommentar ist veraltet, Konversation oder nicht relevant für diesen Beitrag.
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: etwas anderes
other: something else
desc:
other: Dieser Beitrag benötigt die Aufmerksamkeit des Personals aus einem anderen Grund, der oben nicht aufgeführt ist.
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: beantwortet
modified:
other: geändert
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: Ihre Antwort wurde gelöscht
your_comment_was_deleted:
other: Ihr Kommentar wurde gelöscht
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,20 +482,28 @@ ui:
upgrade: Antwort-Upgrade
maintenance: Website-Pflege
users: Benutzer
oauth_callback: Processing
http_404: HTTP-Fehler 404
http_50X: HTTP-Fehler 500
http_403: HTTP Error 403
http_403: HTTP Fehler 403
notifications:
title: Benachrichtigungen
inbox: Posteingang
achievement: Erfolge
all_read: Alle als gelesen markieren
show_more: Mehr Anzeigen
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Dein Konto wurde gesperrt
until_time: "Ihr Konto wurde bis {{ time }} gesperrt."
forever: Dieser Benutzer wurde für immer gesperrt.
end: Du erfüllst keine Community-Richtlinie.
contact_us: Contact us
editor:
blockquote:
text: Blockzitat
@ -527,7 +710,7 @@ ui:
Verwenden Sie Kommentare, um weitere Informationen anzufordern oder Verbesserungen vorzuschlagen. Vermeiden Sie die Beantwortung von Fragen in Kommentaren.
tip_answer: >-
Verwenden Sie Kommentare, um anderen Benutzern zu antworten oder sie über Änderungen zu informieren. Wenn Sie neue Informationen hinzufügen, bearbeiten Sie Ihren Beitrag, anstatt ihn zu kommentieren.
tip_vote: It adds something useful to the post
tip_vote: It adds something useful to the post
edit_answer:
title: Antwort bearbeiten
default_reason: Antwort bearbeiten
@ -609,6 +792,8 @@ ui:
logout: Ausloggen
admin: Administrator
review: Rezension
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Suchen
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Kann nicht leer sein.
login:
page_title: Willkommen bei {{site_name}}
login_to_continue: Melden Sie sich an, um fortzufahren
info_sign: Sie haben noch kein Konto? <1>Melden Sie sich an</1>
info_login: Haben Sie bereits ein Konto? <1>Melden Sie sich an</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Der Name darf nicht leer sein.
range: Nennen Sie bis zu 30 Zeichen.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: E-Mail darf nicht leer sein.
change_email:
page_title: Willkommen bei {{site_name}}
btn_cancel: Stornieren
btn_update: Aktualisiere email adresse
send_success: >-
@ -672,6 +856,17 @@ ui:
label: Neue e-mail
msg:
empty: E-Mail darf nicht leer sein.
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: Passwort zurücksetzen
btn_name: Setze mein Passwort zurück
@ -690,6 +885,7 @@ ui:
label: Bestätige neues Passwort
settings:
page_title: Einstellungen
goto_modify: Go to Modify
nav:
profile: Profil
notification: Benachrichtigungen
@ -711,7 +907,7 @@ ui:
avatar:
label: Profilbild
gravatar: Gravatar
gravatar_text: Sie können das Bild auf <1>gravatar.com</1> ändern
gravatar_text: You can change image on
custom: Benutzerdefiniert
btn_refresh: Aktualisieren
custom_text: Sie können Ihr Bild hochladen.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
Wir haben eine E-Mail an diese Adresse gesendet. Bitte folgen Sie den Bestätigungsanweisungen.
email:
label: E-Mail
msg: E-Mail-Feld darf nicht leer sein.
label: New Email
msg: New Email cannot be empty.
pass:
label: Current Password
msg: Password cannot be empty.
password_title: Passwort
current_pass:
label: Aktuelles Passwort
@ -756,6 +955,13 @@ ui:
lang:
label: Schnittstellensprache
text: Sprache der Benutzeroberfläche. Es ändert sich, wenn Sie die Seite aktualisieren.
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: erfolg aktualisieren
update_password: Das Kennwort wurde erfolgreich geändert.
@ -766,8 +972,14 @@ ui:
title: Verwandte Fragen
btn: Frage hinzufügen
answers: antworten
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
action: Aktion
Asked: Fragte
asked: fragte
update: Geändert
@ -775,14 +987,15 @@ ui:
Views: Gesehen
Follow: Folgen
Following: Folgend
follow_tip: Follow this question to receive notifications
answered: beantwortet
closed_in: Abgeschlossen in
show_exist: Bestehende Frage anzeigen.
useful: Useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
useful: Nützlich
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: Das ist nützlich
answer_un_useful: Das ist nicht nützlich
answers:
title: Antworten
score: Punkte
@ -800,19 +1013,19 @@ ui:
empty: Antwort darf nicht leer sein.
characters: der Inhalt muss mindestens 6 Zeichen lang sein.
tips:
header_1: Thanks for your answer
li1_1: Please be sure to <strong>answer the question</strong>. Provide details and share your research.
li1_2: Back up any statements you make with references or personal experience.
header_2: But <strong>avoid</strong> ...
li2_1: Asking for help, seeking clarification, or responding to other answers.
header_1: Vielen Dank für Ihre Antwort
li1_1: Bitte <strong>beantworten Sie die Frage</strong>. Geben Sie Details ein und teilen Sie Ihre Begründung/ Recherche.
li1_2: Begründen Sie Ihre Aussagen mit Referenzen oder persönlicher Erfahrung.
header_2: Aber <strong>vermeide</strong>...
li2_1: Bitte um Hilfe, um Klarstellung oder um Antwort auf andere Antworten.
reopen:
confirm_btn: Reopen
confirm_btn: Wieder öffnen
title: Diesen Beitrag erneut öffnen
content: Möchten Sie wirklich wieder öffnen?
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: Beitrag anheften
content: Sind Sie sicher, dass Sie global anpinnen möchten? Dieser Beitrag wird oben auf allen Beitragslisten erscheinen.
confirm_btn: Anheften
delete:
title: Diesen Beitrag löschen
question: >-
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Bestätigen
cancel: Abbrechen
edit: Edit
save: Speichern
delete: Löschen
login: Einloggen
@ -835,7 +1049,11 @@ ui:
reject: Ablehnen
skip: Überspringen
discard_draft: Entwurf verwerfen
pinned: Pinned
pinned: Angeheftet
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Suchergebnisse
keywords: Schlüsselwörter
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Fehler...
account_result:
page_title: Willkommen bei {{site_name}}
success: Ihr neues Konto wird bestätigt; Sie werden auf die Startseite weitergeleitet.
link: Weiter zur Startseite
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Akzeptiert
answered: antwortete
asked: fragte
upvote: positiv bewerten
downvote: ablehnen
downvoted: downvoted
mod_short: Mod
mod_long: Moderatoren
x_reputation: ruf
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Der Name darf nicht leer sein.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Passwort
text: >-
@ -1025,11 +1242,11 @@ ui:
answers: antworten
accepted: Akzeptiert
page_error:
http_error: HTTP Error {{ code }}
desc_403: You dont 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 Fehler {{ code }}
desc_403: Sie haben keine Zugriffsberechtigung für diese Seite.
desc_404: Leider existiert diese Seite nicht.
desc_50X: Der Server ist auf einen Fehler gestoßen und konnte Ihre Anfrage nicht abschließen.
back_home: Zurück zur Startseite
page_maintenance:
desc: "Wir werden gewartet, wir sind bald wieder da."
nav_menus:
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Anpassen
themes: Themen
css-html: CSS/HTML
css_html: CSS/HTML
login: Anmeldung
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Administrator
@ -1095,6 +1323,7 @@ ui:
pending: Ausstehend
completed: Abgeschlossen
flagged: Gekennzeichnet
flagged_type: Flagged {{ type }}
created: Erstellt
action: Aktion
review: Rezension
@ -1122,7 +1351,7 @@ ui:
closed_name: schließen
closed_desc: "Eine geschlossene Frage kann nicht beantworten, kann aber trotzdem bearbeiten, abstimmen und kommentieren."
deleted_name: gelöschte
deleted_desc: Alle erworbenen und verlorenen Reputationen werden wiederhergestellt.
deleted_desc: This post will be deleted.
btn_cancel: Abbrechen
btn_submit: Senden
btn_next: Weiter
@ -1243,9 +1472,6 @@ ui:
label: Zeitzone
msg: Die Zeitzone darf nicht leer sein.
text: Wählen Sie eine Stadt in derselben Zeitzone wie Sie.
avatar:
label: Standard-Avatar
text: Für Benutzer ohne eigenen Avatar.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Fusszeile
text: Dies wird vor </html> eingefügt.
sidebar:
label: Sidebar
text: This will insert in sidebar.
login:
page_title: Anmeldung
membership:
title: Mitgliedschaft
label: Neuregistrierungen zulassen
text: Deaktivieren Sie diese Option, um zu verhindern, dass jemand ein neues Konto erstellt.
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: Privatgelände
label: Anmeldung erforderlich
text: Nur angemeldete Benutzer können auf diese Community zugreifen.
installed_plugins:
title: Installed Plugins
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 providers 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
form:
optional: (optional)
empty: kann nicht leer sein
invalid: ist ungültig
btn_submit: Speichern
not_found_props: "Erforderliche Eigenschaft {{ key }} nicht gefunden."
select: Select
page_review:
review: Rezension
proposed: vorgeschlagen
@ -1397,10 +1678,10 @@ ui:
closed: geschlossen
reopened: wiedereröffnet
created: erstellt
pin: pinned
unpin: unpinned
show: listed
hide: unlisted
pin: angeheftet
unpin: losgelöst
show: gelistet
hide: nicht gelistet
title: "Geschichte für"
tag_title: "Zeitleiste für"
show_votes: "Stimmen anzeigen"
@ -1415,8 +1696,8 @@ ui:
no_data: "Wir konnten nichts finden."
users:
title: Benutzer
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
users_with_the_most_reputation: Benutzer mit den höchsten Reputationspunkten dieser Woche
users_with_the_most_vote: Benutzer, die diese Woche am meisten gestimmt haben
staffs: Benutzer
reputation: ruf
votes: stimmen
@ -1427,8 +1708,8 @@ ui:
discard_confirm: Möchten Sie Ihren Entwurf wirklich verwerfen?
messages:
post_deleted: Dieser Beitrag wurde gelöscht.
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_pin: Dieser Beitrag wurde angepinnt.
post_unpin: Dieser Beitrag wurde losgelöst.
post_hide_list: Dieser Beitrag wurde aus der Liste verborgen.
post_show_list: Dieser Beitrag wird in der Liste angezeigt.
post_reopen: Dieser Beitrag wurde wieder geöffnet.

View File

@ -261,6 +261,9 @@ backend:
upload:
unsupported_file_format:
other: Unsupported file format.
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
@ -328,7 +331,7 @@ backend:
name:
other: needs delete
desc:
other: All reputation gained and lost will be restored.
other: This post will be deleted.
question:
close:
duplicate:
@ -504,6 +507,11 @@ ui:
all_read: Mark all as read
show_more: Show more
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Your Account has been Suspended
until_time: "Your account was suspended until {{ time }}."
@ -805,6 +813,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -925,7 +935,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -991,6 +1001,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -1000,6 +1016,7 @@ ui:
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.
@ -1056,6 +1073,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -1168,8 +1186,7 @@ ui:
accepted: Accepted
answered: answered
asked: asked
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderators
x_reputation: reputation
@ -1378,7 +1395,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1652,6 +1669,9 @@ ui:
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 providers API base. Ignored when empty.
profile_editable:
title: Profile Editable
allow_update_display_name:

View File

@ -11,6 +11,8 @@ backend:
other: No autorizado.
database_error:
other: Error en el servidor de datos.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Dispone de acceso total al sitio web y sus ajustes.
moderator:
other: Dispone de acceso a todas las publicaciones pero no a los ajustes de administrador.
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)
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: Correo electrónico
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: Contraseña o correo incorrecto.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: No puede modificar su contraseña.
@ -82,6 +145,8 @@ backend:
other: El correo debe ser verificado.
verify_url_expired:
other: La URL verificada del correo electrónico ha caducado. Por favor, vuelva a enviar el correo electrónico.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Archivo de idioma no encontrado.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: El rango no cumple la condición.
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: Error en el manejador del reporte.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Sin permiso para revisar.
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: Contraseña o correo incorrecto.
@ -171,6 +242,10 @@ backend:
other: No puedes modificar tu propio rol.
not_allowed_registration:
other: Actualmente el sitio no acepta registros
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Lectura de configuración fallida
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Formato de archivo no soportado.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: spam
desc:
other: Esta publicación es un anuncio o vandalismo. No es útil ni relevante para el tema actual.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: grosero o abusivo
other: rude or abusive
desc:
other: Una persona con juicio encontraría este contenido inapropiado para un discurso respuetuoso.
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: duplicado
other: a duplicate
desc:
other: La pregunta ya ha sido preguntada y resuelta previamente.
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: no una respuesta
other: not an answer
desc:
other: Esto fue publicado como una respuesta, pero no intenta responder a la pregunta. Posiblemente debería de ser una edición, un comentario, otra pregunta o directamente eliminado totalmente.
not_need:
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 necesario
other: no longer needed
desc:
other: El comentario está desactualizado, es altamente controvertido o ya no relevante para esta publicación.
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: otra razón
other: something else
desc:
other: Esta publicación requiere revisión por parte del gestor del sitio por alguna razón diferente a las anteriores.
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: respondida
modified:
other: modificada
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: Tu respuesta ha sido eliminada
your_comment_was_deleted:
other: Tu comentario ha sido eliminado
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -328,6 +503,7 @@ ui:
upgrade: Actualización de Answer
maintenance: Mantenimiento del sitio web
users: Usuarios
oauth_callback: Processing
http_404: HTTP Error 404
http_50X: HTTP Error 500
http_403: HTTP Error 403
@ -337,11 +513,18 @@ ui:
achievement: Logros
all_read: Marcar todo como leído
show_more: Mostrar más
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Tu cuenta ha sido suspendida
until_time: "Tu cuenta ha sido suspendida hasta el {{ time }}."
forever: Este usuario ha sido suspendido indefinidamente.
end: Has infringido alguna norma de la comunidad.
contact_us: Contact us
editor:
blockquote:
text: Cita
@ -548,7 +731,7 @@ ui:
Utiliza los comentarios para pedir más información o sugerir mejoras y modificaciones. Evita responder preguntas en los comentarios.
tip_answer: >-
Usa comentarios para responder a otros usuarios o notificarles de cambios. Si estás añadiendo nueva información, edita tu publicación en vez de comentar.
tip_vote: It adds something useful to the post
tip_vote: It adds something useful to the post
edit_answer:
title: Editar respuesta
default_reason: Editar respuesta
@ -630,6 +813,8 @@ ui:
logout: Cerrar sesión
admin: Administrador
review: Revisar
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Buscar
footer:
@ -654,7 +839,6 @@ ui:
msg:
empty: No puede estar en blanco.
login:
page_title: Bienvenido a {{site_name}}
login_to_continue: Inicia sesión para continuar
info_sign: '¿No tienes cuenta? <1>Regístrate</1>'
info_login: '¿Ya tienes una cuenta? <1>Inicia sesión</1>'
@ -665,6 +849,7 @@ ui:
msg:
empty: El nombre no puede estar vacío.
range: Nombre hasta 30 caracteres.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Correo electrónico
msg:
@ -684,7 +869,6 @@ ui:
msg:
empty: El correo electrónico no puede estar vacío.
change_email:
page_title: Bienvenido a {{site_name}}
btn_cancel: Cancelar
btn_update: Actualizar dirección de correo
send_success: >-
@ -693,6 +877,17 @@ ui:
label: Nuevo correo electrónico
msg:
empty: El correo electrónico no puede estar vacío.
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: Restablecimiento de Contraseña
btn_name: Restablecer mi contraseña
@ -711,6 +906,7 @@ ui:
label: Confirmar nueva contraseña
settings:
page_title: Ajustes
goto_modify: Go to Modify
nav:
profile: Perfil
notification: Notificaciones
@ -732,7 +928,7 @@ ui:
avatar:
label: Imagen de perfil
gravatar: Gravatar
gravatar_text: Puedes cambiar la imagen en <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Propia
btn_refresh: Actualizar
custom_text: Puedes subir tu propia imagen.
@ -759,8 +955,11 @@ ui:
change_email_info: >-
Te hemos enviado un email a esa dirección. Por favor sigue las instrucciones de confirmación.
email:
label: Correo electrónico
msg: El correo electrónico no puede estar vacío.
label: New Email
msg: New Email cannot be empty.
pass:
label: Current Password
msg: Password cannot be empty.
password_title: Contraseña
current_pass:
label: Contraseña actual
@ -777,6 +976,13 @@ ui:
lang:
label: Idioma de la Interfaz
text: Idioma de la interfaz de usuario. Cambiará cuando actualices la página.
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: actualización correcta
update_password: Contraseña cambiada con éxito.
@ -787,6 +993,12 @@ ui:
title: Preguntas relacionadas
btn: Añadir pregunta
answers: respuestas
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Preguntada
@ -796,12 +1008,13 @@ ui:
Views: Visto
Follow: Seguir
Following: Siguiendo
follow_tip: Follow this question to receive notifications
answered: respondida
closed_in: Cerrado el
show_exist: Mostrar una pregunta existente.
useful: Useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -849,6 +1062,7 @@ ui:
btns:
confirm: Confirmar
cancel: Cancelar
edit: Edit
save: Guardar
delete: Eliminar
login: Acceder
@ -861,6 +1075,10 @@ ui:
skip: Omitir
discard_draft: Descartar borrador
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Resultados de la búsqueda
keywords: Palabras claves
@ -895,7 +1113,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Bienvenido a {{site_name}}
success: Tu nueva cuenta ha sido confirmada, serás redirigido a la página de inicio.
link: Continuar a la página de inicio
invalid: >-
@ -956,8 +1173,7 @@ ui:
accepted: Aceptada
answered: respondida
asked: preguntó
upvote: votar a favor
downvote: voto negativo
downvoted: downvoted
mod_short: Modificación
mod_long: Moderadores
x_reputation: reputación
@ -1019,6 +1235,7 @@ ui:
admin_name:
label: Nombre
msg: El nombre no puede estar vacío.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Contraseña
text: >-
@ -1076,8 +1293,19 @@ ui:
seo: ESTE
customize: Personalizar
themes: Temas
css-html: CSS/HTML
css_html: CSS/HTML
login: Iniciar sesión
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Administrador
@ -1120,6 +1348,7 @@ ui:
pending: Pendiente
completed: Terminado
flagged: Marcado
flagged_type: Flagged {{ type }}
created: Creado
action: Acción
review: Revisar
@ -1147,7 +1376,7 @@ ui:
closed_name: cerrada
closed_desc: "Una pregunta cerrada no puede responder, pero aún puede editar, votar y comentar."
deleted_name: eliminado
deleted_desc: Toda la reputación ganada y perdida será restaurada.
deleted_desc: This post will be deleted.
btn_cancel: Cancelar
btn_submit: Entregar
btn_next: Próximo
@ -1268,9 +1497,6 @@ ui:
label: Zona horaria
msg: Timezone cannot be empty.
text: Elija una ciudad en la misma zona horaria que usted.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1380,22 +1606,77 @@ ui:
footer:
label: Pie de página
text: Esto se insertará antes de </html>.
sidebar:
label: Sidebar
text: This will insert in sidebar.
login:
page_title: Iniciar sesión
membership:
title: Membresía
label: Permitir registro de nuevas ceuntas
text: Desactiva esto para evitar que cualquier persona pueda crear una cuenta.
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: Privado
label: Inicio de sesión requerido
text: Sólo usuarios con sesión iniciada pueden acceder a esta comunidad.
installed_plugins:
title: Installed Plugins
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 providers 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
form:
optional: (optional)
empty: no puede estar en blanco
invalid: no es válido
btn_submit: Guardar
not_found_props: "La propiedad requerida {{ key }} no se ha encontrado."
select: Select
page_review:
review: Revisar
proposed: propuesto

View File

@ -11,25 +11,31 @@ backend:
other: Non autorisé.
database_error:
other: Erreur du serveur de données.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
edit:
other: Edit
other: Éditer
delete:
other: Delete
other: Supprimer
close:
other: Close
other: Fermer
reopen:
other: Reopen
other: Rouvrir
forbidden_error:
other: Forbidden.
pin:
other: Pin
other: Épingler
hide:
other: Unlist
other: Délister
unpin:
other: Unpin
other: Désépingler
show:
other: List
other: Liste
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Possède tous les droits pour accéder au site.
moderator:
other: Possède les accès à tous les messages sauf aux paramètres d'administration.
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)
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
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: L'email et le mot de passe ne correspondent pas.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: Vous ne pouvez pas modifier votre mot de passe.
@ -82,6 +145,8 @@ backend:
other: L'adresse e-mail doit être vérifiée.
verify_url_expired:
other: L'URL de vérification de l'email a expiré, veuillez renvoyer l'email.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Fichier de langue non trouvé.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: Le rang ne remplit pas la condition.
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: La gestion du rapport a échoué.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Vous n'êtes pas autorisé à Vérifier.
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: L'email et le mot de passe ne correspondent pas.
@ -171,6 +242,10 @@ backend:
other: Vous ne pouvez pas modifier votre rôle.
not_allowed_registration:
other: Actuellement, le site n'est pas ouvert aux inscriptions
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: La lecture de la configuration a échoué
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Format de fichier non supporté.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: spam
desc:
other: Ce message est une publicité ou un vandalisme. Il n'est pas utile ou pertinent pour le sujet actuel.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: grossier ou abusif
other: rude or abusive
desc:
other: Une personne raisonnable jugerait que ce contenu est inapproprié pour un discours respectueux.
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: doublon
other: a duplicate
desc:
other: Cette question a déjà été posée auparavant et a déjà une réponse.
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: ce n'est pas une réponse
other: not an answer
desc:
other: Cela a été posté comme une réponse, mais il n'essaie pas de répondre à la question. Il devrait s'agir d'une modification, d'un commentaire, d'une autre question, ou d'une suppression totale.
not_need:
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: nest plus nécessaire
other: no longer needed
desc:
other: Ce commentaire est obsolète, conversationnel ou non pertinent pour ce post.
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: quelque chose d'autre
other: something else
desc:
other: Ce message nécessite l'attention du personnel pour une autre raison non listée ci-dessus.
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: a répondu
modified:
other: modifié
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: Votre réponse a bien été supprimée
your_comment_was_deleted:
other: Votre commentaire a été supprimé
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,20 +482,28 @@ ui:
upgrade: Mise à jour d'Answer
maintenance: Maintenance du site
users: Utilisateurs
oauth_callback: Processing
http_404: Erreur HTTP 404
http_50X: Erreur HTTP 500
http_403: HTTP Error 403
http_403: Erreur HTTP 403
notifications:
title: Notifications
inbox: Boîte de réception
achievement: Succès
all_read: Tout marquer comme lu
show_more: Afficher plus
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Votre compte a été suspendu
until_time: "Votre compte a été suspendu jusqu'au {{ time }}."
forever: Cet utilisateur a été suspendu pour toujours.
end: Vous ne respectez pas les directives de la communauté.
contact_us: Contact us
editor:
blockquote:
text: Bloc de citation
@ -527,7 +710,7 @@ ui:
Utilisez les commentaires pour demander plus d'informations ou suggérer des améliorations. Évitez de répondre aux questions dans les commentaires.
tip_answer: >-
Utilisez des commentaires pour répondre à d'autres utilisateurs ou leur signaler des modifications. Si vous ajoutez de nouvelles informations, modifiez votre message au lieu de commenter.
tip_vote: It adds something useful to the post
tip_vote: It adds something useful to the post
edit_answer:
title: Modifier la réponse
default_reason: Modifier la réponse
@ -609,6 +792,8 @@ ui:
logout: Se déconnecter
admin: Administration
review: Vérifier
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Rechercher
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Ne peut pas être vide.
login:
page_title: Bienvenue sur {{site_name}}
login_to_continue: Connectez-vous pour continuer
info_sign: Vous n'avez pas de compte ? <1>Inscrivez-vous</1>
info_login: Vous avez déjà un compte ? <1>Connectez-vous</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Le nom ne peut pas être vide.
range: Le nom doit contenir moins de 30 caractères.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: L'e-mail ne peut pas être vide.
change_email:
page_title: Bienvenue sur {{site_name}}
btn_cancel: Annuler
btn_update: Mettre à jour l'adresse e-mail
send_success: >-
@ -672,6 +856,17 @@ ui:
label: Nouvel e-mail
msg:
empty: L'email ne peut pas être vide.
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: Réinitialiser le mot de passe
btn_name: Réinitialiser mon mot de passe
@ -690,6 +885,7 @@ ui:
label: Confirmer le nouveau mot de passe
settings:
page_title: Paramètres
goto_modify: Go to Modify
nav:
profile: Profil
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Image de profil
gravatar: Gravatar
gravatar_text: Vous pouvez changer d'image sur <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Personnaliser
btn_refresh: Actualiser
custom_text: Vous pouvez charger votre image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
Nous vous avons envoyé un mail à cette adresse. Merci de suivre les instructions.
email:
label: E-mail
msg: L'e-mail ne peut pas être vide.
label: New Email
msg: New Email cannot be empty.
pass:
label: Current Password
msg: Password cannot be empty.
password_title: Mot de passe
current_pass:
label: Mot de passe actuel
@ -756,6 +955,13 @@ ui:
lang:
label: Langue de l'interface
text: Langue de l'interface utilisateur. Cela changera lorsque vous rafraîchissez la 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: mise à jour effectuée
update_password: Mot de passe changé avec succès.
@ -766,6 +972,12 @@ ui:
title: Questions liées
btn: Ajouter une question
answers: réponses
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Demandé
@ -775,14 +987,15 @@ ui:
Views: Consultée
Follow: Sabonner
Following: Abonné(s)
follow_tip: Follow this question to receive notifications
answered: répondu
closed_in: Fermé dans
show_exist: Afficher la question existante.
useful: Useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
useful: Utile
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: C'est utile
answer_un_useful: Ce n'est pas utile
answers:
title: Réponses
score: Score
@ -800,19 +1013,19 @@ ui:
empty: La réponse ne peut être vide.
characters: le contenu doit comporter au moins 6 caractères.
tips:
header_1: Thanks for your answer
li1_1: Please be sure to <strong>answer the question</strong>. Provide details and share your research.
li1_2: Back up any statements you make with references or personal experience.
header_2: But <strong>avoid</strong> ...
li2_1: Asking for help, seeking clarification, or responding to other answers.
header_1: Merci pour votre réponse
li1_1: Noubliez pas de <strong>répondre à la question</strong>. Fournissez des détails et partagez vos recherches.
li1_2: Sauvegardez toutes les déclarations que vous faites avec des références ou une expérience personnelle.
header_2: Mais <strong>évitez</strong>...
li2_1: Demander de laide, chercher des éclaircissements ou répondre à dautres réponses.
reopen:
confirm_btn: Reopen
confirm_btn: Rouvrir
title: Rouvrir ce message
content: Êtes-vous sûr de vouloir rouvrir ?
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: Épingler cet article
content: Êtes-vous sûr de vouloir l'épingler globalement ? Ce message apparaîtra en haut de toutes les listes de messages.
confirm_btn: Épingler
delete:
title: Supprimer la publication
question: >-
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confimer
cancel: Annuler
edit: Edit
save: Enregistrer
delete: Supprimer
login: Se connecter
@ -835,7 +1049,11 @@ ui:
reject: Rejeter
skip: Ignorer
discard_draft: Abandonner le brouillon
pinned: Pinned
pinned: Épinglé
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Résultats de la recherche
keywords: Mots-clés
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Erreur...
account_result:
page_title: Bienvenue sur {{site_name}}
success: Votre nouveau compte est confirmé; vous serez redirigé vers la page d'accueil.
link: Continuer vers la page d'accueil
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepté
answered: a répondu
asked: a demandé
upvote: voter pour
downvote: voter contre
downvoted: downvoted
mod_short: Modérateurs
mod_long: Modérateurs
x_reputation: réputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Nom
msg: Le nom ne peut pas être vide.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Mot de passe
text: >-
@ -1025,11 +1242,11 @@ ui:
answers: réponses
accepted: Accepté
page_error:
http_error: HTTP Error {{ code }}
desc_403: You dont 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: Erreur HTTP {{ code }}
desc_403: Vous n'avez pas la permission d'accéder à cette page.
desc_404: Malheureusement, cette page n'existe pas.
desc_50X: Le serveur a rencontré une erreur et n'a pas pu répondre à votre requête.
back_home: Retour à la page d'accueil
page_maintenance:
desc: "Nous sommes en maintenance, nous serons bientôt de retour."
nav_menus:
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Personnaliser
themes: Thèmes
css-html: CSS/HTML
css_html: CSS/HTML
login: Se connecter
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: En attente
completed: Complété
flagged: Signalé
flagged_type: Flagged {{ type }}
created: Créé
action: Action
review: Vérification
@ -1122,7 +1351,7 @@ ui:
closed_name: fermé
closed_desc: "Une question fermée ne peut pas être répondue, mais peut-être quand même modifiée, votée et commentée."
deleted_name: supprimé
deleted_desc: Tous les points de réputation gagnés et perdus seront restaurés.
deleted_desc: This post will be deleted.
btn_cancel: Annuler
btn_submit: Valider
btn_next: Suivant
@ -1243,9 +1472,6 @@ ui:
label: Fuseau Horaire
msg: Le fuseau horaire ne peut pas être vide.
text: Choisissez une ville dans le même fuseau horaire que vous.
avatar:
label: Avatar par défaut
text: Pour les utilisateurs sans avatar personnalisé.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: Ceci va être inséré avant </html>.
sidebar:
label: Sidebar
text: This will insert in sidebar.
login:
page_title: Se connecter
membership:
title: Adhésion
label: Autoriser les inscriptions
text: Désactivez pour empêcher quiconque de créer un nouveau compte.
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: Privé
label: Connexion requise
text: Seuls les utilisateurs connectés peuvent accéder à cette communauté.
installed_plugins:
title: Installed Plugins
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 providers 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
form:
optional: (optionnel)
empty: ne peut pas être vide
invalid: est invalide
btn_submit: Sauvegarder
not_found_props: "La propriété requise {{ key }} est introuvable."
select: Select
page_review:
review: Vérifier
proposed: proposé
@ -1397,10 +1678,10 @@ ui:
closed: fermé
reopened: réouvert
created: créé
pin: pinned
unpin: unpinned
show: listed
hide: unlisted
pin: épinglé
unpin: non épinglé
show: listé
hide: non listé
title: "Historique de"
tag_title: "Chronologie de"
show_votes: "Afficher les votes"
@ -1415,8 +1696,8 @@ ui:
no_data: "Nous n'avons rien pu trouver."
users:
title: Utilisateurs
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
users_with_the_most_reputation: Utilisateurs ayant le score de réputation le plus élevé cette semaine
users_with_the_most_vote: Utilisateurs qui ont le plus voté cette semaine
staffs: Staff de la communauté
reputation: réputation
votes: votes
@ -1427,8 +1708,8 @@ ui:
discard_confirm: Êtes-vous sûr de vouloir abandonner ce brouillon ?
messages:
post_deleted: Ce message a été supprimé.
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_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.
post_show_list: Ce message a été affiché dans la liste.
post_reopen: Ce message a été rouvert.

View File

@ -11,6 +11,8 @@ backend:
other: Tidak diizinkan.
database_error:
other: Kesalahan data server.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Memiliki hak penuh untuk mengakses website.
moderator:
other: Memiliki hak penuh pada semua pertanyaan, kecuali pengaturan Admin.
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)
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
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: Email dan kata sandi tidak cocok.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: You cannot modify your password.
@ -82,6 +145,8 @@ backend:
other: Email harus terverifikasi.
verify_url_expired:
other: URL verifikasi email telah kadaluwarsa, silahkan kirim ulang.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Bahasa tidak ditemukan.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: Peringkat gagal memenuhi syarat.
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: Laporan penanganan gagal.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Tidak memiliki izin untuk merevisi.
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 dan kata sandi tidak cocok.
@ -171,6 +242,10 @@ backend:
other: Anda tidak dapat memodifikasi role anda sendiri.
not_allowed_registration:
other: Website tidak membuka pendaftaran baru untuk saat ini
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Gagal membaca konfigurasi
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Unsupported file format.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: Spam
other: spam
desc:
other: Posting ini adalah iklan, atau vandalisme. Tidak berguna atau relevan dengan topik saat ini.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: kasar atau kejam
other: rude or abusive
desc:
other: Orang yang berakal sehat akan menganggap konten ini tidak pantas untuk wacana yang terhormat.
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: Duplikat
other: a duplicate
desc:
other: Pertanyaan ini telah ditanyakan sebelumnya dan sudah ada jawabannya.
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: bukan jawaban
other: not an answer
desc:
other: Ini diposting sebagai jawaban, tetapi tidak menjawab pertanyaan. Itu mungkin berupa suntingan, komentar, pertanyaan lain, atau telah dihapus sepenuhnya.
not_need:
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: tidak Dibutuhkan Lagi
other: no longer needed
desc:
other: Komentar ini kedaluwarsa, sesuai percakapan, atau tidak relevan dengan postingan ini.
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: lainnya
other: something else
desc:
other: Posting ini membutuhkan perhatian staf karena alasan lain yang tidak tercantum di atas.
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: dijawab
modified:
other: dimodifikasi
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: Jawabanmu telah dihapus
your_comment_was_deleted:
other: Komentarmu telah dihapus
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
upgrade: Meng-upgrade Answer
maintenance: Pemeliharaan Website
users: Pengguna
oauth_callback: Processing
http_404: HTTP Error 404
http_50X: HTTP Error 500
http_403: HTTP Error 403
@ -316,11 +492,18 @@ ui:
achievement: Pencapaian
all_read: Tandai Semua Jika Sudah Dibaca
show_more: Tampilkan lebih banyak
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Akun Anda telah ditangguhkan
until_time: "Akun anda ditangguhkan sampai {{ time }}."
forever: Pengguna ini ditangguhkan selamanya.
end: Anda tidak sesuai dengan syarat pedoman komunitas.
contact_us: Contact us
editor:
blockquote:
text: Blockquote
@ -527,7 +710,7 @@ ui:
Gunakan komentar untuk meminta informasi lebih lanjut atau menyarankan perbaikan. Hindari menjawab pertanyaan di komentar.
tip_answer: >-
Gunakan komentar untuk membalas pengguna lain atau memberi tahu mereka tentang perubahan. Jika Anda menambahkan informasi baru, cukup edit posting Anda.
tip_vote: It adds something useful to the post
tip_vote: It adds something useful to the post
edit_answer:
title: Sunting jawaban
default_reason: Edit jawaban
@ -609,6 +792,8 @@ ui:
logout: Keluar
admin: Admin
review: Ulasan
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Cari
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Tidak bisa kosong.
login:
page_title: Selamat datang ke {{site_name}}
login_to_continue: Masuk untuk melanjutkan
info_sign: Belum punya akun? <1>Daftar</1>
info_login: Sudah punya akun? <1>Masuk</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Nama tidak boleh kosong.
range: Nama harus menunjukkan 1-30 karakter.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: Email tidak boleh kosong.
change_email:
page_title: Welcome to {{site_name}}
btn_cancel: Batal
btn_update: Perbarui alamat email
send_success: >-
@ -672,6 +856,17 @@ ui:
label: Email Baru
msg:
empty: Email tidak boleh kosong.
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: Atur ulang kata sandi
btn_name: Atur ulang kata sandi saya
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: Email
msg: Email cannot be empty.
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
@ -756,6 +955,13 @@ ui:
lang:
label: Bahasa Antarmuka
text: Bahasa antarmuka pengguna. Itu akan berubah ketika Anda me-refresh halaman.
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: pembaruan sukses
update_password: Kata sandi berhasil diganti.
@ -766,6 +972,12 @@ ui:
title: Pertanyaan Terkait
btn: Tambahkan pertanyaan
answers: jawaban
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Ditanyakan
@ -775,12 +987,13 @@ ui:
Views: Dilihat
Follow: Ikuti
Following: Mengikuti
follow_tip: Follow this question to receive notifications
answered: dijawab
closed_in: Ditutup pada
show_exist: Gunakan pertanyaan yang sudah ada.
useful: Useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Konfirmasi
cancel: Batal
edit: Edit
save: Simpan
delete: Hapus
login: Masuk
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Welcome to {{site_name}}
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Diterima
answered: dijawab
asked: ditanyakan
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderator
x_reputation: reputasi
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Password
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Kostumisasi
themes: Tema
css-html: CSS/HTML
css_html: CSS/HTML
login: Masuk
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
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

View File

@ -11,6 +11,8 @@ backend:
other: Non autorizzato
database_error:
other: Errore server dati
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Avere il pieno potere di accedere al sito.
moderator:
other: Ha accesso a tutti i post tranne le impostazioni di amministratore.
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)
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: E-mail
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: Email o password errati
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: You cannot modify your password.
@ -82,6 +145,8 @@ backend:
other: email deve essere verificata
verify_url_expired:
other: l'url di verifica email è scaduto, si prega di reinviare la email
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: lingua non trovata
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: Condizioni non valide per il grado
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: Gestione del report fallita
@ -154,6 +221,10 @@ backend:
no_permission:
other: Nessun permesso per la revisione.
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 o password errati
@ -171,6 +242,10 @@ backend:
other: Non puoi modificare il tuo ruolo.
not_allowed_registration:
other: Al momento il sito non è aperto per la registrazione
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Read config failed
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Unsupported file format.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: posta indesiderata
other: spam
desc:
other: Questo articolo è una pubblicità o vandalismo. Non è utile o rilevante all'argomento corrente.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: scortese o violento
other: rude or abusive
desc:
other: Una persona ragionevole trova questo contenuto inappropriato a un discorso rispettoso.
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: duplicato
other: a duplicate
desc:
other: Questa domanda è già stata posta e ha già una risposta.
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: non è una risposta
other: not an answer
desc:
other: Questo è stato pubblicato come una risposta, ma non tenta di rispondere alla domanda. Dovrebbe forse essere una modifica, un commento, un'altra domanda, o cancellata del tutto.
not_need:
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
other: no longer needed
desc:
other: Questo commento è obsoleto, conversazionale o non pertinente per questo post.
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: altro
other: something else
desc:
other: Questo articolo richiede una supervisione dello staff per altre ragioni non listate sopra.
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: answered
modified:
other: modified
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: la tua risposta è stata rimossa
your_comment_was_deleted:
other: il tuo commento è stato rimosso
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
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
@ -316,11 +492,18 @@ ui:
achievement: Achievements
all_read: Mark all as read
show_more: Show more
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
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
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Edit Answer
default_reason: Edit answer
@ -609,6 +792,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Cannot be empty.
login:
page_title: Welcome to {{site_name}}
login_to_continue: Log in to continue
info_sign: Don't have an account? <1>Sign up</1>
info_login: Already have an account? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Name cannot be empty.
range: Name up to 30 characters.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: Email cannot be empty.
change_email:
page_title: Welcome to {{site_name}}
btn_cancel: Cancel
btn_update: Update email address
send_success: >-
@ -672,6 +856,17 @@ ui:
label: New Email
msg:
empty: Email cannot be empty.
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
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: Email
msg: Email cannot be empty.
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
@ -756,6 +955,13 @@ ui:
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.
@ -766,6 +972,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -775,12 +987,13 @@ ui:
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_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Welcome to {{site_name}}
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepted
answered: answered
asked: asked
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderators
x_reputation: reputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Password
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Customize
themes: Themes
css-html: CSS/HTML
css_html: CSS/HTML
login: Login
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
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

View File

@ -11,6 +11,8 @@ backend:
other: 権限がありません。
database_error:
other: データサーバーエラー
forbidden_error:
other: Forbidden.
action:
report:
other: フラグ
@ -22,6 +24,8 @@ backend:
other: 閉じる
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
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)
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: メールアドレス
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: メールアドレスとパスワードが一致しません。
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: パスワードは変更できません。
@ -82,6 +145,8 @@ backend:
other: 電子メールを確認する必要があります。
verify_url_expired:
other: メール認証済みURLの有効期限が切れています。メールを再送信してください。
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: 言語ファイルが見つかりません。
@ -119,7 +184,9 @@ backend:
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: 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: レポートの処理に失敗しました。
@ -154,6 +221,10 @@ backend:
no_permission:
other: No permission to Revision.
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: メールアドレスとパスワードが一致しません。
@ -171,6 +242,10 @@ backend:
other: You cannot modify your role.
not_allowed_registration:
other: Currently the site is not open for registration
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Read config failed
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Unsupported file format.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: スパム
other: spam
desc:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude:
rude_or_abusive:
name:
other: rude or abusive
desc:
other: A reasonable person would find this content inappropriate for respectful discourse.
duplicate:
a_duplicate:
name:
other: a duplicate
desc:
other: This question has been asked before and already has an answer.
not_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.
not_need:
no_longer_needed:
name:
other: no longer needed
desc:
other: This comment is outdated, conversational or not relevant to this post.
other:
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: 回答済み
modified:
other: 修正済み
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
upgrade: Answer Upgrade
maintenance: Website Maintenance
users: ユーザー
oauth_callback: Processing
http_404: HTTP エラー 404
http_50X: HTTP エラー 500
http_403: HTTP エラー 403
@ -316,11 +492,18 @@ ui:
achievement: Achievements
all_read: Mark all as read
show_more: もっと見る
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: あなたのアカウントは停止されています。
until_time: "あなたのアカウントは {{ time }} まで停止されました。"
forever: このユーザーは永久に停止されました。
end: You don't meet a community guideline.
contact_us: Contact us
editor:
blockquote:
text: 引用
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Edit Answer
default_reason: Edit answer
@ -609,6 +792,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Cannot be empty.
login:
page_title: '{{site_name}} へようこそ'
login_to_continue: Log in to continue
info_sign: Don't have an account? <1>Sign up</1>
info_login: Already have an account? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Name cannot be empty.
range: Name up to 30 characters.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: メールアドレス
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: メールアドレスを入力してください。
change_email:
page_title: '{{site_name}} へようこそ'
btn_cancel: キャンセル
btn_update: メールアドレスを更新
send_success: >-
@ -672,6 +856,17 @@ ui:
label: New Email
msg:
empty: Email cannot be empty.
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: パスワード再設定
btn_name: パスワードをリセット
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: メールアドレス
msg: Email cannot be empty.
label: New Email
msg: New Email cannot be empty.
pass:
label: Current Password
msg: Password cannot be empty.
password_title: パスワード
current_pass:
label: 現在のパスワード
@ -756,6 +955,13 @@ ui:
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.
@ -766,6 +972,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -775,12 +987,13 @@ ui:
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_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: '{{site_name}} へようこそ'
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepted
answered: answered
asked: 質問済み
upvote: 賛成
downvote: 反対票を投じる
downvoted: downvoted
mod_short: Mod
mod_long: モデレーター
x_reputation: reputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: パスワード
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: カスタマイズ
themes: テーマ
css-html: CSS/HTML
css_html: CSS/HTML
login: ログイン
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: 管理者
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
form:
optional: (optional)
empty: cannot be empty
invalid: is invalid
btn_submit: 保存
not_found_props: "Required property {{ key }} not found."
select: Select
page_review:
review: Review
proposed: proposed

View File

@ -11,6 +11,8 @@ backend:
other: Não autorizado.
database_error:
other: Erro no servidor de dados.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Possui acesso total ao site.
moderator:
other: Possui acesso a todas as postagens exceto às configurações de usuários.
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)
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: E-mail
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: O e-mail e a palavra-passe não coincidem.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: You cannot modify your password.
@ -82,6 +145,8 @@ backend:
other: O e-mail deve ser verificado.
verify_url_expired:
other: O e-mail verificado URL expirou, por favor, reenvie o e-mail.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Arquivo de idioma não encontrado.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: O nível não consegue satisfazer a condição.
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: Falha ao manusear relatório.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Sem permissão de modificação.
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: O e-mail e a senha não conferem.
@ -171,6 +242,10 @@ backend:
other: Você não pode modificar a sua função.
not_allowed_registration:
other: O site não está aberto para novos registros
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Falha ao ler configuração
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Formato de arquivo não suportado.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: spam
desc:
other: Essa postagem é um anúncio, ou vandalismo. Não é útil ou relevante para o tópico atual.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: rude ou abusivo
other: rude or abusive
desc:
other: A reasonable person would find this content inappropriate for respectful discourse.
duplicate:
a_duplicate:
name:
other: a duplicate
desc:
other: This question has been asked before and already has an answer.
not_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.
not_need:
no_longer_needed:
name:
other: no longer needed
desc:
other: This comment is outdated, conversational or not relevant to this post.
other:
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: answered
modified:
other: modified
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
upgrade: Atualização do Answer
maintenance: Manutenção do website
users: Usuários
oauth_callback: Processing
http_404: HTTP Error 404
http_50X: HTTP Error 500
http_403: HTTP Error 403
@ -316,11 +492,18 @@ ui:
achievement: Conquistas
all_read: Marcar todos como lida
show_more: Mostrar mais
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: A sua conta foi suspensa
until_time: "Sua conta está suspensa até {{ time }}."
forever: Este usuário foi suspenso permanentemente.
end: Você não atende a uma diretriz da comunidade.
contact_us: Contact us
editor:
blockquote:
text: Bloco de citação
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Edit Answer
default_reason: Edit answer
@ -609,6 +792,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Cannot be empty.
login:
page_title: Welcome to {{site_name}}
login_to_continue: Log in to continue
info_sign: Don't have an account? <1>Sign up</1>
info_login: Already have an account? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Name cannot be empty.
range: Name up to 30 characters.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: Email cannot be empty.
change_email:
page_title: Welcome to {{site_name}}
btn_cancel: Cancel
btn_update: Update email address
send_success: >-
@ -672,6 +856,17 @@ ui:
label: New Email
msg:
empty: Email cannot be empty.
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
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: Email
msg: Email cannot be empty.
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
@ -756,6 +955,13 @@ ui:
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.
@ -766,6 +972,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -775,12 +987,13 @@ ui:
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_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Welcome to {{site_name}}
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepted
answered: answered
asked: asked
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderators
x_reputation: reputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Password
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Customize
themes: Themes
css-html: CSS/HTML
css_html: CSS/HTML
login: Login
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
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

View File

@ -11,6 +11,8 @@ backend:
other: Авторизация не выполнена.
database_error:
other: Ошибка сервера данных.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Имейте все полномочия для доступа к сайту.
moderator:
other: Имеет доступ ко всем сообщениям, кроме настроек администратора.
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)
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: Эл. почта
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: Неверное имя пользователя или пароль.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: You cannot modify your password.
@ -82,6 +145,8 @@ backend:
other: Адрес электронной почты должен быть подтвержден.
verify_url_expired:
other: Срок действия подтверждённого адреса электронной почты истек, пожалуйста, отправьте письмо повторно.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Языковой файл не найден.
@ -119,7 +184,9 @@ backend:
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: 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: Не удалось обработать отчет.
@ -154,6 +221,10 @@ backend:
no_permission:
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.
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.
@ -171,6 +242,10 @@ backend:
other: You cannot modify your role.
not_allowed_registration:
other: Currently the site is not open for registration
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Read config failed
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Unsupported file format.
report:
site_info:
config_not_found:
other: Site config 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:
rude_or_abusive:
name:
other: rude or abusive
desc:
other: A reasonable person would find this content inappropriate for respectful discourse.
duplicate:
a_duplicate:
name:
other: a duplicate
desc:
other: This question has been asked before and already has an answer.
not_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.
not_need:
no_longer_needed:
name:
other: no longer needed
desc:
other: This comment is outdated, conversational or not relevant to this post.
other:
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: answered
modified:
other: modified
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
upgrade: Обновить ответ
maintenance: Обслуживание сайта
users: Пользователи
oauth_callback: Processing
http_404: HTTP Error 404
http_50X: HTTP Error 500
http_403: HTTP Error 403
@ -316,11 +492,18 @@ ui:
achievement: Достижения
all_read: Отметить всё как прочитанное
show_more: Показать еще
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Ваш аккаунт заблокирован
until_time: "Ваша учетная запись была заблокирована до {{ time }}."
forever: Этот пользователь был навсегда заблокирован.
end: Вы не соответствуете правилам сообщества.
contact_us: Contact us
editor:
blockquote:
text: Цитата
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Edit Answer
default_reason: Edit answer
@ -609,6 +792,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Cannot be empty.
login:
page_title: Welcome to {{site_name}}
login_to_continue: Log in to continue
info_sign: Don't have an account? <1>Sign up</1>
info_login: Already have an account? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Name cannot be empty.
range: Name up to 30 characters.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: Email cannot be empty.
change_email:
page_title: Welcome to {{site_name}}
btn_cancel: Cancel
btn_update: Update email address
send_success: >-
@ -672,6 +856,17 @@ ui:
label: New Email
msg:
empty: Email cannot be empty.
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
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: Email
msg: Email cannot be empty.
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
@ -756,6 +955,13 @@ ui:
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.
@ -766,6 +972,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -775,12 +987,13 @@ ui:
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_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Welcome to {{site_name}}
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepted
answered: answered
asked: asked
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderators
x_reputation: reputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Password
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Customize
themes: Themes
css-html: CSS/HTML
css_html: CSS/HTML
login: Login
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
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

View File

@ -11,6 +11,8 @@ backend:
other: Neoprávnené.
database_error:
other: Chyba dátového servera.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: Má plnú moc a prístup ku stránke.
moderator:
other: Má prístup ku všetkým príspevkom okrem nastavenia správcu.
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)
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: E-mail
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: E-mail a heslo sa nezhodujú.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: Svoje heslo upraviť.
@ -82,6 +145,8 @@ backend:
other: E-mail by sa mal overiť.
verify_url_expired:
other: Platnosť overenej adresy URL e-mailu vypršala, pošlite e-mail znova.
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: Jazykový súbor sa nenašiel.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: Poradie nespĺňa podmienku.
vote_fail_to_meet_the_condition:
other: Thanks for the feedback. You need at least {{ rank }} reputation to cast a vote.
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: Spracovanie prehľadu zlyhalo.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Žiadne povolenie na revíziu.
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: E-mail a heslo sa nezhodujú.
@ -171,6 +242,10 @@ backend:
other: Svoju rolu nemôžete zmeniť.
not_allowed_registration:
other: V súčasnosti nie je stránka otvorená na registráciu
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Read Config zlyhal
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Nepodporovaný formát súboru.
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: nevyžiadaná pošta
other: spam
desc:
other: Tento príspevok je reklama alebo vandalizmus. Nie je to užitočné ani relevantné pre aktuálnu tému.
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: hrubý alebo urážlivý
other: rude or abusive
desc:
other: Rozumný človek by považoval tento obsah za nevhodný na zdvorilý prejav.
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: duplikát
other: a duplicate
desc:
other: Táto otázka už bola položená a už má odpoveď.
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: nie odpoveď
other: not an answer
desc:
other: Toto bolo uverejnené ako odpoveď, ale nepokúša sa odpovedať na otázku. Možno by to mala byť úprava, komentár, iná otázka, alebo úplne vymazané.
not_need:
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: už nie sú potrebné
other: no longer needed
desc:
other: Tento komentár je zastaraný, konverzačný alebo nesúvisí s týmto príspevkom.
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: niečo iné
other: something else
desc:
other: Tento príspevok si vyžaduje pozornosť zamestnancov z iného dôvodu, ktorý nie je uvedený vyššie.
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: zodpovedaný
modified:
other: upravený
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: Vaša odpoveď bola odstránená
your_comment_was_deleted:
other: Váš komentár bol odstránený
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
upgrade: Answer Upgrade
maintenance: Údržba webových stránok
users: Užívatelia
oauth_callback: Processing
http_404: HTTP chyba 404
http_50X: HTTP chyba 403
http_403: HTTP Error 403
@ -316,11 +492,18 @@ ui:
achievement: Úspechy
all_read: Označiť všetko ako prečítané
show_more: Zobraziť viac
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Váš účet bol pozastavený
until_time: "Váš účet bol pozastavený do {{ time }}."
forever: Tento používateľ bol navždy pozastavený.
end: Nespĺňate pokyny pre komunitu.
contact_us: Contact us
editor:
blockquote:
text: Blockquote
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Uprav odpoveď
default_reason: Uprav odpoveď
@ -609,6 +792,8 @@ ui:
logout: Odhlásiť sa
admin: Správca
review: Preskúmanie
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Vyhľadávanie
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Nemôže byť prázdny.
login:
page_title: Vitajte na stránke {{site_name}}
login_to_continue: Pre pokračovanie sa prihláste
info_sign: Nemáte účet? <1>Sign up</1>
info_login: Máte už účet? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Prihlasovacie meno nemôže byť prázdne.
range: Prihlasovacie meno nesmie mať viac ako 30 znakov.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: E-mail
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: E-mail nemôže byť prázdny.
change_email:
page_title: Vitajte na stránke {{site_name}}
btn_cancel: Zrušiť
btn_update: Aktualizovať e-mailovú adresu
send_success: >-
@ -672,6 +856,17 @@ ui:
label: Nový e-mail
msg:
empty: E-mail nemôže byť prázdny.
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: Resetovanie hesla
btn_name: Obnoviť heslo
@ -690,6 +885,7 @@ ui:
label: Potvrďte nové heslo
settings:
page_title: Nastavenia
goto_modify: Go to Modify
nav:
profile: Profil
notification: Oznámenia
@ -711,7 +907,7 @@ ui:
avatar:
label: Profilová fotka
gravatar: Gravatar
gravatar_text: Obrázok môžete zmeniť na <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Vlastný
btn_refresh: Obnoviť
custom_text: Môžete nahrať svoj obrázok.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
Na túto adresu sme poslali e-mail. Postupujte podľa pokynov na potvrdenie.
email:
label: E-mail
msg: E-mail nemôže byť prázdny.
label: New Email
msg: New Email cannot be empty.
pass:
label: Current Password
msg: Password cannot be empty.
password_title: Heslo
current_pass:
label: Aktuálne heslo
@ -756,6 +955,13 @@ ui:
lang:
label: Jazyk rozhrania
text: Jazyk používateľského rozhrania. Zmení sa pri obnove stránky.
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: aktualizácia úspešna
update_password: Heslo bolo úspešne zmenené.
@ -766,6 +972,12 @@ ui:
title: Súvisiace otázky
btn: Pridať otázku
answers: odpovede
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Opýtané
@ -775,12 +987,13 @@ ui:
Views: Videné
Follow: Sledovať
Following: Sledované
follow_tip: Follow this question to receive notifications
answered: zodpovedaný
closed_in: Uzatvorené
show_exist: Ukázať existujúcu otázku.
useful: Useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Potvrdiť
cancel: Zrušiť
edit: Edit
save: Uložiť
delete: Vymazať
login: Prihlásiť sa
@ -836,6 +1050,10 @@ ui:
skip: Preskočiť
discard_draft: Zahodiť koncept
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Výsledky vyhľadávania
keywords: Kľúčové slová
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Chyba...
account_result:
page_title: Vitajte na stránke {{site_name}}
success: Váš nový účet je potvrdený; Budete presmerovaný na domovskú stránku.
link: Pokračovať na domovskú stránku
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Prijaté
answered: zodpovedané
asked: opýtané
upvote: hlasovať za
downvote: hlasovať proti
downvoted: downvoted
mod_short: mod
mod_long: Moderátori
x_reputation: reputácia
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Meno
msg: Meno nemôže byť prázdne.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Heslo
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Prispôsobiť
themes: Témy
css-html: CSS/HTML
css_html: CSS/HTML
login: Prihlásiť sa
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Administrátor
@ -1095,6 +1323,7 @@ ui:
pending: Prebiehajúce
completed: Dokončené
flagged: Označené
flagged_type: Flagged {{ type }}
created: Vytvorené
action: Akcia
review: Preskúmanie
@ -1122,7 +1351,7 @@ ui:
closed_name: Uzavreté
closed_desc: "Na uzavretú otázku nemôžete odpovedať, ale stále ju môžete upravovať, hlasovať a komentovať."
deleted_name: Vymazané
deleted_desc: Získaná a stratená reputácia sa obnoví.
deleted_desc: This post will be deleted.
btn_cancel: Zrušiť
btn_submit: Odovdať
btn_next: Ďalšie
@ -1243,9 +1472,6 @@ ui:
label: Časové pásmo
msg: Časové pásmo nemôže byť prázdne.
text: Vyberte si mesto v rovnakom časovom pásme ako vy.
avatar:
label: Predvolený avatar
text: Pre používateľov bez vlastného avatara.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Päta
text: Toto sa vloží pred </html>.
sidebar:
label: Sidebar
text: This will insert in sidebar.
login:
page_title: Prihlásenie
membership:
title: Členstvo
label: Povoliť nové registrácie
text: Vypnúť, aby sa zabránilo vytvorenie nového účtu hocikým.
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: Súkromné
label: Vyžaduje sa prihlásenie
text: Do tejto komunity majú prístup iba prihlásení používatelia
installed_plugins:
title: Installed Plugins
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 providers 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
form:
optional: (voliteľné)
empty: nemôže byť prázdne
invalid: je neplatné
btn_submit: Uložiť
not_found_props: "Požadovaná vlastnosť {{ key }} nebola nájdená."
select: Select
page_review:
review: Preskúmanie
proposed: navrhované

View File

@ -11,6 +11,8 @@ backend:
other: İzin yok.
database_error:
other: Veri sunucu hatası.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
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)
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: E-Posta
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: E-Posta ve parola eşleşmiyor.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: You cannot modify your password.
@ -82,6 +145,8 @@ backend:
other: E-Posta doğrulanmalı.
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: Dil dosyası bulunamadı.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: 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.
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: Rapor işlenemedi.
@ -154,6 +221,10 @@ backend:
no_permission:
other: Revizyon izni yok.
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: E-Posta ve parola eşleşmiyor.
@ -171,6 +242,10 @@ backend:
other: Kendi rolünüzü değiştiremezsiniz.
not_allowed_registration:
other: Site şu anda kayıt olmaya açık değil
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Read config failed
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Desteklenmeyen dosya formatı.
report:
site_info:
config_not_found:
other: Site config 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:
rude_or_abusive:
name:
other: rude or abusive
desc:
other: A reasonable person would find this content inappropriate for respectful discourse.
duplicate:
a_duplicate:
name:
other: a duplicate
desc:
other: This question has been asked before and already has an answer.
not_answer:
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: cevap değil
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.
not_need:
no_longer_needed:
name:
other: no longer needed
desc:
other: This comment is outdated, conversational or not relevant to this post.
other:
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: answered
modified:
other: modified
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: Cevabınız silindi
your_comment_was_deleted:
other: Yorumunuz silindi
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
upgrade: Answer Upgrade
maintenance: Website Bakımı
users: Kullanıcılar
oauth_callback: Processing
http_404: HTTP Error 404
http_50X: HTTP Error 500
http_403: HTTP Error 403
@ -316,11 +492,18 @@ ui:
achievement: Başarılar
all_read: Tümünü okundu olarak işaretle
show_more: Daha fazla göster
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: Hesabınız Askıya Alındı
until_time: "Your account was suspended until {{ time }}."
forever: This user was suspended forever.
end: You don't meet a community guideline.
contact_us: Contact us
editor:
blockquote:
text: Alıntı
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Edit Answer
default_reason: Edit answer
@ -609,6 +792,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Cannot be empty.
login:
page_title: Welcome to {{site_name}}
login_to_continue: Log in to continue
info_sign: Don't have an account? <1>Sign up</1>
info_login: Already have an account? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Name cannot be empty.
range: Name up to 30 characters.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: Email cannot be empty.
change_email:
page_title: Welcome to {{site_name}}
btn_cancel: Cancel
btn_update: Update email address
send_success: >-
@ -672,6 +856,17 @@ ui:
label: New Email
msg:
empty: Email cannot be empty.
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
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: Email
msg: Email cannot be empty.
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
@ -756,6 +955,13 @@ ui:
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.
@ -766,6 +972,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -775,12 +987,13 @@ ui:
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_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Welcome to {{site_name}}
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepted
answered: answered
asked: asked
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderators
x_reputation: reputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Password
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Customize
themes: Themes
css-html: CSS/HTML
css_html: CSS/HTML
login: Login
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
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

View File

@ -11,6 +11,8 @@ backend:
other: Unauthorized.
database_error:
other: Data server error.
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
@ -22,6 +24,8 @@ backend:
other: Close
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
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)
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
password:
@ -52,6 +112,9 @@ backend:
email_or_password_wrong_error:
other: Email and password do not match.
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: You cannot modify your password.
@ -82,6 +145,8 @@ backend:
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.
@ -119,7 +184,9 @@ backend:
fail_to_meet_the_condition:
other: 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.
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.
@ -154,6 +221,10 @@ backend:
no_permission:
other: No permission to Revision.
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.
@ -171,6 +242,10 @@ backend:
other: You cannot modify your role.
not_allowed_registration:
other: Currently the site is not open for registration
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: Read config failed
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: Unsupported file format.
report:
site_info:
config_not_found:
other: Site config 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:
rude_or_abusive:
name:
other: rude or abusive
desc:
other: A reasonable person would find this content inappropriate for respectful discourse.
duplicate:
a_duplicate:
name:
other: a duplicate
desc:
other: This question has been asked before and already has an answer.
not_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.
not_need:
no_longer_needed:
name:
other: no longer needed
desc:
other: This comment is outdated, conversational or not relevant to this post.
other:
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: answered
modified:
other: modified
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,6 +482,7 @@ ui:
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
@ -316,11 +492,18 @@ ui:
achievement: Achievements
all_read: Mark all as read
show_more: Show more
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
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
@ -527,7 +710,7 @@ ui:
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: It adds something useful to the post
edit_answer:
title: Edit Answer
default_reason: Edit answer
@ -609,6 +792,8 @@ ui:
logout: Log out
admin: Admin
review: Review
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: Search
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: Cannot be empty.
login:
page_title: Welcome to {{site_name}}
login_to_continue: Log in to continue
info_sign: Don't have an account? <1>Sign up</1>
info_login: Already have an account? <1>Log in</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: Name cannot be empty.
range: Name up to 30 characters.
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: Email
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: Email cannot be empty.
change_email:
page_title: Welcome to {{site_name}}
btn_cancel: Cancel
btn_update: Update email address
send_success: >-
@ -672,6 +856,17 @@ ui:
label: New Email
msg:
empty: Email cannot be empty.
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
@ -690,6 +885,7 @@ ui:
label: Confirm New Password
settings:
page_title: Settings
goto_modify: Go to Modify
nav:
profile: Profile
notification: Notifications
@ -711,7 +907,7 @@ ui:
avatar:
label: Profile Image
gravatar: Gravatar
gravatar_text: You can change image on <1>gravatar.com</1>
gravatar_text: You can change image on
custom: Custom
btn_refresh: Refresh
custom_text: You can upload your image.
@ -738,8 +934,11 @@ ui:
change_email_info: >-
We've sent an email to that address. Please follow the confirmation instructions.
email:
label: Email
msg: Email cannot be empty.
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
@ -756,6 +955,13 @@ ui:
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.
@ -766,6 +972,12 @@ ui:
title: Related Questions
btn: Add question
answers: answers
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: Asked
@ -775,12 +987,13 @@ ui:
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_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: Confirm
cancel: Cancel
edit: Edit
save: Save
delete: Delete
login: Log in
@ -836,6 +1050,10 @@ ui:
skip: Skip
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: Search Results
keywords: Keywords
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: Error...
account_result:
page_title: Welcome to {{site_name}}
success: Your new account is confirmed; you will be redirected to the home page.
link: Continue to homepage
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: Accepted
answered: answered
asked: asked
upvote: upvote
downvote: downvote
downvoted: downvoted
mod_short: Mod
mod_long: Moderators
x_reputation: reputation
@ -994,6 +1210,7 @@ ui:
admin_name:
label: Name
msg: Name cannot be empty.
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: Password
text: >-
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: Customize
themes: Themes
css-html: CSS/HTML
css_html: CSS/HTML
login: Login
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: Admin
@ -1095,6 +1323,7 @@ ui:
pending: Pending
completed: Completed
flagged: Flagged
flagged_type: Flagged {{ type }}
created: Created
action: Action
review: Review
@ -1122,7 +1351,7 @@ ui:
closed_name: closed
closed_desc: "A closed question can't answer, but still can edit, vote and comment."
deleted_name: deleted
deleted_desc: All reputation gained and lost will be restored.
deleted_desc: This post will be deleted.
btn_cancel: Cancel
btn_submit: Submit
btn_next: Next
@ -1243,9 +1472,6 @@ ui:
label: Timezone
msg: Timezone cannot be empty.
text: Choose a city in the same timezone as you.
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: Footer
text: This will insert before </html>.
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.
installed_plugins:
title: Installed Plugins
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 providers 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
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

View File

@ -11,6 +11,8 @@ backend:
other: 未授权。
database_error:
other: 数据服务器错误。
forbidden_error:
other: 禁止访问。
action:
report:
other: 举报
@ -22,14 +24,18 @@ backend:
other: 关闭
reopen:
other: 重新打开
forbidden_error:
other: 禁止访问。
pin:
other: 置顶
hide:
other: 隐藏
other: 列表隐藏
unpin:
other: 取消置顶
show:
other: 显示
other: 列表显示
invite_someone_to_answer:
other: 编辑
role:
name:
user:
@ -44,62 +50,62 @@ backend:
admin:
other: 拥有管理网站的全部权限。
moderator:
other: 拥有访问除管理员设置以外的所有权限。
other: 拥有访问除后台管理以外的所有权限。
privilege:
level_1:
description:
other: 等级1创业社区所需的声望最低
other: 第 1 级 (私人团队、群组所需的声望)
level_2:
description:
other: 等级2创业社区所需的声望较低
other: 级别2(启动社区所需的低声望)
level_3:
description:
other: 等级3成熟社区所需的声望较高
other: 等级 3 (成熟社区所需的高声望)
rank_question_add_label:
other: 提问
other: 提问s
rank_answer_add_label:
other: 回答问题
other: 写入答案
rank_comment_add_label:
other: 发表评论
rank_report_add_label:
other: 举报
rank_comment_vote_up_label:
other: 评论点赞
other: 点赞评论
rank_link_url_limit_label:
other: 一次发布超过两个链接
other: 每次发布超过 2 个链接
rank_question_vote_up_label:
other: 问题点赞
other: 点赞问题
rank_answer_vote_up_label:
other: 答案点赞
other: 点赞答案
rank_question_vote_down_label:
other: 问题点踩
other: 点踩问题
rank_answer_vote_down_label:
other: 答案点踩
other: 点踩答案
rank_invite_someone_to_answer_label:
other: 邀请回答
rank_tag_add_label:
other: 创建新标签
rank_tag_edit_label:
other: 编辑标签描述(需要审核)
other: 编辑标签描述(需要审核)
rank_question_edit_label:
other: 编辑他人提问(需要审核)
other: 编辑对方的问题 (需要审查)
rank_answer_edit_label:
other: 编辑他人回答(需要审核)
other: 编辑对方的答案 (需要审查)
rank_question_edit_without_review_label:
other: 编辑他人提问(无需审核)
other: 不经评论编辑对方的问题
rank_answer_edit_without_review_label:
other: 编辑他人回答(无需审核)
other: 编辑对方的答案而不需要审核
rank_question_audit_label:
other: 核问题编辑
other: 查问题
rank_answer_audit_label:
other: 审核案编辑
other: 审核
rank_tag_audit_label:
other: 审核标签编辑
rank_tag_edit_without_review_label:
other: 编辑标签描述(无需审核)
other: 编辑标签且无需审核
rank_tag_synonym_label:
other: 管理标签同义词
e_mail:
email:
other: 邮箱
password:
other: 密码
@ -108,12 +114,12 @@ backend:
error:
password:
space_invalid:
other: 密码不能包含空格。
other: 密码不得含有空格
admin:
cannot_update_their_password:
other: 无法修改自己的密码。
other: 无法修改自己的密码。
cannot_modify_self_status:
other: 无法修改自己的状态。
other: 无法修改自己的状态。
email_or_password_wrong:
other: 邮箱和密码不匹配。
answer:
@ -131,7 +137,7 @@ backend:
not_found:
other: 评论未找到。
cannot_edit_after_deadline:
other: 评论时间太,无法修改。
other: 评论时间太,无法修改。
email:
duplicate:
other: 邮箱已经存在。
@ -140,102 +146,106 @@ backend:
verify_url_expired:
other: 邮箱验证的网址已过期,请重新发送邮件。
illegal_email_domain_error:
other: 该域名的邮箱无法使用。请尝试更换其他邮箱
other: 此邮箱不在允许注册的邮箱域中。请使用其他邮箱尝试
lang:
not_found:
other: 语言未找到
other: 语言文件未找到
object:
captcha_verification_failed:
other: 验证码错误
other: 验证码错误
disallow_follow:
other: 你不能关注
other: 你不能关注
disallow_vote:
other: 你不能投票
other: 你不能投票
disallow_vote_your_self:
other: 你不能为自己的帖子投票
other: 你不能为自己的帖子投票
not_found:
other: 对象未找到
other: 对象未找到
verification_failed:
other: 验证失败
other: 验证失败
email_or_password_incorrect:
other: 邮箱或密码不正确
other: 邮箱和密码不匹配。
old_password_verification_failed:
other: 旧密码验证失败
other: 旧密码验证失败
new_password_same_as_previous_setting:
other: 新密码与之前的设置相同
other: 新密码和旧密码相同。
question:
already_deleted:
other: 此问题已被删除.
other: 该帖子已被删除。
not_found:
other: 问题未找到
other: 问题未找到
cannot_deleted:
other: 无删除权限
other: 没有删除权限。
cannot_close:
other: 无关闭权限
other: 没有关闭权限。
cannot_update:
other: 无更新权限
other: 没有更新权限。
rank:
fail_to_meet_the_condition:
other: 级别不符合条件
other: 声望值未达到要求。
vote_fail_to_meet_the_condition:
other: 感谢您的投票。您至少需要{{.Rank}}声望才能投票。
no_enough_rank_to_operate:
other: 您至少需要{{.Rank}}声望才能执行此操作。
report:
handle_failed:
other: 报告处理失败
other: 报告处理失败
not_found:
other: 报告未找到
other: 报告未找到
tag:
already_exist:
other: 标签已存在。
not_found:
other: 标签未找到
other: 标签未找到
recommend_tag_not_found:
other: 推荐标签不存在
other: 推荐标签不存在
recommend_tag_enter:
other: 输入至少一个必需的标签。
other: 选择至少一个必选标签。
not_contain_synonym_tags:
other: 不应包含同义词标签。
cannot_update:
other: 没有更新标签权限。
other: 没有更新权限。
is_used_cannot_delete:
other: 您不能删除正在使用的标签
other: 您不能删除这个正在使用的标签
cannot_set_synonym_as_itself:
other: 您不能将当前标签的同义词设置为本身
other: 你不能将当前标签设为自己的同义词
smtp:
config_from_name_cannot_be_email:
other: 发件人名称不能是电子邮件地址。
other: 发件人名称不能是邮箱地址。
theme:
not_found:
other: 主题未找到
other: 主题未找到
revision:
review_underway:
other: 目前无法编辑,有一个版本在审阅队列中。
no_permission:
other: 无权限修改
user:
external_login_missing_user_id:
other: 第三方平台没有提供唯一的用户ID所以您不能登录请联系网站管理员。
external_login_unbinding_forbidden:
other: 请在您移除此登录之前为您的帐户设置登录密码。
email_or_password_wrong:
other:
other: 邮箱或密码错误
other: 邮箱和密码不匹配。
not_found:
other: 用户未找到
other: 用户未找到
suspended:
other: 用户已被暂停
other: 用户已被封禁。
username_invalid:
other: 用户名无效
other: 用户名无效
username_duplicate:
other: 用户名已被使用
other: 用户名已被使用
set_avatar:
other: 头像设置错误
other: 头像设置错误
cannot_update_your_role:
other: 不能修改自己的角色。
other: 不能修改自己的角色。
not_allowed_registration:
other: 目前该站点未开放注册
other: 目前该站点未开放注册
access_denied:
other: 访问被拒绝
other: 拒绝访问
page_access_denied:
other: 你没有权限进入这个页面。
other: 您没有权限访问此页面。
config:
read_config_failed:
other: 读取配置失败
@ -250,12 +260,15 @@ backend:
upload:
unsupported_file_format:
other: 不支持的文件格式。
site_info:
config_not_found:
other: 未找到网站的该配置信息。
reason:
spam:
name:
other: 垃圾信息
desc:
other: 这个帖子是一个广告,或是破坏性行为。它对当前的主题没有用处,也不相关。
other: 这个帖子是一个广告,或是破坏性行为。它对当前的主题无帮助或无关。
rude_or_abusive:
name:
other: 粗鲁或辱骂的
@ -265,46 +278,46 @@ backend:
name:
other: 重复信息
desc:
other: 此问题以前就有人问过,而且已经有了答案。
other: 该问题有人问过,而且已经有了答案。
placeholder:
other: 请输入重复的问题的网址
other: 输入已有的问题链接
not_a_answer:
name:
other: 不是答案
desc:
other: 此帖子是作为一个答案发布的,但它并没有试图回答这个问题。总之,它可能应该是个编辑,评论,另一个问题或者被删除。
other: 该帖是作为答案发布的,但它并没有试图回答这个问题。总之,它可能应该是个编辑、评论、另一个问题或需要被删除。
no_longer_needed:
name:
other: 不再需要
desc:
other: 此评论已过时,对话或与此帖子无关。
other: 该评论已过时,对话性质或与此帖子无关。
something:
name:
other: 其他原因
desc:
other: 此帖子需要工作人员注,因为是上述所列以外的其他理由。
other: 此帖子需要工作人员,因为是上述所列以外的其他理由。
placeholder:
other: 让我们具体了解你所关注的内容
other: 让我们具体知道你关心的什么
community_specific:
name:
other: 特定社区原因
other: 社区特定原因
desc:
other: 这个问题不符合社区准则。
other: 问题不符合社区准则。
not_clarity:
name:
other: 需要细节或澄清
desc:
other: 此问题目前包含多个问题。它应该只关注一个问题
other: 该问题目前涵盖多个问题。它应该侧重在一个问题上
looks_ok:
name:
other: 看起来不错
other: 看起来还好
desc:
other: 篇文章很好,不是低质量的
other: 个帖子是好的,不是低质量
needs_edit:
name:
other: 需要编辑,我已经编辑了
other: 需要编辑,我已做了修改。
desc:
other: 自己改善和纠正这篇文章中的问题。
other: 改进和纠正你自己帖子中的问题。
needs_close:
name:
other: 需要关闭
@ -314,7 +327,7 @@ backend:
name:
other: 需要删除
desc:
other: 所有获得和失去的声望都将被恢复
other: 该帖子将被删除
question:
close:
duplicate:
@ -326,17 +339,17 @@ backend:
name:
other: 社区特定原因
desc:
other: 问题不符合社区准则。
other: 问题不符合社区准则。
multiple:
name:
other: 需要细节或澄清
desc:
other: 问题目前涵盖多个问题。它应该只集中在一个问题上。
other: 问题目前涵盖多个问题。它应该只集中在一个问题上。
other:
name:
other: 其他原因
desc:
other: 这个帖子需要上面没有列出的另一个原因。
other: 该帖子存在上面没有列出的另一个原因。
operation_type:
asked:
other: 提问于
@ -345,7 +358,7 @@ backend:
modified:
other: 修改于
deleted_title:
other: 问题已被删除
other: 删除的问题
notification:
action:
update_question:
@ -355,7 +368,7 @@ backend:
update_answer:
other: 更新了答案
accept_answer:
other: 已接受的回答
other: 采纳了答案
comment_question:
other: 评论了问题
comment_answer:
@ -373,48 +386,48 @@ backend:
your_comment_was_deleted:
other: 你的评论已被删除
up_voted_question:
other: 问题
other: 赞问题
down_voted_question:
other: 问题
other: 踩问题
up_voted_answer:
other: 答案
other: 赞答案
down_voted_answer:
other: 踩了答案
other: 点踩回答
up_voted_comment:
other: 评论
other: 赞评论
invited_you_to_answer:
other: 邀请你回答问题
other: 邀请你回答
email_tpl:
change_email:
title:
other: "[{{.SiteName}}] 确认您的新电子邮件地址"
other: "[{{.SiteName}}] 确认你的新邮箱地址"
body:
other: "请点击以下链接确认您在 {{.SiteName}} 上的新电子邮件地址:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\n如果您没有请求此更改,请忽略此电子邮件。\n"
other: "请点击以下链接确认你在 {{.SiteName}} 上的新邮箱地址:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\n如果你没有请求此更改,请忽略此邮件。\n\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} 回答了您的问题"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>在 {{.SiteName}} 上查看</a><br><br>\n\n<small>您会收到此邮件是因为您开启了订阅。<a href='{{.UnsubscribeUrl}}'>取消订阅</a></small>"
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\\n\\n<small>{{.DisplayName}}:</small><br>\\n<blockquote>{{.AnswerSummary}}</blockquote><br>\\n<a href='{{.AnswerUrl}}'>在 {{.SiteName}} 上查看</a><br><br>\\n\\n<small>您会收到此邮件是因为您开启了订阅。<a href='{{.UnsubscribeUrl}}'>取消订阅</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} 邀请您回答问题"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>我想你可能知道答案。</blockquote><br>\n<a href='{{.InviteUrl}}'>在 {{.SiteName}} 上查看</a><br><br>\n\n<small>您会收到此邮件是因为您开启了订阅. <a href='{{.UnsubscribeUrl}}'>取消订阅</a></small>"
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\\n\\n<small>{{.DisplayName}}:</small><br>\\n<blockquote>我想你可能知道答案。</blockquote><br>\\n<a href='{{.InviteUrl}}'>在 {{.SiteName}} 上查看</a><br><br>\\n\\n<small>您会收到此邮件是因为您开启了订阅. <a href='{{.UnsubscribeUrl}}'>取消订阅</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} 评论了您的帖子"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>在 {{.SiteName}} 上查看</a><br><br>\n\n<small>您会收到此邮件是因为您开启了订阅。<a href='{{.UnsubscribeUrl}}'>取消订阅</a></small>"
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\\n\\n<small>{{.DisplayName}}:</small><br>\\n<blockquote>{{.CommentSummary}}</blockquote><br>\\n<a href='{{.CommentUrl}}'>在 {{.SiteName}} 上查看</a><br><br>\\n\\n<small>您会收到此邮件是因为您开启了订阅。<a href='{{.UnsubscribeUrl}}'>取消订阅</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] 重置密码"
body:
other: "有人要求在 [{{.SiteName}}] 上重置您的密码。<br><br>\n\n如果这不是您的操作请安心忽略此电子邮件。<br><br>\n\n请点击以下链接选择一个新密码<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
other: "有人要求在 [{{.SiteName}}] 上重置您的密码。<br><br>\\n\\n如果这不是您的操作请安心忽略此电子邮件。<br><br>\\n\\n请点击以下链接选择一个新密码<br>\\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>"
register:
title:
other: "[{{.SiteName}}] 确认您的新账户"
body:
other: "欢迎加入 {{.SiteName}}<br><br>\n\n请点击以下链接确认并激活您的新账户<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\n\n如果上面的链接不能点击请将其复制并粘贴到您的浏览器地址栏中。\n"
other: "欢迎加入 {{.SiteName}}<br><br>\\n\\n请点击以下链接确认并激活您的新账户<br>\\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\\n\\n如果上面的链接不能点击请将其复制并粘贴到您的浏览器地址栏中。\\n"
test:
title:
other: "[{{.SiteName}}] 测试邮件"
@ -424,21 +437,21 @@ backend:
upvote:
other: 点赞
upvoted:
other:
other:
downvote:
other: 点踩
downvoted:
other:
other:
accept:
other: 采纳
accepted:
other: 采纳
other: 采纳
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
title: 如何设定文本格式
title: 如何排版
desc: >-
<ul class="mb-0"><li><p class="mb-2">添加链接</p><pre class="mb-2"><code>&lt;https://url.com&gt;<br/><br/>[标题](https://url.com)</code></pre></li><li><p class="mb-2">段落之间使用空行分隔</p></li><li><p class="mb-2"><em>_斜体_</em> 或者 **<strong>粗体</strong>**</p></li><li><p class="mb-2">使用 4 个空格缩进代码</p></li><li><p class="mb-2">在行首添加<code>&gt;</code>表示引用</p></li><li><p class="mb-2">反引号进行转义 <code>`像 _这样_`</code></p></li><li><p class="mb-2">使用<code>```</code>创建代码块</p><pre class="mb-0"><code>```<br/>// 这是代码<br/>```</code></pre></li></ul>
<ul class="mb-0"><li><p class="mb-2">添加链接</p><pre class="mb-2"><code>&lt;https://url.com&gt;<br/><br/>[标题](https://url.com)</code></pre></li><li><p class="mb-2">段落之间使用空行分隔</p></li><li><p class="mb-2"><em>_斜体_</em> 或者 **<strong>粗体</strong>**</p></li><li><p class="mb-2">使用 4 个空格缩进代码</p></li><li><p class="mb-2">在行首添加 <code>&gt;</code> 表示引用</p></li><li><p class="mb-2">反引号进行转义 <code>`像 _这样_`</code></p></li><li><p class="mb-2">使用 <code>```</code> 创建代码块</p><pre class="mb-0"><code>```<br/>// 这是代码<br/>```</code></pre></li></ul>
pagination:
prev: 上一页
next: 下一页
@ -447,7 +460,7 @@ ui:
questions: 问题
tag: 标签
tags: 标签
tag_wiki: 签 wiki
tag_wiki: 记维基
create_tag: 创建标签
edit_tag: 编辑标签
ask_a_question: 提问题
@ -455,20 +468,21 @@ ui:
edit_answer: 编辑回答
search: 搜索
posts_containing: 包含
settings:
settings:
notifications: 通知
login: 登录
sign_up: 注册
account_recovery: 账号恢复
account_activation: 账号激活
confirm_email: 确认电子邮件
account_suspended: 账号已封禁
account_suspended: 账号已封禁
admin: 后台管理
change_email: 修改邮箱
install: Answer 安装
upgrade: Answer 升级
maintenance: 网站维护
users: 用户
oauth_callback: 处理中
http_404: HTTP 错误 404
http_50X: HTTP 错误 500
http_403: HTTP 错误 403
@ -479,11 +493,17 @@ ui:
all_read: 全部标记为已读
show_more: 显示更多
someone: 有人
inbox_type:
all: 全部
posts: 帖子
invites: 邀请
votes: 投票
suspended:
title: 账号已封禁
until_time: "你的账号被封禁至{{ time }}。"
title: 你的账号账号已封禁
until_time: "你的账号被封禁直到 {{ time }}。"
forever: 你的账号已被永久封禁。
end: 违反了我们的社区准则。
contact_us: 联系我们
editor:
blockquote:
text: 引用
@ -772,6 +792,8 @@ ui:
logout: 退出登录
admin: 后台管理
review: 审查
bookmark: 收藏夹
moderation: 管理
search:
placeholder: 搜索
footer:
@ -796,7 +818,6 @@ ui:
msg:
empty: 不能为空
login:
page_title: 欢迎来到 {{site_name}}
login_to_continue: 登录以继续
info_sign: 没有账户?<1>注册</1>
info_login: 已经有一个账户?<1>登录</1>
@ -807,6 +828,7 @@ ui:
msg:
empty: 昵称不能为空
range: 昵称最多 30 个字符
character: '只能由 "a-z", "0-9", " - . _" 组成'
email:
label: 邮箱
msg:
@ -826,7 +848,6 @@ ui:
msg:
empty: 邮箱不能为空
change_email:
page_title: 欢迎来到 {{site_name}}
btn_cancel: 取消
btn_update: 更新电子邮件地址
send_success: >-
@ -835,6 +856,17 @@ ui:
label: 新邮箱
msg:
empty: 邮箱不能为空
oauth_bind_email:
subtitle: 向你的账户添加恢复邮件地址。
btn_update: 更新电子邮件地址
email:
label: 邮箱
msg:
empty: 邮箱不能为空。
modal_title: 邮箱已经存在。
modal_content: 此电子邮件地址已经注册。你确定要连接到已有账户吗?
modal_cancel: 更改邮箱
modal_confirm: 连接到已有账户
password_reset:
page_title: 密码重置
btn_name: 重置我的密码
@ -875,7 +907,7 @@ ui:
avatar:
label: 头像
gravatar: Gravatar
gravatar_text: 您可以在 <1>gravatar.com</1> 更改图像
gravatar_text: 你可以更改图像在
custom: 自定义
btn_refresh: 刷新
custom_text: 您可以上传您的图片。
@ -902,8 +934,11 @@ ui:
change_email_info: >-
邮件已发送。请根据指引完成验证。
email:
label: 邮箱
msg: 邮箱不能为空
label: 新邮箱
msg: 新邮箱不能为空。
pass:
label: 当前密码
msg: 密码不能为空。
password_title: 密码
current_pass:
label: 当前密码
@ -920,6 +955,13 @@ ui:
lang:
label: 界面语言
text: 设置用户界面语言,在刷新页面后生效。
my_logins:
title: 我的登录
label: 使用这些账户登录或注册本网站。
modal_title: 移除登录
modal_content: 你确定要从账户里移除该登录?
modal_confirm_btn: 移除
remove_success: 移除成功
toast:
update: 更新成功
update_password: 更改密码成功。
@ -930,6 +972,12 @@ ui:
title: 相关问题
btn: 我要提问
answers: 个回答
invite_to_answer:
title: 受邀人
desc: 邀请你认为可能知道答案的人。
invite: 邀请回答
add: 添加人员
search: 搜索人员
question_detail:
action: 操作
Asked: 提问于
@ -939,12 +987,13 @@ ui:
Views: 阅读次数
Follow: 关注此问题
Following: 已关注
follow_tip: 关注此问题以接收通知
answered: 回答于
closed_in: 关闭于
show_exist: 查看相关问题。
useful: 有用的
question_useful: 这是有用和清楚
question_un_useful: 它不明确或没
question_useful: 它是有用和明确
question_un_useful: 它不明确或没
answer_useful: 这是有用的
answer_un_useful: 它是没有用的
answers:
@ -988,6 +1037,7 @@ ui:
btns:
confirm: 确认
cancel: 取消
edit: 编辑
save: 保存
delete: 删除
login: 登录
@ -1000,7 +1050,7 @@ ui:
skip: 略过
discard_draft: 丢弃草稿
pinned: 已置顶
all: 所有
all: 全部
question: 问题
answer: 回答
comment: 评论
@ -1038,7 +1088,6 @@ ui:
modal_confirm:
title: 发生错误...
account_result:
page_title: 欢迎来到 {{site_name}}
success: 你的账号已通过验证,即将返回首页。
link: 返回首页
invalid: >-
@ -1099,8 +1148,7 @@ ui:
accepted: 已采纳
answered: 回答于
asked: 提问于
upvote: 赞同
downvote: 反对
downvoted: 点踩
mod_short: 管理员
mod_long: 管理员
x_reputation: 声望
@ -1162,6 +1210,7 @@ ui:
admin_name:
label: 昵称
msg: 昵称不能为空。
character: '只能由 "a-z", "0-9", " - . _" 组成'
admin_password:
label: 密码
text: >-
@ -1219,18 +1268,19 @@ ui:
seo: SEO
customize: 自定义
themes: 主题
css-html: CSS/HTML
css_html: CSS/HTML
login: 登录
privileges: 特权
plugins: 插件
installed_plugins: 插件列表
installed_plugins: 已安装插件
website_welcome: 欢迎来到 {{site_name}}
plugins:
login: 登录
qrcode_login_tip: 请使用 {{ agentName }} 扫描二维码登录
login_failed_email_tip: 登录失败, 请允许该应用程序访问您的电子邮件信息,然后再试一次
qrcode_login_tip: 请使用 {{ agentName }} 扫描二维码登录
login_failed_email_tip: 登录失败,请允许此应用访问您的邮箱信息,然后重试
oauth:
connect: 连接到 {{ auth_name }}
remove: 解绑 {{ auth_name }}
remove: 移除 {{ auth_name }}
admin:
admin_header:
title: 后台管理
@ -1273,7 +1323,7 @@ ui:
pending: 等待处理
completed: 已完成
flagged: 被举报内容
flagged_type: 被举报的{{ type }}
flagged_type: 标记了 {{ type }}
created: 创建于
action: 操作
review: 审查
@ -1301,7 +1351,7 @@ ui:
closed_name: 关闭
closed_desc: "关闭的问题不能回答,但仍然可以编辑、投票和评论。"
deleted_name: 删除
deleted_desc: 获得和丧失的所有信誉积分将被恢复
deleted_desc: 该帖子将被删除
btn_cancel: 取消
btn_submit: 提交
btn_next: 下一步
@ -1422,9 +1472,6 @@ ui:
label: 时区
msg: 时区不能为空。
text: 选择一个与您相同时区的城市。
avatar:
label: 默认头像
text: 没有自定义头像的用户。
smtp:
page_title: SMTP
from_email:
@ -1523,39 +1570,49 @@ ui:
css_and_html:
page_title: CSS 与 HTML
custom_css:
label: 自定义CSS
text: 这将在 <link> 之前插入
label: 自定义 CSS
text: 这将以 <link> 方式插入
head:
label: 头部
text: 这将在 </head> 之前插入
header:
label: 标题
text: 这将在 <body> 之插入
label: 页眉
text: 这将在 <body> 之插入
footer:
label: 页脚
text: 这将在 </html> 之前插入
sidebar:
label: 侧边栏
text: 这将插入侧边栏中。
login:
page_title: 登录
membership:
title: 会员
label: 允许新注册
text: 关闭以防止任何人创建新帐户。
email_registration:
title: 邮箱注册
label: 允许邮箱注册
text: 关闭以防止任何人通过邮箱创建新账户。
allowed_email_domains:
title: 允许的邮箱域
text: 允许注册账户的邮箱域。每行一个域名。留空时忽略。
private:
title: 非公开的
label: 需要登录
text: 只有登录用户才能访问这个社区。
installed_plugins:
title: 插件列表
title: 已安装插件
filter:
all: 全部
active: 启用
active: 启用
inactive: 未启用
outdated: 已过期
plugins:
label: 插件
text: 选择一个插件
name: 插件名称
version: 插件版本
text: 选择一个现有的插件
name: 名称
version: 版本
status: 状态
action: 操作
deactivate: 停用
@ -1565,32 +1622,36 @@ ui:
title: 用户
avatar:
label: 默认头像
text: 未设置自定义头像的用户所展示的头像。
text: 没有自定义头像的用户。
gravatar_base_url:
label: Gravatar 基础 URL
text: Gravatar 提供商的 API 基础 URL 。留空时忽略。
profile_editable:
title: 可编辑的个人资料
title: 个人资料可编辑
allow_update_display_name:
label: 允许用户改显示名称
label: 允许用户改显示名称
allow_update_username:
label: 允许用户改用户名
label: 允许用户改用户名
allow_update_avatar:
label: 允许用户更改头像
label: 允许用户修改个人头像
allow_update_bio:
label: 允许用户更改自我介绍
label: 允许用户修改个人介绍
allow_update_website:
label: 允许用户更改个人网站
label: 允许用户修改个人主页网址
allow_update_location:
label: 允许用户更改所在地
label: 允许用户更改位置
privilege:
title: 声望权限
title: 特权
level:
label: 所需声望等级
text: 选择所需的声望等级以获取权限
label: 级别所需声望
text: 选择特权所需的声望值
form:
optional: (选填)
empty: 不能为空
invalid: 是无效的
btn_submit: 保存
not_found_props: "所需属性 {{ key }} 未找到。"
select: 选择
page_review:
review: 评论
proposed: 提案
@ -1606,7 +1667,7 @@ ui:
undeleted: 取消删除
deleted: 删除
downvote: 反对
upvote:
upvote:
accept: 采纳
cancelled: 已取消
commented: '评论:'

View File

@ -11,17 +11,21 @@ backend:
other: 未授權。
database_error:
other: 資料庫錯誤。
forbidden_error:
other: Forbidden.
action:
report:
other: Flag
other: 举报
edit:
other: Edit
other: 编辑
delete:
other: Delete
other: 删除
close:
other: Close
other: 关闭
reopen:
other: Reopen
forbidden_error:
other: Forbidden.
pin:
other: Pin
hide:
@ -30,6 +34,8 @@ backend:
other: Unpin
show:
other: List
invite_someone_to_answer:
other: Edit
role:
name:
user:
@ -45,6 +51,60 @@ backend:
other: 擁有訪問該網站的全部權限。
moderator:
other: 可以訪問除了管理員設定以外的所有貼文。
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)
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: 電子郵件
password:
@ -52,9 +112,12 @@ backend:
email_or_password_wrong_error:
other: 電郵和密碼不匹配。
error:
password:
space_invalid:
other: Password cannot contain spaces.
admin:
cannot_update_their_password:
other: You cannot modify your password.
other: 您不能修改自己的密码。
cannot_modify_self_status:
other: You cannot modify your status.
email_or_password_wrong:
@ -82,6 +145,8 @@ backend:
other: 需驗證電子郵件
verify_url_expired:
other: 電子郵件驗證網址已過期,請重發電子郵件。
illegal_email_domain_error:
other: Email is not allowed from that email domain. Please use another one.
lang:
not_found:
other: 未找到语言文件。
@ -119,7 +184,9 @@ backend:
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: 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: 報告處理失敗。
@ -154,6 +221,10 @@ backend:
no_permission:
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.
external_login_unbinding_forbidden:
other: Please set a login password for your account before you remove this login.
email_or_password_wrong:
other:
other: 電子郵箱和密碼不匹配。
@ -171,6 +242,10 @@ backend:
other: 您不能修改自己的角色。
not_allowed_registration:
other: 本站目前未開放註冊。
access_denied:
other: Access denied
page_access_denied:
other: You do not have access to this page.
config:
read_config_failed:
other: 讀取配置失敗
@ -185,37 +260,74 @@ backend:
upload:
unsupported_file_format:
other: 不支援的檔案格式。
report:
site_info:
config_not_found:
other: Site config not found.
reason:
spam:
name:
other: 垃圾貼文。
other: spam
desc:
other: 此貼文是一個廣告,或是破壞性行為。它對當前的主題沒有用處,也不相關。
rude:
other: This post is an advertisement, or vandalism. It is not useful or relevant to the current topic.
rude_or_abusive:
name:
other: 粗魯或辱罵的
other: rude or abusive
desc:
other: 一個有理智的人都會認為這種內容不適合進行尊重性的討論。
duplicate:
other: A reasonable person would find this content inappropriate for respectful discourse.
a_duplicate:
name:
other: 重覆信息
other: a duplicate
desc:
other: 此問題以前就有人問過,而且已經有了答案。
not_answer:
other: This question has been asked before and already has an answer.
placeholder:
other: Enter the existing question link
not_a_answer:
name:
other: 不是答案
other: not an answer
desc:
other: 此帖子是作為一個答案發布的,但它並沒有試圖回答這個問題。總之,它可能應該是個編輯,評論,另一個問題或者被刪除。
not_need:
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: 不再需要
other: no longer needed
desc:
other: 此評論已過時,對話或與此帖子無關。
other:
other: This comment is outdated, conversational or not relevant to this post.
something:
name:
other: 其他原因
other: something else
desc:
other: 由於上面未列出的另一個原因,這篇文章需要工作人員注意。
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 doesnt 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 cant answer, but still can edit, vote and comment.
needs_delete:
name:
other: needs delete
desc:
other: This post will be deleted.
question:
close:
duplicate:
@ -245,6 +357,8 @@ backend:
other: 回答於
modified:
other: 修改於
deleted_title:
other: Deleted question
notification:
action:
update_question:
@ -271,6 +385,67 @@ backend:
other: 你的答案已被刪除
your_comment_was_deleted:
other: 你的評論已被刪除
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
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:<br><br>\n\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nIf you did not request this change, please ignore this email.\n"
new_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} answered your question"
body:
other: "<strong><a href='{{.AnswerUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.AnswerSummary}}</blockquote><br>\n<a href='{{.AnswerUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
invited_you_to_answer:
title:
other: "[{{.SiteName}}] {{.DisplayName}} invited you to answer"
body:
other: "<strong><a href='{{.InviteUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>I think you may know the answer.</blockquote><br>\n<a href='{{.InviteUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
new_comment:
title:
other: "[{{.SiteName}}] {{.DisplayName}} commented on your post"
body:
other: "<strong><a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a></strong><br><br>\n\n<small>{{.DisplayName}}:</small><br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>View it on {{.SiteName}}</a><br><br>\n\n<small>You are receiving this because you authored the thread. <a href='{{.UnsubscribeUrl}}'>Unsubscribe</a></small>"
pass_reset:
title:
other: "[{{.SiteName }}] Password reset"
body:
other: "Somebody asked to reset your password on [{{.SiteName}}].<br><br>\n\nIf it was not you, you can safely ignore this email.<br><br>\n\nClick the following link to choose a new password:<br>\n<a href='{{.PassResetUrl}}' target='_blank'>{{.PassResetUrl}}</a>\n"
register:
title:
other: "[{{.SiteName}}] Confirm your new account"
body:
other: "Welcome to {{.SiteName}}<br><br>\n\nClick the following link to confirm and activate your new account:<br>\n<a href='{{.RegisterUrl}}' target='_blank'>{{.RegisterUrl}}</a><br><br>\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
#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
@ -307,20 +482,28 @@ ui:
upgrade: Answer 升級
maintenance: 網站維護
users: 用戶
http_404: HTTP Error 404
http_50X: HTTP Error 500
http_403: HTTP Error 403
oauth_callback: Processing
http_404: HTTP 錯誤 404
http_50X: HTTP 錯誤 500
http_403: HTTP 錯誤 403
notifications:
title: 通知
inbox: 收件夾
achievement: 成就
all_read: 全部標記為已讀
show_more: 顯示更多
someone: Someone
inbox_type:
all: All
posts: Posts
invites: Invites
votes: Votes
suspended:
title: 您的帳號已被停權
until_time: "你的帳號被停權至{{ time }}。"
forever: 你的帳號已被永久停權。
end: 違反了我們的社群準則。
contact_us: Contact us
editor:
blockquote:
text: 引用
@ -527,7 +710,7 @@ ui:
通过評論询问更多问题或提出改進建議。避免在評論中回答問題。
tip_answer: >-
使用評論回復其他用戶或通知他們进行更改。如果你要添加新的信息,請編輯你的帖子,而不是發表評論。
tip_vote: It adds something useful to the post
tip_vote: It adds something useful to the post
edit_answer:
title: 編輯回答
default_reason: 編輯回答
@ -609,6 +792,8 @@ ui:
logout: 登出
admin: 後台管理
review: 審查
bookmark: Bookmarks
moderation: Moderation
search:
placeholder: 搜尋
footer:
@ -633,7 +818,6 @@ ui:
msg:
empty: 不能為空
login:
page_title: 歡迎來到 {{site_name}}
login_to_continue: 登入以繼續
info_sign: 沒有帳戶?<1>註冊</1>
info_login: 已經有一個帳號?<1>登入</1>
@ -644,6 +828,7 @@ ui:
msg:
empty: 名稱不能為空
range: 名稱最多 30 個字元
character: 'Must use the character set "a-z", "0-9", " - . _"'
email:
label: 郵箱
msg:
@ -663,7 +848,6 @@ ui:
msg:
empty: 郵箱不能為空
change_email:
page_title: 歡迎來到 {{site_name}}
btn_cancel: 取消
btn_update: 更新電子郵件地址
send_success: >-
@ -672,6 +856,17 @@ ui:
label: 新電子郵件
msg:
empty: 郵箱不能為空
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: 密碼重置
btn_name: 重置我的密碼
@ -690,6 +885,7 @@ ui:
label: 確認新密碼
settings:
page_title: 設置
goto_modify: Go to Modify
nav:
profile: 我的資料
notification: 通知
@ -711,7 +907,7 @@ ui:
avatar:
label: 頭像
gravatar: 頭像
gravatar_text: 您可以在 <1>gravatar.com</1> 更改圖像
gravatar_text: You can change image on
custom: 自定義
btn_refresh: 重新整理
custom_text: 您可以上傳您的圖片。
@ -738,8 +934,11 @@ ui:
change_email_info: >-
我們已經寄出一封郵件至此電子郵件地址,請遵照說明進行確認。
email:
label: 郵箱
msg: 郵箱不能為空
label: New Email
msg: New Email cannot be empty.
pass:
label: Current Password
msg: Password cannot be empty.
password_title: 密碼
current_pass:
label: 當前密碼
@ -756,6 +955,13 @@ ui:
lang:
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
toast:
update: 更新成功
update_password: 更改密碼成功。
@ -766,6 +972,12 @@ ui:
title: 相關問題
btn: 發問
answers: 個回答
invite_to_answer:
title: People asked
desc: Invite people who you think might know the answer.
invite: Invite to answer
add: Add people
search: Search people
question_detail:
action: Action
Asked: 提問於
@ -775,12 +987,13 @@ ui:
Views: 閱讀次數
Follow: 關注
Following: 已關注
follow_tip: Follow this question to receive notifications
answered: 回答於
closed_in: 關閉於
show_exist: 顯示現有問題。
useful: Useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
question_useful: It is useful and clear
question_un_useful: It is unclear or not useful
answer_useful: It is useful
answer_un_useful: It is not useful
answers:
@ -824,6 +1037,7 @@ ui:
btns:
confirm: 確認
cancel: 取消
edit: Edit
save: 儲存
delete: 刪除
login: 登入
@ -836,6 +1050,10 @@ ui:
skip: 略過
discard_draft: Discard draft
pinned: Pinned
all: All
question: Question
answer: Answer
comment: Comment
search:
title: 搜尋結果
keywords: 關鍵詞
@ -870,7 +1088,6 @@ ui:
modal_confirm:
title: 發生錯誤...
account_result:
page_title: 歡迎來到 {{site_name}}
success: 你的帳號已通過驗證,即將返回首頁。
link: 繼續訪問主頁
invalid: >-
@ -931,8 +1148,7 @@ ui:
accepted: 已採納
answered: 回答於
asked: 提問於
upvote: 讚同
downvote: 反對
downvoted: downvoted
mod_short: 模組
mod_long: 管理員
x_reputation: 聲望
@ -994,6 +1210,7 @@ ui:
admin_name:
label: 暱稱
msg: 暱稱不能為空。
character: 'Must use the character set "a-z", "0-9", " - . _"'
admin_password:
label: 密碼
text: >-
@ -1025,7 +1242,7 @@ ui:
answers: 回答
accepted: 已採納
page_error:
http_error: HTTP Error {{ code }}
http_error: HTTP 错误 {{ code }}
desc_403: You dont 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.
@ -1051,8 +1268,19 @@ ui:
seo: SEO
customize: 自定義
themes: 主題
css-html: CSS/HTML
css_html: CSS/HTML
login: 登入
privileges: Privileges
plugins: Plugins
installed_plugins: Installed Plugins
website_welcome: Welcome to {{site_name}}
plugins:
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.
oauth:
connect: Connect with {{ auth_name }}
remove: Remove {{ auth_name }}
admin:
admin_header:
title: 後台管理
@ -1095,6 +1323,7 @@ ui:
pending: 等待處理
completed: 已完成
flagged: 已標記
flagged_type: Flagged {{ type }}
created: 創建於
action: 操作
review: 審核
@ -1122,7 +1351,7 @@ ui:
closed_name: 關閉
closed_desc: "關閉的問題不能回答,但仍然可以編輯、投票和評論。"
deleted_name: 刪除
deleted_desc: 獲得和失去的所有信譽將被恢復。
deleted_desc: This post will be deleted.
btn_cancel: 取消
btn_submit: 提交
btn_next: 下一步
@ -1243,9 +1472,6 @@ ui:
label: 時區
msg: 時區不能為空。
text: 選擇一個與您相同時區的城市。
avatar:
label: Default Avatar
text: For users without a custom avatar of their own.
smtp:
page_title: SMTP
from_email:
@ -1355,22 +1581,77 @@ ui:
footer:
label: 頁尾
text: 這將在 </html> 之前插入
sidebar:
label: Sidebar
text: This will insert in sidebar.
login:
page_title: 登入
membership:
title: 會員
label: 允許新註冊
text: 關閉以防止任何人創建新帳戶。
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: 非公開的
label: 需要登入
text: 只有登入使用者才能訪問這個社群。
installed_plugins:
title: Installed Plugins
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 providers 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
form:
optional: (選填)
empty: 不能為空
invalid: 是無效的
btn_submit: 儲存
not_found_props: "所需屬性 {{ key }} 未找到。"
select: Select
page_review:
review: 審核
proposed: 提案

View File

@ -61,7 +61,7 @@ const (
DatabaseConnectionFailed = "error.database.connection_failed"
InstallCreateTableFailed = "error.database.create_table_failed"
InstallConfigFailed = "error.install.create_config_failed"
SiteInfoNotFound = "error.site_info.not_found"
SiteInfoConfigNotFound = "error.site_info.config_not_found"
UploadFileSourceUnsupported = "error.upload.source_unsupported"
UploadFileUnsupportedFileFormat = "error.upload.unsupported_file_format"
RecommendTagNotExist = "error.tag.recommend_tag_not_found"

View File

@ -623,6 +623,7 @@ func (uc *UserController) SearchUserListByName(ctx *gin.Context) {
if handler.BindAndCheck(ctx, req) {
return
}
resp, err := uc.userService.SearchUserListByName(ctx, req.Username)
req.UserID = middleware.GetLoginUserIDFromContext(ctx)
resp, err := uc.userService.SearchUserListByName(ctx, req)
handler.HandleResponse(ctx, err, resp)
}

View File

@ -69,7 +69,7 @@ var migrations = []Migration{
NewMigration("v1.0.9", "add login limitations", addLoginLimitations, true),
NewMigration("v1.1.0-beta.1", "update user pin hide features", updateRolePinAndHideFeatures, true),
NewMigration("v1.1.0-beta.2", "update question post time", updateQuestionPostTime, true),
NewMigration("v1.1.0", "add gravatar base url", updateCount, false),
NewMigration("v1.1.0", "add gravatar base url", updateCount, true),
}
// GetCurrentDBVersion returns the current db version

View File

@ -14,14 +14,21 @@ import (
)
func updateCount(x *xorm.Engine) error {
addPrivilegeForInviteSomeoneToAnswer(x)
addGravatarBaseURL(x)
updateQuestionCount(x)
updateTagCount(x)
updateUserQuestionCount(x)
updateUserAnswerCount(x)
inviteAnswer(x)
inBoxData(x)
fns := []func(*xorm.Engine) error{
inviteAnswer,
addPrivilegeForInviteSomeoneToAnswer,
addGravatarBaseURL,
updateQuestionCount,
updateTagCount,
updateUserQuestionCount,
updateUserAnswerCount,
inBoxData,
}
for _, fn := range fns {
if err := fn(x); err != nil {
return err
}
}
return nil
}

View File

@ -206,10 +206,29 @@ func (ar *answerRepo) GetByID(ctx context.Context, id string) (*entity.Answer, b
return &resp, has, nil
}
func (ar *answerRepo) GetCountByQuestionID(ctx context.Context, questionID string) (int64, error) {
questionID = uid.DeShortID(questionID)
rows := make([]*entity.Answer, 0)
count, err := ar.data.DB.Context(ctx).Where("question_id =? and status = ?", questionID, entity.AnswerStatusAvailable).FindAndCount(&rows)
if err != nil {
return count, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
return count, nil
}
func (ar *answerRepo) GetCountByUserID(ctx context.Context, userID string) (int64, error) {
rows := make([]*entity.Answer, 0)
count, err := ar.data.DB.Context(ctx).Where(" user_id = ? and status = ?", userID, entity.AnswerStatusAvailable).FindAndCount(&rows)
if err != nil {
return count, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
return count, nil
}
func (ar *answerRepo) GetByUserIDQuestionID(ctx context.Context, userID string, questionID string) (*entity.Answer, bool, error) {
questionID = uid.DeShortID(questionID)
var resp entity.Answer
has, err := ar.data.DB.Context(ctx).Where("question_id =? and user_id = ?", questionID, userID).Get(&resp)
has, err := ar.data.DB.Context(ctx).Where("question_id =? and user_id = ? and status = ?", questionID, userID, entity.AnswerStatusAvailable).Get(&resp)
if err != nil {
return &resp, false, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
@ -255,7 +274,11 @@ func (ar *answerRepo) SearchList(ctx context.Context, search *entity.AnswerSearc
session = session.OrderBy("adopted desc,vote_count desc,created_at asc")
}
if !search.IncludeDeleted {
session = session.And("status = ? OR user_id = ?", entity.AnswerStatusAvailable, search.LoginUserID)
if search.LoginUserID == "" {
session = session.And("status = ? ", entity.AnswerStatusAvailable)
} else {
session = session.And("status = ? OR user_id = ?", entity.AnswerStatusAvailable, search.LoginUserID)
}
}
session = session.Limit(search.PageSize, offset)

View File

@ -80,8 +80,8 @@ func (cr configRepo) GetConfigByKey(ctx context.Context, key string) (c *entity.
func (cr configRepo) UpdateConfig(ctx context.Context, key string, value string) (err error) {
// check if key exists
cf := &entity.Config{}
exist, err := cr.data.DB.Context(ctx).Get(cf)
oldConfig := &entity.Config{}
exist, err := cr.data.DB.Context(ctx).Get(oldConfig)
if err != nil {
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
@ -90,19 +90,20 @@ func (cr configRepo) UpdateConfig(ctx context.Context, key string, value string)
}
// update database
_, err = cr.data.DB.Context(ctx).ID(cf.ID).Update(&entity.Config{Value: value})
_, err = cr.data.DB.Context(ctx).ID(oldConfig.ID).Update(&entity.Config{Value: value})
if err != nil {
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
cacheVal := cf.JsonString()
oldConfig.Value = value
cacheVal := oldConfig.JsonString()
// update cache
if err := cr.data.Cache.SetString(ctx,
constant.ConfigKEY2ContentCacheKeyPrefix+key, cacheVal, -1); err != nil {
log.Error(err)
}
if err := cr.data.Cache.SetString(ctx,
fmt.Sprintf("%s%d", constant.ConfigID2KEYCacheKeyPrefix, cf.ID), cacheVal, -1); err != nil {
fmt.Sprintf("%s%d", constant.ConfigID2KEYCacheKeyPrefix, oldConfig.ID), cacheVal, -1); err != nil {
log.Error(err)
}
return

View File

@ -93,7 +93,8 @@ func (qr *questionRepo) UpdatePvCount(ctx context.Context, questionID string) (e
func (qr *questionRepo) UpdateAnswerCount(ctx context.Context, questionID string, num int) (err error) {
questionID = uid.DeShortID(questionID)
question := &entity.Question{}
_, err = qr.data.DB.Context(ctx).Where("id =?", questionID).Incr("answer_count", num).Update(question)
question.AnswerCount = num
_, err = qr.data.DB.Context(ctx).Where("id =?", questionID).Cols("answer_count").Update(question)
if err != nil {
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}

View File

@ -355,6 +355,7 @@ type UserBasicInfo struct {
type GetOtherUserInfoByUsernameReq struct {
Username string `validate:"required,gt=0,lte=500" form:"username"`
UserID string `json:"-"`
}
type GetOtherUserInfoResp struct {

View File

@ -17,6 +17,8 @@ type AnswerRepo interface {
GetAnswerPage(ctx context.Context, page, pageSize int, answer *entity.Answer) (answerList []*entity.Answer, total int64, err error)
UpdateAccepted(ctx context.Context, id string, questionID string) error
GetByID(ctx context.Context, id string) (*entity.Answer, bool, error)
GetCountByQuestionID(ctx context.Context, questionID string) (int64, error)
GetCountByUserID(ctx context.Context, userID string) (int64, error)
GetByUserIDQuestionID(ctx context.Context, userID string, questionID string) (*entity.Answer, bool, error)
SearchList(ctx context.Context, search *entity.AnswerSearch) ([]*entity.Answer, int64, error)
AdminSearchList(ctx context.Context, search *entity.AdminAnswerSearch) ([]*entity.Answer, int64, error)

View File

@ -118,21 +118,24 @@ func (as *AnswerService) RemoveAnswer(ctx context.Context, req *schema.RemoveAns
}
// user add question count
err = as.questionCommon.UpdateAnswerCount(ctx, answerInfo.QuestionID, -1)
if err != nil {
log.Error("IncreaseAnswerCount error", err.Error())
}
err = as.userCommon.UpdateAnswerCount(ctx, answerInfo.UserID, -1)
if err != nil {
log.Error("user IncreaseAnswerCount error", err.Error())
}
err = as.answerRepo.RemoveAnswer(ctx, req.ID)
if err != nil {
return err
}
// user add question count
err = as.questionCommon.UpdateAnswerCount(ctx, answerInfo.QuestionID)
if err != nil {
log.Error("IncreaseAnswerCount error", err.Error())
}
userAnswerCount, err := as.answerRepo.GetCountByUserID(ctx, answerInfo.UserID)
if err != nil {
log.Error("GetCountByUserID error", err.Error())
}
err = as.userCommon.UpdateAnswerCount(ctx, answerInfo.UserID, int(userAnswerCount))
if err != nil {
log.Error("user IncreaseAnswerCount error", err.Error())
}
// #2372 In order to simplify the process and complexity, as well as to consider if it is in-house,
// facing the problem of recovery.
//err = as.answerActivityService.DeleteAnswer(ctx, answerInfo.ID, answerInfo.CreatedAt, answerInfo.VoteCount)
@ -173,7 +176,7 @@ func (as *AnswerService) Insert(ctx context.Context, req *schema.AnswerAddReq) (
if err = as.answerRepo.AddAnswer(ctx, insertData); err != nil {
return "", err
}
err = as.questionCommon.UpdateAnswerCount(ctx, req.QuestionID, 1)
err = as.questionCommon.UpdateAnswerCount(ctx, req.QuestionID)
if err != nil {
log.Error("IncreaseAnswerCount error", err.Error())
}
@ -185,8 +188,11 @@ func (as *AnswerService) Insert(ctx context.Context, req *schema.AnswerAddReq) (
if err != nil {
return insertData.ID, err
}
err = as.userCommon.UpdateAnswerCount(ctx, req.UserID, 1)
userAnswerCount, err := as.answerRepo.GetCountByUserID(ctx, req.UserID)
if err != nil {
log.Error("GetCountByUserID error", err.Error())
}
err = as.userCommon.UpdateAnswerCount(ctx, req.UserID, int(userAnswerCount))
if err != nil {
log.Error("user IncreaseAnswerCount error", err.Error())
}
@ -524,6 +530,7 @@ func (as *AnswerService) SearchFormatInfo(ctx context.Context, answers []*entity
userIDs = append(userIDs, info.UserID)
userIDs = append(userIDs, info.LastEditUserID)
if req.UserID != "" {
item.ID = uid.DeShortID(item.ID)
item.VoteStatus = as.voteRepo.GetVoteStatus(ctx, item.ID, req.UserID)
}
}

View File

@ -54,19 +54,6 @@ type EmailConfig struct {
SMTPUsername string `json:"smtp_username"`
SMTPPassword string `json:"smtp_password"`
SMTPAuthentication bool `json:"smtp_authentication"`
RegisterTitle string `json:"register_title"`
RegisterBody string `json:"register_body"`
PassResetTitle string `json:"pass_reset_title"`
PassResetBody string `json:"pass_reset_body"`
ChangeTitle string `json:"change_title"`
ChangeBody string `json:"change_body"`
TestTitle string `json:"test_title"`
TestBody string `json:"test_body"`
NewAnswerTitle string `json:"new_answer_title"`
NewAnswerBody string `json:"new_answer_body"`
NewCommentTitle string `json:"new_comment_title"`
NewCommentBody string `json:"new_comment_body"`
}
func (e *EmailConfig) IsSSL() bool {
@ -306,7 +293,8 @@ func (es *EmailService) GetEmailConfig(ctx context.Context) (ec *EmailConfig, er
ec = &EmailConfig{}
err = json.Unmarshal([]byte(emailConf), ec)
if err != nil {
return nil, errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
log.Errorf("old email config format is invalid, you need to update smtp config: %v", err)
return nil, errors.BadRequest(reason.SiteInfoConfigNotFound)
}
return ec, nil
}

View File

@ -102,8 +102,12 @@ func (qs *QuestionCommon) UpdatePv(ctx context.Context, questionID string) error
return qs.questionRepo.UpdatePvCount(ctx, questionID)
}
func (qs *QuestionCommon) UpdateAnswerCount(ctx context.Context, questionID string, num int) error {
return qs.questionRepo.UpdateAnswerCount(ctx, questionID, num)
func (qs *QuestionCommon) UpdateAnswerCount(ctx context.Context, questionID string) error {
count, err := qs.answerRepo.GetCountByQuestionID(ctx, questionID)
if err != nil {
return err
}
return qs.questionRepo.UpdateAnswerCount(ctx, questionID, int(count))
}
func (qs *QuestionCommon) UpdateCollectionCount(ctx context.Context, questionID string, num int) error {
@ -526,12 +530,15 @@ func (as *QuestionCommon) RemoveAnswer(ctx context.Context, id string) (err erro
// user add question count
err = as.UpdateAnswerCount(ctx, answerinfo.QuestionID, -1)
err = as.UpdateAnswerCount(ctx, answerinfo.QuestionID)
if err != nil {
log.Error("UpdateAnswerCount error", err.Error())
}
err = as.userCommon.UpdateAnswerCount(ctx, answerinfo.UserID, -1)
userAnswerCount, err := as.answerRepo.GetCountByUserID(ctx, answerinfo.UserID)
if err != nil {
log.Error("GetCountByUserID error", err.Error())
}
err = as.userCommon.UpdateAnswerCount(ctx, answerinfo.UserID, int(userAnswerCount))
if err != nil {
log.Error("user UpdateAnswerCount error", err.Error())
}

View File

@ -573,10 +573,7 @@ func (qs *QuestionService) UpdateQuestionInviteUser(ctx context.Context, req *sc
for _, item := range req.InviteUser {
_, ok := inviteUserInfoList[item]
if ok {
//The inviter can't be himself.
if req.UserID != inviteUserInfoList[item].ID {
inviteUserIDs = append(inviteUserIDs, inviteUserInfoList[item].ID)
}
inviteUserIDs = append(inviteUserIDs, inviteUserInfoList[item].ID)
}
}
inviteUserStr := ""

View File

@ -226,9 +226,7 @@ func (s *SiteInfoService) SaveSiteUsers(ctx context.Context, req *schema.SiteUse
}
// GetSMTPConfig get smtp config
func (s *SiteInfoService) GetSMTPConfig(ctx context.Context) (
resp *schema.GetSMTPConfigResp, err error,
) {
func (s *SiteInfoService) GetSMTPConfig(ctx context.Context) (resp *schema.GetSMTPConfigResp, err error) {
emailConfig, err := s.emailService.GetEmailConfig(ctx)
if err != nil {
return nil, err
@ -240,13 +238,10 @@ func (s *SiteInfoService) GetSMTPConfig(ctx context.Context) (
// UpdateSMTPConfig get smtp config
func (s *SiteInfoService) UpdateSMTPConfig(ctx context.Context, req *schema.UpdateSMTPConfigReq) (err error) {
oldEmailConfig, err := s.emailService.GetEmailConfig(ctx)
if err != nil {
return err
}
_ = copier.Copy(oldEmailConfig, req)
ec := &export.EmailConfig{}
_ = copier.Copy(ec, req)
err = s.emailService.SetEmailConfig(ctx, oldEmailConfig)
err = s.emailService.SetEmailConfig(ctx, ec)
if err != nil {
return err
}
@ -257,7 +252,7 @@ func (s *SiteInfoService) UpdateSMTPConfig(ctx context.Context, req *schema.Upda
}
go s.emailService.SendAndSaveCode(ctx, req.TestEmailRecipient, title, body, "", "")
}
return
return nil
}
func (s *SiteInfoService) GetSeo(ctx context.Context) (resp *schema.SiteSeoReq, err error) {

View File

@ -817,17 +817,20 @@ func (us *UserService) getUserInfoMapping(ctx context.Context, userIDs []string)
return userInfoMapping, nil
}
func (us *UserService) SearchUserListByName(ctx context.Context, name string) ([]*schema.UserBasicInfo, error) {
func (us *UserService) SearchUserListByName(ctx context.Context, input *schema.GetOtherUserInfoByUsernameReq) ([]*schema.UserBasicInfo, error) {
userinfolist := make([]*schema.UserBasicInfo, 0)
list, err := us.userRepo.SearchUserListByName(ctx, name)
list, err := us.userRepo.SearchUserListByName(ctx, input.Username)
if err != nil {
return userinfolist, err
}
avatarMapping := us.siteInfoService.FormatListAvatar(ctx, list)
for _, user := range list {
userinfo := us.userCommonService.FormatUserBasicInfo(ctx, user)
userinfo.Avatar = avatarMapping[user.ID].GetURL()
userinfolist = append(userinfolist, userinfo)
if input.UserID != user.ID {
userinfo := us.userCommonService.FormatUserBasicInfo(ctx, user)
userinfo.Avatar = avatarMapping[user.ID].GetURL()
userinfolist = append(userinfolist, userinfo)
}
}
return userinfolist, nil
}

View File

@ -3,13 +3,14 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="theme-color" content="#0033FF" />
<meta name="theme-color" />
<meta name="generator" content="Answer - https://github.com/answerdev/answer">
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root">
<div id="spin-mask">
<noscript>
<style>
@ -17,7 +18,7 @@
display: none !important;
}
#protect-brower {
#protect-browser {
display: none;
}
</style>
@ -54,7 +55,7 @@
animation: 0.75s linear infinite _doc-spin;
}
#protect-brower {
#protect-browser {
padding: 20px;
text-align: center;
}
@ -62,8 +63,9 @@
<div id="spin-container">
<div class="spinner"></div>
</div>
<div id="protect-brower"></div>
<div id="protect-browser"></div>
</div>
</div>
</body>
<script>
@ -91,20 +93,20 @@
name: 'IE',
}
];
function getBrowerTypeAndVersion(){
var brower = {
function getBrowserTypeAndVersion(){
var browser = {
name: '',
version: ''
};
var ua = navigator.userAgent.toLowerCase();
var s;
((ua.indexOf("compatible") > -1 && ua.indexOf("MSIE") > -1) || (ua.indexOf('Trident') > -1 && ua.indexOf("rv:11.0") > -1)) ? brower = { name: 'IE', version: '' } :
(s = ua.match(/edge\/([\d\.]+)/)) ? brower = { name: 'Edge', version: s[1] } :
(s = ua.match(/firefox\/([\d\.]+)/)) ? brower = { name: 'Firefox', version: s[1] } :
(s = ua.match(/chrome\/([\d\.]+)/)) ? brower = { name: 'Chrome', version: s[1] } :
(s = ua.match(/version\/([\d\.]+).*safari/)) ? brower = { name: 'Safari', version: s[1] } : brower = { name: 'unknown', version: '' };
((ua.indexOf("compatible") > -1 && ua.indexOf("MSIE") > -1) || (ua.indexOf('Trident') > -1 && ua.indexOf("rv:11.0") > -1)) ? browser = { name: 'IE', version: '' } :
(s = ua.match(/edge\/([\d\.]+)/)) ? browser = { name: 'Edge', version: s[1] } :
(s = ua.match(/firefox\/([\d\.]+)/)) ? browser = { name: 'Firefox', version: s[1] } :
(s = ua.match(/chrome\/([\d\.]+)/)) ? browser = { name: 'Chrome', version: s[1] } :
(s = ua.match(/version\/([\d\.]+).*safari/)) ? browser = { name: 'Safari', version: s[1] } : browser = { name: 'unknown', version: '' };
// 根据关系进行判断
return brower;
return browser;
}
function compareVersion(version1, version2) {
@ -129,25 +131,23 @@
return 0;
}
const browerInfo = getBrowerTypeAndVersion();
const browserInfo = getBrowserTypeAndVersion();
if (browerInfo.name === 'IE') {
const div = document.getElementById('protect-brower');
if (browserInfo.name === 'IE') {
const div = document.getElementById('protect-browser');
div.innerText = 'Sorry, this site does not support Internet Explorer. In order to avoid affecting the normal use of our features, please use a more modern browser such as Edge, Firefox, Chrome, or Safari.'
} else {
const notSupport = defaultList.some(item => {
if (item.name === browerInfo.name) {
return compareVersion(browerInfo.version, item.version) === -1;
if (item.name === browserInfo.name) {
return compareVersion(browserInfo.version, item.version) === -1;
}
return false;
});
if (notSupport) {
const div = document.getElementById('protect-brower');
const div = document.getElementById('protect-browser');
div.innerText = 'The current browser version is too low, in order not to affect the normal use of the function, please upgrade the browser to the latest version.'
}
}
</script>
</html>

View File

@ -3,3 +3,4 @@ $enable-negative-margins: true;
$blue: #0033FF !default;
$placeholder-opacity-max: .2;
$placeholder-opacity-min: .1;
$enable-smooth-scroll: false;

View File

@ -8,6 +8,8 @@ export const CAPTCHA_CODE_STORAGE_KEY = '_a_captcha_';
export const DRAFT_QUESTION_STORAGE_KEY = '_a_dq_';
export const DRAFT_ANSWER_STORAGE_KEY = '_a_da_';
export const DRAFT_TIMESIGH_STORAGE_KEY = '|_a_t_s_|';
export const QUESTIONS_ORDER_STORAGE_KEY = '_a_qok_';
export const USER_AGENT_NAMES = {
SegmentFault: 'SegmentFault',
WeChat: 'WeChat',

View File

@ -109,6 +109,15 @@ enum RoleId {
Admin = 2,
Moderator = 3,
}
export interface User {
username: string;
rank: number;
vote_count: number;
display_name: string;
avatar: string;
}
export interface UserInfoBase {
id?: string;
avatar: any;
@ -122,7 +131,7 @@ export interface UserInfoBase {
*/
status?: string;
/** roles */
role_id: RoleId;
role_id?: RoleId;
}
export interface UserInfoRes extends UserInfoBase {
@ -161,7 +170,7 @@ export interface PasswordResetReq extends ImgCodeReq {
}
export interface CheckImgReq {
action: 'login' | 'e_mail' | 'find_pass';
action: 'login' | 'e_mail' | 'find_pass' | 'modify_pass';
}
export interface SetNoticeReq {
@ -333,6 +342,7 @@ export interface AdminSettingsUsers {
allow_update_username: boolean;
allow_update_website: boolean;
default_avatar: string;
gravatar_base_url: string;
}
export interface SiteSettings {
@ -539,14 +549,6 @@ export interface MemberActionItem {
type: string;
}
export interface User {
username: string;
rank: number;
vote_count: number;
display_name: string;
avatar: string;
}
export interface QuestionOperationReq {
id: string;
operation: 'pin' | 'unpin' | 'hide' | 'show';
@ -568,8 +570,3 @@ export interface UserOauthConnectorItem extends OauthConnectorItem {
binding: boolean;
external_id: string;
}
export interface QuestionOperationReq {
id: string;
operation: 'pin' | 'unpin' | 'hide' | 'show';
}

View File

@ -0,0 +1,17 @@
.page-main {
max-width: 70%;
}
.page-right-side {
flex: none;
width: 30%;
}
// lg
@media screen and (max-width: 1199.9px) {
.page-main {
max-width: 100%;
}
.page-right-side {
width: 100%;
}
}

View File

@ -27,12 +27,15 @@ const Index: FC<IProps> = ({ avatar, size, className, searchStr = '' }) => {
url = `${avatar.custom}?${searchStr}`;
}
const roundedCls =
className && className.indexOf('rounded') !== -1 ? '' : 'rounded';
return (
<img
src={url || DefaultAvatar}
width={size}
height={size}
className={classNames('rounded', className)}
className={classNames(roundedCls, className)}
alt=""
/>
);

View File

@ -19,7 +19,7 @@ const Index: FC<Props> = ({
showAvatar = true,
avatarClass = '',
avatarSize = '20px',
className = 'fs-14',
className = 'small',
avatarSearchStr = 's=48',
showReputation = true,
}) => {

View File

@ -22,7 +22,7 @@ const ActionBar = ({
const { t } = useTranslation('translation', { keyPrefix: 'comment' });
return (
<div className="d-flex justify-content-between fs-14">
<div className="d-flex justify-content-between small">
<div className="d-flex align-items-center link-secondary">
{userStatus !== 'deleted' ? (
<Link to={`/users/${username}`}>{nickName}</Link>

View File

@ -33,7 +33,7 @@ const Index = ({ userName, onSendReply, onCancel, mode }) => {
return (
<div className="mb-2">
<div className="fs-14 mb-2">
<div className="small mb-2">
{t('reply_to')} {userName}
</div>
<div className="d-flex mb-1 align-items-start flex-column flex-md-row">

View File

@ -258,13 +258,13 @@ const Comment = ({ objectId, mode, commentId }) => {
) : (
<div className="d-block">
{item.reply_user_display_name && (
<Link to="." className="fs-14 me-1 text-nowrap">
<Link to="." className="small me-1 text-nowrap">
@{item.reply_user_display_name}
</Link>
)}
<div
className="fmt fs-14 text-break text-wrap"
className="fmt small text-break text-wrap"
dangerouslySetInnerHTML={{ __html: item.parsed_text }}
/>
</div>
@ -306,7 +306,8 @@ const Comment = ({ objectId, mode, commentId }) => {
<div className="mt-2">
<Button
variant="link"
className="p-0 fs-14 btn-no-border"
className="p-0 btn-no-border"
size="sm"
onClick={() => {
if (tryNormalLogged(true)) {
setVisibleComment(!visibleComment);
@ -317,7 +318,8 @@ const Comment = ({ objectId, mode, commentId }) => {
{data && (pageIndex || 1) < Math.ceil((data?.count || 0) / pageSize) && (
<Button
variant="link"
className="p-0 fs-14 ms-3 btn-no-border"
size="sm"
className="p-0 ms-3 btn-no-border"
onClick={() => {
setPageIndex(pageIndex + 1);
}}>

View File

@ -1,4 +1,4 @@
import { FC } from 'react';
import { FC, useLayoutEffect } from 'react';
import { Helmet } from 'react-helmet-async';
import Color from 'color';
@ -11,10 +11,17 @@ const Index: FC = () => {
let primaryColor;
if (theme_config?.[theme]?.primary_color) {
primaryColor = Color(theme_config[theme].primary_color);
document
.querySelector('meta[name="theme-color"]')
?.setAttribute('content', primaryColor.hex());
}
const setThemeColor = () => {
const themeMetaNode = document.querySelector('meta[name="theme-color"]');
if (themeMetaNode) {
const themeColor = primaryColor ? primaryColor.hex() : '#0033ff';
themeMetaNode.setAttribute('content', themeColor);
}
};
useLayoutEffect(() => {
setThemeColor();
}, [primaryColor]);
return (
<Helmet>

View File

@ -94,7 +94,7 @@ const Index: FC<Props> = ({
{objectType === 'tag' && opts?.showTagUrlSlug && (
<div
className={classnames(
'fs-14 font-monospace',
'small font-monospace',
newData.original_text && 'mb-4',
)}
dangerouslySetInnerHTML={{
@ -113,7 +113,7 @@ const Index: FC<Props> = ({
dangerouslySetInnerHTML={{
__html: diffText(newData.original_text, oldData?.original_text),
}}
className="pre-line text-break font-monospace fs-14"
className="pre-line text-break font-monospace small"
/>
</div>
);

View File

@ -29,7 +29,7 @@ const Heading: FC<IEditorContext> = (context) => {
label: t('heading.options.h4'),
},
{
text: `<h5 class="mb-0 fs-14">${t('heading.options.h5')}</h5>`,
text: `<h5 class="mb-0 small">${t('heading.options.h5')}</h5>`,
level: 5,
label: t('heading.options.h5'),
},

View File

@ -94,13 +94,17 @@ export function htmlRender(el: HTMLElement | null) {
el.querySelectorAll('.language-mermaid').forEach((pre) => {
const flag = Date.now();
mermaid.render(`theGraph${flag}`, pre.textContent, function (svgCode) {
const p = document.createElement('p');
p.className = 'text-center';
p.innerHTML = svgCode;
mermaid.render(
`theGraph${flag}`,
pre.textContent || '',
function (svgCode) {
const p = document.createElement('p');
p.className = 'text-center';
p.innerHTML = svgCode;
pre.parentNode?.replaceChild(p, pre);
});
pre.parentNode?.replaceChild(p, pre);
},
);
});
});
import('katex/contrib/auto-render/auto-render').then(

View File

@ -13,7 +13,7 @@ const Index = () => {
return (
<footer className="bg-light">
<Container className="py-3">
<p className="text-center mb-0 fs-14 text-secondary">
<p className="text-center mb-0 small text-secondary">
<Trans i18nKey="footer.build_on" values={{ cc }}>
Built on
{/* eslint-disable-next-line react/jsx-no-target-blank */}

View File

@ -63,29 +63,16 @@ const Index: FC<Props> = ({ redDot, userInfo, logOut }) => {
onClick={handleLinkClick}>
{t('header.nav.profile')}
</Dropdown.Item>
<Dropdown.Item
href={`/users/${userInfo.username}/bookmarks`}
onClick={handleLinkClick}>
{t('header.nav.bookmark')}
</Dropdown.Item>
<Dropdown.Item
href="/users/settings/profile"
onClick={handleLinkClick}>
{t('header.nav.setting')}
</Dropdown.Item>
{userInfo?.role_id === 2 ? (
<Dropdown.Item href="/admin" onClick={handleLinkClick}>
{t('header.nav.admin')}
</Dropdown.Item>
) : null}
{redDot?.can_revision ? (
<Dropdown.Item
href="/review"
className="position-relative"
onClick={handleLinkClick}>
{t('header.nav.review')}
{redDot?.revision > 0 && (
<span className="position-absolute top-50 translate-middle-y end-0 me-3 p-2 bg-danger border border-light rounded-circle">
<span className="visually-hidden">New Review</span>
</span>
)}
</Dropdown.Item>
) : null}
<Dropdown.Divider />
<Dropdown.Item onClick={logOut}>
{t('header.nav.logout')}

View File

@ -52,10 +52,14 @@
&.theme-light {
background: linear-gradient(180deg, rgb(255, 255, 255) 0%, rgba(255, 255, 255, 0.95) 100%);
}
.maxw-400 {
max-width: 400px;;
}
}
@media (max-width: 992.9px) {
@media (max-width: 991.9px) {
#header {
.nav-grow {
flex-grow: 1!important;
@ -65,8 +69,8 @@
display: flex!important;
}
.w-75 {
width: 100% !important;
.maxw-400 {
max-width: 100%;
}
}

View File

@ -11,7 +11,6 @@ import {
import { useTranslation } from 'react-i18next';
import {
useSearchParams,
NavLink,
Link,
useNavigate,
useLocation,
@ -20,13 +19,14 @@ import {
import classnames from 'classnames';
import { userCenter } from '@/utils';
import { userCenter, floppyNavigation } from '@/utils';
import {
loggedUserInfoStore,
siteInfoStore,
brandingStore,
loginSettingStore,
themeSettingStore,
sideNavStore,
} from '@/stores';
import { logout, useQueryNotificationStatus } from '@/services';
@ -45,6 +45,7 @@ const Header: FC = () => {
const siteInfo = siteInfoStore((state) => state.siteInfo);
const brandingInfo = brandingStore((state) => state.branding);
const loginSetting = loginSettingStore((state) => state.login);
const { updateReiview, updateVisible } = sideNavStore();
const { data: redDot } = useQueryNotificationStatus();
/**
* Automatically append `tag` information when creating a question
@ -55,6 +56,13 @@ const Header: FC = () => {
askUrl = `${askUrl}?tags=${tagMatch.params.slugName}`;
}
useEffect(() => {
updateReiview({
can_revision: Boolean(redDot?.can_revision),
revision: Number(redDot?.revision),
});
}, [redDot]);
const handleInput = (val) => {
setSearch(val);
};
@ -106,10 +114,13 @@ const Header: FC = () => {
aria-controls="navBarContent"
className="answer-navBar me-2"
id="navBarToggle"
onClick={() => {
updateVisible();
}}
/>
<div className="d-flex justify-content-between align-items-center nav-grow flex-nowrap">
<Navbar.Brand to="/" as={Link} className="lh-1 me-0 me-sm-3 p-0">
<Navbar.Brand to="/" as={Link} className="lh-1 me-0 me-sm-5 p-0">
{brandingInfo.logo ? (
<>
<img
@ -141,6 +152,7 @@ const Header: FC = () => {
'link-light': navbarStyle === 'theme-colored',
'link-primary': navbarStyle !== 'theme-colored',
})}
onClick={() => floppyNavigation.storageLoginRedirect()}
href={userCenter.getLoginUrl()}>
{t('btns.login')}
</Button>
@ -159,26 +171,11 @@ const Header: FC = () => {
</div>
<Navbar.Collapse id="navBarContent" className="me-auto">
<hr className="hr lg-none mb-2" style={{ marginTop: '12px' }} />
<Col md={4}>
<Nav>
<NavLink className="nav-link" to="/questions">
{t('header.nav.question')}
</NavLink>
<NavLink className="nav-link" to="/tags">
{t('header.nav.tag')}
</NavLink>
<NavLink className="nav-link" to="/users">
{t('header.nav.user')}
</NavLink>
</Nav>
</Col>
<hr className="hr lg-none mt-2" />
<Col lg={4} className="d-flex justify-content-center">
<hr className="hr lg-none mb-3" style={{ marginTop: '12px' }} />
<Col lg={8} className="ps-0">
<Form
action="/search"
className="w-75 px-0 px-lg-2"
className="w-100 maxw-400"
onSubmit={handleSearch}>
<FormControl
placeholder={t('header.search.placeholder')}
@ -228,6 +225,7 @@ const Header: FC = () => {
'link-light': navbarStyle === 'theme-colored',
'link-primary': navbarStyle !== 'theme-colored',
})}
onClick={() => floppyNavigation.storageLoginRedirect()}
href={userCenter.getLoginUrl()}>
{t('btns.login')}
</Button>

View File

@ -29,7 +29,7 @@ const HotQuestions: FC = () => {
<div className="link-dark">{li.title}</div>
{li.answer_count > 0 ? (
<div
className={`d-flex align-items-center fs-14 mt-1 ${
className={`d-flex align-items-center small mt-1 ${
li.accepted_answer_id > 0
? 'link-success'
: 'link-secondary'

View File

@ -1,4 +1,4 @@
import React from 'react';
import { useEffect } from 'react';
import { Modal, Form, Button, InputGroup } from 'react-bootstrap';
import { useTranslation } from 'react-i18next';
@ -30,6 +30,13 @@ const Index: React.FC<IProps> = ({
}) => {
const { t } = useTranslation('translation', { keyPrefix: 'pic_auth_code' });
const { captcha, imgCode } = data;
useEffect(() => {
if (visible) {
refreshImgCode();
}
}, [visible]);
return (
<Modal size="sm" title="Captcha" show={visible} onHide={onClose} centered>
<Modal.Header closeButton>

View File

@ -252,7 +252,7 @@ const Index: FC<IProps> = ({
<Link
key={item.action}
to={editUrl}
className="link-secondary p-0 fs-14 ms-3"
className="link-secondary p-0 small ms-3"
onClick={(evt) => handleEdit(evt, editUrl)}
style={{ lineHeight: '23px' }}>
{item.name}
@ -263,7 +263,8 @@ const Index: FC<IProps> = ({
<Button
key={item.action}
variant="link"
className="link-secondary p-0 fs-14 ms-3"
size="sm"
className="link-secondary p-0 ms-3"
onClick={() => handleAction(item.action)}>
{item.name}
</Button>
@ -273,7 +274,8 @@ const Index: FC<IProps> = ({
<Dropdown className="ms-3">
<Dropdown.Toggle
variant="link"
className="link-secondary p-0 fs-14 no-toggle">
size="sm"
className="link-secondary p-0 no-toggle">
{t('action', { keyPrefix: 'question_detail' })}
</Dropdown.Toggle>
<Dropdown.Menu>

View File

@ -2,6 +2,7 @@ import { FC, useEffect, useLayoutEffect } from 'react';
import { Helmet } from 'react-helmet-async';
import { brandingStore, pageTagStore, siteInfoStore } from '@/stores';
import { getCurrentLang } from '@/utils/localize';
const doInsertCustomCSS = !document.querySelector('link[href*="custom.css"]');
@ -32,7 +33,19 @@ const Index: FC = () => {
// eslint-disable-next-line no-empty
} catch (ex) {}
};
const currentLang = getCurrentLang();
const setDocLang = () => {
if (currentLang) {
document.documentElement.setAttribute(
'lang',
currentLang.replace('_', '-'),
);
}
};
useEffect(() => {
setDocLang();
}, [currentLang]);
useEffect(() => {
setAppGenerator();
}, [appVersion]);

View File

@ -3,8 +3,8 @@ import { ListGroup } from 'react-bootstrap';
import { NavLink, useSearchParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import type { QuestionOrderBy } from '@/common/interface';
import { pathFactory } from '@/router/pathFactory';
import type * as Type from '@/common/interface';
import {
Tag,
Pagination,
@ -16,25 +16,32 @@ import {
Counts,
Icon,
} from '@/components';
import * as Type from '@/common/interface';
const QuestionOrderKeys: Type.QuestionOrderBy[] = [
export const QUESTION_ORDER_KEYS: Type.QuestionOrderBy[] = [
'active',
'newest',
'frequent',
'score',
'unanswered',
];
interface Props {
source: 'questions' | 'tag';
order?: QuestionOrderBy;
data;
isLoading: boolean;
}
const QuestionList: FC<Props> = ({ source, data, isLoading = false }) => {
const QuestionList: FC<Props> = ({
source,
order,
data,
isLoading = false,
}) => {
const { t } = useTranslation('translation', { keyPrefix: 'question' });
const [urlSearchParams] = useSearchParams();
const curOrder = urlSearchParams.get('order') || QuestionOrderKeys[0];
const curOrder =
order || urlSearchParams.get('order') || QUESTION_ORDER_KEYS[0];
const curPage = Number(urlSearchParams.get('page')) || 1;
const pageSize = 20;
const count = data?.count || 0;
@ -47,7 +54,7 @@ const QuestionList: FC<Props> = ({ source, data, isLoading = false }) => {
: t('x_questions', { count })}
</h5>
<QueryGroup
data={QuestionOrderKeys}
data={QUESTION_ORDER_KEYS}
currentSort={curOrder}
pathname={source === 'questions' ? '/questions' : ''}
i18nKeyPrefix="question"
@ -77,7 +84,7 @@ const QuestionList: FC<Props> = ({ source, data, isLoading = false }) => {
{li.status === 2 ? ` [${t('closed')}]` : ''}
</NavLink>
</h5>
<div className="d-flex flex-column flex-md-row align-items-md-center fs-14 mb-2 text-secondary">
<div className="d-flex flex-column flex-md-row align-items-md-center small mb-2 text-secondary">
<div className="d-flex">
<BaseUserCard
data={li.operator}

View File

@ -71,7 +71,7 @@ const Index: FC<IProps> = ({ type, qid, aid, title, slugTitle = '' }) => {
<Dropdown.Toggle
id="dropdown-share"
as="a"
className="no-toggle fs-14 link-secondary pointer"
className="no-toggle small link-secondary pointer"
onClick={() => setShow(true)}
style={{ lineHeight: '23px' }}>
{t('share.name')}

View File

@ -0,0 +1,46 @@
#sideNav {
.nav-wrap {
position: sticky;
width: auto;
top: 62px;
box-sizing: border-box;
max-height: calc(100vh - 74px - 62px - 24px);
overflow-y: auto;
margin-bottom: 8px;
}
.nav {
max-width: calc(100% - 24px);
}
.nav-link {
color: rgba(0, 0, 0, 0.65);
}
.nav-link:hover {
color: rgba(0, 0, 0);
background-color: var(--bs-gray-100);
}
.nav-link.active {
color: black;
background-color: var(--bs-gray-200);
}
.side-nav-right-line {
position: absolute;
top: 0;
right: 12px;
width: 1px;
height: 100%;
background-color: var(--bs-gray-300);
min-height: calc(100vh - 62px - 74px);
}
}
@media screen and (max-width: 991.9px) {
#sideNav {
.nav {
max-width: 100%;
}
.side-nav-right-line {
display: none;
}
}
}

View File

@ -0,0 +1,76 @@
import { FC } from 'react';
import { Col, Nav } from 'react-bootstrap';
import { NavLink, useLocation } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import classnames from 'classnames';
import { loggedUserInfoStore, sideNavStore } from '@/stores';
import { Icon } from '@/components';
import './index.scss';
const Index: FC = () => {
const { t } = useTranslation();
const { pathname } = useLocation();
const { user: userInfo } = loggedUserInfoStore();
const { visible, can_revision, revision } = sideNavStore();
return (
<Col
xl={2}
lg={3}
md={12}
className={classnames(
'position-relative',
visible ? '' : 'd-none d-lg-block',
)}
id="sideNav">
<div className="nav-wrap pt-4">
<Nav variant="pills" className="flex-column">
<NavLink
to="/questions"
className={({ isActive }) =>
isActive || pathname === '/' ? 'nav-link active' : 'nav-link'
}>
<Icon name="question-circle-fill" className="me-2" />
<span>{t('header.nav.question')}</span>
</NavLink>
<NavLink to="/tags" className="nav-link">
<Icon name="tags-fill" className="me-2" />
<span>{t('header.nav.tag')}</span>
</NavLink>
<NavLink to="/users" className="nav-link">
<Icon name="people-fill" className="me-2" />
<span>{t('header.nav.user')}</span>
</NavLink>
{can_revision || userInfo?.role_id === 2 ? (
<>
<div className="py-2 px-3 mt-3 small fw-bold">
{t('header.nav.moderation')}
</div>
{can_revision && (
<NavLink to="/review" className="nav-link">
<span>{t('header.nav.review')}</span>
<span className="float-end">
{revision > 99 ? '99+' : revision > 0 ? revision : ''}
</span>
</NavLink>
)}
{userInfo?.role_id === 2 ? (
<NavLink to="/admin" className="nav-link">
{t('header.nav.admin')}
</NavLink>
) : null}
</>
) : null}
</Nav>
</div>
<div className="side-nav-right-line" />
</Col>
);
};
export default Index;

View File

@ -6,9 +6,9 @@ import { useTranslation } from 'react-i18next';
import { marked } from 'marked';
import classNames from 'classnames';
import { useTagModal } from '@/hooks';
import { useTagModal, useToast } from '@/hooks';
import type * as Type from '@/common/interface';
import { queryTags } from '@/services';
import { queryTags, useUserPermission } from '@/services';
import './index.scss';
@ -42,7 +42,8 @@ const TagSelector: FC<IProps> = ({
const [tags, setTags] = useState<Type.Tag[] | null>(null);
const { t } = useTranslation('translation', { keyPrefix: 'tag_selector' });
const [visibleMenu, setVisibleMenu] = useState(false);
const { data: userPermission } = useUserPermission('tag.add');
const toast = useToast();
const tagModal = useTagModal({
onConfirm: (data) => {
if (!(onChange instanceof Function)) {
@ -109,6 +110,11 @@ const TagSelector: FC<IProps> = ({
fetchTags(searchValue);
}, [visibleMenu]);
const resetSearch = () => {
setCurrentIndex(0);
setSearchValue('');
setTags([]);
};
const handleClick = (val: Type.Tag) => {
const findIndex = initialValue.findIndex(
(item) => item.slug_name.toLowerCase() === val.slug_name.toLowerCase(),
@ -129,6 +135,7 @@ const TagSelector: FC<IProps> = ({
setRepeatIndex(-1);
}, 2000);
}
resetSearch();
};
const handleRemove = (val: Type.Tag) => {
@ -177,12 +184,25 @@ const TagSelector: FC<IProps> = ({
}
if (currentIndex <= tags.length - 1) {
handleClick(tags[currentIndex]);
if (currentIndex === tags.length - 1 && currentIndex > 0) {
setCurrentIndex(currentIndex - 1);
}
// if (currentIndex === tags.length - 1 && currentIndex > 0) {
// setCurrentIndex(currentIndex - 1);
// }
}
}
};
const handleCreate = () => {
const tagAddPermission = userPermission?.['tag.add'];
if (!tagAddPermission || tagAddPermission?.has_permission) {
tagModal.onShow(searchValue);
} else if (tagAddPermission?.no_permission_tip) {
toast.onShow({
msg: tagAddPermission.no_permission_tip,
variant: 'danger',
});
}
};
return (
<div
className="tag-selector-wrap"
@ -261,9 +281,7 @@ const TagSelector: FC<IProps> = ({
<Button
variant="link"
className="px-3 btn-no-border w-100 text-start"
onClick={() => {
tagModal.onShow(searchValue);
}}>
onClick={handleCreate}>
+ {t('create_btn')}
</Button>
)}

View File

@ -25,7 +25,7 @@ const Index: FC<Props> = ({ count = 20 }) => {
/>
<p
className="placeholder fs-14 text-truncate-3 w-100"
className="placeholder small text-truncate-3 w-100"
style={{ height: '42px' }}
/>
<div className="d-flex align-items-center">
@ -34,7 +34,7 @@ const Index: FC<Props> = ({ count = 20 }) => {
style={{ width: '80px', height: '31px' }}
/>
<span
className="placeholder text-secondary fs-14 text-nowrap"
className="placeholder text-secondary small text-nowrap"
style={{ width: '100px', height: '21px' }}
/>
</div>

View File

@ -58,7 +58,7 @@ const Index: FC<Props> = ({
/>
</>
)}
<div className="fs-14 text-secondary d-flex flex-row flex-md-column align-items-center align-items-md-start">
<div className="small text-secondary d-flex flex-row flex-md-column align-items-center align-items-md-start">
<div className="me-1 me-md-0">
{data?.status !== 'deleted' ? (
<Link to={`/users/${data?.username}`} className="me-1 text-break">

View File

@ -40,6 +40,7 @@ import HotQuestions from './HotQuestions';
import HttpErrorContent from './HttpErrorContent';
import CustomSidebar from './CustomSidebar';
import ImgViewer from './ImgViewer';
import SideNav from './SideNav';
export {
Avatar,
@ -86,5 +87,6 @@ export {
HttpErrorContent,
CustomSidebar,
ImgViewer,
SideNav,
};
export type { EditorRef, JSONSchema, UISchema };

View File

@ -99,7 +99,7 @@ const useEditStatusModal = ({
<FormCheck.Label htmlFor={item.type}>
<span className="fw-bold">{item.name}</span>
<br />
<span className="fs-14 text-secondary">
<span className="small text-secondary">
{item.description}
</span>
</FormCheck.Label>

View File

@ -9,7 +9,7 @@ toastPortal.style.top = '90px';
toastPortal.style.left = '0';
toastPortal.style.right = '0';
toastPortal.style.margin = 'auto';
toastPortal.style.zIndex = '5';
toastPortal.style.zIndex = '1001';
const setPortalPosition = () => {
const header = document.querySelector('#header');

View File

@ -31,9 +31,6 @@ a {
text-decoration: none;
}
.fs-14 {
font-size: 0.875rem;
}
.fs-12 {
font-size: 0.75rem;
}
@ -202,7 +199,7 @@ a {
margin-top: 2rem;
}
h5 {
@extend .fs-14;
@extend .small;
margin-top: 2rem;
}
h6 {

View File

@ -146,7 +146,7 @@ const Answers: FC = () => {
)}
</Stack>
<div
className="text-truncate-2 fs-14"
className="text-truncate-2 small"
style={{ maxWidth: '30rem' }}>
{escapeRemove(li.description)}
</div>
@ -158,7 +158,7 @@ const Answers: FC = () => {
<BaseUserCard data={li.user_info} />
<FormatTime
className="fs-14 text-secondary"
className="small text-secondary"
time={li.create_time}
/>
</Stack>

View File

@ -48,35 +48,35 @@ const Index: FC = () => {
'ui:widget': 'textarea',
'ui:options': {
rows: 10,
className: ['fs-14', 'font-monospace'],
className: ['small', 'font-monospace'],
},
},
custom_head: {
'ui:widget': 'textarea',
'ui:options': {
rows: 10,
className: ['fs-14', 'font-monospace'],
className: ['small', 'font-monospace'],
},
},
custom_header: {
'ui:widget': 'textarea',
'ui:options': {
rows: 10,
className: ['fs-14', 'font-monospace'],
className: ['small', 'font-monospace'],
},
},
custom_sidebar: {
'ui:widget': 'textarea',
'ui:options': {
rows: 10,
className: ['fs-14', 'font-monospace'],
className: ['small', 'font-monospace'],
},
},
custom_footer: {
'ui:widget': 'textarea',
'ui:options': {
rows: 10,
className: ['fs-14', 'font-monospace'],
className: ['small', 'font-monospace'],
},
},
};

View File

@ -102,7 +102,7 @@ const Flags: FC = () => {
</small>
<BaseUserCard
data={li.reported_user}
className="mt-2 fs-14"
className="mt-2 small"
/>
<a
href={pathFactory.questionLanding(
@ -123,11 +123,11 @@ const Flags: FC = () => {
<Stack>
<FormatTime
time={li.created_at}
className="fs-14 text-secondary"
className="small text-secondary"
/>
<BaseUserCard
data={li.report_user}
className="mt-2 mb-2 fs-14"
className="mt-2 mb-2 small"
/>
{li.flagged_reason ? (
<small>{li.flagged_content}</small>

View File

@ -96,7 +96,7 @@ const Users: FC = () => {
plugin.name
)}
</div>
<div className="fs-14">{plugin.description}</div>
<div className="small">{plugin.description}</div>
</td>
<td className="text-break">{plugin.version}</td>
<td>

View File

@ -162,7 +162,7 @@ const Questions: FC = () => {
<Stack>
<BaseUserCard data={li.user_info} />
<FormatTime
className="fs-14 text-secondary"
className="small text-secondary"
time={li.create_time}
/>
</Stack>

View File

@ -31,6 +31,11 @@ const Index: FC = () => {
enumNames: SYSTEM_AVATAR_OPTIONS?.map((v) => v.label),
default: 'system',
},
gravatar_base_url: {
type: 'string',
title: t('gravatar_base_url.label'),
description: t('gravatar_base_url.text'),
},
profile_editable: {
type: 'string',
title: t('profile_editable.title'),
@ -68,6 +73,9 @@ const Index: FC = () => {
default_avatar: {
'ui:widget': 'select',
},
gravatar_base_url: {
'ui:widget': 'input',
},
profile_editable: {
'ui:widget': 'legend',
},
@ -127,6 +135,7 @@ const Index: FC = () => {
allow_update_username: formData.allow_update_username.value,
allow_update_website: formData.allow_update_website.value,
default_avatar: formData.default_avatar.value,
gravatar_base_url: formData.gravatar_base_url.value,
};
putUsersSetting(reqParams)
.then(() => {
@ -155,6 +164,9 @@ const Index: FC = () => {
if (k === 'default_avatar' && !v) {
v = 'system';
}
if (k === 'gravatar_base_url' && !v) {
v = 'https://www.gravatar.com/avatar/';
}
formMeta[k] = { ...formData[k], value: v };
});
setFormData({ ...formData, ...formMeta });

View File

@ -1,4 +1,4 @@
.admin-container {
padding-top: 2rem;
padding-bottom: 2rem;
padding-top: 1.5rem;
padding-bottom: 1.5rem;
}

View File

@ -7,7 +7,7 @@ interface IProps {
const Index: FC<IProps> = ({ step }) => {
return (
<div className="d-flex align-items-center fs-14 text-secondary">
<div className="d-flex align-items-center small text-secondary">
<ProgressBar
now={(step / 5) * 100}
variant="success"

View File

@ -33,7 +33,7 @@ const Index: FC<Props> = ({ visible, errorMsg, nextCallback }) => {
type="text"
as="textarea"
rows={8}
className="fs-14"
className="small"
value={errorMsg?.default_config}
/>
</FormGroup>

View File

@ -10,7 +10,7 @@ import {
installBaseInfo,
checkConfigFileExists,
} from '@/services';
import { Storage, handleFormError } from '@/utils';
import { Storage, handleFormError, scrollToDocTop } from '@/utils';
import { CURRENT_LANG_STORAGE_KEY } from '@/common/constants';
import {
@ -109,7 +109,7 @@ const Index: FC = () => {
};
const handleErr = (data) => {
window.scrollTo(0, 0);
scrollToDocTop();
setErrorData(data);
};

View File

@ -1,31 +1,29 @@
import { FC } from 'react';
import { Container, Row, Col, Nav } from 'react-bootstrap';
import { Row, Col, Nav } from 'react-bootstrap';
import { Outlet, NavLink } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
const Index: FC = () => {
const { t } = useTranslation('translation', { keyPrefix: 'nav_menus' });
return (
<Container className="pt-4 mt-2 mb-5">
<Row className="justify-content-center">
<Col xxl={10}>
<Nav
className="mb-4 flex-nowrap"
variant="pills"
style={{ overflow: 'auto' }}>
<NavLink to="/tos" key="tos" className="nav-link">
{t('tos')}
</NavLink>
<NavLink to="/privacy" key="privacy" className="nav-link">
{t('privacy')}
</NavLink>
</Nav>
</Col>
<Col xxl={10}>
<Outlet />
</Col>
</Row>
</Container>
<Row className="pt-4 mb-5">
<Col xxl={12}>
<Nav
className="mb-4 flex-nowrap"
variant="pills"
style={{ overflow: 'auto' }}>
<NavLink to="/tos" key="tos" className="nav-link">
{t('tos')}
</NavLink>
<NavLink to="/privacy" key="privacy" className="nav-link">
{t('privacy')}
</NavLink>
</Nav>
</Col>
<Col xxl={12}>
<Outlet />
</Col>
</Row>
);
};

View File

@ -1,5 +1,5 @@
import React, { useState, useEffect, useRef } from 'react';
import { Container, Row, Col, Form, Button, Card } from 'react-bootstrap';
import { Row, Col, Form, Button, Card } from 'react-bootstrap';
import { useParams, useNavigate, useSearchParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -16,7 +16,6 @@ import {
questionDetail,
modifyQuestion,
useQueryRevisions,
// postAnswer,
useQueryQuestionByTitle,
getTagsBySlugName,
saveQuestionWidthAnaser,
@ -320,14 +319,10 @@ const Ask = () => {
title: pageTitle,
});
return (
<Container className="pt-4 mt-2 mb-5">
<Row className="justify-content-center">
<Col xxl={10} md={12}>
<h3 className="mb-4">{isEdit ? t('edit_title') : t('title')}</h3>
</Col>
</Row>
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12} className="mb-4 mb-md-0">
<div className="pt-4 mb-5">
<h3 className="mb-4">{isEdit ? t('edit_title') : t('title')}</h3>
<Row>
<Col className="page-main flex-auto">
<Form noValidate onSubmit={handleSubmit}>
{isEdit && (
<Form.Group controlId="revision" className="mb-3">
@ -491,7 +486,7 @@ const Ask = () => {
)}
</Form>
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<Col className="page-right-side mt-4 mt-xl-0">
<Card>
<Card.Header>
{t('title', { keyPrefix: 'how_to_format' })}
@ -505,7 +500,7 @@ const Ask = () => {
</Card>
</Col>
</Row>
</Container>
</div>
);
};

View File

@ -23,7 +23,7 @@ const Index: FC<Props> = ({ data }) => {
) : (
<p>{data.msg ? data.msg : data.description}</p>
)}
<div className="fs-14">
<div className="small">
{t('question_detail.closed_in')}{' '}
<time
dateTime={dayjs.unix(data.time).tz().toISOString()}

View File

@ -149,14 +149,14 @@ const Index: FC<Props> = ({
<FormatTime
time={Number(data.update_time)}
preFix={t('edit')}
className="link-secondary fs-14"
className="link-secondary small"
/>
</Link>
) : (
<FormatTime
time={Number(data.update_time)}
preFix={t('edit')}
className="text-secondary fs-14"
className="text-secondary small"
/>
)}
</div>

View File

@ -0,0 +1,10 @@
.people-dropdown {
.dropdown-menu {
width: 15rem;
}
.dropdown-item.active {
color: #212529;
background-color: #e9ecef;
}
}

View File

@ -0,0 +1,163 @@
import { FC, useEffect, useState } from 'react';
import { Dropdown, Form } from 'react-bootstrap';
import { useTranslation } from 'react-i18next';
import { loggedUserInfoStore } from '@/stores';
import { userSearchByName } from '@/services';
import { Avatar } from '@/components';
import * as Type from '@/common/interface';
import './PeopleDropdown.scss';
interface Props {
selectedPeople: Type.UserInfoBase[] | undefined;
onSelect: (people: Type.UserInfoBase) => void;
visible?: boolean;
}
const Index: FC<Props> = ({
selectedPeople = [],
visible = false,
onSelect,
}) => {
const { user: currentUser } = loggedUserInfoStore();
const { t } = useTranslation('translation', {
keyPrefix: 'invite_to_answer',
});
const [toggleState, setToggleState] = useState(false);
const [peopleList, setPeopleList] = useState<Type.UserInfoBase[]>([]);
const [currentIndex, setCurrentIndex] = useState(0);
const [searchValue, setSearchValue] = useState('');
const filterAndSetPeople = (source) => {
if (!toggleState) {
return;
}
const filteredPeople: Type.UserInfoBase[] = [];
source.forEach((p) => {
if (currentUser && currentUser.username === p.username) {
return;
}
if (selectedPeople.find((_) => _.username === p.username)) {
return;
}
filteredPeople.push(p);
});
setPeopleList(filteredPeople);
};
const searchPeople = (s) => {
if (!s) {
setPeopleList([]);
return;
}
userSearchByName(s).then((resp) => {
filterAndSetPeople(resp);
});
};
const handleSearch = (evt) => {
const s = evt.target.value;
setSearchValue(s);
searchPeople(s);
};
const resetSearch = () => {
setCurrentIndex(0);
setSearchValue('');
setPeopleList([]);
};
const handleSelect = (idx) => {
if (idx < 0 || idx >= peopleList.length) {
return;
}
const people = peopleList[idx];
if (people) {
onSelect(people);
}
resetSearch();
};
const handleKeyDown = (evt) => {
evt.stopPropagation();
if (!peopleList?.length) {
return;
}
const { keyCode } = evt;
if (keyCode === 38 && currentIndex > 0) {
setCurrentIndex(currentIndex - 1);
}
if (keyCode === 40 && currentIndex < peopleList.length - 1) {
setCurrentIndex(currentIndex + 1);
}
if (keyCode === 13 && currentIndex > -1) {
evt.preventDefault();
handleSelect(currentIndex);
}
};
useEffect(() => {
filterAndSetPeople(peopleList);
}, [selectedPeople]);
useEffect(() => {
searchPeople(searchValue);
}, [toggleState]);
useEffect(() => {
if (!visible && toggleState) {
setToggleState(false);
}
}, [visible]);
return visible ? (
<Dropdown
className="d-inline-flex people-dropdown"
onSelect={handleSelect}
onKeyDown={handleKeyDown}
onToggle={setToggleState}>
<Dropdown.Toggle
className="m-1 no-toggle"
size="sm"
variant="outline-secondary">
<span className="me-1">+</span>
{t('add')}
</Dropdown.Toggle>
<Dropdown.Menu show={toggleState}>
<Dropdown.Header className="px-2 py-0">
{toggleState ? (
<Form.Control
autoFocus
placeholder={t('search')}
value={searchValue}
onChange={handleSearch}
/>
) : null}
</Dropdown.Header>
{peopleList.map((p, idx) => {
return (
<Dropdown.Item
key={p.username}
eventKey={idx}
active={idx === currentIndex}
className={idx === 0 ? 'mt-2' : ''}>
<div className="d-flex align-items-center text-nowrap">
<Avatar avatar={p.avatar} size="24" className="rounded-1" />
<div className="d-flex flex-wrap text-truncate">
<span className="ms-2 text-truncate">{p.display_name}</span>
<small className="text-secondary text-truncate ms-2">
@{p.username}
</small>
</div>
</div>
</Dropdown.Item>
);
})}
</Dropdown.Menu>
</Dropdown>
) : null;
};
export default Index;

View File

@ -0,0 +1,168 @@
import { memo, FC, useState, useEffect } from 'react';
import { Card, Button } from 'react-bootstrap';
import { useTranslation } from 'react-i18next';
import { Link } from 'react-router-dom';
import classNames from 'classnames';
import { Avatar } from '@/components';
import { getInviteUser, putInviteUser } from '@/services';
import type * as Type from '@/common/interface';
import PeopleDropdown from './PeopleDropdown';
interface Props {
questionId: string;
readOnly?: boolean;
}
const Index: FC<Props> = ({ questionId, readOnly = false }) => {
const { t } = useTranslation('translation', {
keyPrefix: 'invite_to_answer',
});
const MAX_ASK_NUMBER = 5;
const [editing, setEditing] = useState(false);
const [users, setUsers] = useState<Type.UserInfoBase[]>();
const initInviteUsers = () => {
if (!questionId) {
return;
}
getInviteUser(questionId)
.then((resp) => {
setUsers(resp);
})
.catch(() => {
if (!users) {
setUsers([]);
}
});
};
const updateInviteUsers = (user: Type.UserInfoBase) => {
let userList = [user];
if (users?.length) {
userList = [...users, user];
}
setUsers(userList);
};
const removeInviteUser = (user: Type.UserInfoBase) => {
const inviteUsers = users!.filter((_) => {
return _.username !== user.username;
});
setUsers(inviteUsers);
};
const saveInviteUsers = () => {
if (!users) {
return;
}
const names = users.map((_) => {
return _.username;
});
putInviteUser(questionId, names)
.then(() => {
setEditing(false);
})
.catch((ex) => {
console.log('ex: ', ex);
});
};
useEffect(() => {
initInviteUsers();
}, [questionId]);
const showAddButton = editing && (!users || users.length < MAX_ASK_NUMBER);
const showInviteFeat = !editing && users?.length === 0;
const showInviteButton = showInviteFeat && !readOnly;
const showEditButton = !readOnly && !editing && users?.length;
const showSaveButton = !readOnly && editing;
const showEmpty = readOnly && users?.length === 0;
if (showEmpty) {
return null;
}
return (
<Card className="mt-4">
<Card.Header className="text-nowrap d-flex justify-content-between text-capitalize">
{t('title')}
{showSaveButton ? (
<Button onClick={saveInviteUsers} variant="link" className="p-0">
{t('save', { keyPrefix: 'btns' })}
</Button>
) : null}
{showEditButton ? (
<Button
onClick={() => setEditing(true)}
variant="link"
className="p-0">
{t('edit', { keyPrefix: 'btns' })}
</Button>
) : null}
</Card.Header>
<Card.Body>
<div
className={classNames(
'd-flex align-items-center flex-wrap',
editing ? 'm-n1' : ' mx-n2 my-n1',
)}>
{users?.map((user) => {
if (editing) {
return (
<Button
key={user.username}
className="m-1 d-inline-flex flex-nowrap"
size="sm"
variant="outline-secondary">
<Avatar
avatar={user.avatar}
size="20"
className="rounded-1"
/>
<span className="text-nowrap ms-2">{user.display_name}</span>
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
<span
className="px-1 me-n1"
onClick={() => removeInviteUser(user)}>
×
</span>
</Button>
);
}
return (
<Link
key={user.username}
to={`/users/${user.username}`}
className="mx-2 my-1 d-inline-flex flex-nowrap">
<Avatar avatar={user.avatar} size="24" className="rounded-1" />
<small className="text-nowrap ms-2">{user.display_name}</small>
</Link>
);
})}
<PeopleDropdown
visible={showAddButton}
selectedPeople={users}
onSelect={updateInviteUsers}
/>
</div>
{showInviteFeat ? (
<>
<div className="text-muted">{t('desc')}</div>
{showInviteButton ? (
<Button
size="sm"
variant="outline-primary"
className="mt-3"
onClick={() => setEditing(true)}>
{t('invite')}
</Button>
) : null}
</>
) : null}
</Card.Body>
</Card>
);
};
export default memo(Index);

View File

@ -1,7 +1,7 @@
import { memo, FC, useState, useEffect, useRef } from 'react';
import { Link, useSearchParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import { Button } from 'react-bootstrap';
import { Button, OverlayTrigger, Tooltip } from 'react-bootstrap';
import {
Tag,
@ -85,7 +85,7 @@ const Index: FC<Props> = ({ data, initPage, hasAnswer, isLogged }) => {
</Link>
</h1>
<div className="d-flex flex-wrap align-items-center fs-14 mb-3 text-secondary">
<div className="d-flex flex-wrap align-items-center small mb-3 text-secondary">
<FormatTime
time={data.create_time}
preFix={t('Asked')}
@ -102,13 +102,17 @@ const Index: FC<Props> = ({ data, initPage, hasAnswer, isLogged }) => {
{t('Views')} {formatCount(data.view_count)}
</div>
)}
<Button
variant="link"
size="sm"
className="p-0 btn-no-border"
onClick={(e) => handleFollow(e)}>
{t(followed ? 'Following' : 'Follow')}
</Button>
<OverlayTrigger
placement="bottom"
overlay={<Tooltip id="followTooltip">{t('follow_tip')}</Tooltip>}>
<Button
variant="link"
size="sm"
className="p-0 btn-no-border"
onClick={(e) => handleFollow(e)}>
{t(followed ? 'Following' : 'Follow')}
</Button>
</OverlayTrigger>
</div>
<div className="m-n1">
{data?.tags?.map((item: any) => {
@ -165,14 +169,14 @@ const Index: FC<Props> = ({ data, initPage, hasAnswer, isLogged }) => {
<FormatTime
time={data.edit_time}
preFix={t('edit')}
className="link-secondary fs-14"
className="link-secondary small"
/>
</Link>
) : (
<FormatTime
time={data.edit_time}
preFix={t('edit')}
className="text-secondary fs-14"
className="text-secondary small"
/>
)}
</div>

View File

@ -40,7 +40,7 @@ const Index: FC<Props> = ({ id }) => {
<div className="link-dark">{item.title}</div>
{item.answer_count > 0 && (
<div
className={`mt-1 fs-14 me-2 ${
className={`mt-1 small me-2 ${
item.accepted_answer_id > 0
? 'link-success'
: 'link-secondary'

View File

@ -5,6 +5,7 @@ import RelatedQuestions from './RelatedQuestions';
import WriteAnswer from './WriteAnswer';
import Alert from './Alert';
import ContentLoader from './ContentLoader';
import InviteToAnswer from './InviteToAnswer';
export {
Question,
@ -14,4 +15,5 @@ export {
WriteAnswer,
Alert,
ContentLoader,
InviteToAnswer,
};

View File

@ -1,5 +1,5 @@
import { useEffect, useState } from 'react';
import { Container, Row, Col } from 'react-bootstrap';
import { Row, Col } from 'react-bootstrap';
import {
useParams,
useSearchParams,
@ -10,7 +10,7 @@ import { useTranslation } from 'react-i18next';
import { Pagination, CustomSidebar } from '@/components';
import { loggedUserInfoStore, toastStore } from '@/stores';
import { scrollToElementTop } from '@/utils';
import { scrollToElementTop, scrollToDocTop } from '@/utils';
import { usePageTags, usePageUsers } from '@/hooks';
import type {
ListResult,
@ -27,6 +27,7 @@ import {
WriteAnswer,
Alert,
ContentLoader,
InviteToAnswer,
} from './components';
import './index.scss';
@ -152,12 +153,12 @@ const Index = () => {
const initPage = (type: string) => {
if (type === 'delete_question') {
setTimeout(() => {
navigate(-1);
navigate('/', { replace: true });
}, 1000);
return;
}
if (type === 'default') {
window.scrollTo(0, 0);
scrollToDocTop();
getDetail();
return;
}
@ -182,7 +183,7 @@ const Index = () => {
if (!qid) {
return;
}
window.scrollTo(0, 0);
scrollToDocTop();
getDetail();
requestAnswers();
}, [qid]);
@ -197,70 +198,86 @@ const Index = () => {
description: question?.description,
keywords: question?.tags.map((_) => _.slug_name).join(','),
});
const showInviteToAnswer = question?.id;
let canInvitePeople = false;
if (showInviteToAnswer && Array.isArray(question.extends_actions)) {
const inviteAct = question.extends_actions.find((op) => {
return op.action === 'invite_other_to_answer';
});
if (inviteAct) {
canInvitePeople = true;
}
}
return (
<Container className="pt-4 mt-2 mb-5 questionDetailPage">
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12} className="mb-5 mb-md-0">
{question?.operation?.level && <Alert data={question.operation} />}
{isLoading ? (
<ContentLoader />
) : (
<Question
data={question}
initPage={initPage}
hasAnswer={answers.count > 0}
isLogged={isLogged}
<Row className="questionDetailPage pt-4 mb-5">
<Col className="page-main flex-auto">
{question?.operation?.level && <Alert data={question.operation} />}
{isLoading ? (
<ContentLoader />
) : (
<Question
data={question}
initPage={initPage}
hasAnswer={answers.count > 0}
isLogged={isLogged}
/>
)}
{!isLoading && answers.count > 0 && (
<>
<AnswerHead count={answers.count} order={order} />
{answers?.list?.map((item) => {
return (
<Answer
aid={aid}
key={item?.id}
data={item}
questionTitle={question?.title || ''}
slugTitle={question?.url_title}
canAccept={isAuthor || isAdmin || isModerator}
callback={initPage}
isLogged={isLogged}
/>
);
})}
</>
)}
{!isLoading && Math.ceil(answers.count / 15) > 1 && (
<div className="d-flex justify-content-center answer-item pt-4">
<Pagination
currentPage={Number(page || 1)}
pageSize={15}
totalSize={answers?.count || 0}
/>
</div>
)}
{!isLoading &&
Number(question?.status) !== 2 &&
!question?.operation?.type && (
<WriteAnswer
data={{
qid,
answered: question?.answered,
loggedUserRank,
}}
callback={writeAnswerCallback}
/>
)}
{!isLoading && answers.count > 0 && (
<>
<AnswerHead count={answers.count} order={order} />
{answers?.list?.map((item) => {
return (
<Answer
aid={aid}
key={item?.id}
data={item}
questionTitle={question?.title || ''}
slugTitle={question?.url_title}
canAccept={isAuthor || isAdmin || isModerator}
callback={initPage}
isLogged={isLogged}
/>
);
})}
</>
)}
{!isLoading && Math.ceil(answers.count / 15) > 1 && (
<div className="d-flex justify-content-center answer-item pt-4">
<Pagination
currentPage={Number(page || 1)}
pageSize={15}
totalSize={answers?.count || 0}
/>
</div>
)}
{!isLoading &&
Number(question?.status) !== 2 &&
!question?.operation?.type && (
<WriteAnswer
data={{
qid,
answered: question?.answered,
loggedUserRank,
}}
callback={writeAnswerCallback}
/>
)}
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<CustomSidebar />
<RelatedQuestions id={question?.id || ''} />
</Col>
</Row>
</Container>
</Col>
<Col className="page-right-side mt-4 mt-xl-0">
<CustomSidebar />
<RelatedQuestions id={question?.id || ''} />
{showInviteToAnswer ? (
<InviteToAnswer
questionId={question.id}
readOnly={!canInvitePeople}
/>
) : null}
</Col>
</Row>
);
};

View File

@ -1,5 +1,5 @@
import React, { useState, useRef, useEffect, useLayoutEffect } from 'react';
import { Container, Row, Col, Form, Button, Card } from 'react-bootstrap';
import { Row, Col, Form, Button, Card } from 'react-bootstrap';
import { useParams, useNavigate } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -184,14 +184,10 @@ const Index = () => {
title: t('edit_answer', { keyPrefix: 'page_title' }),
});
return (
<Container className="pt-4 mt-2 mb-5 edit-answer-wrap">
<Row className="justify-content-center">
<Col xxl={10} md={12}>
<h3 className="mb-4">{t('title')}</h3>
</Col>
</Row>
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12} className="mb-4 mb-md-0">
<div className="pt-4 mb-5 edit-answer-wrap">
<h3 className="mb-4">{t('title')}</h3>
<Row>
<Col className="page-main flex-auto">
<a
href={pathFactory.questionLanding(qid, data?.question.url_title)}
target="_blank"
@ -285,7 +281,7 @@ const Index = () => {
</div>
</Form>
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<Col className="page-right-side mt-4 mt-xl-0">
<Card>
<Card.Header>
{t('title', { keyPrefix: 'how_to_format' })}
@ -299,7 +295,7 @@ const Index = () => {
</Card>
</Col>
</Row>
</Container>
</div>
);
};

View File

@ -1,5 +1,5 @@
import { FC } from 'react';
import { Container, Row, Col } from 'react-bootstrap';
import { Row, Col } from 'react-bootstrap';
import { useMatch, Link, useSearchParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -17,7 +17,9 @@ import {
} from '@/stores';
import { useQuestionList } from '@/services';
import * as Type from '@/common/interface';
import { userCenter, floppyNavigation } from '@/utils';
import { userCenter, floppyNavigation, Storage } from '@/utils';
import { QUESTIONS_ORDER_STORAGE_KEY } from '@/common/constants';
import { QUESTION_ORDER_KEYS } from '@/components/QuestionList';
const Questions: FC = () => {
const { t } = useTranslation('translation', { keyPrefix: 'question' });
@ -25,7 +27,12 @@ const Questions: FC = () => {
const { user: loggedUser } = loggedUserInfoStore((_) => _);
const [urlSearchParams] = useSearchParams();
const curPage = Number(urlSearchParams.get('page')) || 1;
const curOrder = urlSearchParams.get('order') || 'active';
const storageOrder = Storage.get(QUESTIONS_ORDER_STORAGE_KEY);
const curOrder =
urlSearchParams.get('order') || storageOrder || QUESTION_ORDER_KEYS[0];
if (curOrder !== storageOrder) {
Storage.set(QUESTIONS_ORDER_STORAGE_KEY, curOrder);
}
const reqParams: Type.QueryQuestionsReq = {
page_size: 20,
page: curPage,
@ -44,48 +51,47 @@ const Questions: FC = () => {
usePageTags({ title: pageTitle, subtitle: slogan });
return (
<Container className="pt-4 mt-2 mb-5">
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12}>
<QuestionList
source="questions"
data={listData}
isLoading={listLoading}
/>
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<CustomSidebar />
{!loggedUser.username && (
<div className="card mb-4">
<div className="card-body">
<h5 className="card-title">
{t2('website_welcome', {
site_name: siteInfo.name,
})}
</h5>
<p className="card-text">{siteInfo.description}</p>
<Row className="pt-4 mb-5">
<Col className="page-main flex-auto">
<QuestionList
source="questions"
data={listData}
order={curOrder}
isLoading={listLoading}
/>
</Col>
<Col className="page-right-side mt-4 mt-xl-0">
<CustomSidebar />
{!loggedUser.username && (
<div className="card mb-4">
<div className="card-body">
<h5 className="card-title">
{t2('website_welcome', {
site_name: siteInfo.name,
})}
</h5>
<p className="card-text">{siteInfo.description}</p>
<Link
to={userCenter.getLoginUrl()}
className="btn btn-primary"
onClick={floppyNavigation.handleRouteLinkClick}>
{t('login', { keyPrefix: 'btns' })}
</Link>
{loginSetting.allow_new_registrations ? (
<Link
to={userCenter.getLoginUrl()}
className="btn btn-primary"
to={userCenter.getSignUpUrl()}
className="btn btn-link ms-2"
onClick={floppyNavigation.handleRouteLinkClick}>
{t('login', { keyPrefix: 'btns' })}
{t('signup', { keyPrefix: 'btns' })}
</Link>
{loginSetting.allow_new_registrations ? (
<Link
to={userCenter.getSignUpUrl()}
className="btn btn-link ms-2"
onClick={floppyNavigation.handleRouteLinkClick}>
{t('signup', { keyPrefix: 'btns' })}
</Link>
) : null}
</div>
) : null}
</div>
)}
{loggedUser.access_token && <FollowingTags />}
<HotQuestions />
</Col>
</Row>
</Container>
</div>
)}
{loggedUser.access_token && <FollowingTags />}
<HotQuestions />
</Col>
</Row>
);
};

View File

@ -1,5 +1,5 @@
import { FC, useEffect, useState } from 'react';
import { Container, Row, Col, Alert, Stack, Button } from 'react-bootstrap';
import { Row, Col, Alert, Stack, Button } from 'react-bootstrap';
import { Link } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -7,6 +7,7 @@ import { usePageTags } from '@/hooks';
import { BaseUserCard, FormatTime, Empty, DiffContent } from '@/components';
import { getReviewList, revisionAudit } from '@/services';
import { pathFactory } from '@/router/pathFactory';
import { scrollToDocTop } from '@/utils';
import type * as Type from '@/common/interface';
const Index: FC = () => {
@ -39,7 +40,7 @@ const Index: FC = () => {
setNoTasks(true);
}
setTimeout(() => {
window.scrollTo({ top: 0 });
scrollToDocTop();
}, 150);
};
const queryNextOne = (pageNumber) => {
@ -123,121 +124,111 @@ const Index: FC = () => {
title: t('review'),
});
return (
<Container className="pt-2 mt-4 mb-5">
<Row>
<Col lg={{ span: 7, offset: 1 }}>
<h3 className="mb-4">{t('review')}</h3>
</Col>
<Row className="pt-4 mb-5">
<h3 className="mb-4">{t('review')}</h3>
<Col className="page-main flex-auto">
{!noTasks && ro && (
<>
<Col lg={{ span: 7, offset: 1 }}>
<Alert variant="secondary">
<Stack className="align-items-start">
<span className="badge text-bg-secondary mb-2">
{editBadge}
</span>
<Link to={itemLink} target="_blank">
{itemTitle}
</Link>
<p className="mb-0">
{t('edit_summary')}: {editSummary}
</p>
</Stack>
<Stack
direction="horizontal"
gap={1}
className="align-items-baseline mt-2">
<BaseUserCard data={editor} avatarSize="24" />
{editTime && (
<FormatTime
time={editTime}
className="small text-secondary"
preFix={t('proposed')}
/>
)}
</Stack>
</Alert>
</Col>
<Col lg={{ span: 7, offset: 1 }}>
{type === 'question' &&
info &&
reviewInfo &&
'content' in reviewInfo && (
<DiffContent
className="mt-2"
objectType={type}
oldData={{
title: info.title,
original_text: info.content,
tags: info.tags,
}}
newData={{
title: reviewInfo.title,
original_text: reviewInfo.content,
tags: reviewInfo.tags,
}}
<Alert variant="secondary">
<Stack className="align-items-start">
<span className="badge text-bg-secondary mb-2">
{editBadge}
</span>
<Link to={itemLink} target="_blank">
{itemTitle}
</Link>
<p className="mb-0">
{t('edit_summary')}: {editSummary}
</p>
</Stack>
<Stack
direction="horizontal"
gap={1}
className="align-items-baseline mt-2">
<BaseUserCard data={editor} avatarSize="24" />
{editTime && (
<FormatTime
time={editTime}
className="small text-secondary"
preFix={t('proposed')}
/>
)}
{type === 'answer' &&
info &&
reviewInfo &&
'content' in reviewInfo && (
<DiffContent
className="mt-2"
objectType={type}
newData={{
original_text: reviewInfo.content,
}}
oldData={{
original_text: info.content,
}}
/>
)}
{type === 'tag' && info && reviewInfo && (
</Stack>
</Alert>
{type === 'question' &&
info &&
reviewInfo &&
'content' in reviewInfo && (
<DiffContent
className="mt-2"
objectType={type}
oldData={{
title: info.title,
original_text: info.content,
tags: info.tags,
}}
newData={{
title: reviewInfo.title,
original_text: reviewInfo.content,
tags: reviewInfo.tags,
}}
/>
)}
{type === 'answer' &&
info &&
reviewInfo &&
'content' in reviewInfo && (
<DiffContent
className="mt-2"
objectType={type}
newData={{
original_text: reviewInfo.original_text,
original_text: reviewInfo.content,
}}
oldData={{
original_text: info.content,
}}
opts={{ showTitle: false, showTagUrlSlug: false }}
/>
)}
</Col>
<Col lg={{ span: 7, offset: 1 }}>
<Stack direction="horizontal" gap={2} className="mt-4">
<Button
variant="outline-primary"
disabled={isLoading}
onClick={handlingApprove}>
{t('approve', { keyPrefix: 'btns' })}
</Button>
<Button
variant="outline-primary"
disabled={isLoading}
onClick={handlingReject}>
{t('reject', { keyPrefix: 'btns' })}
</Button>
<Button
variant="outline-primary"
disabled={isLoading}
onClick={handlingSkip}>
{t('skip', { keyPrefix: 'btns' })}
</Button>
</Stack>
</Col>
{type === 'tag' && info && reviewInfo && (
<DiffContent
className="mt-2"
objectType={type}
newData={{
original_text: reviewInfo.original_text,
}}
oldData={{
original_text: info.content,
}}
opts={{ showTitle: false, showTagUrlSlug: false }}
/>
)}
<Stack direction="horizontal" gap={2} className="mt-4">
<Button
variant="outline-primary"
disabled={isLoading}
onClick={handlingApprove}>
{t('approve', { keyPrefix: 'btns' })}
</Button>
<Button
variant="outline-primary"
disabled={isLoading}
onClick={handlingReject}>
{t('reject', { keyPrefix: 'btns' })}
</Button>
<Button
variant="outline-primary"
disabled={isLoading}
onClick={handlingSkip}>
{t('skip', { keyPrefix: 'btns' })}
</Button>
</Stack>
</>
)}
{noTasks && (
<Col lg={{ span: 7, offset: 1 }}>
<Empty>{t('empty')}</Empty>
</Col>
)}
</Row>
</Container>
{noTasks && <Empty>{t('empty')}</Empty>}
</Col>
<Col className="page-right-side mt-4 mt-xl-0" />
</Row>
);
};

View File

@ -42,7 +42,7 @@ const Index: FC<Props> = ({ data }) => {
: null}
</a>
</div>
<div className="d-flex flex-wrap align-items-center fs-14 text-secondary mb-2">
<div className="d-flex flex-wrap align-items-center small text-secondary mb-2">
<BaseUserCard data={data.object?.user_info} showAvatar={false} />
<span className="split-dot" />
@ -65,7 +65,7 @@ const Index: FC<Props> = ({ data }) => {
</div>
{data.object?.excerpt && (
<p className="fs-14 text-truncate-2 mb-2 last-p text-break">
<p className="small text-truncate-2 mb-2 last-p text-break">
{escapeRemove(data.object.excerpt)}
</p>
)}

View File

@ -7,7 +7,7 @@ const Index: FC = () => {
return (
<Card>
<Card.Header>{t('search.tips.title')}</Card.Header>
<Card.Body className="fs-14 ext-secondary">
<Card.Body className="small ext-secondary">
<div className="mb-1">
<Trans i18nKey="search.tips.tag" components={{ 1: <code /> }} />
</div>

View File

@ -1,5 +1,4 @@
import React from 'react';
import { Container, Row, Col, ListGroup } from 'react-bootstrap';
import { Row, Col, ListGroup } from 'react-bootstrap';
import { useTranslation } from 'react-i18next';
import { useSearchParams } from 'react-router-dom';
@ -39,36 +38,34 @@ const Index = () => {
title: pageTitle,
});
return (
<Container className="pt-4 mt-2 mb-5">
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12} className="mb-3">
<Head data={extra} />
<SearchHead sort={order} count={count} />
<ListGroup className="rounded-0 mb-5">
{isLoading ? (
<ListLoader />
) : (
list?.map((item) => {
return <SearchItem key={item.object.id} data={item} />;
})
)}
</ListGroup>
<Row className="pt-4 mb-5">
<Col className="page-main flex-auto">
<Head data={extra} />
<SearchHead sort={order} count={count} />
<ListGroup className="rounded-0 mb-5">
{isLoading ? (
<ListLoader />
) : (
list?.map((item) => {
return <SearchItem key={item.object.id} data={item} />;
})
)}
</ListGroup>
{!isLoading && !list?.length && <Empty />}
{!isLoading && !list?.length && <Empty />}
<div className="d-flex justify-content-center">
<Pagination
currentPage={Number(page)}
pageSize={20}
totalSize={count}
/>
</div>
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<Tips />
</Col>
</Row>
</Container>
<div className="d-flex justify-content-center">
<Pagination
currentPage={Number(page)}
pageSize={20}
totalSize={count}
/>
</div>
</Col>
<Col className="page-right-side mt-4 mt-xl-0">
<Tips />
</Col>
</Row>
);
};

View File

@ -0,0 +1,22 @@
import { FC, memo } from 'react';
import { Container, Row, Col } from 'react-bootstrap';
import { Outlet } from 'react-router-dom';
import { SideNav } from '@/components';
import '@/common/sideNavLayout.scss';
const Index: FC = () => {
return (
<Container>
<Row>
<SideNav />
<Col xl={10} lg={9} md={12}>
<Outlet />
</Col>
</Row>
</Container>
);
};
export default memo(Index);

View File

@ -1,5 +1,5 @@
import React, { useState, useRef, useEffect } from 'react';
import { Container, Row, Col, Form, Button, Card } from 'react-bootstrap';
import { Row, Col, Form, Button, Card } from 'react-bootstrap';
import { useNavigate } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -17,25 +17,25 @@ interface FormDataItem {
slugName: Type.FormValue<string>;
description: Type.FormValue<string>;
}
const initFormData = {
displayName: {
value: '',
isInvalid: false,
errorMsg: '',
},
slugName: {
value: '',
isInvalid: false,
errorMsg: '',
},
description: {
value: '',
isInvalid: false,
errorMsg: '',
},
};
const Index = () => {
const initFormData = {
displayName: {
value: '',
isInvalid: false,
errorMsg: '',
},
slugName: {
value: '',
isInvalid: false,
errorMsg: '',
},
description: {
value: '',
isInvalid: false,
errorMsg: '',
},
};
const { role_id = 1 } = loggedUserInfoStore((state) => state.user);
const navigate = useNavigate();
const { t } = useTranslation('translation', { keyPrefix: 'tag_modal' });
@ -82,7 +82,7 @@ const Index = () => {
const handleDescriptionChange = (value: string) =>
setFormData({
...formData,
description: { ...formData.description, value },
description: { ...formData.description, value, isInvalid: false },
});
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
@ -115,29 +115,34 @@ const Index = () => {
const handleDisplayNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setFormData({
...formData,
displayName: { ...formData.displayName, value: e.currentTarget.value },
displayName: {
...formData.displayName,
value: e.currentTarget.value,
isInvalid: false,
},
});
};
const handleSlugNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setFormData({
...formData,
slugName: { ...formData.slugName, value: e.currentTarget.value },
slugName: {
...formData.slugName,
value: e.currentTarget.value,
isInvalid: false,
},
});
};
usePageTags({
title: t('create_tag', { keyPrefix: 'page_title' }),
});
return (
<Container className="pt-4 mt-2 mb-5 edit-answer-wrap">
<Row className="justify-content-center">
<Col xxl={10} md={12}>
<h3 className="mb-4">{t('title')}</h3>
</Col>
</Row>
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12} className="mb-4 mb-md-0">
<div className="pt-4 mb-5">
<h3 className="mb-4">{t('title')}</h3>
<Row>
<Col className="page-main flex-auto">
<Form noValidate onSubmit={handleSubmit}>
<Form.Group controlId="display_name" className="mb-3">
<Form.Label>{t('form.fields.display_name.label')}</Form.Label>
@ -199,7 +204,7 @@ const Index = () => {
</div>
</Form>
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<Col className="page-right-side mt-4 mt-xl-0">
<Card>
<Card.Header>
{t('title', { keyPrefix: 'how_to_format' })}
@ -213,7 +218,7 @@ const Index = () => {
</Card>
</Col>
</Row>
</Container>
</div>
);
};

View File

@ -1,5 +1,5 @@
import { FC, useEffect, useState } from 'react';
import { Container, Row, Col, Button } from 'react-bootstrap';
import { Row, Col, Button } from 'react-bootstrap';
import {
useParams,
Link,
@ -17,18 +17,24 @@ import {
useQuerySynonymsTags,
useQuestionList,
} from '@/services';
import QuestionList from '@/components/QuestionList';
import QuestionList, { QUESTION_ORDER_KEYS } from '@/components/QuestionList';
import HotQuestions from '@/components/HotQuestions';
import { escapeRemove, guard } from '@/utils';
import { escapeRemove, guard, Storage, scrollToDocTop } from '@/utils';
import { pathFactory } from '@/router/pathFactory';
import { QUESTIONS_ORDER_STORAGE_KEY } from '@/common/constants';
const Questions: FC = () => {
const Index: FC = () => {
const { t } = useTranslation('translation', { keyPrefix: 'tags' });
const navigate = useNavigate();
const routeParams = useParams();
const curTagName = routeParams.tagName || '';
const [urlSearchParams] = useSearchParams();
const curOrder = urlSearchParams.get('order') || 'active';
const storageOrder = Storage.get(QUESTIONS_ORDER_STORAGE_KEY);
const curOrder =
urlSearchParams.get('order') || storageOrder || QUESTION_ORDER_KEYS[0];
if (curOrder !== storageOrder) {
Storage.set(QUESTIONS_ORDER_STORAGE_KEY, curOrder);
}
const curPage = Number(urlSearchParams.get('page')) || 1;
const reqParams: Type.QueryQuestionsReq = {
page_size: 20,
@ -54,7 +60,7 @@ const Questions: FC = () => {
useEffect(() => {
if (!listLoading) {
window.scrollTo(0, 0);
scrollToDocTop();
}
}, [listLoading]);
@ -100,65 +106,68 @@ const Questions: FC = () => {
keywords: keywords.join(','),
});
return (
<Container className="pt-4 mt-2 mb-5">
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12}>
{isLoading || listLoading ? (
<div className="tag-box mb-5 placeholder-glow">
<div className="mb-3 h3 placeholder" style={{ width: '120px' }} />
<p
className="placeholder w-100 d-block align-top"
style={{ height: '24px' }}
/>
<Row className="pt-4 mb-5">
<Col className="page-main flex-auto">
{isLoading || listLoading ? (
<div className="tag-box mb-5 placeholder-glow">
<div className="mb-3 h3 placeholder" style={{ width: '120px' }} />
<p
className="placeholder w-100 d-block align-top"
style={{ height: '24px' }}
/>
<div
className="placeholder d-block align-top"
style={{ height: '38px', width: '100px' }}
/>
<div
className="placeholder d-block align-top"
style={{ height: '38px', width: '100px' }}
/>
</div>
) : (
<div className="tag-box mb-5">
<h3 className="mb-3">
<Link
to={pathFactory.tagLanding(tagInfo.slug_name)}
replace
className="link-dark">
{tagInfo.display_name}
</Link>
</h3>
<p className="text-break">
{escapeRemove(tagInfo.excerpt) || t('no_desc')}
<Link to={pathFactory.tagInfo(curTagName)} className="ms-1">
[{t('more')}]
</Link>
</p>
<div className="box-ft">
{tagInfo.is_follower ? (
<Button variant="primary" onClick={() => toggleFollow()}>
{t('button_following')}
</Button>
) : (
<Button
variant="outline-primary"
onClick={() => toggleFollow()}>
{t('button_follow')}
</Button>
)}
</div>
) : (
<div className="tag-box mb-5">
<h3 className="mb-3">
<Link
to={pathFactory.tagLanding(tagInfo.slug_name)}
replace
className="link-dark">
{tagInfo.display_name}
</Link>
</h3>
<p className="text-break">
{escapeRemove(tagInfo.excerpt) || t('no_desc')}
<Link to={pathFactory.tagInfo(curTagName)} className="ms-1">
[{t('more')}]
</Link>
</p>
<div className="box-ft">
{tagInfo.is_follower ? (
<Button variant="primary" onClick={() => toggleFollow()}>
{t('button_following')}
</Button>
) : (
<Button
variant="outline-primary"
onClick={() => toggleFollow()}>
{t('button_follow')}
</Button>
)}
</div>
</div>
)}
<QuestionList source="tag" data={listData} isLoading={listLoading} />
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<CustomSidebar />
<FollowingTags />
<HotQuestions />
</Col>
</Row>
</Container>
</div>
)}
<QuestionList
source="tag"
data={listData}
order={curOrder}
isLoading={listLoading}
/>
</Col>
<Col className="page-right-side mt-4 mt-xl-0">
<CustomSidebar />
<FollowingTags />
<HotQuestions />
</Col>
</Row>
);
};
export default Questions;
export default Index;

View File

@ -1,5 +1,5 @@
import React, { useState, useRef, useEffect } from 'react';
import { Container, Row, Col, Form, Button, Card } from 'react-bootstrap';
import { Row, Col, Form, Button, Card } from 'react-bootstrap';
import { useParams, useNavigate } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -188,14 +188,10 @@ const Index = () => {
title: t('edit_tag', { keyPrefix: 'page_title' }),
});
return (
<Container className="pt-4 mt-2 mb-5 edit-answer-wrap">
<Row className="justify-content-center">
<Col xxl={10} md={12}>
<h3 className="mb-4">{t('title')}</h3>
</Col>
</Row>
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12} className="mb-4 mb-md-0">
<div className="pt-4 mb-5">
<h3 className="mb-4">{t('title')}</h3>
<Row>
<Col className="page-main flex-auto">
<Form noValidate onSubmit={handleSubmit}>
<Form.Group controlId="revision" className="mb-3">
<Form.Label>{t('form.fields.revision.label')}</Form.Label>
@ -291,7 +287,7 @@ const Index = () => {
</div>
</Form>
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<Col className="page-right-side mt-4 mt-xl-0">
<Card>
<Card.Header>
{t('title', { keyPrefix: 'how_to_format' })}
@ -305,7 +301,7 @@ const Index = () => {
</Card>
</Col>
</Row>
</Container>
</div>
);
};

View File

@ -1,5 +1,5 @@
import { useState, useEffect } from 'react';
import { Container, Row, Col, Button, Card } from 'react-bootstrap';
import { Row, Col, Button, Card } from 'react-bootstrap';
import { useParams, useNavigate, Link, useLocation } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -132,132 +132,131 @@ const TagIntroduction = () => {
};
return (
<Container className="pt-4 mt-2 mb-5">
<Row className="justify-content-center">
<Col xxl={7} lg={8} sm={12}>
<h3 className="mb-3">
<Link
to={pathFactory.tagLanding(tagInfo.slug_name)}
replace
className="link-dark">
{tagInfo.display_name}
</Link>
</h3>
<Row className="pt-4 mb-5">
<Col className="page-main flex-auto">
<h3 className="mb-3">
<Link
to={pathFactory.tagLanding(tagInfo.slug_name)}
replace
className="link-dark">
{tagInfo.display_name}
</Link>
</h3>
<div className="text-secondary mb-4 fs-14">
<FormatTime preFix={t('created_at')} time={tagInfo.created_at} />
<FormatTime
preFix={t('edited_at')}
className="ms-3"
time={tagInfo.updated_at}
/>
</div>
<div
className="content text-break fmt"
dangerouslySetInnerHTML={{ __html: tagInfo?.parsed_text }}
<div className="text-secondary mb-4 small">
<FormatTime preFix={t('created_at')} time={tagInfo.created_at} />
<FormatTime
preFix={t('edited_at')}
className="ms-3"
time={tagInfo.updated_at}
/>
<div className="mt-4">
{tagInfo?.member_actions.map((action, index) => {
return (
<Button
key={action.name}
variant="link"
className={classNames(
'link-secondary btn-no-border p-0 fs-14',
index > 0 && 'ms-3',
)}
onClick={() => onAction(action)}>
{action.name}
</Button>
);
})}
{isLogged && (
<Link
to={`/tags/${tagInfo?.tag_id}/timeline`}
</div>
<div
className="content text-break fmt"
dangerouslySetInnerHTML={{ __html: tagInfo?.parsed_text }}
/>
<div className="mt-4">
{tagInfo?.member_actions.map((action, index) => {
return (
<Button
key={action.name}
variant="link"
size="sm"
className={classNames(
'link-secondary btn-no-border p-0 fs-14',
tagInfo?.member_actions?.length > 0 && 'ms-3',
)}>
{t('history')}
</Link>
)}
</div>
</Col>
<Col xxl={3} lg={4} sm={12} className="mt-5 mt-lg-0">
<Card>
<Card.Header className="d-flex justify-content-between">
<span>{t('synonyms.title')}</span>
{isEdit ? (
<Button
variant="link"
className="p-0 btn-no-border"
onClick={handleSave}>
{t('synonyms.btn_save')}
</Button>
) : synonymsData?.member_actions?.find(
(v) => v.action === 'edit',
) ? (
<Button
variant="link"
className="p-0 btn-no-border"
onClick={handleEdit}>
{t('synonyms.btn_edit')}
</Button>
) : null}
</Card.Header>
<Card.Body>
{isEdit && (
<>
<div className="mb-3">
{t('synonyms.text')}{' '}
<Tag
data={{
slug_name: tagName || '',
main_tag_slug_name: '',
display_name:
tagInfo?.display_name || tagInfo?.slug_name || '',
recommend: false,
reserved: false,
}}
/>
</div>
<TagSelector
value={synonymsData?.synonyms}
onChange={handleTagsChange}
hiddenDescription
'link-secondary btn-no-border p-0',
index > 0 && 'ms-3',
)}
onClick={() => onAction(action)}>
{action.name}
</Button>
);
})}
{isLogged && (
<Link
to={`/tags/${tagInfo?.tag_id}/timeline`}
className={classNames(
'link-secondary btn-no-border p-0 small',
tagInfo?.member_actions?.length > 0 && 'ms-3',
)}>
{t('history')}
</Link>
)}
</div>
</Col>
<Col className="page-right-side mt-4 mt-xl-0">
<Card>
<Card.Header className="d-flex justify-content-between">
<span>{t('synonyms.title')}</span>
{isEdit ? (
<Button
variant="link"
className="p-0 btn-no-border"
onClick={handleSave}>
{t('synonyms.btn_save')}
</Button>
) : synonymsData?.member_actions?.find(
(v) => v.action === 'edit',
) ? (
<Button
variant="link"
className="p-0 btn-no-border"
onClick={handleEdit}>
{t('synonyms.btn_edit')}
</Button>
) : null}
</Card.Header>
<Card.Body>
{isEdit && (
<>
<div className="mb-3">
{t('synonyms.text')}{' '}
<Tag
data={{
slug_name: tagName || '',
main_tag_slug_name: '',
display_name:
tagInfo?.display_name || tagInfo?.slug_name || '',
recommend: false,
reserved: false,
}}
/>
</div>
<TagSelector
value={synonymsData?.synonyms}
onChange={handleTagsChange}
hiddenDescription
/>
</>
)}
{!isEdit &&
(synonymsData?.synonyms && synonymsData.synonyms.length > 0 ? (
<div className="m-n1">
{synonymsData.synonyms.map((item) => {
return (
<Tag key={item.tag_id} className="m-1" data={item} />
);
})}
</div>
) : (
<>
<div className="text-muted mb-3">{t('synonyms.empty')}</div>
{synonymsData?.member_actions?.find(
(v) => v.action === 'edit',
) && (
<Button
variant="outline-primary"
size="sm"
onClick={handleEdit}>
{t('synonyms.btn_add')}
</Button>
)}
</>
)}
{!isEdit &&
(synonymsData?.synonyms && synonymsData.synonyms.length > 0 ? (
<div className="m-n1">
{synonymsData.synonyms.map((item) => {
return (
<Tag key={item.tag_id} className="m-1" data={item} />
);
})}
</div>
) : (
<>
<div className="text-muted mb-3">{t('synonyms.empty')}</div>
{synonymsData?.member_actions?.find(
(v) => v.action === 'edit',
) && (
<Button
variant="outline-primary"
size="sm"
onClick={handleEdit}>
{t('synonyms.btn_add')}
</Button>
)}
</>
))}
</Card.Body>
</Card>
</Col>
</Row>
</Container>
))}
</Card.Body>
</Card>
</Col>
</Row>
);
};

View File

@ -1,13 +1,5 @@
import { useState } from 'react';
import {
Container,
Row,
Col,
Card,
Button,
Form,
Stack,
} from 'react-bootstrap';
import { Row, Col, Card, Button, Form, Stack } from 'react-bootstrap';
import { useSearchParams, Link } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -60,90 +52,89 @@ const Tags = () => {
title: t('tags', { keyPrefix: 'page_title' }),
});
return (
<Container className="py-3 my-3">
<Row className="mb-4 d-flex justify-content-center">
<Col xxl={10} sm={12}>
<h3 className="mb-4">{t('title')}</h3>
<div className="d-block d-sm-flex justify-content-between align-items-center flex-wrap">
<Stack direction="horizontal" gap={3} className="mb-3 mb-sm-0">
<Form>
<Form.Group controlId="formBasicEmail">
<Form.Control
value={searchTag}
placeholder={t('search_placeholder')}
type="text"
onChange={handleChange}
size="sm"
/>
</Form.Group>
</Form>
{role_id === 2 || role_id === 3 ? (
<Link
className="btn btn-outline-primary btn-sm"
to="/tags/create">
{t('title', { keyPrefix: 'tag_modal' })}
</Link>
) : null}
</Stack>
<QueryGroup
data={sortBtns}
currentSort={sort || 'popular'}
sortKey="sort"
i18nKeyPrefix="tags.sort_buttons"
/>
</div>
</Col>
<Row className="py-4 mb-4">
<Col xxl={12}>
<h3 className="mb-4">{t('title')}</h3>
<div className="d-block d-sm-flex justify-content-between align-items-center flex-wrap">
<Stack direction="horizontal" gap={3} className="mb-3 mb-sm-0">
<Form>
<Form.Group controlId="formBasicEmail">
<Form.Control
value={searchTag}
placeholder={t('search_placeholder')}
type="text"
onChange={handleChange}
size="sm"
/>
</Form.Group>
</Form>
{role_id === 2 || role_id === 3 ? (
<Link
className="btn btn-outline-primary btn-sm"
to="/tags/create">
{t('title', { keyPrefix: 'tag_modal' })}
</Link>
) : null}
</Stack>
<QueryGroup
data={sortBtns}
currentSort={sort || 'popular'}
sortKey="sort"
i18nKeyPrefix="tags.sort_buttons"
/>
</div>
</Col>
<Col className="mt-4" xxl={10} sm={12}>
<Row>
{isLoading ? (
<TagsLoader />
) : (
tags?.list?.map((tag) => (
<Col
key={tag.slug_name}
xs={12}
lg={3}
md={4}
sm={6}
className="mb-4">
<Card className="h-100">
<Card.Body className="d-flex flex-column align-items-start">
<Tag className="mb-3" data={tag} />
<Col className="mt-4" xxl={12}>
<Row>
{isLoading ? (
<TagsLoader />
) : (
tags?.list?.map((tag) => (
<Col
key={tag.slug_name}
xl={3}
lg={4}
md={4}
sm={6}
xs={12}
className="mb-4">
<Card className="h-100">
<Card.Body className="d-flex flex-column align-items-start">
<Tag className="mb-3" data={tag} />
<div className="fs-14 flex-fill text-break text-wrap text-truncate-3 reset-p mb-3">
{escapeRemove(tag.excerpt)}
</div>
<div className="d-flex align-items-center">
<Button
className={`me-2 ${tag.is_follower ? 'active' : ''}`}
variant="outline-primary"
size="sm"
onClick={() => handleFollow(tag)}>
{tag.is_follower
? t('button_following')
: t('button_follow')}
</Button>
<span className="text-secondary fs-14 text-nowrap">
{formatCount(tag.question_count)} {t('tag_label')}
</span>
</div>
</Card.Body>
</Card>
</Col>
))
)}
</Row>
<div className="d-flex justify-content-center">
<Pagination
currentPage={page}
totalSize={tags?.count || 0}
pageSize={pageSize}
/>
</div>
</Col>
</Row>
</Container>
<div className="small flex-fill text-break text-wrap text-truncate-3 reset-p mb-3">
{escapeRemove(tag.excerpt)}
</div>
<div className="d-flex align-items-center">
<Button
className={`me-2 ${tag.is_follower ? 'active' : ''}`}
variant="outline-primary"
size="sm"
onClick={() => handleFollow(tag)}>
{tag.is_follower
? t('button_following')
: t('button_follow')}
</Button>
<span className="text-secondary small text-nowrap">
{formatCount(tag.question_count)} {t('tag_label')}
</span>
</div>
</Card.Body>
</Card>
</Col>
))
)}
</Row>
<div className="d-flex justify-content-center">
<Pagination
currentPage={page}
totalSize={tags?.count || 0}
pageSize={pageSize}
/>
</div>
</Col>
</Row>
);
};

View File

@ -1,5 +1,5 @@
import { FC, useState, useEffect } from 'react';
import { Container, Row, Col, Form, Table } from 'react-bootstrap';
import { Form, Table } from 'react-bootstrap';
import { Link, useParams } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
@ -79,54 +79,50 @@ const Index: FC = () => {
title: pageTitle,
});
return (
<Container className="py-3">
<Row className="py-3 justify-content-center">
<Col xxl={10}>
<h5 className="mb-4">
{timelineData?.object_info.object_type === 'tag'
? t('tag_title')
: t('title')}{' '}
<Link to={linkUrl}>{timelineData?.object_info?.title}</Link>
</h5>
{timelineData?.object_info.object_type !== 'tag' && (
<Form.Check
className="mb-4"
type="switch"
id="custom-switch"
label={t('show_votes')}
checked={showVotes}
onChange={(e) => handleSwitch(e.target.checked)}
/>
)}
<Table hover>
<thead>
<tr>
<th style={{ width: '20%' }}>{t('datetime')}</th>
<th style={{ width: '15%' }}>{t('type')}</th>
<th style={{ width: '19%' }}>{t('by')}</th>
<th>{t('comment')}</th>
</tr>
</thead>
<tbody>
{timelineData?.timeline?.map((item) => {
return (
<HistoryItem
data={item}
objectInfo={timelineData?.object_info}
key={item.activity_id}
isAdmin={role_id === 2}
revisionList={revisionList}
/>
);
})}
</tbody>
</Table>
{!isLoading && Number(timelineData?.timeline?.length) <= 0 && (
<Empty>{t('no_data')}</Empty>
)}
</Col>
</Row>
</Container>
<div className="py-4 mb-5">
<h5 className="mb-4">
{timelineData?.object_info.object_type === 'tag'
? t('tag_title')
: t('title')}{' '}
<Link to={linkUrl}>{timelineData?.object_info?.title}</Link>
</h5>
{timelineData?.object_info.object_type !== 'tag' && (
<Form.Check
className="mb-4"
type="switch"
id="custom-switch"
label={t('show_votes')}
checked={showVotes}
onChange={(e) => handleSwitch(e.target.checked)}
/>
)}
<Table hover>
<thead>
<tr>
<th style={{ width: '20%' }}>{t('datetime')}</th>
<th style={{ width: '15%' }}>{t('type')}</th>
<th style={{ width: '19%' }}>{t('by')}</th>
<th>{t('comment')}</th>
</tr>
</thead>
<tbody>
{timelineData?.timeline?.map((item) => {
return (
<HistoryItem
data={item}
objectInfo={timelineData?.object_info}
key={item.activity_id}
isAdmin={role_id === 2}
revisionList={revisionList}
/>
);
})}
</tbody>
</Table>
{!isLoading && Number(timelineData?.timeline?.length) <= 0 && (
<Empty>{t('no_data')}</Empty>
)}
</div>
);
};

View File

@ -65,12 +65,13 @@ const Index: FC = () => {
clearTimeout(checkTimer);
};
}, []);
if (getUaType() !== USER_AGENT_NAMES.WeCom) {
return (
<Card className="text-center">
<Card.Body>
<Card.Title as="h3" className="mb-3">
{ucAgent?.agent_info.display_name} {t('login')}
{ucAgent?.agent_info?.display_name} {t('login')}
</Card.Title>
{qrcodeDataUrl ? (
<>
@ -82,7 +83,7 @@ const Index: FC = () => {
/>
<div className="text-secondary mt-3">
{t('qrcode_login_tip', {
agentName: ucAgent?.agent_info.display_name,
agentName: ucAgent?.agent_info?.display_name,
})}
</div>
</>

View File

@ -13,7 +13,7 @@ const Index = () => {
const { t } = useTranslation('translation');
const [searchParam] = useSearchParams();
const { agent: ucAgent } = userCenterStore();
let agentName = ucAgent?.agent_info.name || '';
let agentName = ucAgent?.agent_info?.name || '';
if (searchParam.get('agent_name')) {
agentName = searchParam.get('agent_name') || '';
}

Some files were not shown because too many files have changed in this diff Show More