You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml
index e5a67c36..ab5c5141 100644
--- a/i18n/en_US.yaml
+++ b/i18n/en_US.yaml
@@ -210,7 +210,7 @@ backend:
other: "answered question"
update_answer:
other: "updated answer"
- adopt_answer:
+ accept_answer:
other: "accepted answer"
comment_question:
other: "commented question"
diff --git a/i18n/es_ES.yaml b/i18n/es_ES.yaml
new file mode 100644
index 00000000..20fd4aa4
--- /dev/null
+++ b/i18n/es_ES.yaml
@@ -0,0 +1,1336 @@
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: "Success."
+ unknown:
+ other: "Unknown error."
+ request_format_error:
+ other: "Request format is not valid."
+ unauthorized_error:
+ other: "Unauthorized."
+ database_error:
+ other: "Data server error."
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
+ email:
+ other: "Email"
+ password:
+ other: "Password"
+ email_or_password_wrong_error:
+ other: "Email and password do not match."
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: "Answer do not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
+ comment:
+ edit_without_permission:
+ other: "Comment are not allowed to edit."
+ not_found:
+ other: "Comment not found."
+ email:
+ duplicate:
+ other: "Email already exists."
+ need_to_be_verified:
+ other: "Email should be verified."
+ verify_url_expired:
+ other: "Email verified URL has expired, please resend the email."
+ lang:
+ not_found:
+ other: "Language file not found."
+ object:
+ captcha_verification_failed:
+ other: "Captcha wrong."
+ disallow_follow:
+ other: "You are not allowed to follow."
+ disallow_vote:
+ other: "You are not allowed to vote."
+ disallow_vote_your_self:
+ other: "You can't vote for your own post."
+ not_found:
+ other: "Object not found."
+ verification_failed:
+ other: "Verification failed."
+ email_or_password_incorrect:
+ other: "Email and password do not match."
+ old_password_verification_failed:
+ other: "The old password verification failed"
+ new_password_same_as_previous_setting:
+ other: "The new password is the same as the previous one."
+ question:
+ not_found:
+ other: "Question not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
+ rank:
+ fail_to_meet_the_condition:
+ other: "Rank fail to meet the condition."
+ report:
+ handle_failed:
+ other: "Report handle failed."
+ not_found:
+ other: "Report not found."
+ tag:
+ not_found:
+ other: "Tag not found."
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
+ theme:
+ not_found:
+ other: "Theme not found."
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: "User not found."
+ suspended:
+ other: "User has been suspended."
+ username_invalid:
+ other: "Username is invalid."
+ username_duplicate:
+ other: "Username is already in use."
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
+ report:
+ spam:
+ name:
+ other: "spam"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
+ rude:
+ name:
+ other: "rude or abusive"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
+ duplicate:
+ name:
+ other: "a duplicate"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ not_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:
+ name:
+ other: "no longer needed"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
+ question:
+ close:
+ duplicate:
+ name:
+ other: "spam"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ guideline:
+ name:
+ other: "a community-specific reason"
+ desc:
+ other: "This question doesn't meet a community guideline."
+ multiple:
+ name:
+ other: "needs details or clarity"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires another reason not listed above."
+ notification:
+ action:
+ update_question:
+ other: "updated question"
+ answer_the_question:
+ other: "answered question"
+ update_answer:
+ other: "updated answer"
+ accept_answer:
+ other: "accepted answer"
+ comment_question:
+ other: "commented question"
+ comment_answer:
+ other: "commented answer"
+ reply_to_you:
+ other: "replied to you"
+ mention_you:
+ other: "mentioned you"
+ your_question_is_closed:
+ other: "Your question has been closed"
+ your_question_was_deleted:
+ other: "Your question has been deleted"
+ your_answer_was_deleted:
+ other: "Your answer has been deleted"
+ your_comment_was_deleted:
+ other: "Your comment has been deleted"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/fr_FR.yaml b/i18n/fr_FR.yaml
new file mode 100644
index 00000000..20fd4aa4
--- /dev/null
+++ b/i18n/fr_FR.yaml
@@ -0,0 +1,1336 @@
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: "Success."
+ unknown:
+ other: "Unknown error."
+ request_format_error:
+ other: "Request format is not valid."
+ unauthorized_error:
+ other: "Unauthorized."
+ database_error:
+ other: "Data server error."
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
+ email:
+ other: "Email"
+ password:
+ other: "Password"
+ email_or_password_wrong_error:
+ other: "Email and password do not match."
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: "Answer do not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
+ comment:
+ edit_without_permission:
+ other: "Comment are not allowed to edit."
+ not_found:
+ other: "Comment not found."
+ email:
+ duplicate:
+ other: "Email already exists."
+ need_to_be_verified:
+ other: "Email should be verified."
+ verify_url_expired:
+ other: "Email verified URL has expired, please resend the email."
+ lang:
+ not_found:
+ other: "Language file not found."
+ object:
+ captcha_verification_failed:
+ other: "Captcha wrong."
+ disallow_follow:
+ other: "You are not allowed to follow."
+ disallow_vote:
+ other: "You are not allowed to vote."
+ disallow_vote_your_self:
+ other: "You can't vote for your own post."
+ not_found:
+ other: "Object not found."
+ verification_failed:
+ other: "Verification failed."
+ email_or_password_incorrect:
+ other: "Email and password do not match."
+ old_password_verification_failed:
+ other: "The old password verification failed"
+ new_password_same_as_previous_setting:
+ other: "The new password is the same as the previous one."
+ question:
+ not_found:
+ other: "Question not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
+ rank:
+ fail_to_meet_the_condition:
+ other: "Rank fail to meet the condition."
+ report:
+ handle_failed:
+ other: "Report handle failed."
+ not_found:
+ other: "Report not found."
+ tag:
+ not_found:
+ other: "Tag not found."
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
+ theme:
+ not_found:
+ other: "Theme not found."
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: "User not found."
+ suspended:
+ other: "User has been suspended."
+ username_invalid:
+ other: "Username is invalid."
+ username_duplicate:
+ other: "Username is already in use."
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
+ report:
+ spam:
+ name:
+ other: "spam"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
+ rude:
+ name:
+ other: "rude or abusive"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
+ duplicate:
+ name:
+ other: "a duplicate"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ not_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:
+ name:
+ other: "no longer needed"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
+ question:
+ close:
+ duplicate:
+ name:
+ other: "spam"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ guideline:
+ name:
+ other: "a community-specific reason"
+ desc:
+ other: "This question doesn't meet a community guideline."
+ multiple:
+ name:
+ other: "needs details or clarity"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires another reason not listed above."
+ notification:
+ action:
+ update_question:
+ other: "updated question"
+ answer_the_question:
+ other: "answered question"
+ update_answer:
+ other: "updated answer"
+ accept_answer:
+ other: "accepted answer"
+ comment_question:
+ other: "commented question"
+ comment_answer:
+ other: "commented answer"
+ reply_to_you:
+ other: "replied to you"
+ mention_you:
+ other: "mentioned you"
+ your_question_is_closed:
+ other: "Your question has been closed"
+ your_question_was_deleted:
+ other: "Your question has been deleted"
+ your_answer_was_deleted:
+ other: "Your answer has been deleted"
+ your_comment_was_deleted:
+ other: "Your comment has been deleted"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/i18n.yaml b/i18n/i18n.yaml
index 13a6c522..bcbfaa9c 100644
--- a/i18n/i18n.yaml
+++ b/i18n/i18n.yaml
@@ -2,5 +2,25 @@
language_options:
- label: "简体中文(CN)"
value: "zh_CN"
+ - label: "繁體中文(CN)"
+ value: "zh_TW"
- label: "English(US)"
value: "en_US"
+ - label: "Deutsch(DE)"
+ value: "de_DE"
+ - label: "Español(ES)"
+ value: "es_ES"
+ - label: "Français(FR)"
+ value: "fr_FR"
+ - label: "Italiano(IT)"
+ value: "it_IT"
+ - label: "日本語(JA)"
+ value: "ja_JP"
+ - label: "한국어(KO)"
+ value: "ko_KR"
+ - label: "Português(PT)"
+ value: "pt_PT"
+ - label: "Русский(RU)"
+ value: "ru_RU"
+ - label: "Tiếng Việt(VI)"
+ value: "vi_VN"
diff --git a/i18n/it_IT.yaml b/i18n/it_IT.yaml
index 61de40f8..a84add71 100644
--- a/i18n/it_IT.yaml
+++ b/i18n/it_IT.yaml
@@ -1,4 +1,4 @@
-# The following fields are used for back-end
+#The following fields are used for back-end
backend:
base:
success:
@@ -11,21 +11,38 @@ backend:
other: "Non autorizzato"
database_error:
other: "Errore server dati"
-
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
email:
other: "email"
password:
other: "password"
-
- email_or_password_wrong_error: &email_or_password_wrong
+ email_or_password_wrong_error:
other: "Email o password errati"
-
error:
admin:
- email_or_password_wrong: *email_or_password_wrong
+ email_or_password_wrong:
+ other: Email o password errati
answer:
not_found:
other: "Risposta non trovata"
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
comment:
edit_without_permission:
other: "Non si hanno di privilegi sufficienti per modificare il commento"
@@ -63,6 +80,12 @@ backend:
question:
not_found:
other: "domanda non trovata"
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
rank:
fail_to_meet_the_condition:
other: "Condizioni non valide per il grado"
@@ -74,12 +97,28 @@ backend:
tag:
not_found:
other: "Etichetta non trovata"
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
theme:
not_found:
other: "tema non trovato"
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
user:
email_or_password_wrong:
- other: *email_or_password_wrong
+ other:
+ other: Email o password errati
not_found:
other: "utente non trovato"
suspended:
@@ -88,62 +127,76 @@ backend:
other: "utente non valido"
username_duplicate:
other: "utente già in uso"
-
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
report:
spam:
name:
other: "spam"
- description:
- other: "Questo articolo è una pubblicità o vandalismo. Non è utile o rilevante all'argomento corrente"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
rude:
name:
other: "scortese o violento"
- description:
- other: "Una persona ragionevole trova questo contenuto inappropriato a un discorso rispettoso"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
duplicate:
name:
other: "duplicato"
- description:
- other: "Questa domanda è già stata posta e ha già una risposta."
+ desc:
+ other: "This question has been asked before and already has an answer."
not_answer:
name:
other: "non è una risposta"
- description:
- other: "Questo è stato postato come una risposta, ma non sta cercando di rispondere alla domanda. Dovrebbe essere una modifica, un commento, un'altra domanda o cancellato del tutto."
+ 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:
name:
other: "non più necessario"
- description:
- other: "Questo commento è datato, conversazionale o non rilevante a questo articolo."
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
other:
name:
other: "altro"
- description:
- other: "Questo articolo richiede una supervisione dello staff per altre ragioni non listate sopra."
-
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
question:
close:
duplicate:
name:
other: "spam"
- description:
- other: "Questa domanda è già stata chiesta o ha già una risposta."
+ desc:
+ other: "This question has been asked before and already has an answer."
guideline:
name:
other: "motivo legato alla community"
- description:
- other: "Questa domanda non soddisfa le linee guida della comunità."
+ desc:
+ other: "This question doesn't meet a community guideline."
multiple:
name:
other: "richiede maggiori dettagli o chiarezza"
- description:
- other: "Questa domanda attualmente contiene più domande. Deve concentrarsi solamente su un unico problema."
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
other:
name:
other: "altro"
- description:
- other: "Questo articolo richiede un'altro motivo non listato sopra."
-
+ desc:
+ other: "This post requires another reason not listed above."
notification:
action:
update_question:
@@ -152,8 +205,8 @@ backend:
other: "domanda risposta"
update_answer:
other: "risposta aggiornata"
- adopt_answer:
- other: "risposta accettata"
+ accept_answer:
+ other: "risposta accepted"
comment_question:
other: "domanda commentata"
comment_answer:
@@ -170,3 +223,1114 @@ backend:
other: "la tua risposta è stata rimossa"
your_comment_was_deleted:
other: "il tuo commento è stato rimosso"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/ja_JP.yaml b/i18n/ja_JP.yaml
new file mode 100644
index 00000000..20fd4aa4
--- /dev/null
+++ b/i18n/ja_JP.yaml
@@ -0,0 +1,1336 @@
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: "Success."
+ unknown:
+ other: "Unknown error."
+ request_format_error:
+ other: "Request format is not valid."
+ unauthorized_error:
+ other: "Unauthorized."
+ database_error:
+ other: "Data server error."
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
+ email:
+ other: "Email"
+ password:
+ other: "Password"
+ email_or_password_wrong_error:
+ other: "Email and password do not match."
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: "Answer do not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
+ comment:
+ edit_without_permission:
+ other: "Comment are not allowed to edit."
+ not_found:
+ other: "Comment not found."
+ email:
+ duplicate:
+ other: "Email already exists."
+ need_to_be_verified:
+ other: "Email should be verified."
+ verify_url_expired:
+ other: "Email verified URL has expired, please resend the email."
+ lang:
+ not_found:
+ other: "Language file not found."
+ object:
+ captcha_verification_failed:
+ other: "Captcha wrong."
+ disallow_follow:
+ other: "You are not allowed to follow."
+ disallow_vote:
+ other: "You are not allowed to vote."
+ disallow_vote_your_self:
+ other: "You can't vote for your own post."
+ not_found:
+ other: "Object not found."
+ verification_failed:
+ other: "Verification failed."
+ email_or_password_incorrect:
+ other: "Email and password do not match."
+ old_password_verification_failed:
+ other: "The old password verification failed"
+ new_password_same_as_previous_setting:
+ other: "The new password is the same as the previous one."
+ question:
+ not_found:
+ other: "Question not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
+ rank:
+ fail_to_meet_the_condition:
+ other: "Rank fail to meet the condition."
+ report:
+ handle_failed:
+ other: "Report handle failed."
+ not_found:
+ other: "Report not found."
+ tag:
+ not_found:
+ other: "Tag not found."
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
+ theme:
+ not_found:
+ other: "Theme not found."
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: "User not found."
+ suspended:
+ other: "User has been suspended."
+ username_invalid:
+ other: "Username is invalid."
+ username_duplicate:
+ other: "Username is already in use."
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
+ report:
+ spam:
+ name:
+ other: "spam"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
+ rude:
+ name:
+ other: "rude or abusive"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
+ duplicate:
+ name:
+ other: "a duplicate"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ not_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:
+ name:
+ other: "no longer needed"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
+ question:
+ close:
+ duplicate:
+ name:
+ other: "spam"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ guideline:
+ name:
+ other: "a community-specific reason"
+ desc:
+ other: "This question doesn't meet a community guideline."
+ multiple:
+ name:
+ other: "needs details or clarity"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires another reason not listed above."
+ notification:
+ action:
+ update_question:
+ other: "updated question"
+ answer_the_question:
+ other: "answered question"
+ update_answer:
+ other: "updated answer"
+ accept_answer:
+ other: "accepted answer"
+ comment_question:
+ other: "commented question"
+ comment_answer:
+ other: "commented answer"
+ reply_to_you:
+ other: "replied to you"
+ mention_you:
+ other: "mentioned you"
+ your_question_is_closed:
+ other: "Your question has been closed"
+ your_question_was_deleted:
+ other: "Your question has been deleted"
+ your_answer_was_deleted:
+ other: "Your answer has been deleted"
+ your_comment_was_deleted:
+ other: "Your comment has been deleted"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/ko_KR.yaml b/i18n/ko_KR.yaml
new file mode 100644
index 00000000..20fd4aa4
--- /dev/null
+++ b/i18n/ko_KR.yaml
@@ -0,0 +1,1336 @@
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: "Success."
+ unknown:
+ other: "Unknown error."
+ request_format_error:
+ other: "Request format is not valid."
+ unauthorized_error:
+ other: "Unauthorized."
+ database_error:
+ other: "Data server error."
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
+ email:
+ other: "Email"
+ password:
+ other: "Password"
+ email_or_password_wrong_error:
+ other: "Email and password do not match."
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: "Answer do not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
+ comment:
+ edit_without_permission:
+ other: "Comment are not allowed to edit."
+ not_found:
+ other: "Comment not found."
+ email:
+ duplicate:
+ other: "Email already exists."
+ need_to_be_verified:
+ other: "Email should be verified."
+ verify_url_expired:
+ other: "Email verified URL has expired, please resend the email."
+ lang:
+ not_found:
+ other: "Language file not found."
+ object:
+ captcha_verification_failed:
+ other: "Captcha wrong."
+ disallow_follow:
+ other: "You are not allowed to follow."
+ disallow_vote:
+ other: "You are not allowed to vote."
+ disallow_vote_your_self:
+ other: "You can't vote for your own post."
+ not_found:
+ other: "Object not found."
+ verification_failed:
+ other: "Verification failed."
+ email_or_password_incorrect:
+ other: "Email and password do not match."
+ old_password_verification_failed:
+ other: "The old password verification failed"
+ new_password_same_as_previous_setting:
+ other: "The new password is the same as the previous one."
+ question:
+ not_found:
+ other: "Question not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
+ rank:
+ fail_to_meet_the_condition:
+ other: "Rank fail to meet the condition."
+ report:
+ handle_failed:
+ other: "Report handle failed."
+ not_found:
+ other: "Report not found."
+ tag:
+ not_found:
+ other: "Tag not found."
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
+ theme:
+ not_found:
+ other: "Theme not found."
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: "User not found."
+ suspended:
+ other: "User has been suspended."
+ username_invalid:
+ other: "Username is invalid."
+ username_duplicate:
+ other: "Username is already in use."
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
+ report:
+ spam:
+ name:
+ other: "spam"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
+ rude:
+ name:
+ other: "rude or abusive"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
+ duplicate:
+ name:
+ other: "a duplicate"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ not_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:
+ name:
+ other: "no longer needed"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
+ question:
+ close:
+ duplicate:
+ name:
+ other: "spam"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ guideline:
+ name:
+ other: "a community-specific reason"
+ desc:
+ other: "This question doesn't meet a community guideline."
+ multiple:
+ name:
+ other: "needs details or clarity"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires another reason not listed above."
+ notification:
+ action:
+ update_question:
+ other: "updated question"
+ answer_the_question:
+ other: "answered question"
+ update_answer:
+ other: "updated answer"
+ accept_answer:
+ other: "accepted answer"
+ comment_question:
+ other: "commented question"
+ comment_answer:
+ other: "commented answer"
+ reply_to_you:
+ other: "replied to you"
+ mention_you:
+ other: "mentioned you"
+ your_question_is_closed:
+ other: "Your question has been closed"
+ your_question_was_deleted:
+ other: "Your question has been deleted"
+ your_answer_was_deleted:
+ other: "Your answer has been deleted"
+ your_comment_was_deleted:
+ other: "Your comment has been deleted"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/pt_PT.yaml b/i18n/pt_PT.yaml
new file mode 100644
index 00000000..20fd4aa4
--- /dev/null
+++ b/i18n/pt_PT.yaml
@@ -0,0 +1,1336 @@
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: "Success."
+ unknown:
+ other: "Unknown error."
+ request_format_error:
+ other: "Request format is not valid."
+ unauthorized_error:
+ other: "Unauthorized."
+ database_error:
+ other: "Data server error."
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
+ email:
+ other: "Email"
+ password:
+ other: "Password"
+ email_or_password_wrong_error:
+ other: "Email and password do not match."
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: "Answer do not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
+ comment:
+ edit_without_permission:
+ other: "Comment are not allowed to edit."
+ not_found:
+ other: "Comment not found."
+ email:
+ duplicate:
+ other: "Email already exists."
+ need_to_be_verified:
+ other: "Email should be verified."
+ verify_url_expired:
+ other: "Email verified URL has expired, please resend the email."
+ lang:
+ not_found:
+ other: "Language file not found."
+ object:
+ captcha_verification_failed:
+ other: "Captcha wrong."
+ disallow_follow:
+ other: "You are not allowed to follow."
+ disallow_vote:
+ other: "You are not allowed to vote."
+ disallow_vote_your_self:
+ other: "You can't vote for your own post."
+ not_found:
+ other: "Object not found."
+ verification_failed:
+ other: "Verification failed."
+ email_or_password_incorrect:
+ other: "Email and password do not match."
+ old_password_verification_failed:
+ other: "The old password verification failed"
+ new_password_same_as_previous_setting:
+ other: "The new password is the same as the previous one."
+ question:
+ not_found:
+ other: "Question not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
+ rank:
+ fail_to_meet_the_condition:
+ other: "Rank fail to meet the condition."
+ report:
+ handle_failed:
+ other: "Report handle failed."
+ not_found:
+ other: "Report not found."
+ tag:
+ not_found:
+ other: "Tag not found."
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
+ theme:
+ not_found:
+ other: "Theme not found."
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: "User not found."
+ suspended:
+ other: "User has been suspended."
+ username_invalid:
+ other: "Username is invalid."
+ username_duplicate:
+ other: "Username is already in use."
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
+ report:
+ spam:
+ name:
+ other: "spam"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
+ rude:
+ name:
+ other: "rude or abusive"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
+ duplicate:
+ name:
+ other: "a duplicate"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ not_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:
+ name:
+ other: "no longer needed"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
+ question:
+ close:
+ duplicate:
+ name:
+ other: "spam"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ guideline:
+ name:
+ other: "a community-specific reason"
+ desc:
+ other: "This question doesn't meet a community guideline."
+ multiple:
+ name:
+ other: "needs details or clarity"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires another reason not listed above."
+ notification:
+ action:
+ update_question:
+ other: "updated question"
+ answer_the_question:
+ other: "answered question"
+ update_answer:
+ other: "updated answer"
+ accept_answer:
+ other: "accepted answer"
+ comment_question:
+ other: "commented question"
+ comment_answer:
+ other: "commented answer"
+ reply_to_you:
+ other: "replied to you"
+ mention_you:
+ other: "mentioned you"
+ your_question_is_closed:
+ other: "Your question has been closed"
+ your_question_was_deleted:
+ other: "Your question has been deleted"
+ your_answer_was_deleted:
+ other: "Your answer has been deleted"
+ your_comment_was_deleted:
+ other: "Your comment has been deleted"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/ru_RU.yaml b/i18n/ru_RU.yaml
new file mode 100644
index 00000000..20fd4aa4
--- /dev/null
+++ b/i18n/ru_RU.yaml
@@ -0,0 +1,1336 @@
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: "Success."
+ unknown:
+ other: "Unknown error."
+ request_format_error:
+ other: "Request format is not valid."
+ unauthorized_error:
+ other: "Unauthorized."
+ database_error:
+ other: "Data server error."
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
+ email:
+ other: "Email"
+ password:
+ other: "Password"
+ email_or_password_wrong_error:
+ other: "Email and password do not match."
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: "Answer do not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
+ comment:
+ edit_without_permission:
+ other: "Comment are not allowed to edit."
+ not_found:
+ other: "Comment not found."
+ email:
+ duplicate:
+ other: "Email already exists."
+ need_to_be_verified:
+ other: "Email should be verified."
+ verify_url_expired:
+ other: "Email verified URL has expired, please resend the email."
+ lang:
+ not_found:
+ other: "Language file not found."
+ object:
+ captcha_verification_failed:
+ other: "Captcha wrong."
+ disallow_follow:
+ other: "You are not allowed to follow."
+ disallow_vote:
+ other: "You are not allowed to vote."
+ disallow_vote_your_self:
+ other: "You can't vote for your own post."
+ not_found:
+ other: "Object not found."
+ verification_failed:
+ other: "Verification failed."
+ email_or_password_incorrect:
+ other: "Email and password do not match."
+ old_password_verification_failed:
+ other: "The old password verification failed"
+ new_password_same_as_previous_setting:
+ other: "The new password is the same as the previous one."
+ question:
+ not_found:
+ other: "Question not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
+ rank:
+ fail_to_meet_the_condition:
+ other: "Rank fail to meet the condition."
+ report:
+ handle_failed:
+ other: "Report handle failed."
+ not_found:
+ other: "Report not found."
+ tag:
+ not_found:
+ other: "Tag not found."
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
+ theme:
+ not_found:
+ other: "Theme not found."
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: "User not found."
+ suspended:
+ other: "User has been suspended."
+ username_invalid:
+ other: "Username is invalid."
+ username_duplicate:
+ other: "Username is already in use."
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
+ report:
+ spam:
+ name:
+ other: "spam"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
+ rude:
+ name:
+ other: "rude or abusive"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
+ duplicate:
+ name:
+ other: "a duplicate"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ not_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:
+ name:
+ other: "no longer needed"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
+ question:
+ close:
+ duplicate:
+ name:
+ other: "spam"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ guideline:
+ name:
+ other: "a community-specific reason"
+ desc:
+ other: "This question doesn't meet a community guideline."
+ multiple:
+ name:
+ other: "needs details or clarity"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires another reason not listed above."
+ notification:
+ action:
+ update_question:
+ other: "updated question"
+ answer_the_question:
+ other: "answered question"
+ update_answer:
+ other: "updated answer"
+ accept_answer:
+ other: "accepted answer"
+ comment_question:
+ other: "commented question"
+ comment_answer:
+ other: "commented answer"
+ reply_to_you:
+ other: "replied to you"
+ mention_you:
+ other: "mentioned you"
+ your_question_is_closed:
+ other: "Your question has been closed"
+ your_question_was_deleted:
+ other: "Your question has been deleted"
+ your_answer_was_deleted:
+ other: "Your answer has been deleted"
+ your_comment_was_deleted:
+ other: "Your comment has been deleted"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/vi_VN.yaml b/i18n/vi_VN.yaml
new file mode 100644
index 00000000..20fd4aa4
--- /dev/null
+++ b/i18n/vi_VN.yaml
@@ -0,0 +1,1336 @@
+#The following fields are used for back-end
+backend:
+ base:
+ success:
+ other: "Success."
+ unknown:
+ other: "Unknown error."
+ request_format_error:
+ other: "Request format is not valid."
+ unauthorized_error:
+ other: "Unauthorized."
+ database_error:
+ other: "Data server error."
+ role:
+ name:
+ user:
+ other: "User"
+ admin:
+ other: "Admin"
+ moderator:
+ other: "Moderator"
+ description:
+ user:
+ other: "Default with no special access."
+ admin:
+ other: "Have the full power to access the site."
+ moderator:
+ other: "Has access to all posts except admin settings."
+ email:
+ other: "Email"
+ password:
+ other: "Password"
+ email_or_password_wrong_error:
+ other: "Email and password do not match."
+ error:
+ admin:
+ email_or_password_wrong:
+ other: Email and password do not match.
+ answer:
+ not_found:
+ other: "Answer do not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_update:
+ other: "No permission to update."
+ comment:
+ edit_without_permission:
+ other: "Comment are not allowed to edit."
+ not_found:
+ other: "Comment not found."
+ email:
+ duplicate:
+ other: "Email already exists."
+ need_to_be_verified:
+ other: "Email should be verified."
+ verify_url_expired:
+ other: "Email verified URL has expired, please resend the email."
+ lang:
+ not_found:
+ other: "Language file not found."
+ object:
+ captcha_verification_failed:
+ other: "Captcha wrong."
+ disallow_follow:
+ other: "You are not allowed to follow."
+ disallow_vote:
+ other: "You are not allowed to vote."
+ disallow_vote_your_self:
+ other: "You can't vote for your own post."
+ not_found:
+ other: "Object not found."
+ verification_failed:
+ other: "Verification failed."
+ email_or_password_incorrect:
+ other: "Email and password do not match."
+ old_password_verification_failed:
+ other: "The old password verification failed"
+ new_password_same_as_previous_setting:
+ other: "The new password is the same as the previous one."
+ question:
+ not_found:
+ other: "Question not found."
+ cannot_deleted:
+ other: "No permission to delete."
+ cannot_close:
+ other: "No permission to close."
+ cannot_update:
+ other: "No permission to update."
+ rank:
+ fail_to_meet_the_condition:
+ other: "Rank fail to meet the condition."
+ report:
+ handle_failed:
+ other: "Report handle failed."
+ not_found:
+ other: "Report not found."
+ tag:
+ not_found:
+ other: "Tag not found."
+ recommend_tag_not_found:
+ other: "Recommend Tag is not exist."
+ recommend_tag_enter:
+ other: "Please enter at least one required tag."
+ not_contain_synonym_tags:
+ other: "Should not contain synonym tags."
+ cannot_update:
+ other: "No permission to update."
+ cannot_set_synonym_as_itself:
+ other: "You cannot set the synonym of the current tag as itself."
+ theme:
+ not_found:
+ other: "Theme not found."
+ revision:
+ review_underway:
+ other: "Can't edit currently, there is a version in the review queue."
+ no_permission:
+ other: "No permission to Revision."
+ user:
+ email_or_password_wrong:
+ other:
+ other: Email and password do not match.
+ not_found:
+ other: "User not found."
+ suspended:
+ other: "User has been suspended."
+ username_invalid:
+ other: "Username is invalid."
+ username_duplicate:
+ other: "Username is already in use."
+ set_avatar:
+ other: "Avatar set failed."
+ config:
+ read_config_failed:
+ other: "Read config failed"
+ database:
+ connection_failed:
+ other: "Database connection failed"
+ create_table_failed:
+ other: "Create table failed"
+ install:
+ create_config_failed:
+ other: "Can’t create the config.yaml file."
+ cannot_update_your_role:
+ other: "You cannot modify your role."
+ not_allowed_registration:
+ other: "Currently the site is not open for registration"
+ report:
+ spam:
+ name:
+ other: "spam"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
+ rude:
+ name:
+ other: "rude or abusive"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
+ duplicate:
+ name:
+ other: "a duplicate"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ not_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:
+ name:
+ other: "no longer needed"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
+ question:
+ close:
+ duplicate:
+ name:
+ other: "spam"
+ desc:
+ other: "This question has been asked before and already has an answer."
+ guideline:
+ name:
+ other: "a community-specific reason"
+ desc:
+ other: "This question doesn't meet a community guideline."
+ multiple:
+ name:
+ other: "needs details or clarity"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
+ other:
+ name:
+ other: "something else"
+ desc:
+ other: "This post requires another reason not listed above."
+ notification:
+ action:
+ update_question:
+ other: "updated question"
+ answer_the_question:
+ other: "answered question"
+ update_answer:
+ other: "updated answer"
+ accept_answer:
+ other: "accepted answer"
+ comment_question:
+ other: "commented question"
+ comment_answer:
+ other: "commented answer"
+ reply_to_you:
+ other: "replied to you"
+ mention_you:
+ other: "mentioned you"
+ your_question_is_closed:
+ other: "Your question has been closed"
+ your_question_was_deleted:
+ other: "Your question has been deleted"
+ your_answer_was_deleted:
+ other: "Your answer has been deleted"
+ your_comment_was_deleted:
+ other: "Your comment has been deleted"
+#The following fields are used for interface presentation(Front-end)
+ui:
+ how_to_format:
+ title: How to Format
+ desc: >-
+
to make links
<https://url.com>
[Title](https://url.com)
put returns between paragraphs
_italic_ or **bold**
indent code by 4 spaces
quote by placing > at start of line
backtick escapes `like _this_`
create code fences with backticks `
``` code here ```
+ pagination:
+ prev: Prev
+ next: Next
+ page_title:
+ question: Question
+ questions: Questions
+ tag: Tag
+ tags: Tags
+ tag_wiki: tag wiki
+ edit_tag: Edit Tag
+ ask_a_question: Add Question
+ edit_question: Edit Question
+ edit_answer: Edit Answer
+ search: Search
+ posts_containing: Posts containing
+ settings: Settings
+ notifications: Notifications
+ login: Log In
+ sign_up: Sign Up
+ account_recovery: Account Recovery
+ account_activation: Account Activation
+ confirm_email: Confirm Email
+ account_suspended: Account Suspended
+ admin: Admin
+ change_email: Modify Email
+ install: Answer Installation
+ upgrade: Answer Upgrade
+ maintenance: Website Maintenance
+ users: Users
+ notifications:
+ title: Notifications
+ inbox: Inbox
+ achievement: Achievements
+ all_read: Mark all as read
+ show_more: Show more
+ suspended:
+ title: Your Account has been Suspended
+ until_time: "Your account was suspended until {{ time }}."
+ forever: This user was suspended forever.
+ end: You don't meet a community guideline.
+ editor:
+ blockquote:
+ text: Blockquote
+ bold:
+ text: Strong
+ chart:
+ text: Chart
+ flow_chart: Flow chart
+ sequence_diagram: Sequence diagram
+ class_diagram: Class diagram
+ state_diagram: State diagram
+ entity_relationship_diagram: Entity relationship diagram
+ user_defined_diagram: User defined diagram
+ gantt_chart: Gantt chart
+ pie_chart: Pie chart
+ code:
+ text: Code Sample
+ add_code: Add code sample
+ form:
+ fields:
+ code:
+ label: Code
+ msg:
+ empty: Code cannot be empty.
+ language:
+ label: Language (optional)
+ placeholder: Automatic detection
+ btn_cancel: Cancel
+ btn_confirm: Add
+ formula:
+ text: Formula
+ options:
+ inline: Inline formula
+ block: Block formula
+ heading:
+ text: Heading
+ options:
+ h1: Heading 1
+ h2: Heading 2
+ h3: Heading 3
+ h4: Heading 4
+ h5: Heading 5
+ h6: Heading 6
+ help:
+ text: Help
+ hr:
+ text: Horizontal Rule
+ image:
+ text: Image
+ add_image: Add image
+ tab_image: Upload image
+ form_image:
+ fields:
+ file:
+ label: Image File
+ btn: Select image
+ msg:
+ empty: File cannot be empty.
+ only_image: Only image files are allowed.
+ max_size: File size cannot exceed 4MB.
+ desc:
+ label: Description (optional)
+ tab_url: Image URL
+ form_url:
+ fields:
+ url:
+ label: Image URL
+ msg:
+ empty: Image URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ uploading: Uploading
+ indent:
+ text: Indent
+ outdent:
+ text: Outdent
+ italic:
+ text: Emphasis
+ link:
+ text: Hyperlink
+ add_link: Add hyperlink
+ form:
+ fields:
+ url:
+ label: URL
+ msg:
+ empty: URL cannot be empty.
+ name:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_confirm: Add
+ ordered_list:
+ text: Numbered List
+ unordered_list:
+ text: Bulleted List
+ table:
+ text: Table
+ heading: Heading
+ cell: Cell
+ close_modal:
+ title: I am closing this post as...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ report_modal:
+ flag_title: I am flagging to report this post as...
+ close_title: I am closing this post as...
+ review_question_title: Review question
+ review_answer_title: Review answer
+ review_comment_title: Review comment
+ btn_cancel: Cancel
+ btn_submit: Submit
+ remark:
+ empty: Cannot be empty.
+ msg:
+ empty: Please select a reason.
+ tag_modal:
+ title: Create new tag
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg:
+ empty: Display name cannot be empty.
+ range: Display name up to 35 characters.
+ slug_name:
+ label: URL Slug
+ desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
+ msg:
+ empty: URL slug cannot be empty.
+ range: URL slug up to 35 characters.
+ character: URL slug contains unallowed character set.
+ desc:
+ label: Description (optional)
+ btn_cancel: Cancel
+ btn_submit: Submit
+ tag_info:
+ created_at: Created
+ edited_at: Edited
+ history: History
+ synonyms:
+ title: Synonyms
+ text: The following tags will be remapped to
+ empty: No synonyms found.
+ btn_add: Add a synonym
+ btn_edit: Edit
+ btn_save: Save
+ synonyms_text: The following tags will be remapped to
+ delete:
+ title: Delete this tag
+ content: >-
+
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml
index 7a50f1d4..126ebefb 100644
--- a/i18n/zh_CN.yaml
+++ b/i18n/zh_CN.yaml
@@ -1,3 +1,4 @@
+#The following fields are used for back-end
backend:
base:
success:
@@ -10,7 +11,6 @@ backend:
other: "未登录"
database_error:
other: "数据服务异常"
-
role:
name:
user:
@@ -26,21 +26,23 @@ backend:
other: "拥有进入网站的全部权限。"
moderator:
other: "有权访问所有的帖子,无法进入管理员设置页面。"
-
email:
other: "邮箱"
password:
other: "密码"
-
- email_or_password_wrong_error: &email_or_password_wrong
+ email_or_password_wrong_error:
other: "邮箱或密码错误"
-
error:
admin:
- email_or_password_wrong: *email_or_password_wrong
+ email_or_password_wrong:
+ other: 邮箱或密码错误
answer:
not_found:
other: "答案未找到"
+ cannot_deleted:
+ other: "无删除权限"
+ cannot_update:
+ other: "无修改权限"
comment:
edit_without_permission:
other: "不允许编辑评论"
@@ -78,6 +80,12 @@ backend:
question:
not_found:
other: "问题未找到"
+ cannot_deleted:
+ other: "无删除权限"
+ cannot_close:
+ other: "无关闭权限"
+ cannot_update:
+ other: "无更新权限"
rank:
fail_to_meet_the_condition:
other: "级别不符合条件"
@@ -102,9 +110,15 @@ backend:
theme:
not_found:
other: "主题未找到"
+ revision:
+ review_underway:
+ other: "目前无法编辑,有一个版本在审阅队列中。"
+ no_permission:
+ other: "无权限修改"
user:
email_or_password_wrong:
- other: *email_or_password_wrong
+ other:
+ other: 邮箱或密码错误
not_found:
other: "用户未找到"
suspended:
@@ -115,71 +129,75 @@ backend:
other: "用户名已被使用"
set_avatar:
other: "头像设置错误"
+ config:
+ read_config_failed:
+ other: "读取配置失败"
+ database:
+ connection_failed:
+ other: "数据连接异常!"
+ create_table_failed:
+ other: "创建表失败"
+ install:
+ create_config_failed:
+ other: "无法创建配置文件"
cannot_update_your_role:
other: "你无法修改自己的角色"
not_allowed_registration:
other: "目前该网站尚未开放注册"
- revision:
- review_underway:
- other: "目前无法编辑,有一个版本在审阅队列中。"
- no_permission:
- other: "无权限修改"
report:
spam:
name:
other: "垃圾信息"
- description:
- other: "此帖子是一个广告贴,或是破坏性行为。它对当前的主题无用,也不相关。"
+ desc:
+ other: "This post is an advertisement, or vandalism. It is not useful or relevant to the current topic."
rude:
name:
other: "粗鲁或辱骂的"
- description:
- other: "有理智的人都会发现此内容不适合进行尊重的讨论。"
+ desc:
+ other: "A reasonable person would find this content inappropriate for respectful discourse."
duplicate:
name:
other: "重复信息"
- description:
- other: "此问题以前就有人问过,而且已经有了答案。"
+ desc:
+ other: "This question has been asked before and already has an answer."
not_answer:
name:
other: "不是答案"
- description:
- other: "此帖子是作为一个答案发布的,但它并没有试图回答这个问题。总之,它可能应该是个编辑,评论,另一个问题或者被删除。"
+ desc:
+ other: "This was posted as an answer, but it does not attempt to answer the question. It should possibly be an edit, a comment, another question, or deleted altogether."
not_need:
name:
other: "不再需要"
- description:
- other: "此条评论是过时的,对话性的或与本帖无关。"
+ desc:
+ other: "This comment is outdated, conversational or not relevant to this post."
other:
name:
other: "其他原因"
- description:
- other: "此帖子需要工作人员关注,因为是上述所列以外的其他理由。"
-
+ desc:
+ other: "This post requires staff attention for another reason not listed above."
question:
close:
duplicate:
name:
other: "垃圾信息"
- description:
- other: "此问题以前就有人问过,而且已经有了答案。"
+ desc:
+ other: "This question has been asked before and already has an answer."
guideline:
name:
other: "社区特定原因"
- description:
- other: "此问题不符合社区准则。"
+ desc:
+ other: "This question doesn't meet a community guideline."
multiple:
name:
other: "需要细节或澄清"
- description:
- other: "此问题目前涵盖多个问题。它应该只集中在一个问题上。"
+ desc:
+ other: "This question currently includes multiple questions in one. It should focus on one problem only."
other:
name:
other: "其他原因"
- description:
- other: "此帖子需要上述所列以外的其他理由。"
-
+ desc:
+ other: "This post requires another reason not listed above."
notification:
action:
update_question:
@@ -188,7 +206,7 @@ backend:
other: "回答了问题"
update_answer:
other: "更新了答案"
- adopt_answer:
+ accept_answer:
other: "接受了答案"
comment_question:
other: "评论了问题"
@@ -206,7 +224,7 @@ backend:
other: "你的答案已被删除"
your_comment_was_deleted:
other: "你的评论已被删除"
-# The following fields are used for interface presentation(Front-end)
+#The following fields are used for interface presentation(Front-end)
ui:
how_to_format:
title: 如何设定文本格式
@@ -244,6 +262,11 @@ ui:
confirm_email: 确认电子邮件
account_suspended: 账号已封禁
admin: 后台管理
+ change_email: 修改邮箱
+ install: Answer 安装
+ upgrade: Answer 升级
+ maintenance: 网站维护
+ users: Users
notifications:
title: 通知
inbox: 收件箱
@@ -252,7 +275,7 @@ ui:
show_more: 显示更多
suspended:
title: 账号已封禁
- until_time: '你的账号被封禁至{{ time }}。'
+ until_time: "你的账号被封禁至{{ time }}。"
forever: 你的账号已被永久封禁。
end: 违反了我们的社区准则。
editor:
@@ -399,6 +422,7 @@ ui:
tag_info:
created_at: 创建于
edited_at: 编辑于
+ history: 历史
synonyms:
title: 同义词
text: 以下标签等同于
@@ -409,7 +433,8 @@ ui:
synonyms_text: 以下标签等同于
delete:
title: 删除标签
- content:
You could use the edit link to refine and improve your existing answer, instead.
+ empty: Answer cannot be empty.
+ reopen:
+ title: Reopen this post
+ content: Are you sure you want to reopen?
+ success: This post has been reopened
+ delete:
+ title: Delete this post
+ question: >-
+ We do not recommend deleting questions with answers because doing so deprives future readers of this knowledge.
Repeated deletion of answered questions can result in your account being blocked from asking. Are you sure you wish to delete?
+ answer_accepted: >-
+
We do not recommend deleting accepted answer because doing so deprives future readers of this knowledge.
Repeated deletion of accepted answers can result in your account being blocked from answering. Are you sure you wish to delete?
+ other: Are you sure you wish to delete?
+ tip_question_deleted: This post has been deleted
+ tip_answer_deleted: This answer has been deleted
+ btns:
+ confirm: Confirm
+ cancel: Cancel
+ save: Save
+ delete: Delete
+ login: Log in
+ signup: Sign up
+ logout: Log out
+ verify: Verify
+ add_question: Add question
+ approve: Approve
+ reject: Reject
+ skip: Skip
+ search:
+ title: Search Results
+ keywords: Keywords
+ options: Options
+ follow: Follow
+ following: Following
+ counts: "{{count}} Results"
+ more: More
+ sort_btns:
+ relevance: Relevance
+ newest: Newest
+ active: Active
+ score: Score
+ more: More
+ tips:
+ title: Advanced Search Tips
+ tag: "<1>[tag]1> search withing a tag"
+ user: "<1>user:username1> search by author"
+ answer: "<1>answers:01> unanswered questions"
+ score: "<1>score:31> posts with a 3+ score"
+ question: "<1>is:question1> search questions"
+ is_answer: "<1>is:answer1> search answers"
+ empty: We couldn't find anything. Try different or less specific keywords.
+ share:
+ name: Share
+ copy: Copy link
+ via: Share post via...
+ copied: Copied
+ facebook: Share to Facebook
+ twitter: Share to Twitter
+ cannot_vote_for_self: You can't vote for your own post
+ modal_confirm:
+ title: Error...
+ account_result:
+ page_title: Welcome to Answer
+ success: Your new account is confirmed; you will be redirected to the home page.
+ link: Continue to homepage
+ invalid: >-
+ Sorry, this account confirmation link is no longer valid. Perhaps your account is already active?
+ confirm_new_email: Your email has been updated.
+ confirm_new_email_invalid: >-
+ Sorry, this confirmation link is no longer valid. Perhaps your email was already changed?
+ question:
+ following_tags: Following Tags
+ edit: Edit
+ save: Save
+ follow_tag_tip: Follow tags to curate your list of questions.
+ hot_questions: Hot Questions
+ all_questions: All Questions
+ x_questions: "{{ count }} Questions"
+ x_answers: "{{ count }} answers"
+ questions: Questions
+ answers: Answers
+ newest: Newest
+ active: Active
+ frequent: Frequent
+ score: Score
+ unanswered: Unanswered
+ modified: modified
+ answered: answered
+ asked: asked
+ closed: closed
+ follow_a_tag: Follow a tag
+ more: More
+ personal:
+ overview: Overview
+ answers: Answers
+ answer: answer
+ questions: Questions
+ question: question
+ bookmarks: Bookmarks
+ reputation: Reputation
+ comments: Comments
+ votes: Votes
+ newest: Newest
+ score: Score
+ edit_profile: Edit Profile
+ visited_x_days: "Visited {{ count }} days"
+ viewed: Viewed
+ joined: Joined
+ last_login: Seen
+ about_me: About Me
+ about_me_empty: "// Hello, World !"
+ top_answers: Top Answers
+ top_questions: Top Questions
+ stats: Stats
+ list_empty: No posts found. Perhaps you'd like to select a different tab?
+ accepted: Accepted
+ answered: answered
+ asked: asked
+ upvote: upvote
+ downvote: downvote
+ mod_short: Mod
+ mod_long: Moderators
+ x_reputation: reputation
+ x_votes: votes received
+ x_answers: answers
+ x_questions: questions
+ install:
+ title: Answer
+ next: Next
+ done: Done
+ config_yaml_error: Can’t create the config.yaml file.
+ lang:
+ label: Please Choose a Language
+ db_type:
+ label: Database Engine
+ db_username:
+ label: Username
+ placeholder: root
+ msg: Username cannot be empty.
+ db_password:
+ label: Password
+ placeholder: root
+ msg: Password cannot be empty.
+ db_host:
+ label: Database Host
+ placeholder: "db:3306"
+ msg: Database Host cannot be empty.
+ db_name:
+ label: Database Name
+ placeholder: answer
+ msg: Database Name cannot be empty.
+ db_file:
+ label: Database File
+ placeholder: /data/answer.db
+ msg: Database File cannot be empty.
+ config_yaml:
+ title: Create config.yaml
+ label: The config.yaml file created.
+ desc: >-
+ You can create the <1>config.yaml1> file manually in the <1>/var/wwww/xxx/1> directory and paste the following text into it.
+ info: "After you’ve done that, click “Next” button."
+ site_information: Site Information
+ admin_account: Admin Account
+ site_name:
+ label: Site Name
+ msg: Site Name cannot be empty.
+ site_url:
+ label: Site URL
+ text: The address of your site.
+ msg:
+ empty: Site URL cannot be empty.
+ incorrect: Site URL incorrect format.
+ contact_email:
+ label: Contact Email
+ text: Email address of key contact responsible for this site.
+ msg:
+ empty: Contact Email cannot be empty.
+ incorrect: Contact Email incorrect format.
+ admin_name:
+ label: Name
+ msg: Name cannot be empty.
+ admin_password:
+ label: Password
+ text: >-
+ You will need this password to log in. Please store it in a secure location.
+ msg: Password cannot be empty.
+ admin_email:
+ label: Email
+ text: You will need this email to log in.
+ msg:
+ empty: Email cannot be empty.
+ incorrect: Email incorrect format.
+ ready_title: Your Answer is Ready!
+ ready_desc: >-
+ If you ever feel like changing more settings, visit <1>admin section1>; find it in the site menu.
+ good_luck: "Have fun, and good luck!"
+ warn_title: Warning
+ warn_desc: >-
+ The file <1>config.yaml1> already exists. If you need to reset any of the configuration items in this file, please delete it first.
+ install_now: You may try <1>installing now1>.
+ installed: Already installed
+ installed_desc: >-
+ You appear to have already installed. To reinstall please clear your old database tables first.
+ db_failed: Database connection failed
+ db_failed_desc: >-
+ This either means that the database information in your <1>config.yaml1> file is incorrect or that contact with the database server could not be established. This could mean your host’s database server is down.
+ page_404:
+ desc: "Unfortunately, this page doesn't exist."
+ back_home: Back to homepage
+ page_50X:
+ desc: The server encountered an error and could not complete your request.
+ back_home: Back to homepage
+ page_maintenance:
+ desc: "We are under maintenance, we’ll be back soon."
+ nav_menus:
+ dashboard: Dashboard
+ contents: Contents
+ questions: Questions
+ answers: Answers
+ users: Users
+ flags: Flags
+ settings: Settings
+ general: General
+ interface: Interface
+ smtp: SMTP
+ branding: Branding
+ legal: Legal
+ write: Write
+ tos: Terms of Service
+ privacy: Privacy
+ seo: SEO
+ customize: Customize
+ themes: Themes
+ css-html: CSS/HTML
+ login: Login
+ admin:
+ admin_header:
+ title: Admin
+ dashboard:
+ title: Dashboard
+ welcome: Welcome to Answer Admin!
+ site_statistics: Site Statistics
+ questions: "Questions:"
+ answers: "Answers:"
+ comments: "Comments:"
+ votes: "Votes:"
+ active_users: "Active users:"
+ flags: "Flags:"
+ site_health_status: Site Health Status
+ version: "Version:"
+ https: "HTTPS:"
+ uploading_files: "Uploading files:"
+ smtp: "SMTP:"
+ timezone: "Timezone:"
+ system_info: System Info
+ storage_used: "Storage used:"
+ uptime: "Uptime:"
+ answer_links: Answer Links
+ documents: Documents
+ feedback: Feedback
+ review: Review
+ config: Config
+ update_to: Update to
+ latest: Latest
+ check_failed: Check failed
+ "yes": "Yes"
+ "no": "No"
+ not_allowed: Not allowed
+ allowed: Allowed
+ enabled: Enabled
+ disabled: Disabled
+ flags:
+ title: Flags
+ pending: Pending
+ completed: Completed
+ flagged: Flagged
+ created: Created
+ action: Action
+ review: Review
+ change_modal:
+ title: Change user status to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ normal_name: normal
+ normal_desc: A normal user can ask and answer questions.
+ suspended_name: suspended
+ suspended_desc: A suspended user can't log in.
+ deleted_name: deleted
+ deleted_desc: "Delete profile, authentication associations."
+ inactive_name: inactive
+ inactive_desc: An inactive user must re-validate their email.
+ confirm_title: Delete this user
+ confirm_content: Are you sure you want to delete this user? This is permanent!
+ confirm_btn: Delete
+ msg:
+ empty: Please select a reason.
+ status_modal:
+ title: "Change {{ type }} status to..."
+ normal_name: normal
+ normal_desc: A normal post available to everyone.
+ closed_name: closed
+ closed_desc: "A closed question can't answer, but still can edit, vote and comment."
+ deleted_name: deleted
+ deleted_desc: All reputation gained and lost will be restored.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ btn_next: Next
+ user_role_modal:
+ title: Change user role to...
+ btn_cancel: Cancel
+ btn_submit: Submit
+ users:
+ title: Users
+ name: Name
+ email: Email
+ reputation: Reputation
+ created_at: Created Time
+ delete_at: Deleted Time
+ suspend_at: Suspended Time
+ status: Status
+ role: Role
+ action: Action
+ change: Change
+ all: All
+ staff: Staff
+ inactive: Inactive
+ suspended: Suspended
+ deleted: Deleted
+ normal: Normal
+ Moderator: Moderator
+ Admin: Admin
+ User: User
+ filter:
+ placeholder: "Filter by name, user:id"
+ set_new_password: Set new password
+ change_status: Change status
+ change_role: Change role
+ show_logs: Show logs
+ add_user: Add user
+ new_password_modal:
+ title: Set new password
+ form:
+ fields:
+ password:
+ label: Password
+ text: The user will be logged out and need to login again.
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ user_modal:
+ title: Add new user
+ form:
+ fields:
+ display_name:
+ label: Display Name
+ msg: display_name must be at 4 - 30 characters in length.
+ email:
+ label: Email
+ msg: Email is not valid.
+ password:
+ label: Password
+ msg: Password must be at 8 - 32 characters in length.
+ btn_cancel: Cancel
+ btn_submit: Submit
+ questions:
+ page_title: Questions
+ normal: Normal
+ closed: Closed
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ answers: Answers
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, question:id"
+ answers:
+ page_title: Answers
+ normal: Normal
+ deleted: Deleted
+ post: Post
+ votes: Votes
+ created: Created
+ status: Status
+ action: Action
+ change: Change
+ filter:
+ placeholder: "Filter by title, answer:id"
+ general:
+ page_title: General
+ name:
+ label: Site Name
+ msg: Site name cannot be empty.
+ text: "The name of this site, as used in the title tag."
+ site_url:
+ label: Site URL
+ msg: Site url cannot be empty.
+ validate: Please enter a valid URL.
+ text: The address of your site.
+ short_desc:
+ label: Short Site Description (optional)
+ msg: Short site description cannot be empty.
+ text: "Short description, as used in the title tag on homepage."
+ desc:
+ label: Site Description (optional)
+ msg: Site description cannot be empty.
+ text: "Describe this site in one sentence, as used in the meta description tag."
+ contact_email:
+ label: Contact Email
+ msg: Contact email cannot be empty.
+ validate: Contact email is not valid.
+ text: Email address of key contact responsible for this site.
+ interface:
+ page_title: Interface
+ logo:
+ label: Logo (optional)
+ msg: Site logo cannot be empty.
+ text: You can upload your image or <1>reset1> it to the site title text.
+ theme:
+ label: Theme
+ msg: Theme cannot be empty.
+ text: Select an existing theme.
+ language:
+ label: Interface Language
+ msg: Interface language cannot be empty.
+ text: User interface language. It will change when you refresh the page.
+ time_zone:
+ label: Timezone
+ msg: Timezone cannot be empty.
+ text: Choose a city in the same timezone as you.
+ smtp:
+ page_title: SMTP
+ from_email:
+ label: From Email
+ msg: From email cannot be empty.
+ text: The email address which emails are sent from.
+ from_name:
+ label: From Name
+ msg: From name cannot be empty.
+ text: The name which emails are sent from.
+ smtp_host:
+ label: SMTP Host
+ msg: SMTP host cannot be empty.
+ text: Your mail server.
+ encryption:
+ label: Encryption
+ msg: Encryption cannot be empty.
+ text: For most servers SSL is the recommended option.
+ ssl: SSL
+ none: None
+ smtp_port:
+ label: SMTP Port
+ msg: SMTP port must be number 1 ~ 65535.
+ text: The port to your mail server.
+ smtp_username:
+ label: SMTP Username
+ msg: SMTP username cannot be empty.
+ smtp_password:
+ label: SMTP Password
+ msg: SMTP password cannot be empty.
+ test_email_recipient:
+ label: Test Email Recipients
+ text: Provide email address that will receive test sends.
+ msg: Test email recipients is invalid
+ smtp_authentication:
+ label: Enable authentication
+ title: SMTP Authentication
+ msg: SMTP authentication cannot be empty.
+ "yes": "Yes"
+ "no": "No"
+ branding:
+ page_title: Branding
+ logo:
+ label: Logo
+ msg: Logo cannot be empty.
+ text: The logo image at the top left of your site. Use a wide rectangular image with a height of 56 and an aspect ratio greater than 3:1. If left blank, the site title text will be shown.
+ mobile_logo:
+ label: Mobile Logo (optional)
+ text: The logo used on mobile version of your site. Use a wide rectangular image with a height of 56. If left blank, the image from the “logo” setting will be used.
+ square_icon:
+ label: Square Icon
+ msg: Square icon cannot be empty.
+ text: Image used as the base for metadata icons. Should ideally be larger than 512x512.
+ favicon:
+ label: Favicon (optional)
+ text: A favicon for your site. To work correctly over a CDN it must be a png. Will be resized to 32x32. If left blank, “square icon” will be used.
+ legal:
+ page_title: Legal
+ terms_of_service:
+ label: Terms of Service
+ text: "You can add terms of service content here. If you already have a document hosted elsewhere, provide the full URL here."
+ privacy_policy:
+ label: Privacy Policy
+ text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
+ write:
+ page_title: Write
+ recommend_tags:
+ label: Recommend Tags
+ text: "Please input tag slug above, one tag per line."
+ required_tag:
+ title: Required Tag
+ label: Set recommend tag as required
+ text: "Every new question must have at least one recommend tag."
+ reserved_tags:
+ label: Reserved Tags
+ text: "Reserved tags can only be added to a post by moderator."
+ seo:
+ page_title: SEO
+ permalink:
+ label: Permalink
+ text: Custom URL structures can improve the usability, and forward-compatibility of your links.
+ robots:
+ label: robots.txt
+ text: This will permanently override any related site settings.
+ themes:
+ page_title: Themes
+ themes:
+ label: Themes
+ text: Select an existing theme.
+ navbar_style:
+ label: Navbar Style
+ text: Select an existing theme.
+ primary_color:
+ label: Primary Color
+ text: Modify the colors used by your themes
+ css_and_html:
+ page_title: CSS and HTML
+ custom_css:
+ label: Custom CSS
+ text: This will insert as
+ head:
+ label: Head
+ text: This will insert before
+ header:
+ label: Header
+ text: This will insert after
+ footer:
+ label: Footer
+ text: This will insert before .
+ login:
+ page_title: Login
+ membership:
+ title: Membership
+ label: Allow new registrations
+ text: Turn off to prevent anyone from creating a new account.
+ private:
+ title: Private
+ label: Login required
+ text: Only logged in users can access this community.
+ form:
+ empty: cannot be empty
+ invalid: is invalid
+ btn_submit: Save
+ not_found_props: "Required property {{ key }} not found."
+ page_review:
+ review: Review
+ proposed: proposed
+ question_edit: Question edit
+ answer_edit: Answer edit
+ tag_edit: Tag edit
+ edit_summary: Edit summary
+ edit_question: Edit question
+ edit_answer: Edit answer
+ edit_tag: Edit tag
+ empty: No review tasks left.
+ timeline:
+ undeleted: undeleted
+ deleted: deleted
+ downvote: downvote
+ upvote: upvote
+ accept: accept
+ cancelled: cancelled
+ commented: commented
+ rollback: rollback
+ edited: edited
+ answered: answered
+ asked: asked
+ closed: closed
+ reopened: reopened
+ created: created
+ title: "History for"
+ tag_title: "Timeline for"
+ show_votes: "Show votes"
+ n_or_a: N/A
+ title_for_question: "Timeline for"
+ title_for_answer: "Timeline for answer to {{ title }} by {{ author }}"
+ title_for_tag: "Timeline for tag"
+ datetime: Datetime
+ type: Type
+ by: By
+ comment: Comment
+ no_data: "We couldn't find anything."
+ users:
+ title: Users
+ users_with_the_most_reputation: Users with the highest reputation scores
+ users_with_the_most_vote: Users who voted the most
+ staffs: Our community staff
+ reputation: reputation
+ votes: votes
+
+
diff --git a/internal/base/constant/notification.go b/internal/base/constant/notification.go
index fe9fbf41..83856f64 100644
--- a/internal/base/constant/notification.go
+++ b/internal/base/constant/notification.go
@@ -7,8 +7,8 @@ const (
AnswerTheQuestion = "notification.action.answer_the_question"
// UpdateAnswer update answer
UpdateAnswer = "notification.action.update_answer"
- // AdoptAnswer adopt answer
- AdoptAnswer = "notification.action.adopt_answer"
+ // AcceptAnswer accept answer
+ AcceptAnswer = "notification.action.accept_answer"
// CommentQuestion comment question
CommentQuestion = "notification.action.comment_question"
// CommentAnswer comment answer
diff --git a/internal/base/handler/handler.go b/internal/base/handler/handler.go
index 8e7ef118..c3b6025e 100644
--- a/internal/base/handler/handler.go
+++ b/internal/base/handler/handler.go
@@ -52,7 +52,7 @@ func BindAndCheck(ctx *gin.Context, data interface{}) bool {
return true
}
- errField, err := validator.GetValidatorByLang(lang.Abbr()).Check(data)
+ errField, err := validator.GetValidatorByLang(lang).Check(data)
if err != nil {
HandleResponse(ctx, err, errField)
return true
@@ -70,6 +70,6 @@ func BindAndCheckReturnErr(ctx *gin.Context, data interface{}) (errFields []*val
return nil
}
- errFields, _ = validator.GetValidatorByLang(lang.Abbr()).Check(data)
+ errFields, _ = validator.GetValidatorByLang(lang).Check(data)
return errFields
}
diff --git a/internal/base/handler/lang.go b/internal/base/handler/lang.go
index 4f4a0763..20e2b38c 100644
--- a/internal/base/handler/lang.go
+++ b/internal/base/handler/lang.go
@@ -11,14 +11,10 @@ import (
// GetLang get language from header
func GetLang(ctx *gin.Context) i18n.Language {
acceptLanguage := ctx.GetHeader(constant.AcceptLanguageFlag)
- switch i18n.Language(acceptLanguage) {
- case i18n.LanguageChinese:
- return i18n.LanguageChinese
- case i18n.LanguageEnglish:
- return i18n.LanguageEnglish
- default:
- return i18n.DefaultLang
+ if len(acceptLanguage) == 0 {
+ return i18n.DefaultLanguage
}
+ return i18n.Language(acceptLanguage)
}
// GetLangByCtx get language from header
@@ -27,5 +23,5 @@ func GetLangByCtx(ctx context.Context) i18n.Language {
if ok {
return acceptLanguage
}
- return i18n.DefaultLang
+ return i18n.DefaultLanguage
}
diff --git a/internal/base/middleware/auth.go b/internal/base/middleware/auth.go
index 555a2d10..a7796c87 100644
--- a/internal/base/middleware/auth.go
+++ b/internal/base/middleware/auth.go
@@ -113,7 +113,7 @@ func (am *AuthUserMiddleware) MustAuth() gin.HandlerFunc {
}
}
-func (am *AuthUserMiddleware) CmsAuth() gin.HandlerFunc {
+func (am *AuthUserMiddleware) AdminAuth() gin.HandlerFunc {
return func(ctx *gin.Context) {
token := ExtractToken(ctx)
if len(token) == 0 {
@@ -121,7 +121,7 @@ func (am *AuthUserMiddleware) CmsAuth() gin.HandlerFunc {
ctx.Abort()
return
}
- userInfo, err := am.authService.GetCmsUserCacheInfo(ctx, token)
+ userInfo, err := am.authService.GetAdminUserCacheInfo(ctx, token)
if err != nil {
handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
ctx.Abort()
diff --git a/internal/base/server/http.go b/internal/base/server/http.go
index 35341fd3..1b699bce 100644
--- a/internal/base/server/http.go
+++ b/internal/base/server/http.go
@@ -57,9 +57,9 @@ func NewHTTPServer(debug bool,
authV1.Use(authUserMiddleware.MustAuth())
answerRouter.RegisterAnswerAPIRouter(authV1)
- cmsauthV1 := r.Group("/answer/admin/api")
- cmsauthV1.Use(authUserMiddleware.CmsAuth())
- answerRouter.RegisterAnswerCmsAPIRouter(cmsauthV1)
+ adminauthV1 := r.Group("/answer/admin/api")
+ adminauthV1.Use(authUserMiddleware.AdminAuth())
+ answerRouter.RegisterAnswerAdminAPIRouter(adminauthV1)
templateRouter.RegisterTemplateRouter(rootGroup)
return r
diff --git a/internal/base/server/http_funcmap.go b/internal/base/server/http_funcmap.go
index caac20f4..c5f58f45 100644
--- a/internal/base/server/http_funcmap.go
+++ b/internal/base/server/http_funcmap.go
@@ -49,6 +49,7 @@ var funcMap = template.FuncMap{
k := converter.InterfaceToString(params[i])
v := converter.InterfaceToString(params[i+1])
trans = strings.ReplaceAll(trans, "{{ "+k+" }}", v)
+ trans = strings.ReplaceAll(trans, "{{"+k+"}}", v)
}
}
diff --git a/internal/base/validator/validator.go b/internal/base/validator/validator.go
index 9c9b8017..6ed4d358 100644
--- a/internal/base/validator/validator.go
+++ b/internal/base/validator/validator.go
@@ -2,23 +2,65 @@ package validator
import (
"errors"
+ "fmt"
"reflect"
"strings"
"github.com/answerdev/answer/internal/base/reason"
"github.com/answerdev/answer/internal/base/translator"
"github.com/go-playground/locales"
+ german "github.com/go-playground/locales/de"
english "github.com/go-playground/locales/en"
- zhongwen "github.com/go-playground/locales/zh"
+ spanish "github.com/go-playground/locales/es"
+ french "github.com/go-playground/locales/fr"
+ italian "github.com/go-playground/locales/it"
+ japanese "github.com/go-playground/locales/ja"
+ korean "github.com/go-playground/locales/ko"
+ portuguese "github.com/go-playground/locales/pt"
+ russian "github.com/go-playground/locales/ru"
+ vietnamese "github.com/go-playground/locales/vi"
+ chinese "github.com/go-playground/locales/zh"
+ chineseTraditional "github.com/go-playground/locales/zh_Hant_TW"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
"github.com/go-playground/validator/v10/translations/en"
+ "github.com/go-playground/validator/v10/translations/es"
+ "github.com/go-playground/validator/v10/translations/fr"
+ "github.com/go-playground/validator/v10/translations/it"
+ "github.com/go-playground/validator/v10/translations/ja"
+ "github.com/go-playground/validator/v10/translations/pt"
+ "github.com/go-playground/validator/v10/translations/ru"
+ "github.com/go-playground/validator/v10/translations/vi"
"github.com/go-playground/validator/v10/translations/zh"
+ "github.com/go-playground/validator/v10/translations/zh_tw"
myErrors "github.com/segmentfault/pacman/errors"
"github.com/segmentfault/pacman/i18n"
"github.com/segmentfault/pacman/log"
)
+type TranslatorLocal struct {
+ La i18n.Language
+ Lo locales.Translator
+ RegisterFunc func(v *validator.Validate, trans ut.Translator) (err error)
+}
+
+var (
+ allLanguageTranslators = []*TranslatorLocal{
+ {La: i18n.LanguageChinese, Lo: chinese.New(), RegisterFunc: zh.RegisterDefaultTranslations},
+ {La: i18n.LanguageChineseTraditional, Lo: chineseTraditional.New(), RegisterFunc: zh_tw.RegisterDefaultTranslations},
+ {La: i18n.LanguageEnglish, Lo: english.New(), RegisterFunc: en.RegisterDefaultTranslations},
+ {La: i18n.LanguageGerman, Lo: german.New(), RegisterFunc: nil},
+ {La: i18n.LanguageSpanish, Lo: spanish.New(), RegisterFunc: es.RegisterDefaultTranslations},
+ {La: i18n.LanguageFrench, Lo: french.New(), RegisterFunc: fr.RegisterDefaultTranslations},
+ {La: i18n.LanguageItalian, Lo: italian.New(), RegisterFunc: it.RegisterDefaultTranslations},
+ {La: i18n.LanguageJapanese, Lo: japanese.New(), RegisterFunc: ja.RegisterDefaultTranslations},
+ {La: i18n.LanguageKorean, Lo: korean.New(), RegisterFunc: nil},
+ {La: i18n.LanguagePortuguese, Lo: portuguese.New(), RegisterFunc: pt.RegisterDefaultTranslations},
+ {La: i18n.LanguageRussian, Lo: russian.New(), RegisterFunc: ru.RegisterDefaultTranslations},
+ {La: i18n.LanguageVietnamese, Lo: vietnamese.New(), RegisterFunc: vi.RegisterDefaultTranslations},
+ }
+)
+
// MyValidator my validator
type MyValidator struct {
Validate *validator.Validate
@@ -33,26 +75,24 @@ type FormErrorField struct {
}
// GlobalValidatorMapping is a mapping from validator to translator used
-var GlobalValidatorMapping = make(map[string]*MyValidator, 0)
+var GlobalValidatorMapping = make(map[i18n.Language]*MyValidator, 0)
func init() {
- zhTran, zhVal := getTran(zhongwen.New(), i18n.LanguageChinese.Abbr()), createDefaultValidator(i18n.LanguageChinese)
- if err := zh.RegisterDefaultTranslations(zhVal, zhTran); err != nil {
- panic(err)
+ for _, t := range allLanguageTranslators {
+ tran, val := getTran(t.Lo), createDefaultValidator(t.La)
+ if t.RegisterFunc != nil {
+ if err := t.RegisterFunc(val, tran); err != nil {
+ panic(err)
+ }
+ }
+ GlobalValidatorMapping[t.La] = &MyValidator{Validate: val, Tran: tran, Lang: t.La}
}
- GlobalValidatorMapping[i18n.LanguageChinese.Abbr()] = &MyValidator{Validate: zhVal, Tran: zhTran, Lang: i18n.LanguageChinese}
-
- enTran, enVal := getTran(english.New(), i18n.LanguageEnglish.Abbr()), createDefaultValidator(i18n.LanguageEnglish)
- if err := en.RegisterDefaultTranslations(enVal, enTran); err != nil {
- panic(err)
- }
- GlobalValidatorMapping[i18n.LanguageEnglish.Abbr()] = &MyValidator{Validate: enVal, Tran: enTran, Lang: i18n.LanguageEnglish}
}
-func getTran(lo locales.Translator, la string) ut.Translator {
- tran, ok := ut.New(lo, lo).GetTranslator(la)
+func getTran(lo locales.Translator) ut.Translator {
+ tran, ok := ut.New(lo, lo).GetTranslator(lo.Locale())
if !ok {
- panic(ok)
+ panic(fmt.Sprintf("not found translator %s", lo.Locale()))
}
return tran
}
@@ -79,11 +119,11 @@ func createDefaultValidator(la i18n.Language) *validator.Validate {
return validate
}
-func GetValidatorByLang(la string) *MyValidator {
- if GlobalValidatorMapping[la] != nil {
- return GlobalValidatorMapping[la]
+func GetValidatorByLang(lang i18n.Language) *MyValidator {
+ if GlobalValidatorMapping[lang] != nil {
+ return GlobalValidatorMapping[lang]
}
- return GlobalValidatorMapping[i18n.DefaultLang.Abbr()]
+ return GlobalValidatorMapping[i18n.DefaultLanguage]
}
// Check /
diff --git a/internal/controller/answer_controller.go b/internal/controller/answer_controller.go
index 7ca1f898..684988ef 100644
--- a/internal/controller/answer_controller.go
+++ b/internal/controller/answer_controller.go
@@ -232,18 +232,18 @@ func (ac *AnswerController) AnswerList(ctx *gin.Context) {
})
}
-// Adopted godoc
-// @Summary Adopted
-// @Description Adopted
+// Accepted godoc
+// @Summary Accepted
+// @Description Accepted
// @Tags api-answer
// @Accept json
// @Produce json
// @Security ApiKeyAuth
-// @Param data body schema.AnswerAdoptedReq true "AnswerAdoptedReq"
+// @Param data body schema.AnswerAcceptedReq true "AnswerAcceptedReq"
// @Success 200 {string} string ""
// @Router /answer/api/v1/answer/acceptance [post]
-func (ac *AnswerController) Adopted(ctx *gin.Context) {
- req := &schema.AnswerAdoptedReq{}
+func (ac *AnswerController) Accepted(ctx *gin.Context) {
+ req := &schema.AnswerAcceptedReq{}
if handler.BindAndCheck(ctx, req) {
return
}
@@ -259,7 +259,7 @@ func (ac *AnswerController) Adopted(ctx *gin.Context) {
return
}
- err = ac.answerService.UpdateAdopted(ctx, req)
+ err = ac.answerService.UpdateAccepted(ctx, req)
handler.HandleResponse(ctx, err, nil)
}
diff --git a/internal/controller/question_controller.go b/internal/controller/question_controller.go
index 7a9199b3..94c7b92c 100644
--- a/internal/controller/question_controller.go
+++ b/internal/controller/question_controller.go
@@ -277,6 +277,19 @@ func (qc *QuestionController) AddQuestion(ctx *gin.Context) {
return
}
+ errList, err := qc.questionService.CheckAddQuestion(ctx, req)
+ if err != nil {
+ errlist, ok := errList.([]*validator.FormErrorField)
+ if ok {
+ errFields = append(errFields, errlist...)
+ }
+ }
+
+ if len(errFields) > 0 {
+ handler.HandleResponse(ctx, errors.BadRequest(reason.RequestFormatError), errFields)
+ return
+ }
+
resp, err := qc.questionService.AddQuestion(ctx, req)
if err != nil {
errlist, ok := resp.([]*validator.FormErrorField)
@@ -284,6 +297,7 @@ func (qc *QuestionController) AddQuestion(ctx *gin.Context) {
errFields = append(errFields, errlist...)
}
}
+
if len(errFields) > 0 {
handler.HandleResponse(ctx, errors.BadRequest(reason.RequestFormatError), errFields)
return
@@ -480,8 +494,8 @@ func (qc *QuestionController) UserCollectionList(ctx *gin.Context) {
})
}
-// CmsSearchList godoc
-// @Summary CmsSearchList
+// AdminSearchList godoc
+// @Summary AdminSearchList
// @Description Status:[available,closed,deleted]
// @Tags admin
// @Accept json
@@ -493,21 +507,21 @@ func (qc *QuestionController) UserCollectionList(ctx *gin.Context) {
// @Param query query string false "question id or title"
// @Success 200 {object} handler.RespBody
// @Router /answer/admin/api/question/page [get]
-func (qc *QuestionController) CmsSearchList(ctx *gin.Context) {
- req := &schema.CmsQuestionSearch{}
+func (qc *QuestionController) AdminSearchList(ctx *gin.Context) {
+ req := &schema.AdminQuestionSearch{}
if handler.BindAndCheck(ctx, req) {
return
}
userID := middleware.GetLoginUserIDFromContext(ctx)
- questionList, count, err := qc.questionService.CmsSearchList(ctx, req, userID)
+ questionList, count, err := qc.questionService.AdminSearchList(ctx, req, userID)
handler.HandleResponse(ctx, err, gin.H{
"list": questionList,
"count": count,
})
}
-// CmsSearchAnswerList godoc
-// @Summary CmsSearchList
+// AdminSearchAnswerList godoc
+// @Summary AdminSearchAnswerList
// @Description Status:[available,deleted]
// @Tags admin
// @Accept json
@@ -520,13 +534,13 @@ func (qc *QuestionController) CmsSearchList(ctx *gin.Context) {
// @Param question_id query string false "question id"
// @Success 200 {object} handler.RespBody
// @Router /answer/admin/api/answer/page [get]
-func (qc *QuestionController) CmsSearchAnswerList(ctx *gin.Context) {
- req := &entity.CmsAnswerSearch{}
+func (qc *QuestionController) AdminSearchAnswerList(ctx *gin.Context) {
+ req := &entity.AdminAnswerSearch{}
if handler.BindAndCheck(ctx, req) {
return
}
userID := middleware.GetLoginUserIDFromContext(ctx)
- questionList, count, err := qc.questionService.CmsSearchAnswerList(ctx, req, userID)
+ questionList, count, err := qc.questionService.AdminSearchAnswerList(ctx, req, userID)
handler.HandleResponse(ctx, err, gin.H{
"list": questionList,
"count": count,
diff --git a/internal/controller/template_controller.go b/internal/controller/template_controller.go
index cf02268c..54316467 100644
--- a/internal/controller/template_controller.go
+++ b/internal/controller/template_controller.go
@@ -264,7 +264,7 @@ func (tc *TemplateController) QuestionInfo(ctx *gin.Context) {
jsonLD.MainEntity.Author.Name = detail.UserInfo.DisplayName
answerList := make([]*schema.SuggestedAnswerItem, 0)
for _, answer := range answers {
- if answer.Adopted == schema.AnswerAdoptedEnable {
+ if answer.Accepted == schema.AnswerAcceptedEnable {
acceptedAnswerItem := &schema.AcceptedAnswerItem{}
acceptedAnswerItem.Type = "Answer"
acceptedAnswerItem.Text = answer.HTML
diff --git a/internal/controller_backyard/controller.go b/internal/controller_admin/controller.go
similarity index 79%
rename from internal/controller_backyard/controller.go
rename to internal/controller_admin/controller.go
index 03b4fae1..885d59e0 100644
--- a/internal/controller_backyard/controller.go
+++ b/internal/controller_admin/controller.go
@@ -1,11 +1,11 @@
-package controller_backyard
+package controller_admin
import "github.com/google/wire"
// ProviderSetController is controller providers.
var ProviderSetController = wire.NewSet(
NewReportController,
- NewUserBackyardController,
+ NewUserAdminController,
NewThemeController,
NewSiteInfoController,
NewRoleController,
diff --git a/internal/controller_backyard/report_controller.go b/internal/controller_admin/report_controller.go
similarity index 89%
rename from internal/controller_backyard/report_controller.go
rename to internal/controller_admin/report_controller.go
index 3c20394b..e09fa241 100644
--- a/internal/controller_backyard/report_controller.go
+++ b/internal/controller_admin/report_controller.go
@@ -1,20 +1,20 @@
-package controller_backyard
+package controller_admin
import (
"github.com/answerdev/answer/internal/base/handler"
"github.com/answerdev/answer/internal/schema"
- "github.com/answerdev/answer/internal/service/report_backyard"
+ "github.com/answerdev/answer/internal/service/report_admin"
"github.com/answerdev/answer/pkg/converter"
"github.com/gin-gonic/gin"
)
// ReportController report controller
type ReportController struct {
- reportService *report_backyard.ReportBackyardService
+ reportService *report_admin.ReportAdminService
}
// NewReportController new controller
-func NewReportController(reportService *report_backyard.ReportBackyardService) *ReportController {
+func NewReportController(reportService *report_admin.ReportAdminService) *ReportController {
return &ReportController{reportService: reportService}
}
diff --git a/internal/controller_backyard/role_controller.go b/internal/controller_admin/role_controller.go
similarity index 97%
rename from internal/controller_backyard/role_controller.go
rename to internal/controller_admin/role_controller.go
index 74d61c1b..56d200f7 100644
--- a/internal/controller_backyard/role_controller.go
+++ b/internal/controller_admin/role_controller.go
@@ -1,4 +1,4 @@
-package controller_backyard
+package controller_admin
import (
"github.com/answerdev/answer/internal/base/handler"
diff --git a/internal/controller_backyard/siteinfo_controller.go b/internal/controller_admin/siteinfo_controller.go
similarity index 99%
rename from internal/controller_backyard/siteinfo_controller.go
rename to internal/controller_admin/siteinfo_controller.go
index 79a3e922..98cb1fec 100644
--- a/internal/controller_backyard/siteinfo_controller.go
+++ b/internal/controller_admin/siteinfo_controller.go
@@ -1,4 +1,4 @@
-package controller_backyard
+package controller_admin
import (
"net/http"
diff --git a/internal/controller_backyard/theme_controller.go b/internal/controller_admin/theme_controller.go
similarity index 95%
rename from internal/controller_backyard/theme_controller.go
rename to internal/controller_admin/theme_controller.go
index 69ce1d0a..044706ae 100644
--- a/internal/controller_backyard/theme_controller.go
+++ b/internal/controller_admin/theme_controller.go
@@ -1,4 +1,4 @@
-package controller_backyard
+package controller_admin
import (
"github.com/answerdev/answer/internal/base/handler"
diff --git a/internal/controller_backyard/user_backyard_controller.go b/internal/controller_admin/user_backyard_controller.go
similarity index 80%
rename from internal/controller_backyard/user_backyard_controller.go
rename to internal/controller_admin/user_backyard_controller.go
index 1b35a2ec..848319b5 100644
--- a/internal/controller_backyard/user_backyard_controller.go
+++ b/internal/controller_admin/user_backyard_controller.go
@@ -1,21 +1,21 @@
-package controller_backyard
+package controller_admin
import (
"github.com/answerdev/answer/internal/base/handler"
"github.com/answerdev/answer/internal/base/middleware"
"github.com/answerdev/answer/internal/schema"
- "github.com/answerdev/answer/internal/service/user_backyard"
+ "github.com/answerdev/answer/internal/service/user_admin"
"github.com/gin-gonic/gin"
)
-// UserBackyardController user controller
-type UserBackyardController struct {
- userService *user_backyard.UserBackyardService
+// UserAdminController user controller
+type UserAdminController struct {
+ userService *user_admin.UserAdminService
}
-// NewUserBackyardController new controller
-func NewUserBackyardController(userService *user_backyard.UserBackyardService) *UserBackyardController {
- return &UserBackyardController{userService: userService}
+// NewUserAdminController new controller
+func NewUserAdminController(userService *user_admin.UserAdminService) *UserAdminController {
+ return &UserAdminController{userService: userService}
}
// UpdateUserStatus update user
@@ -28,7 +28,7 @@ func NewUserBackyardController(userService *user_backyard.UserBackyardService) *
// @Param data body schema.UpdateUserStatusReq true "user"
// @Success 200 {object} handler.RespBody
// @Router /answer/admin/api/user/status [put]
-func (uc *UserBackyardController) UpdateUserStatus(ctx *gin.Context) {
+func (uc *UserAdminController) UpdateUserStatus(ctx *gin.Context) {
req := &schema.UpdateUserStatusReq{}
if handler.BindAndCheck(ctx, req) {
return
@@ -48,7 +48,7 @@ func (uc *UserBackyardController) UpdateUserStatus(ctx *gin.Context) {
// @Param data body schema.UpdateUserRoleReq true "user"
// @Success 200 {object} handler.RespBody
// @Router /answer/admin/api/user/role [put]
-func (uc *UserBackyardController) UpdateUserRole(ctx *gin.Context) {
+func (uc *UserAdminController) UpdateUserRole(ctx *gin.Context) {
req := &schema.UpdateUserRoleReq{}
if handler.BindAndCheck(ctx, req) {
return
@@ -70,7 +70,7 @@ func (uc *UserBackyardController) UpdateUserRole(ctx *gin.Context) {
// @Param data body schema.AddUserReq true "user"
// @Success 200 {object} handler.RespBody
// @Router /answer/admin/api/user [post]
-func (uc *UserBackyardController) AddUser(ctx *gin.Context) {
+func (uc *UserAdminController) AddUser(ctx *gin.Context) {
req := &schema.AddUserReq{}
if handler.BindAndCheck(ctx, req) {
return
@@ -92,7 +92,7 @@ func (uc *UserBackyardController) AddUser(ctx *gin.Context) {
// @Param data body schema.UpdateUserPasswordReq true "user"
// @Success 200 {object} handler.RespBody
// @Router /answer/admin/api/user/password [put]
-func (uc *UserBackyardController) UpdateUserPassword(ctx *gin.Context) {
+func (uc *UserAdminController) UpdateUserPassword(ctx *gin.Context) {
req := &schema.UpdateUserPasswordReq{}
if handler.BindAndCheck(ctx, req) {
return
@@ -117,7 +117,7 @@ func (uc *UserBackyardController) UpdateUserPassword(ctx *gin.Context) {
// @Param status query string false "user status" Enums(suspended, deleted, inactive)
// @Success 200 {object} handler.RespBody{data=pager.PageModel{records=[]schema.GetUserPageResp}}
// @Router /answer/admin/api/users/page [get]
-func (uc *UserBackyardController) GetUserPage(ctx *gin.Context) {
+func (uc *UserAdminController) GetUserPage(ctx *gin.Context) {
req := &schema.GetUserPageReq{}
if handler.BindAndCheck(ctx, req) {
return
diff --git a/internal/entity/answer_entity.go b/internal/entity/answer_entity.go
index b02c5d3c..8c3bcdb1 100644
--- a/internal/entity/answer_entity.go
+++ b/internal/entity/answer_entity.go
@@ -11,7 +11,7 @@ const (
AnswerStatusDeleted = 10
)
-var CmsAnswerSearchStatus = map[string]int{
+var AdminAnswerSearchStatus = map[string]int{
"available": AnswerStatusAvailable,
"deleted": AnswerStatusDeleted,
}
@@ -27,7 +27,7 @@ type Answer struct {
OriginalText string `xorm:"not null MEDIUMTEXT original_text"`
ParsedText string `xorm:"not null MEDIUMTEXT parsed_text"`
Status int `xorm:"not null default 1 INT(11) status"`
- Adopted int `xorm:"not null default 1 INT(11) adopted"`
+ Accepted int `xorm:"not null default 1 INT(11) adopted"`
CommentCount int `xorm:"not null default 0 INT(11) comment_count"`
VoteCount int `xorm:"not null default 0 INT(11) vote_count"`
RevisionID string `xorm:"not null default 0 BIGINT(20) revision_id"`
@@ -40,7 +40,7 @@ type AnswerSearch struct {
PageSize int `json:"page_size" form:"page_size"` // Search page size
}
-type CmsAnswerSearch struct {
+type AdminAnswerSearch struct {
Page int `json:"page" form:"page"` // Query number of pages
PageSize int `json:"page_size" form:"page_size"` // Search page size
Status int `json:"-" form:"-"`
diff --git a/internal/entity/question_entity.go b/internal/entity/question_entity.go
index 5ee91159..a47f59b4 100644
--- a/internal/entity/question_entity.go
+++ b/internal/entity/question_entity.go
@@ -10,13 +10,13 @@ const (
QuestionStatusDeleted = 10
)
-var CmsQuestionSearchStatus = map[string]int{
+var AdminQuestionSearchStatus = map[string]int{
"available": QuestionStatusAvailable,
"closed": QuestionStatusClosed,
"deleted": QuestionStatusDeleted,
}
-var CmsQuestionSearchStatusIntToString = map[int]string{
+var AdminQuestionSearchStatusIntToString = map[int]string{
QuestionStatusAvailable: "available",
QuestionStatusClosed: "closed",
QuestionStatusDeleted: "deleted",
diff --git a/internal/migrations/migrations.go b/internal/migrations/migrations.go
index 44aaec56..bbe0a958 100644
--- a/internal/migrations/migrations.go
+++ b/internal/migrations/migrations.go
@@ -1,6 +1,7 @@
package migrations
import (
+ "context"
"fmt"
"github.com/answerdev/answer/internal/base/data"
@@ -14,11 +15,13 @@ const minDBVersion = 0 // answer 1.0.0
type Migration interface {
Description() string
Migrate(*xorm.Engine) error
+ ShouldCleanCache() bool
}
type migration struct {
- description string
- migrate func(*xorm.Engine) error
+ description string
+ migrate func(*xorm.Engine) error
+ shouldCleanCache bool
}
// Description returns the migration's description
@@ -31,9 +34,14 @@ func (m *migration) Migrate(x *xorm.Engine) error {
return m.migrate(x)
}
+// ShouldCleanCache should clean the cache
+func (m *migration) ShouldCleanCache() bool {
+ return m.shouldCleanCache
+}
+
// NewMigration creates a new migration
-func NewMigration(desc string, fn func(*xorm.Engine) error) Migration {
- return &migration{description: desc, migrate: fn}
+func NewMigration(desc string, fn func(*xorm.Engine) error, shouldCleanCache bool) Migration {
+ return &migration{description: desc, migrate: fn, shouldCleanCache: shouldCleanCache}
}
// Use noopMigration when there is a migration that has been no-oped
@@ -41,12 +49,12 @@ var noopMigration = func(_ *xorm.Engine) error { return nil }
var migrations = []Migration{
// 0->1
- NewMigration("this is first version, no operation", noopMigration),
- NewMigration("add user language", addUserLanguage),
- NewMigration("add recommend and reserved tag fields", addTagRecommendedAndReserved),
- NewMigration("add activity timeline", addActivityTimeline),
- NewMigration("add user role", addRoleFeatures),
- NewMigration("add theme and private mode", addThemeAndPrivateMode),
+ NewMigration("this is first version, no operation", noopMigration, false),
+ NewMigration("add user language", addUserLanguage, false),
+ NewMigration("add recommend and reserved tag fields", addTagRecommendedAndReserved, false),
+ NewMigration("add activity timeline", addActivityTimeline, false),
+ NewMigration("add user role", addRoleFeatures, false),
+ NewMigration("add theme and private mode", addThemeAndPrivateMode, true),
}
// GetCurrentDBVersion returns the current db version
@@ -76,8 +84,12 @@ func ExpectedVersion() int64 {
}
// Migrate database to current version
-func Migrate(dataConf *data.Database) error {
- engine, err := data.NewDB(false, dataConf)
+func Migrate(dbConf *data.Database, cacheConf *data.CacheConf) error {
+ cache, cacheCleanup, err := data.NewCache(cacheConf)
+ if err != nil {
+ fmt.Println("new check failed:", err.Error())
+ }
+ engine, err := data.NewDB(false, dbConf)
if err != nil {
fmt.Println("new database failed: ", err.Error())
return err
@@ -98,6 +110,11 @@ func Migrate(dataConf *data.Database) error {
fmt.Printf("[migrate] migrate to db version %d failed: %s\n", currentDBVersion+1, err.Error())
return err
}
+ if migrationFunc.ShouldCleanCache() {
+ if err := cache.Flush(context.Background()); err != nil {
+ fmt.Printf("[migrate] flush cache failed: %s\n", err.Error())
+ }
+ }
fmt.Printf("[migrate] migrate to db version %d success\n", currentDBVersion+1)
if _, err := engine.Update(&entity.Version{ID: 1, VersionNumber: currentDBVersion + 1}); err != nil {
fmt.Printf("[migrate] migrate to db version %d, update failed: %s", currentDBVersion+1, err.Error())
@@ -105,5 +122,8 @@ func Migrate(dataConf *data.Database) error {
}
currentDBVersion++
}
+ if cache != nil {
+ cacheCleanup()
+ }
return nil
}
diff --git a/internal/repo/activity/answer_repo.go b/internal/repo/activity/answer_repo.go
index a6eb47cc..cb0d25f2 100644
--- a/internal/repo/activity/answer_repo.go
+++ b/internal/repo/activity/answer_repo.go
@@ -214,7 +214,7 @@ func (ar *AnswerActivityRepo) AcceptAnswer(ctx context.Context,
if act.UserID != questionUserID {
msg.TriggerUserID = questionUserID
msg.ObjectType = constant.AnswerObjectType
- msg.NotificationAction = constant.AdoptAnswer
+ msg.NotificationAction = constant.AcceptAnswer
notice_queue.AddNotification(msg)
}
}
diff --git a/internal/repo/activity/vote_repo.go b/internal/repo/activity/vote_repo.go
index 208028df..bb2f1ef0 100644
--- a/internal/repo/activity/vote_repo.go
+++ b/internal/repo/activity/vote_repo.go
@@ -220,7 +220,7 @@ func (vr *VoteRepo) voteCancel(ctx context.Context, objectID string, userID, obj
}
// trigger user rank and send notification
- if hasRank != 0 && existsActivity.Rank > 0 {
+ if hasRank != 0 && existsActivity.Rank != 0 {
_, err = vr.userRankRepo.TriggerUserRank(ctx, session, activityUserID, -deltaRank, activityType)
if err != nil {
return
diff --git a/internal/repo/answer/answer_repo.go b/internal/repo/answer/answer_repo.go
index 8791e1b1..97734343 100644
--- a/internal/repo/answer/answer_repo.go
+++ b/internal/repo/answer/answer_repo.go
@@ -133,22 +133,22 @@ func (ar *answerRepo) GetAnswerPage(ctx context.Context, page, pageSize int, ans
return
}
-// UpdateAdopted
+// UpdateAccepted
// If no answer is selected, the answer id can be 0
-func (ar *answerRepo) UpdateAdopted(ctx context.Context, id string, questionID string) error {
+func (ar *answerRepo) UpdateAccepted(ctx context.Context, id string, questionID string) error {
if questionID == "" {
return nil
}
var data entity.Answer
data.ID = id
- data.Adopted = schema.AnswerAdoptedFailed
+ data.Accepted = schema.AnswerAcceptedFailed
_, err := ar.data.DB.Where("question_id =?", questionID).Cols("adopted").Update(&data)
if err != nil {
return err
}
if id != "0" {
- data.Adopted = schema.AnswerAdoptedEnable
+ data.Accepted = schema.AnswerAcceptedEnable
_, err = ar.data.DB.Where("id = ?", id).Cols("adopted").Update(&data)
if err != nil {
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
@@ -216,7 +216,7 @@ func (ar *answerRepo) SearchList(ctx context.Context, search *entity.AnswerSearc
return rows, count, nil
}
-func (ar *answerRepo) CmsSearchList(ctx context.Context, search *entity.CmsAnswerSearch) ([]*entity.Answer, int64, error) {
+func (ar *answerRepo) AdminSearchList(ctx context.Context, search *entity.AdminAnswerSearch) ([]*entity.Answer, int64, error) {
var (
count int64
err error
diff --git a/internal/repo/auth/auth.go b/internal/repo/auth/auth.go
index b4bd1f19..d290afcb 100644
--- a/internal/repo/auth/auth.go
+++ b/internal/repo/auth/auth.go
@@ -95,8 +95,8 @@ func (ar *authRepo) RemoveUserStatus(ctx context.Context, userID string) (err er
return nil
}
-// GetBackyardUserCacheInfo get backyard user cache info
-func (ar *authRepo) GetBackyardUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) {
+// GetAdminUserCacheInfo get admin user cache info
+func (ar *authRepo) GetAdminUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) {
userInfoCache, err := ar.data.Cache.GetString(ctx, constant.AdminTokenCacheKey+accessToken)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
@@ -110,8 +110,8 @@ func (ar *authRepo) GetBackyardUserCacheInfo(ctx context.Context, accessToken st
return userInfo, nil
}
-// SetBackyardUserCacheInfo set backyard user cache info
-func (ar *authRepo) SetBackyardUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) (err error) {
+// SetAdminUserCacheInfo set admin user cache info
+func (ar *authRepo) SetAdminUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) (err error) {
userInfoCache, err := json.Marshal(userInfo)
if err != nil {
return err
@@ -125,8 +125,8 @@ func (ar *authRepo) SetBackyardUserCacheInfo(ctx context.Context, accessToken st
return nil
}
-// RemoveBackyardUserCacheInfo remove backyard user cache info
-func (ar *authRepo) RemoveBackyardUserCacheInfo(ctx context.Context, accessToken string) (err error) {
+// RemoveAdminUserCacheInfo remove admin user cache info
+func (ar *authRepo) RemoveAdminUserCacheInfo(ctx context.Context, accessToken string) (err error) {
err = ar.data.Cache.Del(ctx, constant.AdminTokenCacheKey+accessToken)
if err != nil {
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
diff --git a/internal/repo/captcha/captcha.go b/internal/repo/captcha/captcha.go
index 13f6d476..bda41d1e 100644
--- a/internal/repo/captcha/captcha.go
+++ b/internal/repo/captcha/captcha.go
@@ -25,7 +25,7 @@ func NewCaptchaRepo(data *data.Data) action.CaptchaRepo {
}
func (cr *captchaRepo) SetActionType(ctx context.Context, ip, actionType string, amount int) (err error) {
- cacheKey := fmt.Sprintf("ActionRecord:%s@%s", ip, actionType)
+ cacheKey := fmt.Sprintf("ActionRecord:%s@", ip)
err = cr.data.Cache.SetInt64(ctx, cacheKey, int64(amount), 6*time.Minute)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
@@ -34,17 +34,16 @@ func (cr *captchaRepo) SetActionType(ctx context.Context, ip, actionType string,
}
func (cr *captchaRepo) GetActionType(ctx context.Context, ip, actionType string) (amount int, err error) {
- cacheKey := fmt.Sprintf("ActionRecord:%s@%s", ip, actionType)
+ cacheKey := fmt.Sprintf("ActionRecord:%s@", ip)
res, err := cr.data.Cache.GetInt64(ctx, cacheKey)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
- // TODO: cache reflect should return empty when key not found
return int(res), nil
}
func (cr *captchaRepo) DelActionType(ctx context.Context, ip, actionType string) (err error) {
- cacheKey := fmt.Sprintf("ActionRecord:%s@%s", ip, actionType)
+ cacheKey := fmt.Sprintf("ActionRecord:%s@", ip)
err = cr.data.Cache.Del(ctx, cacheKey)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
@@ -54,7 +53,6 @@ func (cr *captchaRepo) DelActionType(ctx context.Context, ip, actionType string)
// SetCaptcha set captcha to cache
func (cr *captchaRepo) SetCaptcha(ctx context.Context, key, captcha string) (err error) {
- // TODO make cache time to config
err = cr.data.Cache.SetString(ctx, key, captcha, 6*time.Minute)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
@@ -68,6 +66,5 @@ func (cr *captchaRepo) GetCaptcha(ctx context.Context, key string) (captcha stri
if err != nil {
log.Debug(err)
}
- // TODO: cache reflect should return empty when key not found
return captcha, nil
}
diff --git a/internal/repo/provider.go b/internal/repo/provider.go
index 7bc82aee..bc18d3da 100644
--- a/internal/repo/provider.go
+++ b/internal/repo/provider.go
@@ -44,7 +44,7 @@ var ProviderSetRepo = wire.NewSet(
activity_common.NewVoteRepo,
config.NewConfigRepo,
user.NewUserRepo,
- user.NewUserBackyardRepo,
+ user.NewUserAdminRepo,
rank.NewUserRankRepo,
question.NewQuestionRepo,
answer.NewAnswerRepo,
diff --git a/internal/repo/question/question_repo.go b/internal/repo/question/question_repo.go
index 7969aeb1..3f44a188 100644
--- a/internal/repo/question/question_repo.go
+++ b/internal/repo/question/question_repo.go
@@ -271,7 +271,7 @@ func (qr *questionRepo) SearchList(ctx context.Context, search *schema.QuestionS
return rows, count, nil
}
-func (qr *questionRepo) CmsSearchList(ctx context.Context, search *schema.CmsQuestionSearch) ([]*entity.Question, int64, error) {
+func (qr *questionRepo) AdminSearchList(ctx context.Context, search *schema.AdminQuestionSearch) ([]*entity.Question, int64, error) {
var (
count int64
err error
diff --git a/internal/repo/repo_test/auth_test.go b/internal/repo/repo_test/auth_test.go
index 7682b3db..cbdaf056 100644
--- a/internal/repo/repo_test/auth_test.go
+++ b/internal/repo/repo_test/auth_test.go
@@ -61,26 +61,26 @@ func Test_authRepo_RemoveUserStatus(t *testing.T) {
assert.Error(t, err)
}
-func Test_authRepo_SetBackyardUserCacheInfo(t *testing.T) {
+func Test_authRepo_SetAdminUserCacheInfo(t *testing.T) {
authRepo := auth.NewAuthRepo(testDataSource)
- err := authRepo.SetBackyardUserCacheInfo(context.TODO(), token, &entity.UserCacheInfo{UserID: userID})
+ err := authRepo.SetAdminUserCacheInfo(context.TODO(), token, &entity.UserCacheInfo{UserID: userID})
assert.NoError(t, err)
- cacheInfo, err := authRepo.GetBackyardUserCacheInfo(context.TODO(), token)
+ cacheInfo, err := authRepo.GetAdminUserCacheInfo(context.TODO(), token)
assert.NoError(t, err)
assert.Equal(t, userID, cacheInfo.UserID)
}
-func Test_authRepo_RemoveBackyardUserCacheInfo(t *testing.T) {
+func Test_authRepo_RemoveAdminUserCacheInfo(t *testing.T) {
authRepo := auth.NewAuthRepo(testDataSource)
- err := authRepo.SetBackyardUserCacheInfo(context.TODO(), token, &entity.UserCacheInfo{UserID: userID})
+ err := authRepo.SetAdminUserCacheInfo(context.TODO(), token, &entity.UserCacheInfo{UserID: userID})
assert.NoError(t, err)
- err = authRepo.RemoveBackyardUserCacheInfo(context.TODO(), token)
+ err = authRepo.RemoveAdminUserCacheInfo(context.TODO(), token)
assert.NoError(t, err)
- _, err = authRepo.GetBackyardUserCacheInfo(context.TODO(), token)
+ _, err = authRepo.GetAdminUserCacheInfo(context.TODO(), token)
assert.Error(t, err)
}
diff --git a/internal/repo/repo_test/user_backyard_repo_test.go b/internal/repo/repo_test/user_backyard_repo_test.go
index de2effda..c8593e14 100644
--- a/internal/repo/repo_test/user_backyard_repo_test.go
+++ b/internal/repo/repo_test/user_backyard_repo_test.go
@@ -10,43 +10,43 @@ import (
"github.com/stretchr/testify/assert"
)
-func Test_userBackyardRepo_GetUserInfo(t *testing.T) {
- userBackyardRepo := user.NewUserBackyardRepo(testDataSource, auth.NewAuthRepo(testDataSource))
- got, exist, err := userBackyardRepo.GetUserInfo(context.TODO(), "1")
+func Test_userAdminRepo_GetUserInfo(t *testing.T) {
+ userAdminRepo := user.NewUserAdminRepo(testDataSource, auth.NewAuthRepo(testDataSource))
+ got, exist, err := userAdminRepo.GetUserInfo(context.TODO(), "1")
assert.NoError(t, err)
assert.True(t, exist)
assert.Equal(t, "1", got.ID)
}
-func Test_userBackyardRepo_GetUserPage(t *testing.T) {
- userBackyardRepo := user.NewUserBackyardRepo(testDataSource, auth.NewAuthRepo(testDataSource))
- got, total, err := userBackyardRepo.GetUserPage(context.TODO(), 1, 1, &entity.User{Username: "admin"}, "", false)
+func Test_userAdminRepo_GetUserPage(t *testing.T) {
+ userAdminRepo := user.NewUserAdminRepo(testDataSource, auth.NewAuthRepo(testDataSource))
+ got, total, err := userAdminRepo.GetUserPage(context.TODO(), 1, 1, &entity.User{Username: "admin"}, "", false)
assert.NoError(t, err)
assert.Equal(t, int64(1), total)
assert.Equal(t, "1", got[0].ID)
}
-func Test_userBackyardRepo_UpdateUserStatus(t *testing.T) {
- userBackyardRepo := user.NewUserBackyardRepo(testDataSource, auth.NewAuthRepo(testDataSource))
- got, exist, err := userBackyardRepo.GetUserInfo(context.TODO(), "1")
+func Test_userAdminRepo_UpdateUserStatus(t *testing.T) {
+ userAdminRepo := user.NewUserAdminRepo(testDataSource, auth.NewAuthRepo(testDataSource))
+ got, exist, err := userAdminRepo.GetUserInfo(context.TODO(), "1")
assert.NoError(t, err)
assert.True(t, exist)
assert.Equal(t, entity.UserStatusAvailable, got.Status)
- err = userBackyardRepo.UpdateUserStatus(context.TODO(), "1", entity.UserStatusSuspended, entity.EmailStatusAvailable,
+ err = userAdminRepo.UpdateUserStatus(context.TODO(), "1", entity.UserStatusSuspended, entity.EmailStatusAvailable,
"admin@admin.com")
assert.NoError(t, err)
- got, exist, err = userBackyardRepo.GetUserInfo(context.TODO(), "1")
+ got, exist, err = userAdminRepo.GetUserInfo(context.TODO(), "1")
assert.NoError(t, err)
assert.True(t, exist)
assert.Equal(t, entity.UserStatusSuspended, got.Status)
- err = userBackyardRepo.UpdateUserStatus(context.TODO(), "1", entity.UserStatusAvailable, entity.EmailStatusAvailable,
+ err = userAdminRepo.UpdateUserStatus(context.TODO(), "1", entity.UserStatusAvailable, entity.EmailStatusAvailable,
"admin@admin.com")
assert.NoError(t, err)
- got, exist, err = userBackyardRepo.GetUserInfo(context.TODO(), "1")
+ got, exist, err = userAdminRepo.GetUserInfo(context.TODO(), "1")
assert.NoError(t, err)
assert.True(t, exist)
assert.Equal(t, entity.UserStatusAvailable, got.Status)
diff --git a/internal/repo/search_common/search_repo.go b/internal/repo/search_common/search_repo.go
index f2b79696..c94690a2 100644
--- a/internal/repo/search_common/search_repo.go
+++ b/internal/repo/search_common/search_repo.go
@@ -371,8 +371,8 @@ func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, tagIDs
// check limit accepted
if accepted {
- b.Where(builder.Eq{"adopted": schema.AnswerAdoptedEnable})
- args = append(args, schema.AnswerAdoptedEnable)
+ b.Where(builder.Eq{"adopted": schema.AnswerAcceptedEnable})
+ args = append(args, schema.AnswerAcceptedEnable)
}
// check question id
@@ -475,14 +475,14 @@ func (sr *searchRepo) parseResult(ctx context.Context, res []map[string][]byte)
_ = copier.Copy(&tags, tagsEntity)
switch objectKey {
case "question":
- for k, v := range entity.CmsQuestionSearchStatus {
+ for k, v := range entity.AdminQuestionSearchStatus {
if v == converter.StringToInt(string(r["status"])) {
status = k
break
}
}
case "answer":
- for k, v := range entity.CmsAnswerSearchStatus {
+ for k, v := range entity.AdminAnswerSearchStatus {
if v == converter.StringToInt(string(r["status"])) {
status = k
break
diff --git a/internal/repo/user/user_backyard_repo.go b/internal/repo/user/user_backyard_repo.go
index 9c050999..1b6cb2f1 100644
--- a/internal/repo/user/user_backyard_repo.go
+++ b/internal/repo/user/user_backyard_repo.go
@@ -12,27 +12,27 @@ import (
"github.com/answerdev/answer/internal/base/reason"
"github.com/answerdev/answer/internal/entity"
"github.com/answerdev/answer/internal/service/auth"
- "github.com/answerdev/answer/internal/service/user_backyard"
+ "github.com/answerdev/answer/internal/service/user_admin"
"github.com/segmentfault/pacman/errors"
"github.com/segmentfault/pacman/log"
)
-// userBackyardRepo user repository
-type userBackyardRepo struct {
+// userAdminRepo user repository
+type userAdminRepo struct {
data *data.Data
authRepo auth.AuthRepo
}
-// NewUserBackyardRepo new repository
-func NewUserBackyardRepo(data *data.Data, authRepo auth.AuthRepo) user_backyard.UserBackyardRepo {
- return &userBackyardRepo{
+// NewUserAdminRepo new repository
+func NewUserAdminRepo(data *data.Data, authRepo auth.AuthRepo) user_admin.UserAdminRepo {
+ return &userAdminRepo{
data: data,
authRepo: authRepo,
}
}
// UpdateUserStatus update user status
-func (ur *userBackyardRepo) UpdateUserStatus(ctx context.Context, userID string, userStatus, mailStatus int,
+func (ur *userAdminRepo) UpdateUserStatus(ctx context.Context, userID string, userStatus, mailStatus int,
email string,
) (err error) {
cond := &entity.User{Status: userStatus, MailStatus: mailStatus, EMail: email}
@@ -62,7 +62,7 @@ func (ur *userBackyardRepo) UpdateUserStatus(ctx context.Context, userID string,
}
// AddUser add user
-func (ur *userBackyardRepo) AddUser(ctx context.Context, user *entity.User) (err error) {
+func (ur *userAdminRepo) AddUser(ctx context.Context, user *entity.User) (err error) {
_, err = ur.data.DB.Insert(user)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
@@ -71,7 +71,7 @@ func (ur *userBackyardRepo) AddUser(ctx context.Context, user *entity.User) (err
}
// UpdateUserPassword update user password
-func (ur *userBackyardRepo) UpdateUserPassword(ctx context.Context, userID string, password string) (err error) {
+func (ur *userAdminRepo) UpdateUserPassword(ctx context.Context, userID string, password string) (err error) {
_, err = ur.data.DB.ID(userID).Update(&entity.User{Pass: password})
if err != nil {
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
@@ -80,7 +80,7 @@ func (ur *userBackyardRepo) UpdateUserPassword(ctx context.Context, userID strin
}
// GetUserInfo get user info
-func (ur *userBackyardRepo) GetUserInfo(ctx context.Context, userID string) (user *entity.User, exist bool, err error) {
+func (ur *userAdminRepo) GetUserInfo(ctx context.Context, userID string) (user *entity.User, exist bool, err error) {
user = &entity.User{}
exist, err = ur.data.DB.ID(userID).Get(user)
if err != nil {
@@ -90,7 +90,7 @@ func (ur *userBackyardRepo) GetUserInfo(ctx context.Context, userID string) (use
}
// GetUserInfoByEmail get user info
-func (ur *userBackyardRepo) GetUserInfoByEmail(ctx context.Context, email string) (user *entity.User, exist bool, err error) {
+func (ur *userAdminRepo) GetUserInfoByEmail(ctx context.Context, email string) (user *entity.User, exist bool, err error) {
userInfo := &entity.User{}
exist, err = ur.data.DB.Where("e_mail = ?", email).
Where("status != ?", entity.UserStatusDeleted).Get(userInfo)
@@ -101,7 +101,7 @@ func (ur *userBackyardRepo) GetUserInfoByEmail(ctx context.Context, email string
}
// GetUserPage get user page
-func (ur *userBackyardRepo) GetUserPage(ctx context.Context, page, pageSize int, user *entity.User,
+func (ur *userAdminRepo) GetUserPage(ctx context.Context, page, pageSize int, user *entity.User,
usernameOrDisplayName string, isStaff bool) (users []*entity.User, total int64, err error) {
users = make([]*entity.User, 0)
session := ur.data.DB.NewSession()
diff --git a/internal/router/answer_api_router.go b/internal/router/answer_api_router.go
index 9e364c3e..c4c02c49 100644
--- a/internal/router/answer_api_router.go
+++ b/internal/router/answer_api_router.go
@@ -2,35 +2,35 @@ package router
import (
"github.com/answerdev/answer/internal/controller"
- "github.com/answerdev/answer/internal/controller_backyard"
+ "github.com/answerdev/answer/internal/controller_admin"
"github.com/gin-gonic/gin"
)
type AnswerAPIRouter struct {
- langController *controller.LangController
- userController *controller.UserController
- commentController *controller.CommentController
- reportController *controller.ReportController
- voteController *controller.VoteController
- tagController *controller.TagController
- followController *controller.FollowController
- collectionController *controller.CollectionController
- questionController *controller.QuestionController
- answerController *controller.AnswerController
- searchController *controller.SearchController
- revisionController *controller.RevisionController
- rankController *controller.RankController
- backyardReportController *controller_backyard.ReportController
- backyardUserController *controller_backyard.UserBackyardController
- reasonController *controller.ReasonController
- themeController *controller_backyard.ThemeController
- siteInfoController *controller_backyard.SiteInfoController
- siteinfoController *controller.SiteinfoController
- notificationController *controller.NotificationController
- dashboardController *controller.DashboardController
- uploadController *controller.UploadController
- activityController *controller.ActivityController
- roleController *controller_backyard.RoleController
+ langController *controller.LangController
+ userController *controller.UserController
+ commentController *controller.CommentController
+ reportController *controller.ReportController
+ voteController *controller.VoteController
+ tagController *controller.TagController
+ followController *controller.FollowController
+ collectionController *controller.CollectionController
+ questionController *controller.QuestionController
+ answerController *controller.AnswerController
+ searchController *controller.SearchController
+ revisionController *controller.RevisionController
+ rankController *controller.RankController
+ adminReportController *controller_admin.ReportController
+ adminUserController *controller_admin.UserAdminController
+ reasonController *controller.ReasonController
+ themeController *controller_admin.ThemeController
+ siteInfoController *controller_admin.SiteInfoController
+ siteinfoController *controller.SiteinfoController
+ notificationController *controller.NotificationController
+ dashboardController *controller.DashboardController
+ uploadController *controller.UploadController
+ activityController *controller.ActivityController
+ roleController *controller_admin.RoleController
}
func NewAnswerAPIRouter(
@@ -47,43 +47,43 @@ func NewAnswerAPIRouter(
searchController *controller.SearchController,
revisionController *controller.RevisionController,
rankController *controller.RankController,
- backyardReportController *controller_backyard.ReportController,
- backyardUserController *controller_backyard.UserBackyardController,
+ adminReportController *controller_admin.ReportController,
+ adminUserController *controller_admin.UserAdminController,
reasonController *controller.ReasonController,
- themeController *controller_backyard.ThemeController,
- siteInfoController *controller_backyard.SiteInfoController,
+ themeController *controller_admin.ThemeController,
+ siteInfoController *controller_admin.SiteInfoController,
siteinfoController *controller.SiteinfoController,
notificationController *controller.NotificationController,
dashboardController *controller.DashboardController,
uploadController *controller.UploadController,
activityController *controller.ActivityController,
- roleController *controller_backyard.RoleController,
+ roleController *controller_admin.RoleController,
) *AnswerAPIRouter {
return &AnswerAPIRouter{
- langController: langController,
- userController: userController,
- commentController: commentController,
- reportController: reportController,
- voteController: voteController,
- tagController: tagController,
- followController: followController,
- collectionController: collectionController,
- questionController: questionController,
- answerController: answerController,
- searchController: searchController,
- revisionController: revisionController,
- rankController: rankController,
- backyardReportController: backyardReportController,
- backyardUserController: backyardUserController,
- reasonController: reasonController,
- themeController: themeController,
- siteInfoController: siteInfoController,
- notificationController: notificationController,
- siteinfoController: siteinfoController,
- dashboardController: dashboardController,
- uploadController: uploadController,
- activityController: activityController,
- roleController: roleController,
+ langController: langController,
+ userController: userController,
+ commentController: commentController,
+ reportController: reportController,
+ voteController: voteController,
+ tagController: tagController,
+ followController: followController,
+ collectionController: collectionController,
+ questionController: questionController,
+ answerController: answerController,
+ searchController: searchController,
+ revisionController: revisionController,
+ rankController: rankController,
+ adminReportController: adminReportController,
+ adminUserController: adminUserController,
+ reasonController: reasonController,
+ themeController: themeController,
+ siteInfoController: siteInfoController,
+ notificationController: notificationController,
+ siteinfoController: siteinfoController,
+ dashboardController: dashboardController,
+ uploadController: uploadController,
+ activityController: activityController,
+ roleController: roleController,
}
}
@@ -194,7 +194,7 @@ func (a *AnswerAPIRouter) RegisterAnswerAPIRouter(r *gin.RouterGroup) {
// answer
r.POST("/answer", a.answerController.Add)
r.PUT("/answer", a.answerController.Update)
- r.POST("/answer/acceptance", a.answerController.Adopted)
+ r.POST("/answer/acceptance", a.answerController.Accepted)
r.DELETE("/answer", a.answerController.RemoveAnswer)
// user
@@ -225,22 +225,22 @@ func (a *AnswerAPIRouter) RegisterAnswerAPIRouter(r *gin.RouterGroup) {
}
-func (a *AnswerAPIRouter) RegisterAnswerCmsAPIRouter(r *gin.RouterGroup) {
- r.GET("/question/page", a.questionController.CmsSearchList)
+func (a *AnswerAPIRouter) RegisterAnswerAdminAPIRouter(r *gin.RouterGroup) {
+ r.GET("/question/page", a.questionController.AdminSearchList)
r.PUT("/question/status", a.questionController.AdminSetQuestionStatus)
- r.GET("/answer/page", a.questionController.CmsSearchAnswerList)
+ r.GET("/answer/page", a.questionController.AdminSearchAnswerList)
r.PUT("/answer/status", a.answerController.AdminSetAnswerStatus)
// report
- r.GET("/reports/page", a.backyardReportController.ListReportPage)
- r.PUT("/report", a.backyardReportController.Handle)
+ r.GET("/reports/page", a.adminReportController.ListReportPage)
+ r.PUT("/report", a.adminReportController.Handle)
// user
- r.GET("/users/page", a.backyardUserController.GetUserPage)
- r.PUT("/user/status", a.backyardUserController.UpdateUserStatus)
- r.PUT("/user/role", a.backyardUserController.UpdateUserRole)
- r.POST("/user", a.backyardUserController.AddUser)
- r.PUT("/user/password", a.backyardUserController.UpdateUserPassword)
+ r.GET("/users/page", a.adminUserController.GetUserPage)
+ r.PUT("/user/status", a.adminUserController.UpdateUserStatus)
+ r.PUT("/user/role", a.adminUserController.UpdateUserRole)
+ r.POST("/user", a.adminUserController.AddUser)
+ r.PUT("/user/password", a.adminUserController.UpdateUserPassword)
// reason
r.GET("/reasons", a.reasonController.Reasons)
diff --git a/internal/router/template_router.go b/internal/router/template_router.go
index 3ee5871e..4ecb99aa 100644
--- a/internal/router/template_router.go
+++ b/internal/router/template_router.go
@@ -3,20 +3,20 @@ package router
import (
"github.com/answerdev/answer/internal/controller"
templaterender "github.com/answerdev/answer/internal/controller/template_render"
- "github.com/answerdev/answer/internal/controller_backyard"
+ "github.com/answerdev/answer/internal/controller_admin"
"github.com/gin-gonic/gin"
)
type TemplateRouter struct {
templateController *controller.TemplateController
templateRenderController *templaterender.TemplateRenderController
- siteInfoController *controller_backyard.SiteInfoController
+ siteInfoController *controller_admin.SiteInfoController
}
func NewTemplateRouter(
templateController *controller.TemplateController,
templateRenderController *templaterender.TemplateRenderController,
- siteInfoController *controller_backyard.SiteInfoController,
+ siteInfoController *controller_admin.SiteInfoController,
) *TemplateRouter {
return &TemplateRouter{
diff --git a/internal/schema/answer_schema.go b/internal/schema/answer_schema.go
index c6f47485..724d9af9 100644
--- a/internal/schema/answer_schema.go
+++ b/internal/schema/answer_schema.go
@@ -15,8 +15,8 @@ type RemoveAnswerReq struct {
}
const (
- AnswerAdoptedFailed = 1
- AnswerAdoptedEnable = 2
+ AnswerAcceptedFailed = 1
+ AnswerAcceptedEnable = 2
)
type AnswerAddReq struct {
@@ -74,7 +74,7 @@ type AnswerInfo struct {
HTML string `json:"html" xorm:"html"` // html
CreateTime int64 `json:"create_time" xorm:"created"` // create_time
UpdateTime int64 `json:"update_time" xorm:"updated"` // update_time
- Adopted int `json:"adopted"` // 1 Failed 2 Adopted
+ Accepted int `json:"accepted"` // 1 Failed 2 accepted
UserID string `json:"-" `
UpdateUserID string `json:"-" `
UserInfo *UserBasicInfo `json:"user_info,omitempty"`
@@ -94,7 +94,7 @@ type AdminAnswerInfo struct {
Description string `json:"description"`
CreateTime int64 `json:"create_time"`
UpdateTime int64 `json:"update_time"`
- Adopted int `json:"adopted"`
+ Accepted int `json:"accepted"`
UserID string `json:"-" `
UpdateUserID string `json:"-" `
UserInfo *UserBasicInfo `json:"user_info"`
@@ -104,7 +104,7 @@ type AdminAnswerInfo struct {
} `json:"question_info"`
}
-type AnswerAdoptedReq struct {
+type AnswerAcceptedReq struct {
QuestionID string `json:"question_id"`
AnswerID string `json:"answer_id"`
UserID string `json:"-" `
diff --git a/internal/schema/question_schema.go b/internal/schema/question_schema.go
index 777bb000..f5689297 100644
--- a/internal/schema/question_schema.go
+++ b/internal/schema/question_schema.go
@@ -199,7 +199,7 @@ type GetCloseTypeResp struct {
type UserAnswerInfo struct {
AnswerID string `json:"answer_id"`
QuestionID string `json:"question_id"`
- Adopted int `json:"adopted"`
+ Accepted int `json:"accepted"`
VoteCount int `json:"vote_count"`
CreateTime int `json:"create_time"`
UpdateTime int `json:"update_time"`
@@ -233,7 +233,7 @@ type QuestionSearch struct {
UserID string `json:"-" form:"-"`
}
-type CmsQuestionSearch struct {
+type AdminQuestionSearch struct {
Page int `json:"page" form:"page"` // Query number of pages
PageSize int `json:"page_size" form:"page_size"` // Search page size
Status int `json:"-" form:"-"`
diff --git a/internal/schema/siteinfo_schema.go b/internal/schema/siteinfo_schema.go
index f13b1c83..16ccd211 100644
--- a/internal/schema/siteinfo_schema.go
+++ b/internal/schema/siteinfo_schema.go
@@ -36,7 +36,6 @@ func (r *SiteGeneralReq) FormatSiteUrl() {
// SiteInterfaceReq site interface request
type SiteInterfaceReq struct {
- Theme string `validate:"required,gt=1,lte=128" form:"theme" json:"theme"`
Language string `validate:"required,gt=1,lte=128" form:"language" json:"language"`
TimeZone string `validate:"required,gt=1,lte=128" form:"time_zone" json:"time_zone"`
}
diff --git a/internal/service/answer_common/answer.go b/internal/service/answer_common/answer.go
index cce4e9eb..758908e1 100644
--- a/internal/service/answer_common/answer.go
+++ b/internal/service/answer_common/answer.go
@@ -15,11 +15,11 @@ type AnswerRepo interface {
GetAnswer(ctx context.Context, id string) (answer *entity.Answer, exist bool, err error)
GetAnswerList(ctx context.Context, answer *entity.Answer) (answerList []*entity.Answer, err error)
GetAnswerPage(ctx context.Context, page, pageSize int, answer *entity.Answer) (answerList []*entity.Answer, total int64, err error)
- UpdateAdopted(ctx context.Context, id string, questionID string) error
+ UpdateAccepted(ctx context.Context, id string, questionID string) error
GetByID(ctx context.Context, id string) (*entity.Answer, bool, error)
GetByUserIDQuestionID(ctx context.Context, userID string, questionID string) (*entity.Answer, bool, error)
SearchList(ctx context.Context, search *entity.AnswerSearch) ([]*entity.Answer, int64, error)
- CmsSearchList(ctx context.Context, search *entity.CmsAnswerSearch) ([]*entity.Answer, int64, error)
+ AdminSearchList(ctx context.Context, search *entity.AdminAnswerSearch) ([]*entity.Answer, int64, error)
UpdateAnswerStatus(ctx context.Context, answer *entity.Answer) (err error)
GetAnswerCount(ctx context.Context) (count int64, err error)
}
@@ -43,11 +43,11 @@ func (as *AnswerCommon) SearchAnswered(ctx context.Context, userID, questionID s
return has, nil
}
-func (as *AnswerCommon) CmsSearchList(ctx context.Context, search *entity.CmsAnswerSearch) ([]*entity.Answer, int64, error) {
+func (as *AnswerCommon) AdminSearchList(ctx context.Context, search *entity.AdminAnswerSearch) ([]*entity.Answer, int64, error) {
if search.Status == 0 {
search.Status = 1
}
- return as.answerRepo.CmsSearchList(ctx, search)
+ return as.answerRepo.AdminSearchList(ctx, search)
}
func (as *AnswerCommon) Search(ctx context.Context, search *entity.AnswerSearch) ([]*entity.Answer, int64, error) {
@@ -64,7 +64,7 @@ func (as *AnswerCommon) ShowFormat(ctx context.Context, data *entity.Answer) *sc
info.QuestionID = data.QuestionID
info.Content = data.OriginalText
info.HTML = data.ParsedText
- info.Adopted = data.Adopted
+ info.Accepted = data.Accepted
info.VoteCount = data.VoteCount
info.CreateTime = data.CreatedAt.Unix()
info.UpdateTime = data.UpdatedAt.Unix()
@@ -80,7 +80,7 @@ func (as *AnswerCommon) AdminShowFormat(ctx context.Context, data *entity.Answer
info := schema.AdminAnswerInfo{}
info.ID = data.ID
info.QuestionID = data.QuestionID
- info.Adopted = data.Adopted
+ info.Accepted = data.Accepted
info.VoteCount = data.VoteCount
info.CreateTime = data.CreatedAt.Unix()
info.UpdateTime = data.UpdatedAt.Unix()
diff --git a/internal/service/answer_service.go b/internal/service/answer_service.go
index ed1a8caf..7d0949de 100644
--- a/internal/service/answer_service.go
+++ b/internal/service/answer_service.go
@@ -80,7 +80,7 @@ func (as *AnswerService) RemoveAnswer(ctx context.Context, req *schema.RemoveAns
if answerInfo.VoteCount > 0 {
return errors.BadRequest(reason.AnswerCannotDeleted)
}
- if answerInfo.Adopted == schema.AnswerAdoptedEnable {
+ if answerInfo.Accepted == schema.AnswerAcceptedEnable {
return errors.BadRequest(reason.AnswerCannotDeleted)
}
questionInfo, exist, err := as.questionRepo.GetQuestion(ctx, answerInfo.QuestionID)
@@ -138,7 +138,7 @@ func (as *AnswerService) Insert(ctx context.Context, req *schema.AnswerAddReq) (
insertData.UserID = req.UserID
insertData.OriginalText = req.Content
insertData.ParsedText = req.HTML
- insertData.Adopted = schema.AnswerAdoptedFailed
+ insertData.Accepted = schema.AnswerAcceptedFailed
insertData.QuestionID = req.QuestionID
insertData.RevisionID = "0"
insertData.LastEditUserID = "0"
@@ -285,8 +285,8 @@ func (as *AnswerService) Update(ctx context.Context, req *schema.AnswerUpdateReq
return insertData.ID, nil
}
-// UpdateAdopted
-func (as *AnswerService) UpdateAdopted(ctx context.Context, req *schema.AnswerAdoptedReq) error {
+// UpdateAccepted
+func (as *AnswerService) UpdateAccepted(ctx context.Context, req *schema.AnswerAcceptedReq) error {
if req.AnswerID == "" {
req.AnswerID = "0"
}
@@ -330,7 +330,7 @@ func (as *AnswerService) UpdateAdopted(ctx context.Context, req *schema.AnswerAd
}
}
- err = as.answerRepo.UpdateAdopted(ctx, req.AnswerID, req.QuestionID)
+ err = as.answerRepo.UpdateAccepted(ctx, req.AnswerID, req.QuestionID)
if err != nil {
return err
}
@@ -413,7 +413,7 @@ func (as *AnswerService) Get(ctx context.Context, answerID, loginUserID string)
}
func (as *AnswerService) AdminSetAnswerStatus(ctx context.Context, req *schema.AdminSetAnswerStatusRequest) error {
- setStatus, ok := entity.CmsAnswerSearchStatus[req.StatusStr]
+ setStatus, ok := entity.AdminAnswerSearchStatus[req.StatusStr]
if !ok {
return fmt.Errorf("question status does not exist")
}
diff --git a/internal/service/auth/auth.go b/internal/service/auth/auth.go
index 9f3bbb75..e500f0b9 100644
--- a/internal/service/auth/auth.go
+++ b/internal/service/auth/auth.go
@@ -16,9 +16,9 @@ type AuthRepo interface {
SetUserStatus(ctx context.Context, userID string, userInfo *entity.UserCacheInfo) (err error)
GetUserStatus(ctx context.Context, userID string) (userInfo *entity.UserCacheInfo, err error)
RemoveUserStatus(ctx context.Context, userID string) (err error)
- GetBackyardUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error)
- SetBackyardUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) error
- RemoveBackyardUserCacheInfo(ctx context.Context, accessToken string) (err error)
+ GetAdminUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error)
+ SetAdminUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) error
+ RemoveAdminUserCacheInfo(ctx context.Context, accessToken string) (err error)
AddUserTokenMapping(ctx context.Context, userID, accessToken string) (err error)
RemoveAllUserTokens(ctx context.Context, userID string)
}
@@ -90,17 +90,17 @@ func (as *AuthService) RemoveAllUserTokens(ctx context.Context, userID string) {
as.authRepo.RemoveAllUserTokens(ctx, userID)
}
-//cms
+//Admin
-func (as *AuthService) GetCmsUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) {
- return as.authRepo.GetBackyardUserCacheInfo(ctx, accessToken)
+func (as *AuthService) GetAdminUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) {
+ return as.authRepo.GetAdminUserCacheInfo(ctx, accessToken)
}
-func (as *AuthService) SetCmsUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) (err error) {
- err = as.authRepo.SetBackyardUserCacheInfo(ctx, accessToken, userInfo)
+func (as *AuthService) SetAdminUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) (err error) {
+ err = as.authRepo.SetAdminUserCacheInfo(ctx, accessToken, userInfo)
return err
}
-func (as *AuthService) RemoveCmsUserCacheInfo(ctx context.Context, accessToken string) (err error) {
- return as.authRepo.RemoveBackyardUserCacheInfo(ctx, accessToken)
+func (as *AuthService) RemoveAdminUserCacheInfo(ctx context.Context, accessToken string) (err error) {
+ return as.authRepo.RemoveAdminUserCacheInfo(ctx, accessToken)
}
diff --git a/internal/service/comment/comment_service.go b/internal/service/comment/comment_service.go
index c9a7cbd0..d23ef7c9 100644
--- a/internal/service/comment/comment_service.go
+++ b/internal/service/comment/comment_service.go
@@ -168,17 +168,11 @@ func (cs *CommentService) AddComment(ctx context.Context, req *schema.AddComment
// RemoveComment delete comment
func (cs *CommentService) RemoveComment(ctx context.Context, req *schema.RemoveCommentReq) (err error) {
- if err := cs.checkCommentWhetherOwner(ctx, req.UserID, req.CommentID); err != nil {
- return err
- }
return cs.commentRepo.RemoveComment(ctx, req.CommentID)
}
// UpdateComment update comment
func (cs *CommentService) UpdateComment(ctx context.Context, req *schema.UpdateCommentReq) (err error) {
- if err := cs.checkCommentWhetherOwner(ctx, req.UserID, req.CommentID); err != nil {
- return err
- }
comment := &entity.Comment{}
_ = copier.Copy(comment, req)
comment.ID = req.CommentID
diff --git a/internal/service/notification_common/notification.go b/internal/service/notification_common/notification.go
index bf5ac725..5bb23f38 100644
--- a/internal/service/notification_common/notification.go
+++ b/internal/service/notification_common/notification.go
@@ -191,7 +191,7 @@ func (ns *NotificationCommon) SendNotificationToAllFollower(ctx context.Context,
if msg.NotificationAction != constant.UpdateQuestion &&
msg.NotificationAction != constant.AnswerTheQuestion &&
msg.NotificationAction != constant.UpdateAnswer &&
- msg.NotificationAction != constant.AdoptAnswer {
+ msg.NotificationAction != constant.AcceptAnswer {
return
}
condObjectID := msg.ObjectID
diff --git a/internal/service/provider.go b/internal/service/provider.go
index 44a8f853..65923136 100644
--- a/internal/service/provider.go
+++ b/internal/service/provider.go
@@ -20,8 +20,8 @@ import (
"github.com/answerdev/answer/internal/service/rank"
"github.com/answerdev/answer/internal/service/reason"
"github.com/answerdev/answer/internal/service/report"
- "github.com/answerdev/answer/internal/service/report_backyard"
- "github.com/answerdev/answer/internal/service/report_handle_backyard"
+ "github.com/answerdev/answer/internal/service/report_admin"
+ "github.com/answerdev/answer/internal/service/report_handle_admin"
"github.com/answerdev/answer/internal/service/revision_common"
"github.com/answerdev/answer/internal/service/role"
"github.com/answerdev/answer/internal/service/search_parser"
@@ -30,7 +30,7 @@ import (
"github.com/answerdev/answer/internal/service/tag"
tagcommon "github.com/answerdev/answer/internal/service/tag_common"
"github.com/answerdev/answer/internal/service/uploader"
- "github.com/answerdev/answer/internal/service/user_backyard"
+ "github.com/answerdev/answer/internal/service/user_admin"
usercommon "github.com/answerdev/answer/internal/service/user_common"
"github.com/google/wire"
)
@@ -64,9 +64,9 @@ var ProviderSetService = wire.NewSet(
NewSearchService,
meta.NewMetaService,
object_info.NewObjService,
- report_handle_backyard.NewReportHandle,
- report_backyard.NewReportBackyardService,
- user_backyard.NewUserBackyardService,
+ report_handle_admin.NewReportHandle,
+ report_admin.NewReportAdminService,
+ user_admin.NewUserAdminService,
reason.NewReasonService,
siteinfo_common.NewSiteInfoCommonService,
siteinfo.NewSiteInfoService,
diff --git a/internal/service/question_common/question.go b/internal/service/question_common/question.go
index f606e038..5329c6db 100644
--- a/internal/service/question_common/question.go
+++ b/internal/service/question_common/question.go
@@ -40,7 +40,7 @@ type QuestionRepo interface {
UpdateAccepted(ctx context.Context, question *entity.Question) (err error)
UpdateLastAnswer(ctx context.Context, question *entity.Question) (err error)
FindByID(ctx context.Context, id []string) (questionList []*entity.Question, err error)
- CmsSearchList(ctx context.Context, search *schema.CmsQuestionSearch) ([]*entity.Question, int64, error)
+ AdminSearchList(ctx context.Context, search *schema.AdminQuestionSearch) ([]*entity.Question, int64, error)
GetQuestionCount(ctx context.Context) (count int64, err error)
GetQuestionIDsPage(ctx context.Context, page, pageSize int) (questionIDList []*schema.SiteMapQuestionInfo, err error)
}
diff --git a/internal/service/question_service.go b/internal/service/question_service.go
index 7a4635a0..71ab9123 100644
--- a/internal/service/question_service.go
+++ b/internal/service/question_service.go
@@ -158,9 +158,66 @@ func (qs *QuestionService) AddQuestionCheckTags(ctx context.Context, Tags []*ent
}
return []string{}, nil
}
+func (qs *QuestionService) CheckAddQuestion(ctx context.Context, req *schema.QuestionAdd) (errorlist any, err error) {
+ if len(req.Tags) == 0 {
+ errorlist := make([]*validator.FormErrorField, 0)
+ errorlist = append(errorlist, &validator.FormErrorField{
+ ErrorField: "tags",
+ ErrorMsg: translator.GlobalTrans.Tr(handler.GetLangByCtx(ctx), reason.TagNotFound),
+ })
+ err = errors.BadRequest(reason.RecommendTagEnter)
+ return errorlist, err
+ }
+ recommendExist, err := qs.tagCommon.ExistRecommend(ctx, req.Tags)
+ if err != nil {
+ return
+ }
+ if !recommendExist {
+ errorlist := make([]*validator.FormErrorField, 0)
+ errorlist = append(errorlist, &validator.FormErrorField{
+ ErrorField: "tags",
+ ErrorMsg: translator.GlobalTrans.Tr(handler.GetLangByCtx(ctx), reason.RecommendTagEnter),
+ })
+ err = errors.BadRequest(reason.RecommendTagEnter)
+ return errorlist, err
+ }
+
+ tagNameList := make([]string, 0)
+ for _, tag := range req.Tags {
+ tagNameList = append(tagNameList, tag.SlugName)
+ }
+ Tags, tagerr := qs.tagCommon.GetTagListByNames(ctx, tagNameList)
+ if tagerr != nil {
+ return errorlist, tagerr
+ }
+ if !req.QuestionPermission.CanUseReservedTag {
+ taglist, err := qs.AddQuestionCheckTags(ctx, Tags)
+ errMsg := fmt.Sprintf(`"%s" can only be used by moderators.`,
+ strings.Join(taglist, ","))
+ if err != nil {
+ errorlist := make([]*validator.FormErrorField, 0)
+ errorlist = append(errorlist, &validator.FormErrorField{
+ ErrorField: "tags",
+ ErrorMsg: errMsg,
+ })
+ err = errors.BadRequest(reason.RecommendTagEnter)
+ return errorlist, err
+ }
+ }
+ return nil, nil
+}
// AddQuestion add question
func (qs *QuestionService) AddQuestion(ctx context.Context, req *schema.QuestionAdd) (questionInfo any, err error) {
+ if len(req.Tags) == 0 {
+ errorlist := make([]*validator.FormErrorField, 0)
+ errorlist = append(errorlist, &validator.FormErrorField{
+ ErrorField: "tags",
+ ErrorMsg: translator.GlobalTrans.Tr(handler.GetLangByCtx(ctx), reason.TagNotFound),
+ })
+ err = errors.BadRequest(reason.RecommendTagEnter)
+ return errorlist, err
+ }
recommendExist, err := qs.tagCommon.ExistRecommend(ctx, req.Tags)
if err != nil {
return
@@ -610,7 +667,7 @@ func (qs *QuestionService) SearchUserList(ctx context.Context, userName, order s
for _, item := range questionlist {
info := &schema.UserQuestionInfo{}
_ = copier.Copy(info, item)
- status, ok := entity.CmsQuestionSearchStatusIntToString[item.Status]
+ status, ok := entity.AdminQuestionSearchStatusIntToString[item.Status]
if ok {
info.Status = status
}
@@ -787,7 +844,7 @@ func (qs *QuestionService) SearchByTitleLike(ctx context.Context, title string,
item.AnswerCount = question.AnswerCount
item.CollectionCount = question.CollectionCount
item.FollowCount = question.FollowCount
- status, ok := entity.CmsQuestionSearchStatusIntToString[question.Status]
+ status, ok := entity.AdminQuestionSearchStatusIntToString[question.Status]
if ok {
item.Status = status
}
@@ -855,7 +912,7 @@ func (qs *QuestionService) SearchList(ctx context.Context, req *schema.QuestionS
}
func (qs *QuestionService) AdminSetQuestionStatus(ctx context.Context, questionID string, setStatusStr string) error {
- setStatus, ok := entity.CmsQuestionSearchStatus[setStatusStr]
+ setStatus, ok := entity.AdminQuestionSearchStatus[setStatusStr]
if !ok {
return fmt.Errorf("question status does not exist")
}
@@ -910,10 +967,10 @@ func (qs *QuestionService) AdminSetQuestionStatus(ctx context.Context, questionI
return nil
}
-func (qs *QuestionService) CmsSearchList(ctx context.Context, search *schema.CmsQuestionSearch, loginUserID string) ([]*schema.AdminQuestionInfo, int64, error) {
+func (qs *QuestionService) AdminSearchList(ctx context.Context, search *schema.AdminQuestionSearch, loginUserID string) ([]*schema.AdminQuestionInfo, int64, error) {
list := make([]*schema.AdminQuestionInfo, 0)
- status, ok := entity.CmsQuestionSearchStatus[search.StatusStr]
+ status, ok := entity.AdminQuestionSearchStatus[search.StatusStr]
if ok {
search.Status = status
}
@@ -921,7 +978,7 @@ func (qs *QuestionService) CmsSearchList(ctx context.Context, search *schema.Cms
if search.Status == 0 {
search.Status = 1
}
- dblist, count, err := qs.questionRepo.CmsSearchList(ctx, search)
+ dblist, count, err := qs.questionRepo.AdminSearchList(ctx, search)
if err != nil {
return list, count, err
}
@@ -949,11 +1006,11 @@ func (qs *QuestionService) CmsSearchList(ctx context.Context, search *schema.Cms
return list, count, nil
}
-// CmsSearchList
-func (qs *QuestionService) CmsSearchAnswerList(ctx context.Context, search *entity.CmsAnswerSearch, loginUserID string) ([]*schema.AdminAnswerInfo, int64, error) {
+// AdminSearchList
+func (qs *QuestionService) AdminSearchAnswerList(ctx context.Context, search *entity.AdminAnswerSearch, loginUserID string) ([]*schema.AdminAnswerInfo, int64, error) {
answerlist := make([]*schema.AdminAnswerInfo, 0)
- status, ok := entity.CmsAnswerSearchStatus[search.StatusStr]
+ status, ok := entity.AdminAnswerSearchStatus[search.StatusStr]
if ok {
search.Status = status
}
@@ -961,7 +1018,7 @@ func (qs *QuestionService) CmsSearchAnswerList(ctx context.Context, search *enti
if search.Status == 0 {
search.Status = 1
}
- dblist, count, err := qs.questioncommon.AnswerCommon.CmsSearchList(ctx, search)
+ dblist, count, err := qs.questioncommon.AnswerCommon.AdminSearchList(ctx, search)
if err != nil {
return answerlist, count, err
}
diff --git a/internal/service/report_backyard/report_backyard.go b/internal/service/report_admin/report_backyard.go
similarity index 86%
rename from internal/service/report_backyard/report_backyard.go
rename to internal/service/report_admin/report_backyard.go
index 94335d12..51065995 100644
--- a/internal/service/report_backyard/report_backyard.go
+++ b/internal/service/report_admin/report_backyard.go
@@ -1,4 +1,4 @@
-package report_backyard
+package report_admin
import (
"context"
@@ -16,35 +16,35 @@ import (
"github.com/answerdev/answer/internal/service/comment_common"
questioncommon "github.com/answerdev/answer/internal/service/question_common"
"github.com/answerdev/answer/internal/service/report_common"
- "github.com/answerdev/answer/internal/service/report_handle_backyard"
+ "github.com/answerdev/answer/internal/service/report_handle_admin"
usercommon "github.com/answerdev/answer/internal/service/user_common"
"github.com/jinzhu/copier"
"github.com/segmentfault/pacman/errors"
)
-// ReportBackyardService user service
-type ReportBackyardService struct {
+// ReportAdminService user service
+type ReportAdminService struct {
reportRepo report_common.ReportRepo
commonUser *usercommon.UserCommon
commonRepo *common.CommonRepo
answerRepo answercommon.AnswerRepo
questionRepo questioncommon.QuestionRepo
commentCommonRepo comment_common.CommentCommonRepo
- reportHandle *report_handle_backyard.ReportHandle
+ reportHandle *report_handle_admin.ReportHandle
configRepo config.ConfigRepo
}
-// NewReportBackyardService new report service
-func NewReportBackyardService(
+// NewReportAdminService new report service
+func NewReportAdminService(
reportRepo report_common.ReportRepo,
commonUser *usercommon.UserCommon,
commonRepo *common.CommonRepo,
answerRepo answercommon.AnswerRepo,
questionRepo questioncommon.QuestionRepo,
commentCommonRepo comment_common.CommentCommonRepo,
- reportHandle *report_handle_backyard.ReportHandle,
- configRepo config.ConfigRepo) *ReportBackyardService {
- return &ReportBackyardService{
+ reportHandle *report_handle_admin.ReportHandle,
+ configRepo config.ConfigRepo) *ReportAdminService {
+ return &ReportAdminService{
reportRepo: reportRepo,
commonUser: commonUser,
commonRepo: commonRepo,
@@ -57,7 +57,7 @@ func NewReportBackyardService(
}
// ListReportPage list report pages
-func (rs *ReportBackyardService) ListReportPage(ctx context.Context, dto schema.GetReportListPageDTO) (pageModel *pager.PageModel, err error) {
+func (rs *ReportAdminService) ListReportPage(ctx context.Context, dto schema.GetReportListPageDTO) (pageModel *pager.PageModel, err error) {
var (
resp []*schema.GetReportListPageResp
flags []entity.Report
@@ -105,7 +105,7 @@ func (rs *ReportBackyardService) ListReportPage(ctx context.Context, dto schema.
}
// HandleReported handle the reported object
-func (rs *ReportBackyardService) HandleReported(ctx context.Context, req schema.ReportHandleReq) (err error) {
+func (rs *ReportAdminService) HandleReported(ctx context.Context, req schema.ReportHandleReq) (err error) {
var (
reported *entity.Report
handleData = entity.Report{
@@ -139,7 +139,7 @@ func (rs *ReportBackyardService) HandleReported(ctx context.Context, req schema.
return
}
-func (rs *ReportBackyardService) parseObject(ctx context.Context, resp *[]*schema.GetReportListPageResp) {
+func (rs *ReportAdminService) parseObject(ctx context.Context, resp *[]*schema.GetReportListPageResp) {
var (
res = *resp
)
diff --git a/internal/service/report_handle_backyard/report_handle.go b/internal/service/report_handle_admin/report_handle.go
similarity index 98%
rename from internal/service/report_handle_backyard/report_handle.go
rename to internal/service/report_handle_admin/report_handle.go
index cbeea25c..c638228a 100644
--- a/internal/service/report_handle_backyard/report_handle.go
+++ b/internal/service/report_handle_admin/report_handle.go
@@ -1,4 +1,4 @@
-package report_handle_backyard
+package report_handle_admin
import (
"context"
diff --git a/internal/service/siteinfo/siteinfo_service.go b/internal/service/siteinfo/siteinfo_service.go
index afbd7edd..549ef6be 100644
--- a/internal/service/siteinfo/siteinfo_service.go
+++ b/internal/service/siteinfo/siteinfo_service.go
@@ -114,23 +114,10 @@ func (s *SiteInfoService) SaveSiteGeneral(ctx context.Context, req schema.SiteGe
func (s *SiteInfoService) SaveSiteInterface(ctx context.Context, req schema.SiteInterfaceReq) (err error) {
var (
- siteType = "interface"
- themeExist bool
- content []byte
+ siteType = "interface"
+ content []byte
)
- // check theme
- for _, theme := range schema.GetThemeOptions {
- if theme.Value == req.Theme {
- themeExist = true
- break
- }
- }
- if !themeExist {
- err = errors.BadRequest(reason.ThemeNotFound)
- return
- }
-
// check language
if !translator.CheckLanguageIsValid(req.Language) {
err = errors.BadRequest(reason.LangNotFound)
diff --git a/internal/service/tag/tag_service.go b/internal/service/tag/tag_service.go
index c0bc6aca..1d938eb5 100644
--- a/internal/service/tag/tag_service.go
+++ b/internal/service/tag/tag_service.go
@@ -320,13 +320,13 @@ func (ts *TagService) GetTagWithPage(ctx context.Context, req *schema.GetTagWith
resp := make([]*schema.GetTagPageResp, 0)
for _, tag := range tags {
- excerpt := htmltext.FetchExcerpt(tag.ParsedText, "...", 240)
+ //excerpt := htmltext.FetchExcerpt(tag.ParsedText, "...", 240)
resp = append(resp, &schema.GetTagPageResp{
TagID: tag.ID,
SlugName: tag.SlugName,
DisplayName: tag.DisplayName,
- OriginalText: excerpt,
- ParsedText: excerpt,
+ OriginalText: tag.OriginalText,
+ ParsedText: tag.ParsedText,
FollowCount: tag.FollowCount,
QuestionCount: tag.QuestionCount,
IsFollower: ts.checkTagIsFollow(ctx, req.UserID, tag.ID),
diff --git a/internal/service/tag_common/tag_common.go b/internal/service/tag_common/tag_common.go
index 6af946bb..d4531329 100644
--- a/internal/service/tag_common/tag_common.go
+++ b/internal/service/tag_common/tag_common.go
@@ -661,7 +661,9 @@ func (ts *TagCommonService) UpdateTag(ctx context.Context, req *schema.UpdateTag
return errors.BadRequest(reason.TagNotFound)
}
//If the content is the same, ignore it
- if tagInfo.OriginalText == req.OriginalText {
+ if tagInfo.OriginalText == req.OriginalText &&
+ tagInfo.DisplayName == req.DisplayName &&
+ tagInfo.SlugName == req.SlugName {
return nil
}
diff --git a/internal/service/user_backyard/user_backyard.go b/internal/service/user_admin/user_backyard.go
similarity index 84%
rename from internal/service/user_backyard/user_backyard.go
rename to internal/service/user_admin/user_backyard.go
index a00198b1..9641bdfe 100644
--- a/internal/service/user_backyard/user_backyard.go
+++ b/internal/service/user_admin/user_backyard.go
@@ -1,4 +1,4 @@
-package user_backyard
+package user_admin
import (
"context"
@@ -21,8 +21,8 @@ import (
"golang.org/x/crypto/bcrypt"
)
-// UserBackyardRepo user repository
-type UserBackyardRepo interface {
+// UserAdminRepo user repository
+type UserAdminRepo interface {
UpdateUserStatus(ctx context.Context, userID string, userStatus, mailStatus int, email string) (err error)
GetUserInfo(ctx context.Context, userID string) (user *entity.User, exist bool, err error)
GetUserInfoByEmail(ctx context.Context, email string) (user *entity.User, exist bool, err error)
@@ -32,22 +32,22 @@ type UserBackyardRepo interface {
UpdateUserPassword(ctx context.Context, userID string, password string) (err error)
}
-// UserBackyardService user service
-type UserBackyardService struct {
- userRepo UserBackyardRepo
+// UserAdminService user service
+type UserAdminService struct {
+ userRepo UserAdminRepo
userRoleRelService *role.UserRoleRelService
authService *auth.AuthService
userCommonService *usercommon.UserCommon
}
-// NewUserBackyardService new user backyard service
-func NewUserBackyardService(
- userRepo UserBackyardRepo,
+// NewUserAdminService new user admin service
+func NewUserAdminService(
+ userRepo UserAdminRepo,
userRoleRelService *role.UserRoleRelService,
authService *auth.AuthService,
userCommonService *usercommon.UserCommon,
-) *UserBackyardService {
- return &UserBackyardService{
+) *UserAdminService {
+ return &UserAdminService{
userRepo: userRepo,
userRoleRelService: userRoleRelService,
authService: authService,
@@ -56,7 +56,7 @@ func NewUserBackyardService(
}
// UpdateUserStatus update user
-func (us *UserBackyardService) UpdateUserStatus(ctx context.Context, req *schema.UpdateUserStatusReq) (err error) {
+func (us *UserAdminService) UpdateUserStatus(ctx context.Context, req *schema.UpdateUserStatusReq) (err error) {
userInfo, exist, err := us.userRepo.GetUserInfo(ctx, req.UserID)
if err != nil {
return
@@ -87,7 +87,7 @@ func (us *UserBackyardService) UpdateUserStatus(ctx context.Context, req *schema
}
// UpdateUserRole update user role
-func (us *UserBackyardService) UpdateUserRole(ctx context.Context, req *schema.UpdateUserRoleReq) (err error) {
+func (us *UserAdminService) UpdateUserRole(ctx context.Context, req *schema.UpdateUserRoleReq) (err error) {
// Users cannot modify their roles
if req.UserID == req.LoginUserID {
return errors.BadRequest(reason.UserCannotUpdateYourRole)
@@ -103,7 +103,7 @@ func (us *UserBackyardService) UpdateUserRole(ctx context.Context, req *schema.U
}
// AddUser add user
-func (us *UserBackyardService) AddUser(ctx context.Context, req *schema.AddUserReq) (err error) {
+func (us *UserAdminService) AddUser(ctx context.Context, req *schema.AddUserReq) (err error) {
_, has, err := us.userRepo.GetUserInfoByEmail(ctx, req.Email)
if err != nil {
return err
@@ -138,7 +138,7 @@ func (us *UserBackyardService) AddUser(ctx context.Context, req *schema.AddUserR
}
// UpdateUserPassword update user password
-func (us *UserBackyardService) UpdateUserPassword(ctx context.Context, req *schema.UpdateUserPasswordReq) (err error) {
+func (us *UserAdminService) UpdateUserPassword(ctx context.Context, req *schema.UpdateUserPasswordReq) (err error) {
userInfo, exist, err := us.userRepo.GetUserInfo(ctx, req.UserID)
if err != nil {
return err
@@ -162,7 +162,7 @@ func (us *UserBackyardService) UpdateUserPassword(ctx context.Context, req *sche
}
// GetUserInfo get user one
-func (us *UserBackyardService) GetUserInfo(ctx context.Context, userID string) (resp *schema.GetUserInfoResp, err error) {
+func (us *UserAdminService) GetUserInfo(ctx context.Context, userID string) (resp *schema.GetUserInfoResp, err error) {
user, exist, err := us.userRepo.GetUserInfo(ctx, userID)
if err != nil {
return
@@ -177,7 +177,7 @@ func (us *UserBackyardService) GetUserInfo(ctx context.Context, userID string) (
}
// GetUserPage get user list page
-func (us *UserBackyardService) GetUserPage(ctx context.Context, req *schema.GetUserPageReq) (pageModel *pager.PageModel, err error) {
+func (us *UserAdminService) GetUserPage(ctx context.Context, req *schema.GetUserPageReq) (pageModel *pager.PageModel, err error) {
user := &entity.User{}
_ = copier.Copy(user, req)
@@ -246,7 +246,7 @@ func (us *UserBackyardService) GetUserPage(ctx context.Context, req *schema.GetU
return pager.NewPageModel(total, resp), nil
}
-func (us *UserBackyardService) setUserRoleInfo(ctx context.Context, resp []*schema.GetUserPageResp) {
+func (us *UserAdminService) setUserRoleInfo(ctx context.Context, resp []*schema.GetUserPageResp) {
var userIDs []string
for _, u := range resp {
userIDs = append(userIDs, u.UserID)
diff --git a/internal/service/user_service.go b/internal/service/user_service.go
index 391294c0..5cfa38e3 100644
--- a/internal/service/user_service.go
+++ b/internal/service/user_service.go
@@ -138,7 +138,7 @@ func (us *UserService) EmailLogin(ctx context.Context, req *schema.UserEmailLogi
}
resp.IsAdmin = userCacheInfo.IsAdmin
if resp.IsAdmin {
- err = us.authService.SetCmsUserCacheInfo(ctx, resp.AccessToken, userCacheInfo)
+ err = us.authService.SetAdminUserCacheInfo(ctx, resp.AccessToken, userCacheInfo)
if err != nil {
return nil, err
}
@@ -355,7 +355,7 @@ func (us *UserService) UserRegisterByEmail(ctx context.Context, registerUserInfo
}
resp.IsAdmin = userCacheInfo.IsAdmin
if resp.IsAdmin {
- err = us.authService.SetCmsUserCacheInfo(ctx, resp.AccessToken, &entity.UserCacheInfo{UserID: userInfo.ID})
+ err = us.authService.SetAdminUserCacheInfo(ctx, resp.AccessToken, &entity.UserCacheInfo{UserID: userInfo.ID})
if err != nil {
return nil, err
}
@@ -451,7 +451,7 @@ func (us *UserService) UserVerifyEmail(ctx context.Context, req *schema.UserVeri
}
resp.IsAdmin = userCacheInfo.IsAdmin
if resp.IsAdmin {
- err = us.authService.SetCmsUserCacheInfo(ctx, resp.AccessToken, &entity.UserCacheInfo{UserID: userInfo.ID})
+ err = us.authService.SetAdminUserCacheInfo(ctx, resp.AccessToken, &entity.UserCacheInfo{UserID: userInfo.ID})
if err != nil {
return nil, err
}
diff --git a/pkg/converter/markdown.go b/pkg/converter/markdown.go
index 79ebead6..c69a042c 100644
--- a/pkg/converter/markdown.go
+++ b/pkg/converter/markdown.go
@@ -1,11 +1,30 @@
package converter
import (
- "github.com/gomarkdown/markdown"
+ "bytes"
+
+ "github.com/segmentfault/pacman/log"
+ "github.com/yuin/goldmark"
+ "github.com/yuin/goldmark/extension"
+ "github.com/yuin/goldmark/parser"
+ "github.com/yuin/goldmark/renderer/html"
)
// Markdown2HTML convert markdown to html
-func Markdown2HTML(md string) string {
- html := markdown.ToHTML([]byte(md), nil, nil)
- return string(html)
+func Markdown2HTML(source string) string {
+ mdConverter := goldmark.New(
+ goldmark.WithExtensions(extension.GFM),
+ goldmark.WithParserOptions(
+ parser.WithAutoHeadingID(),
+ ),
+ goldmark.WithRendererOptions(
+ html.WithHardWraps(),
+ ),
+ )
+ var buf bytes.Buffer
+ if err := mdConverter.Convert([]byte(source), &buf); err != nil {
+ log.Error(err)
+ return source
+ }
+ return buf.String()
}
diff --git a/ui/README.md b/ui/README.md
index f7fbb8aa..edfbb588 100644
--- a/ui/README.md
+++ b/ui/README.md
@@ -102,9 +102,9 @@ All our translations are placed in the i18n directory.
## 📱Environment Support
-| [](http://godban.github.io/browsers-support-badges/) Edge | [](http://godban.github.io/browsers-support-badges/) Firefox | [](http://godban.github.io/browsers-support-badges/) Chrome | [](http://godban.github.io/browsers-support-badges/) Safari |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| last 2 versions | last 2 versions | last 2 versions | last 2 versions |
+| [](http://godban.github.io/browsers-support-badges/) Edge | [](http://godban.github.io/browsers-support-badges/) Firefox | [](http://godban.github.io/browsers-support-badges/) Chrome | [](http://godban.github.io/browsers-support-badges/) Safari |
+|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| last 2 versions | last 2 versions | last 2 versions | last 2 versions |
## ⭐ Built with
- [TypeScript](https://www.typescriptlang.org/) - strongly typed JavaScript
diff --git a/ui/build/index.html b/ui/build/index.html
index d1591341..740c1d7a 100644
--- a/ui/build/index.html
+++ b/ui/build/index.html
@@ -1,44 +1 @@
-
-
-
-
-
-
-
- Answer
-
-
-
-
-
-
-