Compare commits
22 Commits
v1.2.1-RC1
...
v1.2.5
| Author | SHA1 | Date | |
|---|---|---|---|
| 5132cb3912 | |||
| 0849e8f540 | |||
| 968f23db7f | |||
| abecc1c9b6 | |||
| 937de43978 | |||
| 52e0a4c59b | |||
| 720936b74a | |||
| 261b143679 | |||
| 6d93b7d2f3 | |||
| d8c55779f8 | |||
| bdc498ce39 | |||
| 1c5297abf1 | |||
| c8c3d7c1a2 | |||
| da490d4006 | |||
| 615e439fd3 | |||
| 41a73cf9df | |||
| 3b00da932b | |||
| 152934c740 | |||
| 68f5af01d9 | |||
| 2df8d5657e | |||
| 7e4fe9a0f8 | |||
| 3f696b63d6 |
@@ -1,30 +1,36 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
about: Report an issue to help the project improve.
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
## Describe the bug
|
||||
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
### To Reproduce
|
||||
|
||||
Steps to reproduce the behavior:
|
||||
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
### Expected behavior
|
||||
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
### Screenshots
|
||||
|
||||
**Platform (please complete the following information):**
|
||||
- Device: [e.g. Desktop, Mobile]
|
||||
- OS: [e.g. macOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
If applicable, add screenshots or video to help explain your problem.
|
||||
|
||||
### Platform
|
||||
|
||||
- Device: [e.g. Desktop, Mobile]
|
||||
- OS: [e.g. macOS]
|
||||
- Browser and version: [e.g. Chrome, Safari]
|
||||
- Version: [e.g. v1.2.0]
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: Support
|
||||
url: https://answer.apache.org/community
|
||||
about: Contact us if you have any questions while using.
|
||||
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Enhancement request
|
||||
about: Suggest an enhancement for this project. Improve an existing feature.
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Is your enhancement request related to a problem? Please describe
|
||||
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
## Describe the solution you'd like
|
||||
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
## Describe alternatives you've considered
|
||||
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
@@ -1,17 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
about: Suggest an idea or possible new feature for this project.
|
||||
title: ''
|
||||
labels: enhancement
|
||||
labels: feature
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
## Is your feature request related to a problem? Please describe
|
||||
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
## Describe the solution you'd like
|
||||
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
## Describe alternatives you've considered
|
||||
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
@@ -26,6 +26,7 @@ permissions:
|
||||
|
||||
jobs:
|
||||
build-goreleaser:
|
||||
if: ${{ github.repository_owner == 'apache' }}
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
|
||||
@@ -27,6 +27,7 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: ${{ github.repository_owner == 'apache' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
||||
@@ -29,6 +29,7 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: ${{ github.repository_owner == 'apache' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
||||
@@ -23,6 +23,7 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: ${{ github.repository_owner == 'apache' }}
|
||||
name: Build and Push
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
name: Build PR Image
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, closed]
|
||||
|
||||
jobs:
|
||||
build-answer:
|
||||
name: Build and push `Answer`
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
if: ${{ github.event.action != 'closed' }}
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Generate UUID image name
|
||||
id: uuid
|
||||
run: echo "UUID_WORKER=$(uuidgen)" >> $GITHUB_ENV
|
||||
|
||||
- name: Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: registry.uffizzi.com/${{ env.UUID_WORKER }}
|
||||
tags: |
|
||||
type=raw,value=60d
|
||||
|
||||
- name: Build and Push Image to registry.uffizzi.com - Uffizzi's ephemeral Registry
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
push: true
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha, mode=max
|
||||
|
||||
render-compose-file:
|
||||
name: Render Docker Compose File
|
||||
# Pass output of this workflow to another triggered by `workflow_run` event.
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build-answer
|
||||
outputs:
|
||||
compose-file-cache-key: ${{ steps.hash.outputs.hash }}
|
||||
steps:
|
||||
- name: Checkout git repo
|
||||
uses: actions/checkout@v4
|
||||
- name: Render Compose File
|
||||
run: |
|
||||
ANSWER_IMAGE=${{ needs.build-answer.outputs.tags }}
|
||||
export ANSWER_IMAGE
|
||||
export UFFIZZI_URL=\$UFFIZZI_URL
|
||||
# Render simple template from environment variables.
|
||||
envsubst < docker-compose.uffizzi.yml > docker-compose.rendered.yml
|
||||
cat docker-compose.rendered.yml
|
||||
- name: Upload Rendered Compose File as Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: preview-spec
|
||||
path: docker-compose.rendered.yml
|
||||
retention-days: 2
|
||||
- name: Serialize PR Event to File
|
||||
run: |
|
||||
cat << EOF > event.json
|
||||
${{ toJSON(github.event) }}
|
||||
|
||||
EOF
|
||||
- name: Upload PR Event as Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: preview-spec
|
||||
path: event.json
|
||||
retention-days: 2
|
||||
|
||||
delete-preview:
|
||||
name: Call for Preview Deletion
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.action == 'closed' }}
|
||||
steps:
|
||||
# If this PR is closing, we will not render a compose file nor pass it to the next workflow.
|
||||
- name: Serialize PR Event to File
|
||||
run: |
|
||||
cat << EOF > event.json
|
||||
${{ toJSON(github.event) }}
|
||||
|
||||
EOF
|
||||
- name: Upload PR Event as Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: preview-spec
|
||||
path: event.json
|
||||
retention-days: 2
|
||||
@@ -1,105 +0,0 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
name: Deploy Uffizzi Preview
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows:
|
||||
- "Build PR Image"
|
||||
types:
|
||||
- completed
|
||||
|
||||
|
||||
jobs:
|
||||
cache-compose-file:
|
||||
name: Cache Compose File
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
outputs:
|
||||
compose-file-cache-key: ${{ env.HASH }}
|
||||
pr-number: ${{ env.PR_NUMBER }}
|
||||
steps:
|
||||
- name: 'Download artifacts'
|
||||
# Fetch output (zip archive) from the workflow run that triggered this workflow.
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: context.payload.workflow_run.id,
|
||||
});
|
||||
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name == "preview-spec"
|
||||
})[0];
|
||||
let download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: matchArtifact.id,
|
||||
archive_format: 'zip',
|
||||
});
|
||||
let fs = require('fs');
|
||||
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/preview-spec.zip`, Buffer.from(download.data));
|
||||
|
||||
- name: 'Unzip artifact'
|
||||
run: unzip preview-spec.zip
|
||||
- name: Read Event into ENV
|
||||
run: |
|
||||
echo 'EVENT_JSON<<EOF' >> $GITHUB_ENV
|
||||
cat event.json >> $GITHUB_ENV
|
||||
echo 'EOF' >> $GITHUB_ENV
|
||||
|
||||
- name: Hash Rendered Compose File
|
||||
id: hash
|
||||
# If the previous workflow was triggered by a PR close event, we will not have a compose file artifact.
|
||||
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
||||
run: echo "HASH=$(md5sum docker-compose.rendered.yml | awk '{ print $1 }')" >> $GITHUB_ENV
|
||||
- name: Cache Rendered Compose File
|
||||
if: ${{ fromJSON(env.EVENT_JSON).action != 'closed' }}
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: docker-compose.rendered.yml
|
||||
key: ${{ env.HASH }}
|
||||
|
||||
- name: Read PR Number From Event Object
|
||||
id: pr
|
||||
run: echo "PR_NUMBER=${{ fromJSON(env.EVENT_JSON).number }}" >> $GITHUB_ENV
|
||||
- name: DEBUG - Print Job Outputs
|
||||
if: ${{ runner.debug }}
|
||||
run: |
|
||||
echo "PR number: ${{ env.PR_NUMBER }}"
|
||||
echo "Compose file hash: ${{ env.HASH }}"
|
||||
cat event.json
|
||||
|
||||
deploy-uffizzi-preview:
|
||||
name: Use Remote Workflow to Preview on Uffizzi
|
||||
needs:
|
||||
- cache-compose-file
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
uses: UffizziCloud/preview-action/.github/workflows/reusable.yaml@v2
|
||||
with:
|
||||
# If this workflow was triggered by a PR close event, cache-key will be an empty string
|
||||
# and this reusable workflow will delete the preview deployment.
|
||||
compose-file-cache-key: ${{ needs.cache-compose-file.outputs.compose-file-cache-key }}
|
||||
compose-file-cache-path: docker-compose.rendered.yml
|
||||
server: https://app.uffizzi.com
|
||||
pr-number: ${{ needs.cache-compose-file.outputs.pr-number }}
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
id-token: write
|
||||
+10
-4
@@ -32,7 +32,7 @@ builds:
|
||||
- id: build
|
||||
main: ./cmd/answer/.
|
||||
binary: answer
|
||||
ldflags: -s -w -X github.com/apache/incubator-answer/cmd.Version={{.Version}} -X github.com/apache/incubator-answer/cmd.Revision={{.ShortCommit}} -X github.com/apache/incubator-answer/cmd.Time={{.Date}} -X github.com/apache/incubator-answer/cmd.BuildUser=goreleaser
|
||||
ldflags: -s -w -X github.com/apache/incubator-answer/cmd.Version={{.RawVersion}} -X github.com/apache/incubator-answer/cmd.Revision={{.ShortCommit}} -X github.com/apache/incubator-answer/cmd.Time={{.Date}} -X github.com/apache/incubator-answer/cmd.BuildUser=goreleaser
|
||||
flags: -v
|
||||
goos:
|
||||
- linux
|
||||
@@ -43,7 +43,7 @@ builds:
|
||||
- id: build-windows
|
||||
main: ./cmd/answer/.
|
||||
binary: answer
|
||||
ldflags: -s -w -X github.com/apache/incubator-answer/cmd.Version={{.Version}} -X github.com/apache/incubator-answer/cmd.Revision={{.ShortCommit}} -X github.com/apache/incubator-answer/cmd.Time={{.Date}} -X github.com/apache/incubator-answer/cmd.BuildUser=goreleaser
|
||||
ldflags: -s -w -X github.com/apache/incubator-answer/cmd.Version={{.RawVersion}} -X github.com/apache/incubator-answer/cmd.Revision={{.ShortCommit}} -X github.com/apache/incubator-answer/cmd.Time={{.Date}} -X github.com/apache/incubator-answer/cmd.BuildUser=goreleaser
|
||||
flags: -v
|
||||
goos:
|
||||
- windows
|
||||
@@ -55,7 +55,7 @@ builds:
|
||||
|
||||
archives:
|
||||
- name_template: >-
|
||||
apache-answer-{{ .Version }}-incubating-{{ .Os }}-{{ .Arch }}
|
||||
apache-answer-{{ .RawVersion }}-incubating-bin-{{ .Os }}-{{ .Arch }}
|
||||
files:
|
||||
- src: "docs/release/LICENSE"
|
||||
dst: LICENSE
|
||||
@@ -65,6 +65,7 @@ archives:
|
||||
dst: licenses/
|
||||
- src: "DISCLAIMER"
|
||||
dst: DISCLAIMER
|
||||
wrap_in_directory: true
|
||||
checksum:
|
||||
name_template: 'checksums.txt'
|
||||
snapshot:
|
||||
@@ -76,5 +77,10 @@ changelog:
|
||||
- '^docs:'
|
||||
- '^test:'
|
||||
|
||||
# goreleaser release --snapshot --rm-dist
|
||||
source:
|
||||
enabled: true
|
||||
name_template: apache-answer-{{ .RawVersion }}-incubating-src
|
||||
prefix_template: "apache-answer-{{ .RawVersion }}-incubating-src/"
|
||||
|
||||
# goreleaser release --skip-validate --skip-publish --clean
|
||||
|
||||
|
||||
+6
-2
@@ -47,7 +47,9 @@ RUN mkdir -p /data/uploads && chmod 777 /data/uploads \
|
||||
FROM alpine
|
||||
LABEL maintainer="linkinstar@apache.org"
|
||||
|
||||
ENV TZ "Asia/Shanghai"
|
||||
ARG TIMEZONE
|
||||
ENV TIMEZONE=${TIMEZONE:-"Asia/Shanghai"}
|
||||
|
||||
RUN apk update \
|
||||
&& apk --no-cache add \
|
||||
bash \
|
||||
@@ -58,7 +60,9 @@ RUN apk update \
|
||||
openssh \
|
||||
sqlite \
|
||||
gnupg \
|
||||
&& echo "Asia/Shanghai" > /etc/timezone
|
||||
tzdata \
|
||||
&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
|
||||
&& echo "${TIMEZONE}" > /etc/timezone
|
||||
|
||||
COPY --from=golang-builder /usr/bin/answer /usr/bin/answer
|
||||
COPY --from=golang-builder /data /data
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
.PHONY: build clean ui
|
||||
|
||||
VERSION=1.2.1
|
||||
VERSION=1.2.5
|
||||
BIN=answer
|
||||
DIR_SRC=./cmd/answer
|
||||
DOCKER_CMD=docker
|
||||
|
||||
GO_ENV=CGO_ENABLED=0 GO111MODULE=on
|
||||
Revision=$(shell git rev-parse --short HEAD)
|
||||
Revision=$(shell git rev-parse --short HEAD 2>/dev/null || echo "")
|
||||
GO_FLAGS=-ldflags="-X github.com/apache/incubator-answer/cmd.Version=$(VERSION) -X 'github.com/apache/incubator-answer/cmd.Revision=$(Revision)' -X 'github.com/apache/incubator-answer/cmd.Time=`date +%s`' -extldflags -static"
|
||||
GO=$(GO_ENV) $(shell which go)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Apache Answer (incubating)
|
||||
Copyright 2023 The Apache Software Foundation
|
||||
Copyright 2023-2024 The Apache Software Foundation
|
||||
|
||||
This product includes software developed at
|
||||
The Apache Software Foundation (https://www.apache.org/).
|
||||
|
||||
@@ -23,10 +23,10 @@ To learn more about the project, visit [answer.apache.org](https://answer.apache
|
||||
### Running with docker
|
||||
|
||||
```bash
|
||||
docker run -d -p 9080:80 -v answer-data:/data --name answer apache/answer:latest
|
||||
docker run -d -p 9080:80 -v answer-data:/data --name answer apache/answer:1.2.5
|
||||
```
|
||||
|
||||
For more information, see [Installation](https://answer.apache.org/docs/installation)
|
||||
For more information, see [Installation](https://answer.apache.org/docs/installation).
|
||||
|
||||
### Plugins
|
||||
|
||||
@@ -43,11 +43,17 @@ You can also check out the [plugins here](https://answer.apache.org/plugins).
|
||||
- Golang >= 1.18
|
||||
- Node.js >= 16.17
|
||||
- pnpm >= 8
|
||||
- mockgen >= 1.6.0
|
||||
- wire >= 0.5.0
|
||||
|
||||
### Build
|
||||
|
||||
```bash
|
||||
# install wire and mockgen for building
|
||||
$ make generate
|
||||
# install frontend dependencies and build
|
||||
$ make ui
|
||||
# install backend dependencies and build
|
||||
$ make build
|
||||
```
|
||||
|
||||
|
||||
+3
-2
@@ -44,9 +44,10 @@ var (
|
||||
// Version is the version of the project
|
||||
Version = "0.0.0"
|
||||
// Revision is the git short commit revision number
|
||||
Revision = "-"
|
||||
// If built without a Git repository, this field will be empty.
|
||||
Revision = ""
|
||||
// Time is the build time of the project
|
||||
Time = "-"
|
||||
Time = ""
|
||||
// GoVersion is the go version of the project
|
||||
GoVersion = "1.19"
|
||||
// log level
|
||||
|
||||
+7
-5
@@ -201,8 +201,8 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database,
|
||||
collectionController := controller.NewCollectionController(collectionService)
|
||||
answerActivityRepo := activity.NewAnswerActivityRepo(dataData, activityRepo, userRankRepo, notificationQueueService)
|
||||
answerActivityService := activity2.NewAnswerActivityService(answerActivityRepo, configService)
|
||||
externalNotificationService := notification.NewExternalNotificationService(dataData, userNotificationConfigRepo, followRepo, emailService, userRepo, externalNotificationQueueService)
|
||||
questionService := service.NewQuestionService(questionRepo, tagCommonService, questionCommon, userCommon, userRepo, revisionService, metaService, collectionCommon, answerActivityService, emailService, notificationQueueService, externalNotificationQueueService, activityQueueService, siteInfoCommonService, externalNotificationService)
|
||||
externalNotificationService := notification.NewExternalNotificationService(dataData, userNotificationConfigRepo, followRepo, emailService, userRepo, externalNotificationQueueService, userExternalLoginRepo, siteInfoCommonService)
|
||||
questionService := service.NewQuestionService(questionRepo, tagCommonService, questionCommon, userCommon, userRepo, userRoleRelService, revisionService, metaService, collectionCommon, answerActivityService, emailService, notificationQueueService, externalNotificationQueueService, activityQueueService, siteInfoCommonService, externalNotificationService)
|
||||
answerService := service.NewAnswerService(answerRepo, questionRepo, questionCommon, userCommon, collectionCommon, userRepo, revisionService, answerActivityService, answerCommon, voteRepo, emailService, userRoleRelService, notificationQueueService, externalNotificationQueueService, activityQueueService)
|
||||
questionController := controller.NewQuestionController(questionService, answerService, rankService, siteInfoCommonService, captchaService, rateLimitMiddleware)
|
||||
answerController := controller.NewAnswerController(answerService, rankService, captchaService, siteInfoCommonService, rateLimitMiddleware)
|
||||
@@ -227,7 +227,7 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database,
|
||||
siteInfoController := controller_admin.NewSiteInfoController(siteInfoService)
|
||||
controllerSiteInfoController := controller.NewSiteInfoController(siteInfoCommonService)
|
||||
notificationRepo := notification2.NewNotificationRepo(dataData)
|
||||
notificationCommon := notificationcommon.NewNotificationCommon(dataData, notificationRepo, userCommon, activityRepo, followRepo, objService, notificationQueueService)
|
||||
notificationCommon := notificationcommon.NewNotificationCommon(dataData, notificationRepo, userCommon, activityRepo, followRepo, objService, notificationQueueService, userExternalLoginRepo, siteInfoCommonService)
|
||||
notificationService := notification.NewNotificationService(dataData, notificationRepo, notificationCommon, revisionService, userRepo)
|
||||
notificationController := controller.NewNotificationController(notificationService, rankService)
|
||||
dashboardService := dashboard.NewDashboardService(questionRepo, answerRepo, commentCommonRepo, voteRepo, userRepo, reportRepo, configService, siteInfoCommonService, serviceConf, dataData)
|
||||
@@ -241,10 +241,12 @@ func initApplication(debug bool, serverConf *conf.Server, dbConf *data.Database,
|
||||
activityController := controller.NewActivityController(activityService)
|
||||
roleController := controller_admin.NewRoleController(roleService)
|
||||
pluginConfigRepo := plugin_config.NewPluginConfigRepo(dataData)
|
||||
pluginCommonService := plugin_common.NewPluginCommonService(pluginConfigRepo, configService, dataData)
|
||||
pluginUserConfigRepo := plugin_config.NewPluginUserConfigRepo(dataData)
|
||||
pluginCommonService := plugin_common.NewPluginCommonService(pluginConfigRepo, pluginUserConfigRepo, configService, dataData)
|
||||
pluginController := controller_admin.NewPluginController(pluginCommonService)
|
||||
permissionController := controller.NewPermissionController(rankService)
|
||||
answerAPIRouter := router.NewAnswerAPIRouter(langController, userController, commentController, reportController, voteController, tagController, followController, collectionController, questionController, answerController, searchController, revisionController, rankController, controller_adminReportController, userAdminController, reasonController, themeController, siteInfoController, controllerSiteInfoController, notificationController, dashboardController, uploadController, activityController, roleController, pluginController, permissionController)
|
||||
userPluginController := controller.NewUserPluginController(pluginCommonService)
|
||||
answerAPIRouter := router.NewAnswerAPIRouter(langController, userController, commentController, reportController, voteController, tagController, followController, collectionController, questionController, answerController, searchController, revisionController, rankController, controller_adminReportController, userAdminController, reasonController, themeController, siteInfoController, controllerSiteInfoController, notificationController, dashboardController, uploadController, activityController, roleController, pluginController, permissionController, userPluginController)
|
||||
swaggerRouter := router.NewSwaggerRouter(swaggerConf)
|
||||
uiRouter := router.NewUIRouter(controllerSiteInfoController, siteInfoCommonService)
|
||||
authUserMiddleware := middleware.NewAuthUserMiddleware(authService, siteInfoCommonService)
|
||||
|
||||
@@ -32,6 +32,4 @@ swaggerui:
|
||||
host: 127.0.0.1
|
||||
address: ':80'
|
||||
service_config:
|
||||
secret_key: "answer"
|
||||
web_host: "http://127.0.0.1:9080"
|
||||
upload_path: "/data/uploads"
|
||||
|
||||
@@ -1,77 +0,0 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
version: "3.9"
|
||||
|
||||
# uffizzi integration
|
||||
x-uffizzi:
|
||||
ingress:
|
||||
service: answer
|
||||
port: 80
|
||||
|
||||
services:
|
||||
|
||||
answer:
|
||||
image: "${ANSWER_IMAGE}"
|
||||
environment:
|
||||
- AUTO_INSTALL=true
|
||||
- DB_TYPE=mysql
|
||||
- DB_USERNAME=root
|
||||
- DB_PASSWORD=password
|
||||
- DB_HOST=127.0.0.1:3306
|
||||
- DB_NAME=answer
|
||||
- LANGUAGE=en_US
|
||||
- SITE_NAME=answer-test
|
||||
- SITE_URL=http://localhost
|
||||
- CONTACT_EMAIL=test@answer.com
|
||||
- ADMIN_NAME=admin123
|
||||
- ADMIN_PASSWORD=admin123
|
||||
- ADMIN_EMAIL=admin123@admin.com
|
||||
volumes:
|
||||
- answer-data:/data
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
links:
|
||||
- db
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 4000M
|
||||
|
||||
mysql:
|
||||
image: mysql:latest
|
||||
environment:
|
||||
- MYSQL_DATABASE=answer
|
||||
- MYSQL_ROOT_PASSWORD=password
|
||||
- MYSQL_USER=mysql
|
||||
- MYSQL_PASSWORD=mysql
|
||||
healthcheck:
|
||||
test: [ "CMD", "mysqladmin" ,"ping", "-uroot", "-ppassword" ]
|
||||
timeout: 20s
|
||||
retries: 10
|
||||
command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--skip-character-set-client-handshake']
|
||||
volumes:
|
||||
- sql_data:/var/lib/mysql
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 500M
|
||||
|
||||
volumes:
|
||||
answer-data:
|
||||
sql_data:
|
||||
+159
-24
@@ -5895,6 +5895,132 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
},
|
||||
"/answer/api/v1/user/plugin/config": {
|
||||
"get": {
|
||||
"security": [
|
||||
{
|
||||
"ApiKeyAuth": []
|
||||
}
|
||||
],
|
||||
"description": "get user plugin config",
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"UserPlugin"
|
||||
],
|
||||
"summary": "get user plugin config",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "plugin_slug_name",
|
||||
"name": "plugin_slug_name",
|
||||
"in": "query",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/handler.RespBody"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"data": {
|
||||
"$ref": "#/definitions/schema.GetPluginConfigResp"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"put": {
|
||||
"security": [
|
||||
{
|
||||
"ApiKeyAuth": []
|
||||
}
|
||||
],
|
||||
"description": "update user plugin config",
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"UserPlugin"
|
||||
],
|
||||
"summary": "update user plugin config",
|
||||
"parameters": [
|
||||
{
|
||||
"description": "UpdatePluginConfigReq",
|
||||
"name": "data",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/schema.UpdateUserPluginConfigReq"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/handler.RespBody"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/answer/api/v1/user/plugin/configs": {
|
||||
"get": {
|
||||
"security": [
|
||||
{
|
||||
"ApiKeyAuth": []
|
||||
}
|
||||
],
|
||||
"description": "get plugin list that used for user.",
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"UserPlugin"
|
||||
],
|
||||
"summary": "get plugin list that used for user.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/handler.RespBody"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"data": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.GetUserPluginListResp"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/answer/api/v1/user/ranking": {
|
||||
"get": {
|
||||
"security": [
|
||||
@@ -7822,22 +7948,13 @@ const docTemplate = `{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"all_new_question": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"all_new_question_for_following_tags": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"inbox": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -7894,6 +8011,17 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.GetUserPluginListResp": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"slug_name": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.GetVoteWithPageResp": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -9428,22 +9556,13 @@ const docTemplate = `{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"all_new_question": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"all_new_question_for_following_tags": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"inbox": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -9464,6 +9583,22 @@ const docTemplate = `{
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.UpdateUserPluginConfigReq": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"plugin_slug_name"
|
||||
],
|
||||
"properties": {
|
||||
"config_fields": {
|
||||
"type": "object",
|
||||
"additionalProperties": {}
|
||||
},
|
||||
"plugin_slug_name": {
|
||||
"type": "string",
|
||||
"maxLength": 100
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.UpdateUserRoleReq": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
|
||||
@@ -1,3 +1,21 @@
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing,
|
||||
software distributed under the License is distributed on an
|
||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied. See the License for the
|
||||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
<svg width="126" height="44" viewBox="0 0 126 44" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="125.49" height="44" rx="6" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 14.4C8 12.1598 8 11.0397 8.43597 10.184C8.81947 9.43139 9.43139 8.81947 10.184 8.43597C11.0397 8 12.1598 8 14.4 8H29.6C31.8402 8 32.9603 8 33.816 8.43597C34.5686 8.81947 35.1805 9.43139 35.564 10.184C36 11.0397 36 12.1598 36 14.4V24.0892C36 26.9608 36 28.3967 35.5628 29.6643C35.1761 30.7853 34.5451 31.8063 33.7153 32.6535C32.7771 33.6115 31.4928 34.2536 28.9244 35.5378L28 36V32H14.4C12.1598 32 11.0397 32 10.184 31.564C9.43139 31.1805 8.81947 30.5686 8.43597 29.816C8 28.9603 8 27.8402 8 25.6V14.4ZM28 20C28 23.3137 25.3137 26 22 26C18.6954 26 16.0148 23.3285 16.0001 20.0274V20H28Z" fill="#0033FF"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 6.4 KiB |
+159
-24
@@ -5864,6 +5864,132 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"/answer/api/v1/user/plugin/config": {
|
||||
"get": {
|
||||
"security": [
|
||||
{
|
||||
"ApiKeyAuth": []
|
||||
}
|
||||
],
|
||||
"description": "get user plugin config",
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"UserPlugin"
|
||||
],
|
||||
"summary": "get user plugin config",
|
||||
"parameters": [
|
||||
{
|
||||
"type": "string",
|
||||
"description": "plugin_slug_name",
|
||||
"name": "plugin_slug_name",
|
||||
"in": "query",
|
||||
"required": true
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/handler.RespBody"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"data": {
|
||||
"$ref": "#/definitions/schema.GetPluginConfigResp"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"put": {
|
||||
"security": [
|
||||
{
|
||||
"ApiKeyAuth": []
|
||||
}
|
||||
],
|
||||
"description": "update user plugin config",
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"UserPlugin"
|
||||
],
|
||||
"summary": "update user plugin config",
|
||||
"parameters": [
|
||||
{
|
||||
"description": "UpdatePluginConfigReq",
|
||||
"name": "data",
|
||||
"in": "body",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"$ref": "#/definitions/schema.UpdateUserPluginConfigReq"
|
||||
}
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/handler.RespBody"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/answer/api/v1/user/plugin/configs": {
|
||||
"get": {
|
||||
"security": [
|
||||
{
|
||||
"ApiKeyAuth": []
|
||||
}
|
||||
],
|
||||
"description": "get plugin list that used for user.",
|
||||
"consumes": [
|
||||
"application/json"
|
||||
],
|
||||
"produces": [
|
||||
"application/json"
|
||||
],
|
||||
"tags": [
|
||||
"UserPlugin"
|
||||
],
|
||||
"summary": "get plugin list that used for user.",
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "OK",
|
||||
"schema": {
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/handler.RespBody"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"data": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.GetUserPluginListResp"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/answer/api/v1/user/ranking": {
|
||||
"get": {
|
||||
"security": [
|
||||
@@ -7791,22 +7917,13 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"all_new_question": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"all_new_question_for_following_tags": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"inbox": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -7863,6 +7980,17 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.GetUserPluginListResp": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"slug_name": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.GetVoteWithPageResp": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
@@ -9397,22 +9525,13 @@
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"all_new_question": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"all_new_question_for_following_tags": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
},
|
||||
"inbox": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
"$ref": "#/definitions/schema.NotificationChannelConfig"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -9433,6 +9552,22 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.UpdateUserPluginConfigReq": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"plugin_slug_name"
|
||||
],
|
||||
"properties": {
|
||||
"config_fields": {
|
||||
"type": "object",
|
||||
"additionalProperties": {}
|
||||
},
|
||||
"plugin_slug_name": {
|
||||
"type": "string",
|
||||
"maxLength": 100
|
||||
}
|
||||
}
|
||||
},
|
||||
"schema.UpdateUserRoleReq": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
|
||||
+97
-18
@@ -1008,17 +1008,11 @@ definitions:
|
||||
schema.GetUserNotificationConfigResp:
|
||||
properties:
|
||||
all_new_question:
|
||||
items:
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: array
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
all_new_question_for_following_tags:
|
||||
items:
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: array
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
inbox:
|
||||
items:
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: array
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: object
|
||||
schema.GetUserPageResp:
|
||||
properties:
|
||||
@@ -1059,6 +1053,13 @@ definitions:
|
||||
description: username
|
||||
type: string
|
||||
type: object
|
||||
schema.GetUserPluginListResp:
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
slug_name:
|
||||
type: string
|
||||
type: object
|
||||
schema.GetVoteWithPageResp:
|
||||
properties:
|
||||
answer_id:
|
||||
@@ -2116,17 +2117,11 @@ definitions:
|
||||
schema.UpdateUserNotificationConfigReq:
|
||||
properties:
|
||||
all_new_question:
|
||||
items:
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: array
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
all_new_question_for_following_tags:
|
||||
items:
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: array
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
inbox:
|
||||
items:
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: array
|
||||
$ref: '#/definitions/schema.NotificationChannelConfig'
|
||||
type: object
|
||||
schema.UpdateUserPasswordReq:
|
||||
properties:
|
||||
@@ -2140,6 +2135,17 @@ definitions:
|
||||
- password
|
||||
- user_id
|
||||
type: object
|
||||
schema.UpdateUserPluginConfigReq:
|
||||
properties:
|
||||
config_fields:
|
||||
additionalProperties: {}
|
||||
type: object
|
||||
plugin_slug_name:
|
||||
maxLength: 100
|
||||
type: string
|
||||
required:
|
||||
- plugin_slug_name
|
||||
type: object
|
||||
schema.UpdateUserRoleReq:
|
||||
properties:
|
||||
role_id:
|
||||
@@ -6010,6 +6016,79 @@ paths:
|
||||
summary: RetrievePassWord
|
||||
tags:
|
||||
- User
|
||||
/answer/api/v1/user/plugin/config:
|
||||
get:
|
||||
description: get user plugin config
|
||||
parameters:
|
||||
- description: plugin_slug_name
|
||||
in: query
|
||||
name: plugin_slug_name
|
||||
required: true
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
schema:
|
||||
allOf:
|
||||
- $ref: '#/definitions/handler.RespBody'
|
||||
- properties:
|
||||
data:
|
||||
$ref: '#/definitions/schema.GetPluginConfigResp'
|
||||
type: object
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
summary: get user plugin config
|
||||
tags:
|
||||
- UserPlugin
|
||||
put:
|
||||
consumes:
|
||||
- application/json
|
||||
description: update user plugin config
|
||||
parameters:
|
||||
- description: UpdatePluginConfigReq
|
||||
in: body
|
||||
name: data
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/schema.UpdateUserPluginConfigReq'
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
schema:
|
||||
$ref: '#/definitions/handler.RespBody'
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
summary: update user plugin config
|
||||
tags:
|
||||
- UserPlugin
|
||||
/answer/api/v1/user/plugin/configs:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: get plugin list that used for user.
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
schema:
|
||||
allOf:
|
||||
- $ref: '#/definitions/handler.RespBody'
|
||||
- properties:
|
||||
data:
|
||||
items:
|
||||
$ref: '#/definitions/schema.GetUserPluginListResp'
|
||||
type: array
|
||||
type: object
|
||||
security:
|
||||
- ApiKeyAuth: []
|
||||
summary: get plugin list that used for user.
|
||||
tags:
|
||||
- UserPlugin
|
||||
/answer/api/v1/user/ranking:
|
||||
get:
|
||||
consumes:
|
||||
|
||||
@@ -1,3 +1,20 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you under the Apache License, Version 2.0 (the
|
||||
// "License"); you may not use this file except in compliance
|
||||
// with the License. You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing,
|
||||
// software distributed under the License is distributed on an
|
||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
// KIND, either express or implied. See the License for the
|
||||
// specific language governing permissions and limitations
|
||||
// under the License.
|
||||
|
||||
module github.com/apache/incubator-answer
|
||||
|
||||
go 1.18
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -355,7 +355,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -428,7 +428,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -466,7 +466,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -355,7 +355,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -428,7 +428,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -466,7 +466,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -355,7 +355,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -428,7 +428,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -466,7 +466,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -355,7 +355,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -428,7 +428,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -466,7 +466,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -355,7 +355,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -428,7 +428,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -466,7 +466,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: You cannot modify your role.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: How to Format
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Notifications
|
||||
inbox: Inbox
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: Ni allwch addasu eich rôl.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: Sut i Fformatio
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: Gwall HTTP 404
|
||||
http_50X: Gwall HTTP 500
|
||||
http_403: Gwall HTTP 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Hysbysiadau
|
||||
inbox: Mewnflwch
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: Ni all ffeil fod yn wag.
|
||||
only_image: Dim ond ffeiliau delwedd a ganiateir.
|
||||
max_size: Ni all maint y ffeil fod yn fwy na 4MB.
|
||||
max_size: Ni all maint y ffeil fod yn fwy na 4 MB.
|
||||
desc:
|
||||
label: Disgrifiad
|
||||
tab_url: URL delwedd
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: Mae slug URL yn cynnwys set nodau na caniateir.
|
||||
desc:
|
||||
label: Disgrifiad
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Canslo
|
||||
btn_submit: Cyflwyno
|
||||
btn_post: Post tag newydd
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Ychwanegu Cwestiwn
|
||||
edit_title: Golygu Cwestiwn
|
||||
default_reason: Golygu Cwestiwn
|
||||
default_first_reason: Add question
|
||||
similar_questions: Cwestiynau tebyg
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: You cannot modify your role.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: How to Format
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Notifications
|
||||
inbox: Inbox
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+111
-82
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -31,7 +31,7 @@ backend:
|
||||
forbidden_error:
|
||||
other: Verboten.
|
||||
duplicate_request_error:
|
||||
other: Duplicate submission.
|
||||
other: Doppelte Einreichung.
|
||||
action:
|
||||
report:
|
||||
other: Melden
|
||||
@@ -56,7 +56,7 @@ backend:
|
||||
invite_someone_to_answer:
|
||||
other: Bearbeiten
|
||||
undelete:
|
||||
other: Undelete
|
||||
other: Wiederherstellen
|
||||
role:
|
||||
name:
|
||||
user:
|
||||
@@ -75,13 +75,16 @@ backend:
|
||||
privilege:
|
||||
level_1:
|
||||
description:
|
||||
other: Stufe 1 (weniger Ansehen erforderlich für privates Team, Gruppe)
|
||||
other: Level 1 (less reputation required for private team, group)
|
||||
level_2:
|
||||
description:
|
||||
other: Stufe 2 (geringes Ansehen für Startup-Community erforderlich)
|
||||
other: Level 2 (low reputation required for startup community)
|
||||
level_3:
|
||||
description:
|
||||
other: Stufe 3 (hohes Ansehen für reife Gemeinschaft erforderlich)
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Fragen stellen
|
||||
rank_answer_add_label:
|
||||
@@ -179,9 +182,9 @@ backend:
|
||||
captcha_verification_failed:
|
||||
other: Captcha ist falsch.
|
||||
disallow_follow:
|
||||
other: Es ist dir nicht erlaubt, zu folgen.
|
||||
other: Es ist dir nicht erlaubt zu folgen.
|
||||
disallow_vote:
|
||||
other: Du darfst nicht abstimmen.
|
||||
other: Es ist dir nicht erlaubt abzustimmen.
|
||||
disallow_vote_your_self:
|
||||
other: Du kannst nicht für deinen eigenen Beitrag stimmen.
|
||||
not_found:
|
||||
@@ -202,7 +205,7 @@ backend:
|
||||
cannot_deleted:
|
||||
other: Keine Berechtigung zum Löschen.
|
||||
cannot_close:
|
||||
other: Keine Erlaubnis zum Schließen.
|
||||
other: Keine Berechtigung zum Schließen.
|
||||
cannot_update:
|
||||
other: Keine Berechtigung zum Aktualisieren.
|
||||
rank:
|
||||
@@ -214,9 +217,9 @@ backend:
|
||||
other: Dafür brauchst du mindestens {{.Rank}} Ansehen.
|
||||
report:
|
||||
handle_failed:
|
||||
other: Berichtshandle fehlgeschlagen.
|
||||
other: Bearbeiten der Meldung fehlgeschlagen.
|
||||
not_found:
|
||||
other: Report nicht gefunden.
|
||||
other: Meldung nicht gefunden.
|
||||
tag:
|
||||
already_exist:
|
||||
other: Tag existiert bereits.
|
||||
@@ -242,7 +245,7 @@ backend:
|
||||
other: Design nicht gefunden.
|
||||
revision:
|
||||
review_underway:
|
||||
other: Kann momentan nicht bearbeiten, es gibt eine Version in der Warteschlange.
|
||||
other: Kann derzeit nicht bearbeitet werden, es existiert eine Version in der Überprüfungswarteschlange.
|
||||
no_permission:
|
||||
other: Keine Berechtigung zum Überarbeiten.
|
||||
user:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: Du kannst deine Rolle nicht ändern.
|
||||
not_allowed_registration:
|
||||
other: Derzeit ist die Seite nicht für die Anmeldung geöffnet.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Zugriff verweigert
|
||||
page_access_denied:
|
||||
@@ -300,68 +305,68 @@ backend:
|
||||
other: Dieser Beitrag ist eine Werbung oder Vandalismus. Er ist nicht nützlich oder relevant für das aktuelle Thema.
|
||||
rude_or_abusive:
|
||||
name:
|
||||
other: rude or abusive
|
||||
other: unhöflich oder beleidigend
|
||||
desc:
|
||||
other: Eine vernünftige Person würde diesen Inhalt als unangemessen für einen respektvollen Diskurs empfinden.
|
||||
a_duplicate:
|
||||
name:
|
||||
other: a duplicate
|
||||
other: ein Duplikat
|
||||
desc:
|
||||
other: Diese Frage wurde schon einmal gestellt und hat bereits eine Antwort.
|
||||
placeholder:
|
||||
other: Gib den Link zur bestehenden Frage ein
|
||||
not_a_answer:
|
||||
name:
|
||||
other: not an answer
|
||||
other: keine Antwort
|
||||
desc:
|
||||
other: Das wurde als Antwort gepostet, aber es versucht nicht, die Frage zu beantworten. Sie sollte entweder bearbeitet, kommentiert, als weitere Frage gestellt oder ganz gelöscht werden.
|
||||
no_longer_needed:
|
||||
name:
|
||||
other: no longer needed
|
||||
other: nicht mehr benötigt
|
||||
desc:
|
||||
other: Dieser Kommentar ist veraltet oder nicht relevant für diesen Beitrag.
|
||||
something:
|
||||
name:
|
||||
other: something else
|
||||
other: anderer Grund
|
||||
desc:
|
||||
other: Dieser Posten erfordert die Aufmerksamkeit des Personals aus einem anderen, oben nicht genannten Grund.
|
||||
other: Dieser Beitrag erfordert die Aufmerksamkeit der Temmitglieder aus einem anderen, oben nicht genannten Grund.
|
||||
placeholder:
|
||||
other: Lass uns wissen, worüber du dir Sorgen machst
|
||||
community_specific:
|
||||
name:
|
||||
other: a community-specific reason
|
||||
other: ein Community-spezifischer Grund
|
||||
desc:
|
||||
other: Diese Frage entspricht nicht den Gemeinschaftsrichtlinien.
|
||||
not_clarity:
|
||||
name:
|
||||
other: needs details or clarity
|
||||
other: benötigt Details oder Klarheit
|
||||
desc:
|
||||
other: Diese Frage enthält derzeit mehrere Fragen in einer. Sie sollte sich auf ein einziges Problem konzentrieren.
|
||||
looks_ok:
|
||||
name:
|
||||
other: looks OK
|
||||
other: sieht OK aus
|
||||
desc:
|
||||
other: Dieser Beitrag ist gut so wie er ist und nicht von schlechter Qualität.
|
||||
needs_edit:
|
||||
name:
|
||||
other: needs edit, and I did it
|
||||
other: muss bearbeitet werden, und ich habe es getan
|
||||
desc:
|
||||
other: Verbessere und korrigiere Probleme mit diesem Beitrag selbst.
|
||||
needs_close:
|
||||
name:
|
||||
other: needs close
|
||||
other: muss geschlossen werden
|
||||
desc:
|
||||
other: Eine geschlossene Frage kann nicht beantwortet werden, aber du kannst sie trotzdem bearbeiten, abstimmen und kommentieren.
|
||||
needs_delete:
|
||||
name:
|
||||
other: needs delete
|
||||
other: muss gelöscht werden
|
||||
desc:
|
||||
other: Dieser Beitrag wird gelöscht.
|
||||
question:
|
||||
close:
|
||||
duplicate:
|
||||
name:
|
||||
other: spam
|
||||
other: Spam
|
||||
desc:
|
||||
other: Diese Frage ist bereits gestellt worden und hat bereits eine Antwort.
|
||||
guideline:
|
||||
@@ -405,7 +410,7 @@ backend:
|
||||
reply_to_you:
|
||||
other: hat Ihnen geantwortet
|
||||
mention_you:
|
||||
other: mentioned you
|
||||
other: hat dich erwähnt
|
||||
your_question_is_closed:
|
||||
other: Deine Frage wurde geschlossen
|
||||
your_question_was_deleted:
|
||||
@@ -415,23 +420,23 @@ backend:
|
||||
your_comment_was_deleted:
|
||||
other: Dein Kommentar wurde gelöscht
|
||||
up_voted_question:
|
||||
other: upvoted question
|
||||
other: positiv bewertete Frage
|
||||
down_voted_question:
|
||||
other: downvoted question
|
||||
other: negativ bewertete Frage
|
||||
up_voted_answer:
|
||||
other: upvoted answer
|
||||
other: positiv bewertete Antwort
|
||||
down_voted_answer:
|
||||
other: downvoted answer
|
||||
other: negativ bewertete Antwort
|
||||
up_voted_comment:
|
||||
other: upvoted comment
|
||||
other: positiv bewerteter Kommentar
|
||||
invited_you_to_answer:
|
||||
other: invited you to answer
|
||||
other: hat dich eingeladen, zu antworten
|
||||
email_tpl:
|
||||
change_email:
|
||||
title:
|
||||
other: "[{{.SiteName}}] Bestätige deine neue E-Mail-Adresse"
|
||||
body:
|
||||
other: "Bestätige deine neue E-Mail-Adresse für {{.SiteName}}, indem du auf den folgenden Link klickst:<br> <a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}} </a><br><br>\n\nWenn du diese Änderung nicht beantragt hast, ignoriere bitte diese E-Mail."
|
||||
other: "Bestätige deine neue E-Mail-Adresse für {{.SiteName}}, indem du auf den folgenden Link klickst:<br>\n<a href='{{.ChangeEmailUrl}}' target='_blank'>{{.ChangeEmailUrl}}</a><br><br>\n\nWenn du diese Änderung nicht beantragt hast, ignoriere bitte diese E-Mail."
|
||||
new_answer:
|
||||
title:
|
||||
other: "[{{.SiteName}}] {{.DisplayName}} hat deine Frage beantwortet"
|
||||
@@ -446,7 +451,7 @@ backend:
|
||||
title:
|
||||
other: "[{{.SiteName}}] {{.DisplayName}} hat deinen Beitrag kommentiert"
|
||||
body:
|
||||
other: "<a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a><br><br>\n\n{{.DisplayName}}:<br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>Auf {{.SiteName}} ansehen</a><br><br>\n\n--<br>\n<small><a href='{{.UnsubscribeUrl}}'>Abbstellen</a></small>"
|
||||
other: "<a href='{{.CommentUrl}}'>{{.QuestionTitle}}</a><br><br>\n\n{{.DisplayName}}:<br>\n<blockquote>{{.CommentSummary}}</blockquote><br>\n<a href='{{.CommentUrl}}'>Auf {{.SiteName}} ansehen</a><br><br>\n\n--<br>\n<small><a href='{{.UnsubscribeUrl}}'>Abbestellen</a></small>"
|
||||
new_question:
|
||||
title:
|
||||
other: "[{{.SiteName}}] Neue Frage: {{.QuestionTitle}}"
|
||||
@@ -469,23 +474,23 @@ backend:
|
||||
other: "Dies ist eine Test-Email."
|
||||
action_activity_type:
|
||||
upvote:
|
||||
other: upvote
|
||||
other: positiv bewerten
|
||||
upvoted:
|
||||
other: upvoted
|
||||
other: positiv bewertet
|
||||
downvote:
|
||||
other: downvote
|
||||
other: negativ bewerten
|
||||
downvoted:
|
||||
other: downvoted
|
||||
other: negativ bewertet
|
||||
accept:
|
||||
other: accept
|
||||
other: akzeptieren
|
||||
accepted:
|
||||
other: accepted
|
||||
#The following fields are used for interface presentation(Front-end)
|
||||
other: akzeptiert
|
||||
# The following fields are used for interface presentation(Front-end)
|
||||
ui:
|
||||
how_to_format:
|
||||
title: Wie man formatiert
|
||||
desc: >-
|
||||
<ul class="mb-0"><li><p class="mb-2">um Links zu erstellen</p><pre class="mb-2"><code><https://url.com><br/><br/>[Title](https://url.com)</code></pre></li><li><p class="mb-2">put gibt zurück zwischen Absätzen</p></li><li><p class="mb-2"><em>_italic_</em> oder **<strong>fett</strong>**</p></li><li><p class="mb-2">Code um 4 Leerzeichen einrücken</p></li><li><p class="mb-2">Zitat durch Platzieren von <code>></code> am Zeilenanfang</p></li><li><p class="mb-2">Backtick-Escapes <code>`like _this_`</code></p></li><li><p class="mb-2">erzeuge Codezäune mit Backticks <code>`</code></p><pre class="mb-0"><code>```<br/>code hier<br/>```</code></pre></li></ul>
|
||||
<ul class="mb-0"><li><p class="mb-2">um Links</p><pre class="mb-2"><code><https://url.com><br/><br/>[Titel](https://url.com)</code></pre></li><li><p class="mb-2">Zwischen den Absätzen Zeilenumbrüche einfügen</p></li><li><p class="mb-2"><em>_italic_</em> oder **<strong>fett</strong>**</p></li><li><p class="mb-2">Code um 4 Leerzeichen einrücken</p></li><li><p class="mb-2">Zitat durch Setzen von <code>> </code> am Anfang der Zeile</p></li><li><p class="mb-2">Backtick-Escapes <code>`wie _this_`</code></p></li><li><p class="mb-2">Codeumrandungen mit Backticks <code>`</code></p><pre class="mb-0"><code>`<br/>Code hier<br/>``</code></pre></li></ul>
|
||||
pagination:
|
||||
prev: Zurück
|
||||
next: Weiter
|
||||
@@ -514,19 +519,20 @@ ui:
|
||||
change_email: E-Mails ändern
|
||||
install: Installation beantworten
|
||||
upgrade: Antwort-Upgrade
|
||||
maintenance: Website-Pflege
|
||||
maintenance: Website-Wartung
|
||||
users: Benutzer
|
||||
oauth_callback: In Bearbeitung
|
||||
http_404: HTTP-Fehler 404
|
||||
http_50X: HTTP-Fehler 500
|
||||
http_403: HTTP Fehler 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Benachrichtigungen
|
||||
inbox: Posteingang
|
||||
achievement: Erfolge
|
||||
new_alerts: Neue Benachrichtigungen
|
||||
all_read: Alle als gelesen markieren
|
||||
show_more: Mehr Anzeigen
|
||||
show_more: Mehr anzeigen
|
||||
someone: Jemand
|
||||
inbox_type:
|
||||
all: Alle
|
||||
@@ -550,7 +556,7 @@ ui:
|
||||
sequence_diagram: Sequenzdiagramm
|
||||
class_diagram: Klassen Diagramm
|
||||
state_diagram: Zustandsdiagramm
|
||||
entity_relationship_diagram: Entity-Relationship-Diagramm
|
||||
entity_relationship_diagram: Entitätsbeziehungsdiagramm
|
||||
user_defined_diagram: Benutzerdefiniertes Diagramm
|
||||
gantt_chart: Gantt-Diagramm
|
||||
pie_chart: Kuchendiagramm
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: Datei darf nicht leer sein.
|
||||
only_image: Nur Bilddateien sind erlaubt.
|
||||
max_size: Die Dateigröße darf 4MB nicht überschreiten.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Beschreibung
|
||||
tab_url: Bild URL
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL-Slug enthält nicht erlaubten Zeichensatz.
|
||||
desc:
|
||||
label: Beschreibung
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Abbrechen
|
||||
btn_submit: Senden
|
||||
btn_post: Neuen Tag erstellen
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Tag bearbeiten
|
||||
default_reason: Tag bearbeiten
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Anzeigename
|
||||
slug_name:
|
||||
label: URL-Slug
|
||||
info: 'Muss den Zeichensatz "a-z", "0-9", "+ # - ." verwenden'
|
||||
desc:
|
||||
label: Beschreibung
|
||||
edit_summary:
|
||||
label: Zusammenfassung bearbeiten
|
||||
placeholder: >-
|
||||
Erkläre kurz deine Änderungen (korrigierte Rechtschreibung, korrigierte Grammatik, verbesserte Formatierung)
|
||||
default_first_reason: Schlagwort hinzufügen
|
||||
btn_save_edits: Änderungen speichern
|
||||
btn_cancel: Stornieren
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "vor {{count}}h"
|
||||
hour: stunde
|
||||
day: tag
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Einen Kommentar hinzufügen
|
||||
reply_to: Antwort an
|
||||
@@ -740,15 +740,16 @@ ui:
|
||||
btn_flag: Flagge
|
||||
btn_save_edits: Änderungen speichern
|
||||
btn_cancel: Stornieren
|
||||
show_more: Weitere Kommentare anzeigen
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Verwende Kommentare, um nach weiteren Informationen zu fragen oder Verbesserungen vorzuschlagen. Vermeide es, Fragen in Kommentaren zu beantworten.
|
||||
tip_answer: >-
|
||||
Verwende Stellungsnahmen, um anderen Nutzern zu antworten oder sie über Änderungen zu informieren. Wenn du neue Informationen hinzufügst, bearbeite deinen Beitrag, anstatt zu kommentieren.
|
||||
tip_vote: It adds something useful to the post
|
||||
tip_vote: Es fügt dem Beitrag etwas Nützliches hinzu
|
||||
edit_answer:
|
||||
title: Antwort bearbeiten
|
||||
default_reason: Antwort bearbeiten
|
||||
default_first_reason: Antwort hinzufügen
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Frage hinzufügen
|
||||
edit_title: Frage bearbeiten
|
||||
default_reason: Frage bearbeiten
|
||||
default_first_reason: Frage hinzufügen
|
||||
similar_questions: Ähnliche Fragen
|
||||
form:
|
||||
fields:
|
||||
@@ -808,7 +810,7 @@ ui:
|
||||
Erkläre kurz deine Änderungen (korrigierte Rechtschreibung, korrigierte Grammatik, verbesserte Formatierung)
|
||||
btn_post_question: Poste deine Frage
|
||||
btn_save_edits: Änderungen speichern
|
||||
answer_question: Answer your own question
|
||||
answer_question: Eigene Frage beantworten
|
||||
post_question&answer: Poste deine Frage und Antwort
|
||||
tag_selector:
|
||||
add_btn: Schlagwort hinzufügen
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Suchen
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Ändern
|
||||
loading: wird geladen...
|
||||
@@ -868,14 +870,14 @@ ui:
|
||||
range: Name mit bis zu 30 Zeichen.
|
||||
character: 'Muss den Zeichensatz "a-z", "0-9", " - . _" verwenden'
|
||||
email:
|
||||
label: Email
|
||||
label: E-Mail
|
||||
msg:
|
||||
empty: E-Mail-Feld darf nicht leer sein.
|
||||
password:
|
||||
label: Passwort
|
||||
msg:
|
||||
empty: Passwort-Feld darf nicht leer sein.
|
||||
different: The passwords entered on both sides are inconsistent
|
||||
different: Die beiden eingegebenen Passwörter stimmen nicht überein
|
||||
account_forgot:
|
||||
page_title: Dein Passwort vergessen
|
||||
btn_name: Schicke mir eine E-Mail zur Wiederherstellung
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Standort
|
||||
placeholder: "Stadt, Land"
|
||||
notification:
|
||||
heading: Benachrichtigungen
|
||||
email: E-Mail
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email-Benachrichtigungen
|
||||
label: Inbox notifications
|
||||
description: Antworten auf deine Fragen, Kommentare, Einladungen und mehr.
|
||||
all_new_question:
|
||||
label: Alle neuen Fragen
|
||||
@@ -1010,7 +1012,7 @@ ui:
|
||||
modal_confirm_btn: Entfernen
|
||||
remove_success: Erfolgreich entfernt
|
||||
toast:
|
||||
update: update success
|
||||
update: Aktualisierung erfolgreich
|
||||
update_password: Das Kennwort wurde erfolgreich geändert.
|
||||
flag_success: Danke fürs Markieren.
|
||||
forbidden_operate_self: Verboten, an sich selbst zu operieren
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: antworten
|
||||
invite_to_answer:
|
||||
title: Menschen gefragt
|
||||
desc: Lade Leute ein, von denen du denkst, dass sie die Antwort wissen könnten.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Zur Antwort einladen
|
||||
add: Personen hinzufügen
|
||||
search: Personen suchen
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Akzeptiert
|
||||
write_answer:
|
||||
title: Deine Antwort
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Poste deine Antwort
|
||||
add_another_answer: Weitere Antwort hinzufügen
|
||||
confirm_title: Antworten fortsetzen
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Suchergebnisse
|
||||
keywords: Schlüsselwörter
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Willkommen beim Answer-Admin!
|
||||
site_statistics: Site-Statistiken
|
||||
site_statistics: Site statistics
|
||||
questions: "Fragen:"
|
||||
answers: "Antworten:"
|
||||
comments: "Kommentare:"
|
||||
votes: "Stimmen:"
|
||||
active_users: "Aktive Benutzer:"
|
||||
users: "Users:"
|
||||
flags: "Meldungen:"
|
||||
site_health_status: Website-Gesundheitsstatus
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Dateien hochladen:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Zeitzone:"
|
||||
system_info: Systeminformationen
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Verwendeter Speicher:"
|
||||
uptime: "Betriebszeit:"
|
||||
answer_links: Antwortlinks
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Dokumentation
|
||||
feedback: Rückmeldung
|
||||
support: Unterstützung
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Erlaubt
|
||||
enabled: Ermöglicht
|
||||
disabled: Behinderte
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Meldungen
|
||||
pending: Ausstehend
|
||||
@@ -1467,7 +1487,7 @@ ui:
|
||||
text: Don’t check this if you wish to only delete the user’s account.
|
||||
suspend_user:
|
||||
title: Suspend this user
|
||||
content: A suspended user can't log in.
|
||||
content: Ein gesperrter Benutzer kann sich nicht einloggen.
|
||||
questions:
|
||||
page_title: Fragen
|
||||
normal: Normal
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "Du kannst hier Inhalte zur Datenschutzerklärung hinzufügen. Wenn du bereits ein Dokument hast, das anderswo gehostet wird, gib hier die vollständige URL an."
|
||||
write:
|
||||
page_title: Schreiben
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Empfohlene Tags
|
||||
text: "Bitte gib den Tag-Slug oben ein, ein Tag pro Zeile."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themen
|
||||
text: Wähle ein bestehendes Thema aus.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar-Stil
|
||||
text: Wähle ein bestehendes Thema aus.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primärfarbe
|
||||
label: Primary color
|
||||
text: Ändere die Farben, die von deinen Themes verwendet werden
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Privatgelände
|
||||
label: Anmeldung erforderlich
|
||||
text: Nur angemeldete Benutzer können auf diese Community zugreifen.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installierte Plugins
|
||||
plugin_link: Plugins erweitern und ergänzen die Funktionalität von Answer. Du kannst Plugins im <1>Answer Plugin Repository</1> finden.
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+25
-25
@@ -83,6 +83,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -615,7 +618,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -695,6 +698,13 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar,
|
||||
improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -724,22 +734,6 @@ ui:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
default_first_reason: Add tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar,
|
||||
improved formatting)
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -763,7 +757,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid
|
||||
answering questions in comments.
|
||||
@@ -999,10 +993,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1058,7 +1052,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1159,6 +1153,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1687,11 +1686,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
|
||||
+424
-420
File diff suppressed because it is too large
Load Diff
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: سطح ۳ (شهرت بالایی برای نیاز هست برای انجمن های تکمیل)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: سوال بپرس
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: شما نمی توانید وظیفه خود را تغییر دهید.
|
||||
not_allowed_registration:
|
||||
other: درحال حاضر سایت برای ثبت نام باز نیست.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: دسترسی مجاز نیست
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: پذیرفتن
|
||||
accepted:
|
||||
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: نحوه فرمت کردن
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: خطای 404 HTTP
|
||||
http_50X: خطای 500 HTTP
|
||||
http_403: خطای 403 HTTP
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: اعلانات
|
||||
inbox: پیغامهای دریافتی
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: فایل نمی تواند خالی باشد.
|
||||
only_image: فقط فایل های تصویری مجاز هستند.
|
||||
max_size: حجم فایل نمی تواند بیشتر از ۴ مگابایت باشد.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: توضیحات
|
||||
tab_url: لینک عکس
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: نامک آدرس شامل کلمات غیر مجاز می باشد.
|
||||
desc:
|
||||
label: توضیحات
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: لغو
|
||||
btn_submit: ثبت
|
||||
btn_post: پست کردن تگ جدید
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: ویرایش تگ
|
||||
default_reason: ویرایش تگ
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: بازنگری
|
||||
display_name:
|
||||
label: نام
|
||||
slug_name:
|
||||
label: نامک نشانی اینترنتی
|
||||
info: 'باید از حروف "a-z", "0-9", "+ # -" استفاده شود'
|
||||
desc:
|
||||
label: توضیحات
|
||||
edit_summary:
|
||||
label: ویرایش خلاصه
|
||||
placeholder: >-
|
||||
بطور خلاصه تغییرات را توضیح دهید (اصلاح املایی، اصلاح دستورزبان، بهبود فرمت دهی)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: ذخیره ویرایشها
|
||||
btn_cancel: لغو
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}ساعت پیش"
|
||||
hour: ساعت
|
||||
day: روز
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: افزودن نظر
|
||||
reply_to: پاسخ به
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: نشان
|
||||
btn_save_edits: ذخیره ویرایشها
|
||||
btn_cancel: لغو
|
||||
show_more: نمایش نظرات بیشتر
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
از نظرات برای درخواست اطلاعات بیشتر یا پیشنهاد بهبود استفاده کنید. از پاسخ دادن به سوالات در نظرات خودداری کنید.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: ویرایش جواب
|
||||
default_reason: ویرایش جواب
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: سوالی اضافه کنید
|
||||
edit_title: سوال را ویرایش کنید
|
||||
default_reason: سوال را ویرایش کنید
|
||||
default_first_reason: Add question
|
||||
similar_questions: سؤال های مشابه
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: جستجو
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: تغییر
|
||||
loading: درحال بارگذاری...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: موقعیت
|
||||
placeholder: "شهر، کشور"
|
||||
notification:
|
||||
heading: اعلانات
|
||||
email: ایمیل
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: اعلانات ایمیل
|
||||
label: Inbox notifications
|
||||
description: پاسخ به سوالات خود، نظرات، دعوت ها،و بیشتر.
|
||||
all_new_question:
|
||||
label: تمامی سوالات جدید
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: جواب ها
|
||||
invite_to_answer:
|
||||
title: مردم پرسیدند
|
||||
desc: افرادی را دعوت کنید که فکر می کنید ممکن است پاسخ را بدانند.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: دعوت به پاسخ
|
||||
add: افزودن افراد
|
||||
search: جستجوی افراد
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: پذیرفته شده
|
||||
write_answer:
|
||||
title: پاسخ شما
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: پاسخ خود را ارسال کنید
|
||||
add_another_answer: پاسخ دیگری اضافه کنید
|
||||
confirm_title: به پاسخ دادن ادامه دهید
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: نتایج جستجو
|
||||
keywords: کلیدواژه ها
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: داشبرد
|
||||
welcome: به پاسخ مدیر خوش آمدید!
|
||||
site_statistics: آمار سایت
|
||||
site_statistics: Site statistics
|
||||
questions: "سوالات:"
|
||||
answers: "جواب ها:"
|
||||
comments: "نظرات:"
|
||||
votes: "آرا:"
|
||||
active_users: "کاربران فعال:"
|
||||
users: "Users:"
|
||||
flags: "علامتها:"
|
||||
site_health_status: وضعیت سلامت سایت
|
||||
site_health_status: Site health status
|
||||
version: "نسخه:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "فایل های در حال آپلود:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "منطقه زمانی:"
|
||||
system_info: اطلاعات سیستم
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "فضای استفاده شده:"
|
||||
uptime: "پایداری:"
|
||||
answer_links: لینک های Answer
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: اسناد
|
||||
feedback: ﺑﺎﺯﺧﻮﺭﺩ
|
||||
support: پشتیبانی
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: مجاز
|
||||
enabled: فعال
|
||||
disabled: غیرفعال
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: علامتها
|
||||
pending: در حالت انتظار
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: نوشتن
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+281
-252
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -355,7 +355,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -428,7 +428,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -466,7 +466,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: Anda tidak dapat memodifikasi role anda sendiri.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: Cara memformat
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Pemberitahuan
|
||||
inbox: Kotak Masuk
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File tidak boleh kosong.
|
||||
only_image: Hanya file Gambar yang diperbolehkan.
|
||||
max_size: Ukuran file tidak boleh melebihi 4MB.
|
||||
max_size: Ukuran file tidak boleh melebihi 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: URL gambar
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Ubah Tag
|
||||
default_reason: Sunting tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revisi
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Harus menggunakan set karakter "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Deskripsi
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Jelaskan secara singkat perubahan yang Anda lakukan (ejaan yang diperbaiki, tata bahasa yang diperbaiki, pemformatan yang ditingkatkan)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Simpan suntingan
|
||||
btn_cancel: Batal
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: jam
|
||||
day: hari
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Tambahkan Komentar
|
||||
reply_to: Balas ke
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Simpan suntingan
|
||||
btn_cancel: Batal
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Gunakan komentar untuk meminta informasi lebih lanjut atau menyarankan perbaikan. Hindari menjawab pertanyaan di komentar.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Sunting jawaban
|
||||
default_reason: Edit jawaban
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Cari
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Ubah
|
||||
loading: sedang memuat...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: jawaban
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Diterima
|
||||
write_answer:
|
||||
title: Jawaban Anda
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Kirimkan jawaban Anda
|
||||
add_another_answer: Tambahkan jawaban lain
|
||||
confirm_title: Lanjutkan menjawab
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dasbor
|
||||
welcome: Selamat datang di Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Pertanyaan:"
|
||||
answers: "Jawaban:"
|
||||
comments: "Komentar:"
|
||||
votes: "Vote:"
|
||||
active_users: "Pengguna aktif:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Versi:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Mengunggah berkas:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Zona Waktu:"
|
||||
system_info: Informasi Sistem
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Penyimpanan yang terpakai:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Tautan Answer
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Dokumen
|
||||
feedback: Masukan
|
||||
support: Dukungan
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: Non puoi modificare il tuo ruolo.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: Come formattare
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Notifications
|
||||
inbox: Inbox
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+114
-85
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -52,9 +52,9 @@ backend:
|
||||
unpin:
|
||||
other: Unpin
|
||||
show:
|
||||
other: List
|
||||
other: リスト
|
||||
invite_someone_to_answer:
|
||||
other: Edit
|
||||
other: 編集
|
||||
undelete:
|
||||
other: Undelete
|
||||
role:
|
||||
@@ -82,14 +82,17 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
other: 質問する
|
||||
rank_answer_add_label:
|
||||
other: Write answer
|
||||
other: 回答を書く
|
||||
rank_comment_add_label:
|
||||
other: Write comment
|
||||
other: コメントを書く
|
||||
rank_report_add_label:
|
||||
other: Flag
|
||||
other: フラグ
|
||||
rank_comment_vote_up_label:
|
||||
other: Upvote comment
|
||||
rank_link_url_limit_label:
|
||||
@@ -105,7 +108,7 @@ backend:
|
||||
rank_invite_someone_to_answer_label:
|
||||
other: Invite someone to answer
|
||||
rank_tag_add_label:
|
||||
other: Create new tag
|
||||
other: 新しいタグを作成
|
||||
rank_tag_edit_label:
|
||||
other: Edit tag description (need to review)
|
||||
rank_question_edit_label:
|
||||
@@ -133,7 +136,7 @@ backend:
|
||||
password:
|
||||
other: パスワード
|
||||
pass:
|
||||
other: Password
|
||||
other: パスワード
|
||||
email_or_password_wrong_error:
|
||||
other: メールアドレスとパスワードが一致しません。
|
||||
error:
|
||||
@@ -267,8 +270,10 @@ backend:
|
||||
other: You cannot modify your role.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
other: アクセスが拒否されました
|
||||
page_access_denied:
|
||||
other: You do not have access to this page.
|
||||
add_bulk_users_format_error:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: How to Format
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP エラー 404
|
||||
http_50X: HTTP エラー 500
|
||||
http_403: HTTP エラー 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: 通知
|
||||
inbox: 受信トレイ
|
||||
@@ -529,16 +535,16 @@ ui:
|
||||
show_more: もっと見る
|
||||
someone: Someone
|
||||
inbox_type:
|
||||
all: All
|
||||
posts: Posts
|
||||
invites: Invites
|
||||
votes: Votes
|
||||
all: すべて
|
||||
posts: 投稿
|
||||
invites: 招待
|
||||
votes: 投票
|
||||
suspended:
|
||||
title: あなたのアカウントは停止されています。
|
||||
until_time: "あなたのアカウントは {{ time }} まで停止されました。"
|
||||
forever: このユーザーは永久に停止されました。
|
||||
end: You don't meet a community guideline.
|
||||
contact_us: Contact us
|
||||
contact_us: お問い合わせ
|
||||
editor:
|
||||
blockquote:
|
||||
text: 引用
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: ファイルは空にできません。
|
||||
only_image: 画像ファイルのみが許可されています。
|
||||
max_size: ファイルサイズは4MBを超えることはできません。
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: 説明
|
||||
tab_url: 画像URL
|
||||
@@ -670,7 +676,7 @@ ui:
|
||||
empty: 表示名を入力してください。
|
||||
range: 表示名は最大 35 文字までです。
|
||||
slug_name:
|
||||
label: URL slug
|
||||
label: URLスラッグ
|
||||
desc: '文字セット「a-z」、「0-9」、「+ # -」を使用する必要があります。'
|
||||
msg:
|
||||
empty: URL スラッグを空にすることはできません。
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: 説明
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: キャンセル
|
||||
btn_submit: 送信
|
||||
btn_post: 新しいタグを投稿
|
||||
@@ -704,23 +716,9 @@ ui:
|
||||
edit_tag:
|
||||
title: タグを編集
|
||||
default_reason: タグを編集
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
btn_cancel: キャンセル
|
||||
dates:
|
||||
long_date: MMM D
|
||||
long_date_with_year: "MMM D, YYYY"
|
||||
@@ -729,26 +727,29 @@ ui:
|
||||
x_seconds_ago: "{{count}}s ago"
|
||||
x_minutes_ago: "{{count}}m ago"
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hour: 時
|
||||
day: 日
|
||||
hours: 時
|
||||
days: 日
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
btn_add_comment: コメントを追加
|
||||
reply_to: Reply to
|
||||
btn_reply: Reply
|
||||
btn_edit: Edit
|
||||
btn_delete: Delete
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
btn_reply: 返信
|
||||
btn_edit: 編集
|
||||
btn_delete: 削除
|
||||
btn_flag: フラグ
|
||||
btn_save_edits: 編集内容を保存
|
||||
btn_cancel: キャンセル
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
Use comments to reply to other users or notify them of changes. If you are adding new information, edit your post instead of commenting.
|
||||
tip_vote: It adds something useful to the post
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
title: 回答を編集
|
||||
default_reason: 回答を編集
|
||||
default_first_reason: 回答を追加
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -762,24 +763,25 @@ ui:
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
btn_cancel: キャンセル
|
||||
tags:
|
||||
title: Tags
|
||||
title: タグ
|
||||
sort_buttons:
|
||||
popular: Popular
|
||||
name: Name
|
||||
newest: Newest
|
||||
button_follow: Follow
|
||||
button_following: Following
|
||||
tag_label: questions
|
||||
search_placeholder: Filter by tag name
|
||||
popular: 人気
|
||||
name: 名前
|
||||
newest: 最新
|
||||
button_follow: フォロー
|
||||
button_following: フォロー中
|
||||
tag_label: 質問
|
||||
search_placeholder: タグ名でフィルタ
|
||||
no_desc: The tag has no description.
|
||||
more: More
|
||||
ask:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
similar_questions: Similar questions
|
||||
title: 質問を追加
|
||||
edit_title: 質問を編集
|
||||
default_reason: 質問を編集
|
||||
default_first_reason: 質問を追加
|
||||
similar_questions: 類似の質問
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -825,18 +827,18 @@ ui:
|
||||
profile: Profile
|
||||
setting: Settings
|
||||
logout: Log out
|
||||
admin: Admin
|
||||
review: Review
|
||||
bookmark: Bookmarks
|
||||
admin: 管理者
|
||||
review: レビュー
|
||||
bookmark: ブックマーク
|
||||
moderation: Moderation
|
||||
search:
|
||||
placeholder: Search
|
||||
placeholder: 検索
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
name: 変更
|
||||
loading: 読み込み中…
|
||||
pic_auth_code:
|
||||
title: Captcha
|
||||
placeholder: Type the text above
|
||||
@@ -925,7 +927,7 @@ ui:
|
||||
password_confirm:
|
||||
label: Confirm new password
|
||||
settings:
|
||||
page_title: Settings
|
||||
page_title: 設定
|
||||
goto_modify: Go to modify
|
||||
nav:
|
||||
profile: Profile
|
||||
@@ -940,18 +942,18 @@ ui:
|
||||
msg: Display name cannot be empty.
|
||||
msg_range: Display name up to 30 characters.
|
||||
username:
|
||||
label: Username
|
||||
label: ユーザー名
|
||||
caption: People can mention you as "@username".
|
||||
msg: Username cannot be empty.
|
||||
msg_range: Username up to 30 characters.
|
||||
character: 'Must use the character set "a-z", "0-9", " - . _"'
|
||||
avatar:
|
||||
label: Profile image
|
||||
label: プロフィール画像
|
||||
gravatar: Gravatar
|
||||
gravatar_text: You can change image on
|
||||
custom: Custom
|
||||
custom_text: You can upload your image.
|
||||
default: System
|
||||
default: システム
|
||||
msg: Please upload an avatar
|
||||
bio:
|
||||
label: About me
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: ダッシュボード
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: サイト統計
|
||||
site_statistics: Site statistics
|
||||
questions: "質問:"
|
||||
answers: "回答:"
|
||||
comments: "評論:"
|
||||
votes: "投票:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: フィードバック
|
||||
support: サポート
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
@@ -1671,7 +1700,7 @@ ui:
|
||||
plugins:
|
||||
label: Plugins
|
||||
text: Select an existing plugin.
|
||||
name: Name
|
||||
name: 名前
|
||||
version: Version
|
||||
status: Status
|
||||
action: Action
|
||||
@@ -1755,7 +1784,7 @@ ui:
|
||||
comment: Comment
|
||||
no_data: "We couldn't find anything."
|
||||
users:
|
||||
title: Users
|
||||
title: ユーザー
|
||||
users_with_the_most_reputation: Users with the highest reputation scores this week
|
||||
users_with_the_most_vote: Users who voted the most this week
|
||||
staffs: Our community staff
|
||||
|
||||
+63
-34
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: You cannot modify your role.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: How to Format
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Notifications
|
||||
inbox: Inbox
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -671,13 +677,19 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+242
-213
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: Arquivo não pode ser vazio.
|
||||
only_image: Somente um arquivo de imagem é permitido.
|
||||
max_size: O tamanho do arquivo não pode exceder 4MB.
|
||||
max_size: O tamanho do arquivo não pode exceder 4 MB.
|
||||
desc:
|
||||
label: Descrição (opcional)
|
||||
tab_url: URL da imagem
|
||||
|
||||
+63
-34
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Nível 3 (Alta reputação necessária para a comunidade adulta)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Perguntar
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: Você não pode modificar a sua função.
|
||||
not_allowed_registration:
|
||||
other: Atualmente o site não está aberto para cadastro
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Acesso negado
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: aceito
|
||||
accepted:
|
||||
other: aceito
|
||||
#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: Como formatar
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Erro 404
|
||||
http_50X: HTTP Erro 500
|
||||
http_403: HTTP Erro 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Notificações
|
||||
inbox: Caixa de entrada
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: Arquivo não pode ser vazio.
|
||||
only_image: Somente um arquivo de imagem é permitido.
|
||||
max_size: O tamanho do arquivo não pode exceder 4MB.
|
||||
max_size: O tamanho do arquivo não pode exceder 4 MB.
|
||||
desc:
|
||||
label: Descrição (opcional)
|
||||
tab_url: URL da imagem
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contém conjunto de caracteres não permitido.
|
||||
desc:
|
||||
label: Descrição (opcional)
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancelar
|
||||
btn_submit: Enviar
|
||||
btn_post: Postar novo marcador
|
||||
@@ -704,25 +716,11 @@ ui:
|
||||
edit_tag:
|
||||
title: Editar marcador
|
||||
default_reason: Editar marcador
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revisão
|
||||
display_name:
|
||||
label: Nome de exibição
|
||||
slug_name:
|
||||
label: Slug de URL
|
||||
info: 'Deve usar o conjunto de caracteres "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Descrição
|
||||
edit_summary:
|
||||
label: Resumo da edição
|
||||
placeholder: >-
|
||||
Explique resumidamente suas alterações (ortografia corrigida, gramática corrigida, formatação aprimorada)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Salvar edições
|
||||
btn_cancel: Cancelar
|
||||
dates:
|
||||
long_date: D MMM
|
||||
long_date: D MMM
|
||||
long_date_with_year: "D MMM, YYYY"
|
||||
long_date_with_time: "D MMM, YYYY [at] HH:mm"
|
||||
now: agora
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h atrás"
|
||||
hour: hora
|
||||
day: dia
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Adicionar comentário
|
||||
reply_to: Responder a
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Marcador
|
||||
btn_save_edits: Salvar edições
|
||||
btn_cancel: Cancelar
|
||||
show_more: Mostrar mais comentários
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use os comentários para pedir mais informações ou sugerir melhorias. Evite responder perguntas nos comentários.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Editar Resposta
|
||||
default_reason: Editar Resposta
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Adicionar Pergunta
|
||||
edit_title: Editar Pergunta
|
||||
default_reason: Editar pergunta
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar perguntas
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Procurar
|
||||
footer:
|
||||
build_on: >-
|
||||
Construído com <1> Answer </1>- o software de código aberto que empodera comunidades de Q&A.<br />Feito com amor © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Mudar
|
||||
loading: carregando...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Localização (opcional)
|
||||
placeholder: "Cidade, País"
|
||||
notification:
|
||||
heading: Notificações
|
||||
email: E-mail
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Notificações de email
|
||||
label: Inbox notifications
|
||||
description: Responda suas próprias perguntas, comentários, convites e muito mais.
|
||||
all_new_question:
|
||||
label: Todas as perguntas novas
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: respostas
|
||||
invite_to_answer:
|
||||
title: Pessoas Perguntaram
|
||||
desc: Convidar pessoas que você acha que deve saber a resposta.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Convidar para responder
|
||||
add: Adicionar pessoas
|
||||
search: Procurar pessoas
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Aceito
|
||||
write_answer:
|
||||
title: A sua Resposta
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Publicação a sua resposta
|
||||
add_another_answer: Adicionar outra resposta
|
||||
confirm_title: Continuar a responder
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Procurar Resultados
|
||||
keywords: Palavras-chave
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Painel
|
||||
welcome: Bem vindo ao Answer Administrador!
|
||||
site_statistics: Estatísticas do Site
|
||||
site_statistics: Site statistics
|
||||
questions: "Perguntas:"
|
||||
answers: "Respostas:"
|
||||
comments: "Comentários:"
|
||||
votes: "Votos:"
|
||||
active_users: "Usuários ativos:"
|
||||
users: "Users:"
|
||||
flags: "Marcadores:"
|
||||
site_health_status: Estatísticas da saúde do site
|
||||
site_health_status: Site health status
|
||||
version: "Versão:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Enviando arquivos:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Fuso horário:"
|
||||
system_info: Informações do Sistema
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Armazenamento usado:"
|
||||
uptime: "Tempo de atividade:"
|
||||
answer_links: Links das Respostas
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documentos
|
||||
feedback: Opinião
|
||||
support: Supporte
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Permitido
|
||||
enabled: Ativo
|
||||
disabled: Disponível
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Marcadores
|
||||
pending: Pendente
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "Você pode adicionar termos de conteúdo de serviço aqui. Se você já tem um documento hospedado em outro lugar, forneça a URL completa aqui."
|
||||
write:
|
||||
page_title: Escrever
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend Marcadores
|
||||
text: "Por favor input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Temas
|
||||
text: Selecionar um tema existente.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Estilo da barra de navegação
|
||||
text: Selecionar um tema existente.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Cor Primária
|
||||
label: Primary color
|
||||
text: Modifica as cores usadas por seus temas
|
||||
css_and_html:
|
||||
page_title: CSS e HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Privado
|
||||
label: Login requirido
|
||||
text: Somente usuários conectados podem acessar esta comunidade.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Extensões instaladas
|
||||
plugin_link: Extensões estendem e expandem a funcionalidade da Resposta. Você pode encontrar extensões no <1>Repositório de extensões do Answer</1>.
|
||||
|
||||
+1367
-946
File diff suppressed because it is too large
Load Diff
+684
-655
File diff suppressed because it is too large
Load Diff
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: Svoju rolu nemôžete zmeniť.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: Ako formátovať
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP chyba 404
|
||||
http_50X: HTTP chyba 403
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Oznámenia
|
||||
inbox: Doručená pošta
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: Názov súboru nemôže byť prázdny.
|
||||
only_image: Povolené sú iba obrázkové súbory.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Popis
|
||||
tab_url: URL obrázka
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug obsahuje nepovolenú znakovú sadu.
|
||||
desc:
|
||||
label: Opis
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Zrušiť
|
||||
btn_submit: Potvrdiť
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Upraviť značku
|
||||
default_reason: Upraviť značku
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revízia
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Musíte použiť znakovú sadu "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Opis
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Stručne vysvetlite svoje zmeny (opravený pravopis, opravená gramatika, vylepšené formátovanie)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Uložiť úpravy
|
||||
btn_cancel: Zrušiť
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "pred {{count}}h"
|
||||
hour: hodina
|
||||
day: deň
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Pridať komentár
|
||||
reply_to: Odpovedať
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Vlajka
|
||||
btn_save_edits: Uložiť zmeny
|
||||
btn_cancel: Zrušiť
|
||||
show_more: Zobraziť viac komentárov
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Uprav odpoveď
|
||||
default_reason: Uprav odpoveď
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Pridať otázku
|
||||
edit_title: Upraviť otázku
|
||||
default_reason: Upraviť otázku
|
||||
default_first_reason: Add question
|
||||
similar_questions: Podobné otázky
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Vyhľadávanie
|
||||
footer:
|
||||
build_on: >-
|
||||
Postavené na <1> Answer </1> – softvéri s otvoreným zdrojom, ktorý poháňa komunity otázok a odpovedí.<br />Vyrobené s láskou © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Zmena
|
||||
loading: načítavanie...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Poloha
|
||||
placeholder: "Mesto, Krajina"
|
||||
notification:
|
||||
heading: Oznámenia
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: odpovede
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Prijaté
|
||||
write_answer:
|
||||
title: Vaša odpoveď
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Pošlite svoju odpoveď
|
||||
add_another_answer: Pridajte ďalšiu odpoveď
|
||||
confirm_title: Pokračovať v odpovedi
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Výsledky vyhľadávania
|
||||
keywords: Kľúčové slová
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Nástenka
|
||||
welcome: Vitajte v Administrátorovi odpovedí!
|
||||
site_statistics: Štatistiky stránky
|
||||
site_statistics: Site statistics
|
||||
questions: "Otázky:"
|
||||
answers: "Odpovede:"
|
||||
comments: "Komentáre:"
|
||||
votes: "Hlasy:"
|
||||
active_users: "Aktívni používatelia:"
|
||||
users: "Users:"
|
||||
flags: "Vlajky:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Verzia:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Nahrávanie súborov:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Časové pásmo:"
|
||||
system_info: Systémové informácie
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Použité úložisko:"
|
||||
uptime: "Doba prevádzky:"
|
||||
answer_links: Odkazy na odpovede
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Dokumenty
|
||||
feedback: Spätná väzba
|
||||
support: Podpora
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Povolené
|
||||
enabled: Povolené
|
||||
disabled: Zablokované
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Vlajky
|
||||
pending: Prebiehajúce
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "Tu môžete pridať obsah zásad ochrany osobných údajov. Ak už máte dokument umiestnený inde, uveďte tu celú URL adresu."
|
||||
write:
|
||||
page_title: Písať
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Vyššie zadajte tag slug, jednu značku na riadok."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Témy
|
||||
text: Vyberte existujúcu tému.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Štýl navigačnej lišty
|
||||
text: Vyberte existujúcu tému.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primárna farba
|
||||
label: Primary color
|
||||
text: Upraviť farby používané vašími motívmi
|
||||
css_and_html:
|
||||
page_title: CSS a HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Súkromné
|
||||
label: Vyžaduje sa prihlásenie
|
||||
text: Do tejto komunity majú prístup iba prihlásení používatelia
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+3
-3
@@ -355,7 +355,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -428,7 +428,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -466,7 +466,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+3
-3
@@ -360,7 +360,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description (optional)
|
||||
tab_url: Image URL
|
||||
@@ -433,7 +433,7 @@ ui:
|
||||
range: Display name up to 35 characters.
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
desc: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc: URL slug up to 35 characters.
|
||||
msg:
|
||||
empty: URL slug cannot be empty.
|
||||
range: URL slug up to 35 characters.
|
||||
@@ -471,7 +471,7 @@ ui:
|
||||
label: Display Name
|
||||
slug_name:
|
||||
label: URL Slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
info: URL slug up to 35 characters.
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
|
||||
+776
-355
File diff suppressed because it is too large
Load Diff
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: Kendi rolünüzü değiştiremezsiniz.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: How to Format
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Bildirimler
|
||||
inbox: Gelen Kutusu
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: İptal Et
|
||||
btn_submit: Gönder
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Etiketi Düzenle
|
||||
default_reason: Etiketi düzenle
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revizyon
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Açıklama
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Düzenlemeleri kaydet
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: You cannot modify your role.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: How to Format
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Notifications
|
||||
inbox: Inbox
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+62
-33
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Đặt câu hỏi
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: You cannot modify your role.
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Truy cập bị từ chối
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: How to Format
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP Error 404
|
||||
http_50X: HTTP Error 500
|
||||
http_403: HTTP Error 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: Notifications
|
||||
inbox: Inbox
|
||||
@@ -598,7 +604,7 @@ ui:
|
||||
msg:
|
||||
empty: File cannot be empty.
|
||||
only_image: Only image files are allowed.
|
||||
max_size: File size cannot exceed 4MB.
|
||||
max_size: File size cannot exceed 4 MB.
|
||||
desc:
|
||||
label: Description
|
||||
tab_url: Image URL
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL slug contains unallowed character set.
|
||||
desc:
|
||||
label: Description
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: Cancel
|
||||
btn_submit: Submit
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: Edit Tag
|
||||
default_reason: Edit tag
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: Revision
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: 'Must use the character set "a-z", "0-9", "+ # - ."'
|
||||
desc:
|
||||
label: Description
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}}h ago"
|
||||
hour: hour
|
||||
day: day
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: Add comment
|
||||
reply_to: Reply to
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: Flag
|
||||
btn_save_edits: Save edits
|
||||
btn_cancel: Cancel
|
||||
show_more: Show more comments
|
||||
show_more: "{{count}} more comments"
|
||||
tip_question: >-
|
||||
Use comments to ask for more information or suggest improvements. Avoid answering questions in comments.
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: Edit Answer
|
||||
default_reason: Edit answer
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: Add Question
|
||||
edit_title: Edit Question
|
||||
default_reason: Edit question
|
||||
default_first_reason: Add question
|
||||
similar_questions: Similar questions
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: Search
|
||||
footer:
|
||||
build_on: >-
|
||||
Built on <1> Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: Change
|
||||
loading: loading...
|
||||
@@ -963,10 +965,10 @@ ui:
|
||||
label: Location
|
||||
placeholder: "City, Country"
|
||||
notification:
|
||||
heading: Notifications
|
||||
email: Email
|
||||
heading: Email Notifications
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
label: Inbox notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
all_new_question:
|
||||
label: All new questions
|
||||
@@ -1021,7 +1023,7 @@ ui:
|
||||
answers: answers
|
||||
invite_to_answer:
|
||||
title: People Asked
|
||||
desc: Invite people who you think might know the answer.
|
||||
desc: Select people who you think might know the answer.
|
||||
invite: Invite to answer
|
||||
add: Add people
|
||||
search: Search people
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: Accepted
|
||||
write_answer:
|
||||
title: Your Answer
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: Post your answer
|
||||
add_another_answer: Add another answer
|
||||
confirm_title: Continue to answer
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: Search Results
|
||||
keywords: Keywords
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
welcome: Welcome to Answer Admin!
|
||||
site_statistics: Site Statistics
|
||||
site_statistics: Site statistics
|
||||
questions: "Questions:"
|
||||
answers: "Answers:"
|
||||
comments: "Comments:"
|
||||
votes: "Votes:"
|
||||
active_users: "Active users:"
|
||||
users: "Users:"
|
||||
flags: "Flags:"
|
||||
site_health_status: Site Health Status
|
||||
site_health_status: Site health status
|
||||
version: "Version:"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "Uploading files:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "Timezone:"
|
||||
system_info: System Info
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "Storage used:"
|
||||
uptime: "Uptime:"
|
||||
answer_links: Answer Links
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: Documents
|
||||
feedback: Feedback
|
||||
support: Support
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: Allowed
|
||||
enabled: Enabled
|
||||
disabled: Disabled
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: Flags
|
||||
pending: Pending
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "You can add privacy policy content here. If you already have a document hosted elsewhere, provide the full URL here."
|
||||
write:
|
||||
page_title: Write
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "Please input tag slug above, one tag per line."
|
||||
@@ -1617,11 +1641,12 @@ ui:
|
||||
themes:
|
||||
label: Themes
|
||||
text: Select an existing theme.
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: Navbar Style
|
||||
text: Select an existing theme.
|
||||
label: Navbar style
|
||||
primary_color:
|
||||
label: Primary Color
|
||||
label: Primary color
|
||||
text: Modify the colors used by your themes
|
||||
css_and_html:
|
||||
page_title: CSS and HTML
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: Private
|
||||
label: Login required
|
||||
text: Only logged in users can access this community.
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
+207
-183
File diff suppressed because it is too large
Load Diff
+56
-27
@@ -15,7 +15,7 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
#The following fields are used for back-end
|
||||
# The following fields are used for back-end
|
||||
backend:
|
||||
base:
|
||||
success:
|
||||
@@ -82,6 +82,9 @@ backend:
|
||||
level_3:
|
||||
description:
|
||||
other: Level 3 (high reputation required for mature community)
|
||||
level_custom:
|
||||
description:
|
||||
other: Custom Level
|
||||
rank_question_add_label:
|
||||
other: Ask question
|
||||
rank_answer_add_label:
|
||||
@@ -267,6 +270,8 @@ backend:
|
||||
other: 您不能修改自己的角色。
|
||||
not_allowed_registration:
|
||||
other: Currently the site is not open for registration.
|
||||
not_allowed_login_via_password:
|
||||
other: Currently the site is not allowed to login via password.
|
||||
access_denied:
|
||||
other: Access denied
|
||||
page_access_denied:
|
||||
@@ -480,7 +485,7 @@ backend:
|
||||
other: accept
|
||||
accepted:
|
||||
other: accepted
|
||||
#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: 如何設定文本格式
|
||||
@@ -520,6 +525,7 @@ ui:
|
||||
http_404: HTTP 錯誤 404
|
||||
http_50X: HTTP 錯誤 500
|
||||
http_403: HTTP 錯誤 403
|
||||
logout: Log Out
|
||||
notifications:
|
||||
title: 通知
|
||||
inbox: 收件夾
|
||||
@@ -678,6 +684,12 @@ ui:
|
||||
character: URL 固定連結包含非法字元。
|
||||
desc:
|
||||
label: 描述
|
||||
revision:
|
||||
label: Revision
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
Briefly explain your changes (corrected spelling, fixed grammar, improved formatting)
|
||||
btn_cancel: 取消
|
||||
btn_submit: 提交
|
||||
btn_post: Post new tag
|
||||
@@ -704,21 +716,7 @@ ui:
|
||||
edit_tag:
|
||||
title: 編輯標籤
|
||||
default_reason: 編輯標籤
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
label: 編輯歷史
|
||||
display_name:
|
||||
label: Display name
|
||||
slug_name:
|
||||
label: URL slug
|
||||
info: '必須由 "a-z", "0-9", "+ # - ." 組成'
|
||||
desc:
|
||||
label: 描述
|
||||
edit_summary:
|
||||
label: Edit summary
|
||||
placeholder: >-
|
||||
簡單描述更改原因 (錯別字、文字表達、格式等等)
|
||||
default_first_reason: Add tag
|
||||
btn_save_edits: 儲存更改
|
||||
btn_cancel: 取消
|
||||
dates:
|
||||
@@ -731,6 +729,8 @@ ui:
|
||||
x_hours_ago: "{{count}} 小時前"
|
||||
hour: 小時
|
||||
day: 天
|
||||
hours: hours
|
||||
days: days
|
||||
comment:
|
||||
btn_add_comment: 添加評論
|
||||
reply_to: 回復
|
||||
@@ -740,7 +740,7 @@ ui:
|
||||
btn_flag: 舉報
|
||||
btn_save_edits: 保存
|
||||
btn_cancel: 取消
|
||||
show_more: 顯示更多評論
|
||||
show_more: "{{count}}條剩餘評論"
|
||||
tip_question: >-
|
||||
通过評論询问更多问题或提出改進建議。避免在評論中回答問題。
|
||||
tip_answer: >-
|
||||
@@ -749,6 +749,7 @@ ui:
|
||||
edit_answer:
|
||||
title: 編輯回答
|
||||
default_reason: 編輯回答
|
||||
default_first_reason: Add answer
|
||||
form:
|
||||
fields:
|
||||
revision:
|
||||
@@ -779,6 +780,7 @@ ui:
|
||||
title: 發問
|
||||
edit_title: 編輯問題
|
||||
default_reason: 編輯問題
|
||||
default_first_reason: Add question
|
||||
similar_questions: 相似的問題
|
||||
form:
|
||||
fields:
|
||||
@@ -833,7 +835,7 @@ ui:
|
||||
placeholder: 搜尋
|
||||
footer:
|
||||
build_on: >-
|
||||
基於<1>Answer</1>--為問答社群提供動力的開源軟體。<br />Made with love © {{cc}}.
|
||||
Powered by <1> Apache Answer </1>- the open-source software that powers Q&A communities.<br />Made with love © {{cc}}.
|
||||
upload_img:
|
||||
name: 更改
|
||||
loading: 讀取中...
|
||||
@@ -964,7 +966,7 @@ ui:
|
||||
placeholder: "城市, 國家"
|
||||
notification:
|
||||
heading: 通知
|
||||
email: Email
|
||||
turn_on: Turn on
|
||||
inbox:
|
||||
label: Email notifications
|
||||
description: Answers to your questions, comments, invites, and more.
|
||||
@@ -1052,6 +1054,7 @@ ui:
|
||||
btn_accepted: 已被採納
|
||||
write_answer:
|
||||
title: 你的回答
|
||||
edit_answer: Edit my existing answer
|
||||
btn_name: 提交你的回答
|
||||
add_another_answer: 添加另一個答案
|
||||
confirm_title: 繼續回答
|
||||
@@ -1114,6 +1117,11 @@ ui:
|
||||
close: Close
|
||||
reopen: Reopen
|
||||
ok: OK
|
||||
light: Light
|
||||
dark: Dark
|
||||
system_setting: System setting
|
||||
default: Default
|
||||
reset: Reset
|
||||
search:
|
||||
title: 搜尋結果
|
||||
keywords: 關鍵詞
|
||||
@@ -1353,23 +1361,33 @@ ui:
|
||||
dashboard:
|
||||
title: 後台管理
|
||||
welcome: 歡迎來到 Answer 後台管理!
|
||||
site_statistics: 站點統計
|
||||
site_statistics: Site statistics
|
||||
questions: "問題:"
|
||||
answers: "回答:"
|
||||
comments: "評論:"
|
||||
votes: "投票:"
|
||||
active_users: "活躍用戶:"
|
||||
users: "Users:"
|
||||
flags: "檢舉:"
|
||||
site_health_status: '健康狀態:'
|
||||
site_health_status: Site health status
|
||||
version: "版本"
|
||||
https: "HTTPS:"
|
||||
uploading_files: "上傳文件:"
|
||||
upload_folder: "Upload folder:"
|
||||
run_mode: "Running mode:"
|
||||
private: Private
|
||||
public: Public
|
||||
smtp: "SMTP:"
|
||||
timezone: "時區:"
|
||||
system_info: 系統資訊
|
||||
system_info: System info
|
||||
go_version: "Go version:"
|
||||
database: "Database:"
|
||||
database_size: "Database size:"
|
||||
storage_used: "已用儲存空間:"
|
||||
uptime: "運行時間:"
|
||||
answer_links: 回答連結
|
||||
answer_links: Answer links
|
||||
plugins: Plugins
|
||||
github: GitHub
|
||||
blog: Blog
|
||||
contact: Contact
|
||||
documents: 文件
|
||||
feedback: 用戶反饋
|
||||
support: 支持
|
||||
@@ -1384,6 +1402,8 @@ ui:
|
||||
allowed: 允許
|
||||
enabled: 已啟用
|
||||
disabled: 停用
|
||||
writable: Writable
|
||||
not_writable: Not writable
|
||||
flags:
|
||||
title: 檢舉
|
||||
pending: 等待處理
|
||||
@@ -1594,6 +1614,10 @@ ui:
|
||||
text: "您可以在此加入隱私政策內容。如果您已經在別處托管了文檔,請在這裡提供完整的URL。"
|
||||
write:
|
||||
page_title: 編輯
|
||||
restrict_answer:
|
||||
title: Restrict answer
|
||||
label: Each user can only write one answer for each question
|
||||
text: "They can use the edit link to refine and improve their existing answer, instead."
|
||||
recommend_tags:
|
||||
label: Recommend tags
|
||||
text: "請在上方輸入標籤固定連結,每行一個標籤。"
|
||||
@@ -1617,9 +1641,10 @@ ui:
|
||||
themes:
|
||||
label: 主題
|
||||
text: 選擇一個現有主題。
|
||||
color_scheme:
|
||||
label: Color scheme
|
||||
navbar_style:
|
||||
label: 導航欄樣式
|
||||
text: 選擇一個現有主題。
|
||||
primary_color:
|
||||
label: 主色調
|
||||
text: 修改您主題使用的顏色
|
||||
@@ -1660,6 +1685,10 @@ ui:
|
||||
title: 非公開的
|
||||
label: 需要登入
|
||||
text: 只有登入使用者才能訪問這個社群。
|
||||
password_login:
|
||||
title: Password login
|
||||
label: Allow email and password login
|
||||
text: "WARNING: If turn off, you may be unable to log in if you have not previously configured other login method."
|
||||
installed_plugins:
|
||||
title: Installed Plugins
|
||||
plugin_link: Plugins extend and expand the functionality of Answer. You may find plugins in the <1>Answer Plugin Repository</1>.
|
||||
|
||||
@@ -24,7 +24,7 @@ import "github.com/apache/incubator-answer/internal/base/reason"
|
||||
type Privilege struct {
|
||||
Key string `json:"key"`
|
||||
Label string `json:"label"`
|
||||
Value int `json:"value"`
|
||||
Value int `validate:"gte=1" json:"value"`
|
||||
}
|
||||
|
||||
const (
|
||||
|
||||
@@ -37,3 +37,10 @@ const (
|
||||
// PermalinkQuestionIDByShortID /questions/11
|
||||
PermalinkQuestionIDByShortID
|
||||
)
|
||||
|
||||
const (
|
||||
ColorSchemeDefault = "default"
|
||||
ColorSchemeLight = "light"
|
||||
ColorSchemeDark = "dark"
|
||||
ColorSchemeSystem = "system"
|
||||
)
|
||||
|
||||
@@ -89,18 +89,51 @@ func (am *AuthUserMiddleware) EjectUserBySiteInfo() gin.HandlerFunc {
|
||||
return
|
||||
}
|
||||
|
||||
_, isLogin := ctx.Get(ctxUUIDKey)
|
||||
if !isLogin {
|
||||
// If site in private mode, user must login.
|
||||
userInfo := GetUserInfoFromContext(ctx)
|
||||
if userInfo == nil {
|
||||
handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
// If user is not active, eject user.
|
||||
if userInfo.EmailStatus != entity.EmailStatusAvailable {
|
||||
handler.HandleResponse(ctx, errors.Forbidden(reason.EmailNeedToBeVerified),
|
||||
&schema.ForbiddenResp{Type: schema.ForbiddenReasonTypeInactive})
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
ctx.Next()
|
||||
}
|
||||
}
|
||||
|
||||
// MustAuth auth user info. If the user does not log in, an unauthenticated error is displayed
|
||||
func (am *AuthUserMiddleware) MustAuth() gin.HandlerFunc {
|
||||
// MustAuthWithoutAccountAvailable auth user info, any login user can access though user is not active.
|
||||
func (am *AuthUserMiddleware) MustAuthWithoutAccountAvailable() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
token := ExtractToken(ctx)
|
||||
if len(token) == 0 {
|
||||
handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
userInfo, err := am.authService.GetUserCacheInfo(ctx, token)
|
||||
if err != nil || userInfo == nil {
|
||||
handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
if userInfo.UserStatus == entity.UserStatusDeleted {
|
||||
handler.HandleResponse(ctx, errors.Unauthorized(reason.UnauthorizedError), nil)
|
||||
ctx.Abort()
|
||||
return
|
||||
}
|
||||
ctx.Set(ctxUUIDKey, userInfo)
|
||||
ctx.Next()
|
||||
}
|
||||
}
|
||||
|
||||
// MustAuthAndAccountAvailable auth user info and check user status, only allow active user access.
|
||||
func (am *AuthUserMiddleware) MustAuthAndAccountAvailable() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
token := ExtractToken(ctx)
|
||||
if len(token) == 0 {
|
||||
|
||||
@@ -20,9 +20,10 @@
|
||||
package reason
|
||||
|
||||
const (
|
||||
PrivilegeLevel1Desc = "privilege.level_1.description"
|
||||
PrivilegeLevel2Desc = "privilege.level_2.description"
|
||||
PrivilegeLevel3Desc = "privilege.level_3.description"
|
||||
PrivilegeLevel1Desc = "privilege.level_1.description"
|
||||
PrivilegeLevel2Desc = "privilege.level_2.description"
|
||||
PrivilegeLevel3Desc = "privilege.level_3.description"
|
||||
PrivilegeLevelCustomDesc = "privilege.level_custom.description"
|
||||
|
||||
RankQuestionAddLabel = "privilege.rank_question_add_label"
|
||||
RankAnswerAddLabel = "privilege.rank_answer_add_label"
|
||||
|
||||
@@ -74,9 +74,14 @@ func NewHTTPServer(debug bool,
|
||||
unAuthV1.Use(authUserMiddleware.Auth(), authUserMiddleware.EjectUserBySiteInfo())
|
||||
answerRouter.RegisterUnAuthAnswerAPIRouter(unAuthV1)
|
||||
|
||||
// register api that must be authenticated but no need to check account status
|
||||
authWithoutStatusV1 := r.Group("/answer/api/v1")
|
||||
authWithoutStatusV1.Use(authUserMiddleware.MustAuthWithoutAccountAvailable())
|
||||
answerRouter.RegisterAuthUserWithAnyStatusAnswerAPIRouter(authWithoutStatusV1)
|
||||
|
||||
// register api that must be authenticated
|
||||
authV1 := r.Group("/answer/api/v1")
|
||||
authV1.Use(authUserMiddleware.MustAuth())
|
||||
authV1.Use(authUserMiddleware.MustAuthAndAccountAvailable())
|
||||
answerRouter.RegisterAnswerAPIRouter(authV1)
|
||||
|
||||
adminauthV1 := r.Group("/answer/admin/api")
|
||||
|
||||
@@ -46,4 +46,5 @@ var ProviderSetController = wire.NewSet(
|
||||
NewConnectorController,
|
||||
NewUserCenterController,
|
||||
NewPermissionController,
|
||||
NewUserPluginController,
|
||||
)
|
||||
|
||||
@@ -22,6 +22,7 @@ package controller
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/apache/incubator-answer/internal/entity"
|
||||
"html/template"
|
||||
"net/http"
|
||||
"regexp"
|
||||
@@ -376,6 +377,7 @@ func (tc *TemplateController) QuestionInfo(ctx *gin.Context) {
|
||||
"detail": detail,
|
||||
"answers": answers,
|
||||
"comments": comments,
|
||||
"noindex": detail.Show == entity.QuestionHide,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -384,7 +384,7 @@ func (uc *UserController) UserModifyPassWord(ctx *gin.Context) {
|
||||
req.AccessToken = middleware.ExtractToken(ctx)
|
||||
isAdmin := middleware.GetUserIsAdminModerator(ctx)
|
||||
if !isAdmin {
|
||||
captchaPass := uc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionPassword, req.UserID,
|
||||
captchaPass := uc.actionService.ActionRecordVerifyCaptcha(ctx, entity.CaptchaActionEditUserinfo, req.UserID,
|
||||
req.CaptchaID, req.CaptchaCode)
|
||||
if !captchaPass {
|
||||
errFields := append([]*validator.FormErrorField{}, &validator.FormErrorField{
|
||||
@@ -394,7 +394,7 @@ func (uc *UserController) UserModifyPassWord(ctx *gin.Context) {
|
||||
handler.HandleResponse(ctx, errors.BadRequest(reason.CaptchaVerificationFailed), errFields)
|
||||
return
|
||||
}
|
||||
_, err := uc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionPassword, req.UserID)
|
||||
_, err := uc.actionService.ActionRecordAdd(ctx, entity.CaptchaActionEditUserinfo, req.UserID)
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
}
|
||||
@@ -424,7 +424,7 @@ func (uc *UserController) UserModifyPassWord(ctx *gin.Context) {
|
||||
}
|
||||
err = uc.userService.UserModifyPassword(ctx, req)
|
||||
if err == nil {
|
||||
uc.actionService.ActionRecordDel(ctx, entity.CaptchaActionPassword, req.UserID)
|
||||
uc.actionService.ActionRecordDel(ctx, entity.CaptchaActionEditUserinfo, req.UserID)
|
||||
}
|
||||
handler.HandleResponse(ctx, err, nil)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package controller
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/apache/incubator-answer/internal/base/middleware"
|
||||
"github.com/apache/incubator-answer/internal/base/reason"
|
||||
"github.com/segmentfault/pacman/errors"
|
||||
"net/http"
|
||||
|
||||
"github.com/apache/incubator-answer/internal/base/handler"
|
||||
"github.com/apache/incubator-answer/internal/schema"
|
||||
"github.com/apache/incubator-answer/internal/service/plugin_common"
|
||||
"github.com/apache/incubator-answer/plugin"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// UserPluginController role controller
|
||||
type UserPluginController struct {
|
||||
pluginCommonService *plugin_common.PluginCommonService
|
||||
}
|
||||
|
||||
// NewUserPluginController new controller
|
||||
func NewUserPluginController(pluginCommonService *plugin_common.PluginCommonService) *UserPluginController {
|
||||
return &UserPluginController{pluginCommonService: pluginCommonService}
|
||||
}
|
||||
|
||||
// GetUserPluginList get plugin list that used for user.
|
||||
// @Summary get plugin list that used for user.
|
||||
// @Description get plugin list that used for user.
|
||||
// @Tags UserPlugin
|
||||
// @Security ApiKeyAuth
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} handler.RespBody{data=[]schema.GetUserPluginListResp}
|
||||
// @Router /answer/api/v1/user/plugin/configs [get]
|
||||
func (pc *UserPluginController) GetUserPluginList(ctx *gin.Context) {
|
||||
resp := make([]*schema.GetUserPluginListResp, 0)
|
||||
_ = plugin.CallUserConfig(func(base plugin.UserConfig) error {
|
||||
info := base.Info()
|
||||
if plugin.StatusManager.IsEnabled(info.SlugName) {
|
||||
resp = append(resp, &schema.GetUserPluginListResp{
|
||||
Name: info.Name.Translate(ctx),
|
||||
SlugName: info.SlugName,
|
||||
})
|
||||
}
|
||||
return nil
|
||||
})
|
||||
handler.HandleResponse(ctx, nil, resp)
|
||||
}
|
||||
|
||||
// GetUserPluginConfig get user plugin config
|
||||
// @Summary get user plugin config
|
||||
// @Description get user plugin config
|
||||
// @Tags UserPlugin
|
||||
// @Security ApiKeyAuth
|
||||
// @Produce json
|
||||
// @Param plugin_slug_name query string true "plugin_slug_name"
|
||||
// @Success 200 {object} handler.RespBody{data=schema.GetPluginConfigResp}
|
||||
// @Router /answer/api/v1/user/plugin/config [get]
|
||||
func (pc *UserPluginController) GetUserPluginConfig(ctx *gin.Context) {
|
||||
req := &schema.GetUserPluginConfigReq{}
|
||||
if handler.BindAndCheck(ctx, req) {
|
||||
return
|
||||
}
|
||||
|
||||
req.UserID = middleware.GetLoginUserIDFromContext(ctx)
|
||||
|
||||
resp := &schema.GetUserPluginConfigResp{}
|
||||
_ = plugin.CallUserConfig(func(fn plugin.UserConfig) error {
|
||||
if fn.Info().SlugName != req.PluginSlugName {
|
||||
return nil
|
||||
}
|
||||
info := fn.Info()
|
||||
resp.Name = info.Name.Translate(ctx)
|
||||
resp.SlugName = info.SlugName
|
||||
resp.SetConfigFields(ctx, fn.UserConfigFields())
|
||||
return nil
|
||||
})
|
||||
|
||||
configValue, err := pc.pluginCommonService.GetUserPluginConfig(ctx, req)
|
||||
if err != nil {
|
||||
handler.HandleResponse(ctx, err, nil)
|
||||
return
|
||||
}
|
||||
if len(configValue) > 0 {
|
||||
configValueMapping := make(map[string]any)
|
||||
_ = json.Unmarshal([]byte(configValue), &configValueMapping)
|
||||
for _, field := range resp.ConfigFields {
|
||||
if value, ok := configValueMapping[field.Name]; ok {
|
||||
field.Value = value
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handler.HandleResponse(ctx, err, resp)
|
||||
}
|
||||
|
||||
// UpdatePluginUserConfig update user plugin config
|
||||
// @Summary update user plugin config
|
||||
// @Description update user plugin config
|
||||
// @Tags UserPlugin
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param data body schema.UpdateUserPluginConfigReq true "UpdatePluginConfigReq"
|
||||
// @Success 200 {object} handler.RespBody
|
||||
// @Router /answer/api/v1/user/plugin/config [put]
|
||||
func (pc *UserPluginController) UpdatePluginUserConfig(ctx *gin.Context) {
|
||||
req := &schema.UpdateUserPluginConfigReq{}
|
||||
if handler.BindAndCheck(ctx, req) {
|
||||
return
|
||||
}
|
||||
if !plugin.StatusManager.IsEnabled(req.PluginSlugName) {
|
||||
handler.HandleResponse(ctx, errors.New(http.StatusBadRequest, reason.RequestFormatError), nil)
|
||||
return
|
||||
}
|
||||
|
||||
req.UserID = middleware.GetLoginUserIDFromContext(ctx)
|
||||
|
||||
configFields, _ := json.Marshal(req.ConfigFields)
|
||||
err := plugin.CallUserConfig(func(fn plugin.UserConfig) error {
|
||||
if fn.Info().SlugName == req.PluginSlugName {
|
||||
return fn.UserConfigReceiver(req.UserID, configFields)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
handler.HandleResponse(ctx, err, nil)
|
||||
return
|
||||
}
|
||||
|
||||
err = pc.pluginCommonService.UpdatePluginUserConfig(ctx, req)
|
||||
handler.HandleResponse(ctx, err, nil)
|
||||
}
|
||||
@@ -31,12 +31,12 @@ import (
|
||||
|
||||
// PluginController role controller
|
||||
type PluginController struct {
|
||||
PluginCommonService *plugin_common.PluginCommonService
|
||||
pluginCommonService *plugin_common.PluginCommonService
|
||||
}
|
||||
|
||||
// NewPluginController new controller
|
||||
func NewPluginController(PluginCommonService *plugin_common.PluginCommonService) *PluginController {
|
||||
return &PluginController{PluginCommonService: PluginCommonService}
|
||||
func NewPluginController(pluginCommonService *plugin_common.PluginCommonService) *PluginController {
|
||||
return &PluginController{pluginCommonService: pluginCommonService}
|
||||
}
|
||||
|
||||
// GetAllPluginStatus get all plugins status
|
||||
@@ -150,7 +150,7 @@ func (pc *PluginController) UpdatePluginStatus(ctx *gin.Context) {
|
||||
}
|
||||
|
||||
plugin.StatusManager.Enable(req.PluginSlugName, req.Enabled)
|
||||
err := pc.PluginCommonService.UpdatePluginStatus(ctx)
|
||||
err := pc.pluginCommonService.UpdatePluginStatus(ctx)
|
||||
handler.HandleResponse(ctx, err, nil)
|
||||
}
|
||||
|
||||
@@ -220,6 +220,6 @@ func (pc *PluginController) UpdatePluginConfig(ctx *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
err = pc.PluginCommonService.UpdatePluginConfig(ctx, req)
|
||||
err = pc.pluginCommonService.UpdatePluginConfig(ctx, req)
|
||||
handler.HandleResponse(ctx, err, nil)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package entity
|
||||
|
||||
// PluginUserConfig plugin config
|
||||
type PluginUserConfig struct {
|
||||
ID int `xorm:"not null pk autoincr INT(11) id"`
|
||||
UserID string `xorm:"not null default 0 BIGINT(20) UNIQUE(uk_up) user_id"`
|
||||
PluginSlugName string `xorm:"VARCHAR(128) UNIQUE(uk_up) plugin_slug_name"`
|
||||
Value string `xorm:"TEXT value"`
|
||||
}
|
||||
|
||||
// TableName config table name
|
||||
func (PluginUserConfig) TableName() string {
|
||||
return "plugin_user_config"
|
||||
}
|
||||
@@ -65,6 +65,7 @@ type User struct {
|
||||
IPInfo string `xorm:"not null default '' VARCHAR(255) ip_info"`
|
||||
IsAdmin bool `xorm:"not null default false BOOL is_admin"`
|
||||
Language string `xorm:"not null default '' VARCHAR(100) language"`
|
||||
ColorScheme string `xorm:"not null default '' VARCHAR(100) color_scheme"`
|
||||
}
|
||||
|
||||
// TableName user table name
|
||||
|
||||
@@ -67,6 +67,7 @@ var (
|
||||
&entity.PluginConfig{},
|
||||
&entity.UserExternalLogin{},
|
||||
&entity.UserNotificationConfig{},
|
||||
&entity.PluginUserConfig{},
|
||||
}
|
||||
|
||||
roles = []*entity.Role{
|
||||
|
||||
@@ -94,6 +94,7 @@ var migrations = []Migration{
|
||||
NewMigration("v1.1.3", "set default user notification config", setDefaultUserNotificationConfig, false),
|
||||
NewMigration("v1.2.0", "add recover answer permission", addRecoverPermission, true),
|
||||
NewMigration("v1.2.1", "add password login control", addPasswordLoginControl, true),
|
||||
NewMigration("v1.2.5", "add notification plugin and theme config", addNotificationPluginAndThemeConfig, true),
|
||||
}
|
||||
|
||||
func GetMigrations() []Migration {
|
||||
@@ -130,7 +131,7 @@ func ExpectedVersion() int64 {
|
||||
func Migrate(debug bool, dbConf *data.Database, cacheConf *data.CacheConf, upgradeToSpecificVersion string) error {
|
||||
cache, cacheCleanup, err := data.NewCache(cacheConf)
|
||||
if err != nil {
|
||||
fmt.Println("new check failed:", err.Error())
|
||||
fmt.Println("new cache failed:", err.Error())
|
||||
}
|
||||
engine, err := data.NewDB(debug, dbConf)
|
||||
if err != nil {
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package migrations
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/apache/incubator-answer/internal/entity"
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
func addNotificationPluginAndThemeConfig(ctx context.Context, x *xorm.Engine) error {
|
||||
type User struct {
|
||||
ID string `xorm:"not null pk autoincr BIGINT(20) id"`
|
||||
ColorScheme string `xorm:"not null default '' VARCHAR(100) color_scheme"`
|
||||
}
|
||||
return x.Context(ctx).Sync(new(entity.PluginUserConfig), new(User))
|
||||
}
|
||||
@@ -416,7 +416,7 @@ func (ar *answerRepo) updateSearch(ctx context.Context, answerID string) (err er
|
||||
|
||||
// get question
|
||||
var (
|
||||
question *entity.Question
|
||||
question = new(entity.Question)
|
||||
)
|
||||
exist, err = ar.data.DB.Context(ctx).Where("id = ?", answer.QuestionID).Get(&question)
|
||||
if err != nil {
|
||||
|
||||
@@ -50,7 +50,7 @@ func (ur *pluginConfigRepo) SavePluginConfig(ctx context.Context, pluginSlugName
|
||||
old.Value = configValue
|
||||
_, err = ur.data.DB.Context(ctx).ID(old.ID).Update(old)
|
||||
} else {
|
||||
_, err = ur.data.DB.Context(ctx).InsertOne(&entity.PluginConfig{PluginSlugName: pluginSlugName, Value: configValue})
|
||||
_, err = ur.data.DB.Context(ctx).Insert(&entity.PluginConfig{PluginSlugName: pluginSlugName, Value: configValue})
|
||||
}
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package plugin_config
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/apache/incubator-answer/internal/base/pager"
|
||||
"xorm.io/xorm"
|
||||
|
||||
"github.com/apache/incubator-answer/internal/base/data"
|
||||
"github.com/apache/incubator-answer/internal/base/reason"
|
||||
"github.com/apache/incubator-answer/internal/entity"
|
||||
"github.com/apache/incubator-answer/internal/service/plugin_common"
|
||||
"github.com/segmentfault/pacman/errors"
|
||||
)
|
||||
|
||||
type pluginUserConfigRepo struct {
|
||||
data *data.Data
|
||||
}
|
||||
|
||||
// NewPluginUserConfigRepo new repository
|
||||
func NewPluginUserConfigRepo(data *data.Data) plugin_common.PluginUserConfigRepo {
|
||||
return &pluginUserConfigRepo{
|
||||
data: data,
|
||||
}
|
||||
}
|
||||
|
||||
func (ur *pluginUserConfigRepo) SaveUserPluginConfig(ctx context.Context, userID string,
|
||||
pluginSlugName, configValue string) (err error) {
|
||||
_, err = ur.data.DB.Transaction(func(session *xorm.Session) (interface{}, error) {
|
||||
session = session.Context(ctx)
|
||||
old := &entity.PluginUserConfig{
|
||||
UserID: userID,
|
||||
PluginSlugName: pluginSlugName,
|
||||
}
|
||||
exist, err := session.Get(old)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if exist {
|
||||
old.Value = configValue
|
||||
_, err = session.ID(old.ID).Update(old)
|
||||
} else {
|
||||
_, err = session.Insert(&entity.PluginUserConfig{
|
||||
UserID: userID,
|
||||
PluginSlugName: pluginSlugName,
|
||||
Value: configValue,
|
||||
})
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return nil, nil
|
||||
})
|
||||
if err != nil {
|
||||
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ur *pluginUserConfigRepo) GetPluginUserConfig(ctx context.Context, userID, pluginSlugName string) (
|
||||
pluginUserConfig *entity.PluginUserConfig, exist bool, err error) {
|
||||
pluginUserConfig = &entity.PluginUserConfig{
|
||||
UserID: userID,
|
||||
PluginSlugName: pluginSlugName,
|
||||
}
|
||||
exist, err = ur.data.DB.Context(ctx).Get(pluginUserConfig)
|
||||
if err != nil {
|
||||
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
return pluginUserConfig, exist, err
|
||||
}
|
||||
|
||||
func (ur *pluginUserConfigRepo) GetPluginUserConfigPage(ctx context.Context, page, pageSize int) (
|
||||
pluginUserConfigs []*entity.PluginUserConfig, total int64, err error) {
|
||||
pluginUserConfigs = make([]*entity.PluginUserConfig, 0)
|
||||
total, err = pager.Help(page, pageSize, &pluginUserConfigs, &entity.PluginUserConfig{}, ur.data.DB.Context(ctx))
|
||||
if err != nil {
|
||||
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -96,4 +96,5 @@ var ProviderSetRepo = wire.NewSet(
|
||||
plugin_config.NewPluginConfigRepo,
|
||||
user_notification_config.NewUserNotificationConfigRepo,
|
||||
limit.NewRateLimitRepo,
|
||||
plugin_config.NewPluginUserConfigRepo,
|
||||
)
|
||||
|
||||
@@ -23,18 +23,13 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/apache/incubator-answer/plugin"
|
||||
"github.com/segmentfault/pacman/log"
|
||||
"strings"
|
||||
"time"
|
||||
"unicode"
|
||||
"xorm.io/xorm"
|
||||
|
||||
"github.com/apache/incubator-answer/internal/base/handler"
|
||||
"xorm.io/builder"
|
||||
|
||||
"github.com/apache/incubator-answer/internal/base/constant"
|
||||
"github.com/apache/incubator-answer/internal/base/data"
|
||||
"github.com/apache/incubator-answer/internal/base/handler"
|
||||
"github.com/apache/incubator-answer/internal/base/pager"
|
||||
"github.com/apache/incubator-answer/internal/base/reason"
|
||||
"github.com/apache/incubator-answer/internal/entity"
|
||||
@@ -43,8 +38,11 @@ import (
|
||||
"github.com/apache/incubator-answer/internal/service/unique"
|
||||
"github.com/apache/incubator-answer/pkg/htmltext"
|
||||
"github.com/apache/incubator-answer/pkg/uid"
|
||||
|
||||
"github.com/apache/incubator-answer/plugin"
|
||||
"github.com/segmentfault/pacman/errors"
|
||||
"github.com/segmentfault/pacman/log"
|
||||
"xorm.io/builder"
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
// questionRepo question repository
|
||||
@@ -77,7 +75,6 @@ func (qr *questionRepo) AddQuestion(ctx context.Context, question *entity.Questi
|
||||
if handler.GetEnableShortID(ctx) {
|
||||
question.ID = uid.EnShortID(question.ID)
|
||||
}
|
||||
_ = qr.updateSearch(ctx, question.ID)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -101,7 +98,7 @@ func (qr *questionRepo) UpdateQuestion(ctx context.Context, question *entity.Que
|
||||
if handler.GetEnableShortID(ctx) {
|
||||
question.ID = uid.EnShortID(question.ID)
|
||||
}
|
||||
_ = qr.updateSearch(ctx, question.ID)
|
||||
_ = qr.UpdateSearch(ctx, question.ID)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -112,7 +109,7 @@ func (qr *questionRepo) UpdatePvCount(ctx context.Context, questionID string) (e
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
_ = qr.updateSearch(ctx, question.ID)
|
||||
_ = qr.UpdateSearch(ctx, question.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -124,7 +121,7 @@ func (qr *questionRepo) UpdateAnswerCount(ctx context.Context, questionID string
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
_ = qr.updateSearch(ctx, question.ID)
|
||||
_ = qr.UpdateSearch(ctx, question.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -156,7 +153,7 @@ func (qr *questionRepo) UpdateQuestionStatus(ctx context.Context, questionID str
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
_ = qr.updateSearch(ctx, questionID)
|
||||
_ = qr.UpdateSearch(ctx, questionID)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -166,7 +163,7 @@ func (qr *questionRepo) UpdateQuestionStatusWithOutUpdateTime(ctx context.Contex
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
_ = qr.updateSearch(ctx, question.ID)
|
||||
_ = qr.UpdateSearch(ctx, question.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -176,7 +173,7 @@ func (qr *questionRepo) RecoverQuestion(ctx context.Context, questionID string)
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
_ = qr.updateSearch(ctx, questionID)
|
||||
_ = qr.UpdateSearch(ctx, questionID)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -195,7 +192,7 @@ func (qr *questionRepo) UpdateAccepted(ctx context.Context, question *entity.Que
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
_ = qr.updateSearch(ctx, question.ID)
|
||||
_ = qr.UpdateSearch(ctx, question.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -205,7 +202,7 @@ func (qr *questionRepo) UpdateLastAnswer(ctx context.Context, question *entity.Q
|
||||
if err != nil {
|
||||
return errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
_ = qr.updateSearch(ctx, question.ID)
|
||||
_ = qr.UpdateSearch(ctx, question.ID)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -347,19 +344,22 @@ func (qr *questionRepo) SitemapQuestions(ctx context.Context, page, pageSize int
|
||||
}
|
||||
|
||||
// GetQuestionPage query question page
|
||||
func (qr *questionRepo) GetQuestionPage(ctx context.Context, page, pageSize int, userID, tagID, orderCond string, inDays int) (
|
||||
func (qr *questionRepo) GetQuestionPage(ctx context.Context, page, pageSize int, tagIDs []string, userID, orderCond string, inDays int, showHidden bool) (
|
||||
questionList []*entity.Question, total int64, err error) {
|
||||
questionList = make([]*entity.Question, 0)
|
||||
|
||||
session := qr.data.DB.Context(ctx).Where("question.status = ? OR question.status = ?",
|
||||
entity.QuestionStatusAvailable, entity.QuestionStatusClosed)
|
||||
if len(tagID) > 0 {
|
||||
if len(tagIDs) > 0 {
|
||||
session.Join("LEFT", "tag_rel", "question.id = tag_rel.object_id")
|
||||
session.And("tag_rel.tag_id = ?", tagID)
|
||||
session.In("tag_rel.tag_id", tagIDs)
|
||||
session.And("tag_rel.status = ?", entity.TagRelStatusAvailable)
|
||||
}
|
||||
if len(userID) > 0 {
|
||||
session.And("question.user_id = ?", userID)
|
||||
if !showHidden {
|
||||
session.And("question.show = ?", entity.QuestionShow)
|
||||
}
|
||||
} else {
|
||||
session.And("question.show = ?", entity.QuestionShow)
|
||||
}
|
||||
@@ -462,8 +462,8 @@ func (qr *questionRepo) AdminQuestionPage(ctx context.Context, search *schema.Ad
|
||||
return rows, count, nil
|
||||
}
|
||||
|
||||
// updateSearch update search, if search plugin not enable, do nothing
|
||||
func (qr *questionRepo) updateSearch(ctx context.Context, questionID string) (err error) {
|
||||
// UpdateSearch update search, if search plugin not enable, do nothing
|
||||
func (qr *questionRepo) UpdateSearch(ctx context.Context, questionID string) (err error) {
|
||||
// check search plugin
|
||||
var s plugin.Search
|
||||
_ = plugin.CallSearch(func(search plugin.Search) error {
|
||||
@@ -544,7 +544,7 @@ func (qr *questionRepo) RemoveAllUserQuestion(ctx context.Context, userID string
|
||||
|
||||
// update search content
|
||||
for _, id := range questionIDs {
|
||||
_ = qr.updateSearch(ctx, id)
|
||||
_ = qr.UpdateSearch(ctx, id)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ func NewSearchRepo(
|
||||
}
|
||||
|
||||
// SearchContents search question and answer data
|
||||
func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs []string, userID string, votes int, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) {
|
||||
func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs [][]string, userID string, votes int, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) {
|
||||
words = filterWords(words)
|
||||
|
||||
var (
|
||||
@@ -152,16 +152,20 @@ func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs
|
||||
ast := "tag_rel" + strconv.Itoa(ti)
|
||||
b.Join("INNER", "tag_rel as "+ast, "question.id = "+ast+".object_id").
|
||||
And(builder.Eq{
|
||||
ast + ".tag_id": tagID,
|
||||
ast + ".status": entity.TagRelStatusAvailable,
|
||||
})
|
||||
}).
|
||||
And(builder.In(ast+".tag_id", tagID))
|
||||
ub.Join("INNER", "tag_rel as "+ast, "question_id = "+ast+".object_id").
|
||||
And(builder.Eq{
|
||||
ast + ".tag_id": tagID,
|
||||
ast + ".status": entity.TagRelStatusAvailable,
|
||||
})
|
||||
argsQ = append(argsQ, entity.TagRelStatusAvailable, tagID)
|
||||
argsA = append(argsA, entity.TagRelStatusAvailable, tagID)
|
||||
}).
|
||||
And(builder.In(ast+".tag_id", tagID))
|
||||
argsQ = append(argsQ, entity.TagRelStatusAvailable)
|
||||
argsA = append(argsA, entity.TagRelStatusAvailable)
|
||||
for _, t := range tagID {
|
||||
argsQ = append(argsQ, t)
|
||||
argsA = append(argsA, t)
|
||||
}
|
||||
}
|
||||
|
||||
// check user
|
||||
@@ -236,7 +240,7 @@ func (sr *searchRepo) SearchContents(ctx context.Context, words []string, tagIDs
|
||||
}
|
||||
|
||||
// SearchQuestions search question data
|
||||
func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagIDs []string, notAccepted bool, views, answers int, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) {
|
||||
func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagIDs [][]string, notAccepted bool, views, answers int, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) {
|
||||
words = filterWords(words)
|
||||
var (
|
||||
qfs = qFields
|
||||
@@ -269,10 +273,13 @@ func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagID
|
||||
ast := "tag_rel" + strconv.Itoa(ti)
|
||||
b.Join("INNER", "tag_rel as "+ast, "question.id = "+ast+".object_id").
|
||||
And(builder.Eq{
|
||||
ast + ".tag_id": tagID,
|
||||
ast + ".status": entity.TagRelStatusAvailable,
|
||||
})
|
||||
args = append(args, entity.TagRelStatusAvailable, tagID)
|
||||
}).
|
||||
And(builder.In(ast+".tag_id", tagID))
|
||||
args = append(args, entity.TagRelStatusAvailable)
|
||||
for _, t := range tagID {
|
||||
args = append(args, t)
|
||||
}
|
||||
}
|
||||
|
||||
// check need filter has not accepted
|
||||
@@ -343,7 +350,7 @@ func (sr *searchRepo) SearchQuestions(ctx context.Context, words []string, tagID
|
||||
}
|
||||
|
||||
// SearchAnswers search answer data
|
||||
func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, tagIDs []string, accepted bool, questionID string, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) {
|
||||
func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, tagIDs [][]string, accepted bool, questionID string, page, size int, order string) (resp []*schema.SearchResult, total int64, err error) {
|
||||
words = filterWords(words)
|
||||
|
||||
var (
|
||||
@@ -378,10 +385,13 @@ func (sr *searchRepo) SearchAnswers(ctx context.Context, words []string, tagIDs
|
||||
ast := "tag_rel" + strconv.Itoa(ti)
|
||||
b.Join("INNER", "tag_rel as "+ast, "question_id = "+ast+".object_id").
|
||||
And(builder.Eq{
|
||||
ast + ".tag_id": tagID,
|
||||
ast + ".status": entity.TagRelStatusAvailable,
|
||||
})
|
||||
args = append(args, entity.TagRelStatusAvailable, tagID)
|
||||
}).
|
||||
And(builder.In(ast+".tag_id", tagID))
|
||||
args = append(args, entity.TagRelStatusAvailable)
|
||||
for _, t := range tagID {
|
||||
args = append(args, t)
|
||||
}
|
||||
}
|
||||
|
||||
// check limit accepted
|
||||
|
||||
@@ -21,6 +21,7 @@ package tag
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/apache/incubator-answer/internal/base/data"
|
||||
"github.com/apache/incubator-answer/internal/base/reason"
|
||||
"github.com/apache/incubator-answer/internal/entity"
|
||||
@@ -118,6 +119,15 @@ func (tr *tagRepo) GetTagSynonymCount(ctx context.Context, tagID string) (count
|
||||
return
|
||||
}
|
||||
|
||||
func (tr *tagRepo) GetIDsByMainTagId(ctx context.Context, mainTagID string) (tagIDs []string, err error) {
|
||||
session := tr.data.DB.Context(ctx).Table(entity.Tag{}.TableName()).Where(builder.Eq{"status": entity.TagStatusAvailable, "main_tag_id": converter.StringToInt64(mainTagID)}).Cols("id")
|
||||
err = session.Find(&tagIDs)
|
||||
if err != nil {
|
||||
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// GetTagList get tag list all
|
||||
func (tr *tagRepo) GetTagList(ctx context.Context, tag *entity.Tag) (tagList []*entity.Tag, err error) {
|
||||
tagList = make([]*entity.Tag, 0)
|
||||
|
||||
@@ -155,8 +155,9 @@ func (ur *userRepo) UpdateEmail(ctx context.Context, userID, email string) (err
|
||||
return
|
||||
}
|
||||
|
||||
func (ur *userRepo) UpdateLanguage(ctx context.Context, userID, language string) (err error) {
|
||||
_, err = ur.data.DB.Context(ctx).Where("id = ?", userID).Update(&entity.User{Language: language})
|
||||
func (ur *userRepo) UpdateUserInterface(ctx context.Context, userID, language, colorSchema string) (err error) {
|
||||
session := ur.data.DB.Context(ctx).Where("id = ?", userID)
|
||||
_, err = session.Cols("language", "color_scheme").Update(&entity.User{Language: language, ColorScheme: colorSchema})
|
||||
if err != nil {
|
||||
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
|
||||
@@ -72,6 +72,17 @@ func (ur *userExternalLoginRepo) GetByExternalID(ctx context.Context, provider,
|
||||
return
|
||||
}
|
||||
|
||||
// GetByUserID get by user ID
|
||||
func (ur *userExternalLoginRepo) GetByUserID(ctx context.Context, provider, userID string) (
|
||||
userInfo *entity.UserExternalLogin, exist bool, err error) {
|
||||
userInfo = &entity.UserExternalLogin{}
|
||||
exist, err = ur.data.DB.Context(ctx).Where("user_id = ?", userID).Where("provider = ?", provider).Get(userInfo)
|
||||
if err != nil {
|
||||
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// GetUserExternalLoginList get by external ID
|
||||
func (ur *userExternalLoginRepo) GetUserExternalLoginList(ctx context.Context, userID string) (
|
||||
resp []*entity.UserExternalLogin, err error) {
|
||||
|
||||
@@ -53,6 +53,7 @@ type AnswerAPIRouter struct {
|
||||
roleController *controller_admin.RoleController
|
||||
pluginController *controller_admin.PluginController
|
||||
permissionController *controller.PermissionController
|
||||
userPluginController *controller.UserPluginController
|
||||
}
|
||||
|
||||
func NewAnswerAPIRouter(
|
||||
@@ -82,6 +83,7 @@ func NewAnswerAPIRouter(
|
||||
roleController *controller_admin.RoleController,
|
||||
pluginController *controller_admin.PluginController,
|
||||
permissionController *controller.PermissionController,
|
||||
userPluginController *controller.UserPluginController,
|
||||
) *AnswerAPIRouter {
|
||||
return &AnswerAPIRouter{
|
||||
langController: langController,
|
||||
@@ -110,6 +112,7 @@ func NewAnswerAPIRouter(
|
||||
roleController: roleController,
|
||||
pluginController: pluginController,
|
||||
permissionController: permissionController,
|
||||
userPluginController: userPluginController,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,9 +144,6 @@ func (a *AnswerAPIRouter) RegisterMustUnAuthAnswerAPIRouter(authUserMiddleware *
|
||||
|
||||
func (a *AnswerAPIRouter) RegisterUnAuthAnswerAPIRouter(r *gin.RouterGroup) {
|
||||
// user
|
||||
r.GET("/user/logout", a.userController.UserLogout)
|
||||
r.POST("/user/email/change/code", middleware.BanAPIForUserCenter, a.userController.UserChangeEmailSendCode)
|
||||
r.POST("/user/email/verification/send", middleware.BanAPIForUserCenter, a.userController.UserVerifyEmailSend)
|
||||
r.GET("/personal/user/info", a.userController.GetOtherUserInfoByUsername)
|
||||
r.GET("/user/ranking", a.userController.UserRanking)
|
||||
|
||||
@@ -183,6 +183,12 @@ func (a *AnswerAPIRouter) RegisterUnAuthAnswerAPIRouter(r *gin.RouterGroup) {
|
||||
r.GET("/personal/rank/page", a.rankController.GetRankPersonalWithPage)
|
||||
}
|
||||
|
||||
func (a *AnswerAPIRouter) RegisterAuthUserWithAnyStatusAnswerAPIRouter(r *gin.RouterGroup) {
|
||||
r.GET("/user/logout", a.userController.UserLogout)
|
||||
r.POST("/user/email/change/code", middleware.BanAPIForUserCenter, a.userController.UserChangeEmailSendCode)
|
||||
r.POST("/user/email/verification/send", middleware.BanAPIForUserCenter, a.userController.UserVerifyEmailSend)
|
||||
}
|
||||
|
||||
func (a *AnswerAPIRouter) RegisterAnswerAPIRouter(r *gin.RouterGroup) {
|
||||
// revisions
|
||||
r.GET("/revisions/unreviewed", a.revisionController.GetUnreviewedRevisionList)
|
||||
@@ -268,6 +274,10 @@ func (a *AnswerAPIRouter) RegisterAnswerAPIRouter(r *gin.RouterGroup) {
|
||||
r.GET("/activity/timeline", a.activityController.GetObjectTimeline)
|
||||
r.GET("/activity/timeline/detail", a.activityController.GetObjectTimelineDetail)
|
||||
|
||||
// plugin
|
||||
r.GET("/user/plugin/configs", a.userPluginController.GetUserPluginList)
|
||||
r.GET("/user/plugin/config", a.userPluginController.GetUserPluginConfig)
|
||||
r.PUT("/user/plugin/config", a.userPluginController.UpdatePluginUserConfig)
|
||||
}
|
||||
|
||||
func (a *AnswerAPIRouter) RegisterAnswerAdminAPIRouter(r *gin.RouterGroup) {
|
||||
|
||||
@@ -130,7 +130,7 @@ type GetCommentWithPageReq struct {
|
||||
// comment id
|
||||
CommentID string `validate:"omitempty" form:"comment_id"`
|
||||
// query condition
|
||||
QueryCond string `validate:"omitempty,oneof=vote" form:"query_cond"`
|
||||
QueryCond string `validate:"omitempty,oneof=vote created_at" form:"query_cond"`
|
||||
// user id
|
||||
UserID string `json:"-"`
|
||||
// whether user can edit it
|
||||
|
||||
@@ -78,9 +78,11 @@ func (g *GetPluginConfigResp) SetConfigFields(ctx *gin.Context, fields []plugin.
|
||||
Required: field.Required,
|
||||
Value: field.Value,
|
||||
UIOptions: ConfigFieldUIOptions{
|
||||
Rows: field.UIOptions.Rows,
|
||||
InputType: string(field.UIOptions.InputType),
|
||||
Variant: field.UIOptions.Variant,
|
||||
Rows: field.UIOptions.Rows,
|
||||
InputType: string(field.UIOptions.InputType),
|
||||
Variant: field.UIOptions.Variant,
|
||||
ClassName: field.UIOptions.ClassName,
|
||||
FieldClassName: field.UIOptions.FieldClassName,
|
||||
},
|
||||
}
|
||||
configField.UIOptions.Placeholder = field.UIOptions.Placeholder.Translate(ctx)
|
||||
@@ -128,13 +130,15 @@ type ConfigField struct {
|
||||
}
|
||||
|
||||
type ConfigFieldUIOptions struct {
|
||||
Placeholder string `json:"placeholder,omitempty"`
|
||||
Rows string `json:"rows,omitempty"`
|
||||
InputType string `json:"input_type,omitempty"`
|
||||
Label string `json:"label,omitempty"`
|
||||
Action *UIOptionAction `json:"action,omitempty"`
|
||||
Variant string `json:"variant,omitempty"`
|
||||
Text string `json:"text,omitempty"`
|
||||
Placeholder string `json:"placeholder,omitempty"`
|
||||
Rows string `json:"rows,omitempty"`
|
||||
InputType string `json:"input_type,omitempty"`
|
||||
Label string `json:"label,omitempty"`
|
||||
Action *UIOptionAction `json:"action,omitempty"`
|
||||
Variant string `json:"variant,omitempty"`
|
||||
Text string `json:"text,omitempty"`
|
||||
ClassName string `json:"class_name,omitempty"`
|
||||
FieldClassName string `json:"field_class_name,omitempty"`
|
||||
}
|
||||
|
||||
type ConfigFieldOption struct {
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package schema
|
||||
|
||||
import (
|
||||
"github.com/apache/incubator-answer/plugin"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type GetUserPluginListResp struct {
|
||||
Name string `json:"name"`
|
||||
SlugName string `json:"slug_name"`
|
||||
}
|
||||
|
||||
type UpdateUserPluginReq struct {
|
||||
PluginSlugName string `validate:"required,gt=1,lte=100" json:"plugin_slug_name"`
|
||||
UserID string `json:"-"`
|
||||
}
|
||||
|
||||
type GetUserPluginConfigReq struct {
|
||||
PluginSlugName string `validate:"required,gt=1,lte=100" form:"plugin_slug_name"`
|
||||
UserID string `json:"-"`
|
||||
}
|
||||
|
||||
type GetUserPluginConfigResp struct {
|
||||
Name string `json:"name"`
|
||||
SlugName string `json:"slug_name"`
|
||||
ConfigFields []*ConfigField `json:"config_fields"`
|
||||
}
|
||||
|
||||
func (g *GetUserPluginConfigResp) SetConfigFields(ctx *gin.Context, fields []plugin.ConfigField) {
|
||||
for _, field := range fields {
|
||||
configField := &ConfigField{
|
||||
Name: field.Name,
|
||||
Type: string(field.Type),
|
||||
Title: field.Title.Translate(ctx),
|
||||
Description: field.Description.Translate(ctx),
|
||||
Required: field.Required,
|
||||
Value: field.Value,
|
||||
UIOptions: ConfigFieldUIOptions{
|
||||
Rows: field.UIOptions.Rows,
|
||||
InputType: string(field.UIOptions.InputType),
|
||||
Variant: field.UIOptions.Variant,
|
||||
ClassName: field.UIOptions.ClassName,
|
||||
FieldClassName: field.UIOptions.FieldClassName,
|
||||
},
|
||||
}
|
||||
configField.UIOptions.Placeholder = field.UIOptions.Placeholder.Translate(ctx)
|
||||
configField.UIOptions.Label = field.UIOptions.Label.Translate(ctx)
|
||||
configField.UIOptions.Text = field.UIOptions.Text.Translate(ctx)
|
||||
if field.UIOptions.Action != nil {
|
||||
uiOptionAction := &UIOptionAction{
|
||||
Url: field.UIOptions.Action.Url,
|
||||
Method: field.UIOptions.Action.Method,
|
||||
}
|
||||
if field.UIOptions.Action.Loading != nil {
|
||||
uiOptionAction.Loading = &LoadingAction{
|
||||
Text: field.UIOptions.Action.Loading.Text.Translate(ctx),
|
||||
State: string(field.UIOptions.Action.Loading.State),
|
||||
}
|
||||
}
|
||||
if field.UIOptions.Action.OnComplete != nil {
|
||||
uiOptionAction.OnCompleteAction = &OnCompleteAction{
|
||||
ToastReturnMessage: field.UIOptions.Action.OnComplete.ToastReturnMessage,
|
||||
RefreshFormConfig: field.UIOptions.Action.OnComplete.RefreshFormConfig,
|
||||
}
|
||||
}
|
||||
configField.UIOptions.Action = uiOptionAction
|
||||
}
|
||||
|
||||
for _, option := range field.Options {
|
||||
configField.Options = append(configField.Options, ConfigFieldOption{
|
||||
Label: option.Label.Translate(ctx),
|
||||
Value: option.Value,
|
||||
})
|
||||
}
|
||||
g.ConfigFields = append(g.ConfigFields, configField)
|
||||
}
|
||||
}
|
||||
|
||||
type UpdateUserPluginConfigReq struct {
|
||||
PluginSlugName string `validate:"required,gt=1,lte=100" json:"plugin_slug_name"`
|
||||
ConfigFields map[string]any `json:"config_fields"`
|
||||
UserID string `json:"-"`
|
||||
}
|
||||
@@ -64,7 +64,7 @@ type SearchCondition struct {
|
||||
// only show this question's answer
|
||||
QuestionID string
|
||||
// search query tags
|
||||
Tags []string
|
||||
Tags [][]string
|
||||
// search query keywords
|
||||
Words []string
|
||||
}
|
||||
|
||||
@@ -136,6 +136,7 @@ type SiteCustomCssHTMLReq struct {
|
||||
type SiteThemeReq struct {
|
||||
Theme string `validate:"required,gt=0,lte=255" json:"theme"`
|
||||
ThemeConfig map[string]interface{} `validate:"omitempty" json:"theme_config"`
|
||||
ColorScheme string `validate:"omitempty,gt=0,lte=100" json:"color_scheme"`
|
||||
}
|
||||
|
||||
type SiteSeoReq struct {
|
||||
@@ -171,6 +172,7 @@ type SiteThemeResp struct {
|
||||
ThemeOptions []*ThemeOption `json:"theme_options"`
|
||||
Theme string `json:"theme"`
|
||||
ThemeConfig map[string]interface{} `json:"theme_config"`
|
||||
ColorScheme string `json:"color_scheme"`
|
||||
}
|
||||
|
||||
func (s *SiteThemeResp) TrTheme(ctx context.Context) {
|
||||
@@ -284,6 +286,8 @@ const (
|
||||
PrivilegeLevel2 PrivilegeLevel = 2
|
||||
// PrivilegeLevel3 high
|
||||
PrivilegeLevel3 PrivilegeLevel = 3
|
||||
// PrivilegeLevelCustom custom
|
||||
PrivilegeLevelCustom PrivilegeLevel = 99
|
||||
)
|
||||
|
||||
type PrivilegeLevel int
|
||||
@@ -308,16 +312,18 @@ type GetPrivilegesConfigResp struct {
|
||||
type PrivilegeOption struct {
|
||||
Level PrivilegeLevel `json:"level"`
|
||||
LevelDesc string `json:"level_desc"`
|
||||
Privileges []*constant.Privilege `json:"privileges"`
|
||||
Privileges []*constant.Privilege `validate:"dive" json:"privileges"`
|
||||
}
|
||||
|
||||
// UpdatePrivilegesConfigReq update privileges config request
|
||||
type UpdatePrivilegesConfigReq struct {
|
||||
Level PrivilegeLevel `validate:"required,min=1,max=3" json:"level"`
|
||||
Level PrivilegeLevel `validate:"required,min=1,max=3|eq=99" json:"level"`
|
||||
CustomPrivileges []*constant.Privilege `validate:"dive" json:"custom_privileges"`
|
||||
}
|
||||
|
||||
var (
|
||||
DefaultPrivilegeOptions PrivilegeOptions
|
||||
DefaultCustomPrivilegeOption *PrivilegeOption
|
||||
privilegeOptionsLevelMapping = map[string][]int{
|
||||
constant.RankQuestionAddKey: {1, 1, 1},
|
||||
constant.RankAnswerAddKey: {1, 1, 1},
|
||||
@@ -368,4 +374,11 @@ func init() {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// set up default custom privilege option
|
||||
DefaultCustomPrivilegeOption = &PrivilegeOption{
|
||||
Level: PrivilegeLevelCustom,
|
||||
LevelDesc: reason.PrivilegeLevelCustomDesc,
|
||||
Privileges: DefaultPrivilegeOptions[0].Privileges,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,41 +38,13 @@ func NewNotificationChannelsFormJson(jsonStr string) NotificationChannels {
|
||||
return list
|
||||
}
|
||||
|
||||
func (n *NotificationChannels) Format(sequences []constant.NotificationChannelKey) {
|
||||
if n == nil {
|
||||
*n = make([]*NotificationChannelConfig, 0)
|
||||
return
|
||||
func NewNotificationChannelConfigFormJson(jsonStr string) NotificationChannelConfig {
|
||||
var list NotificationChannels
|
||||
_ = json.Unmarshal([]byte(jsonStr), &list)
|
||||
if len(list) > 0 {
|
||||
return *list[0]
|
||||
}
|
||||
mapping := make(map[constant.NotificationChannelKey]*NotificationChannelConfig)
|
||||
for _, item := range *n {
|
||||
mapping[item.Key] = &NotificationChannelConfig{
|
||||
Key: item.Key,
|
||||
Enable: item.Enable,
|
||||
}
|
||||
}
|
||||
newList := make([]*NotificationChannelConfig, 0)
|
||||
for _, ch := range sequences {
|
||||
if c, ok := mapping[ch]; ok {
|
||||
newList = append(newList, c)
|
||||
} else {
|
||||
newList = append(newList, &NotificationChannelConfig{
|
||||
Key: ch,
|
||||
})
|
||||
}
|
||||
}
|
||||
*n = newList
|
||||
}
|
||||
|
||||
func (n *NotificationChannels) CheckEnable(ch constant.NotificationChannelKey) bool {
|
||||
if n == nil {
|
||||
return false
|
||||
}
|
||||
for _, item := range *n {
|
||||
if item.Key == ch {
|
||||
return item.Enable
|
||||
}
|
||||
}
|
||||
return false
|
||||
return NotificationChannelConfig{}
|
||||
}
|
||||
|
||||
func (n *NotificationChannels) ToJsonString() string {
|
||||
@@ -81,62 +53,39 @@ func (n *NotificationChannels) ToJsonString() string {
|
||||
}
|
||||
|
||||
type NotificationConfig struct {
|
||||
Inbox NotificationChannels `json:"inbox"`
|
||||
AllNewQuestion NotificationChannels `json:"all_new_question"`
|
||||
AllNewQuestionForFollowingTags NotificationChannels `json:"all_new_question_for_following_tags"`
|
||||
}
|
||||
|
||||
func (n *NotificationConfig) ToJsonString() string {
|
||||
data, _ := json.Marshal(n)
|
||||
return string(data)
|
||||
Inbox NotificationChannelConfig `json:"inbox"`
|
||||
AllNewQuestion NotificationChannelConfig `json:"all_new_question"`
|
||||
AllNewQuestionForFollowingTags NotificationChannelConfig `json:"all_new_question_for_following_tags"`
|
||||
}
|
||||
|
||||
func NewNotificationConfig(configs []*entity.UserNotificationConfig) NotificationConfig {
|
||||
nc := NotificationConfig{}
|
||||
nc.Inbox = make([]*NotificationChannelConfig, 0)
|
||||
nc.AllNewQuestion = make([]*NotificationChannelConfig, 0)
|
||||
nc.AllNewQuestionForFollowingTags = make([]*NotificationChannelConfig, 0)
|
||||
for _, item := range configs {
|
||||
switch item.Source {
|
||||
case string(constant.InboxSource):
|
||||
nc.Inbox = NewNotificationChannelsFormJson(item.Channels)
|
||||
nc.Inbox = NewNotificationChannelConfigFormJson(item.Channels)
|
||||
case string(constant.AllNewQuestionSource):
|
||||
nc.AllNewQuestion = NewNotificationChannelsFormJson(item.Channels)
|
||||
nc.AllNewQuestion = NewNotificationChannelConfigFormJson(item.Channels)
|
||||
case string(constant.AllNewQuestionForFollowingTagsSource):
|
||||
nc.AllNewQuestionForFollowingTags = NewNotificationChannelsFormJson(item.Channels)
|
||||
nc.AllNewQuestionForFollowingTags = NewNotificationChannelConfigFormJson(item.Channels)
|
||||
}
|
||||
}
|
||||
return nc
|
||||
}
|
||||
|
||||
func (n *NotificationConfig) FromJsonString(data string) {
|
||||
if len(data) > 0 {
|
||||
_ = json.Unmarshal([]byte(data), n)
|
||||
return
|
||||
}
|
||||
n.Inbox = make([]*NotificationChannelConfig, 0)
|
||||
n.AllNewQuestion = make([]*NotificationChannelConfig, 0)
|
||||
n.AllNewQuestionForFollowingTags = make([]*NotificationChannelConfig, 0)
|
||||
return
|
||||
}
|
||||
|
||||
func (n *NotificationConfig) Format() {
|
||||
n.Inbox.Format([]constant.NotificationChannelKey{constant.EmailChannel})
|
||||
n.AllNewQuestion.Format([]constant.NotificationChannelKey{constant.EmailChannel})
|
||||
n.AllNewQuestionForFollowingTags.Format([]constant.NotificationChannelKey{constant.EmailChannel})
|
||||
}
|
||||
|
||||
func (n *NotificationConfig) CheckEnable(
|
||||
source constant.NotificationSource, channel constant.NotificationChannelKey) bool {
|
||||
switch source {
|
||||
case constant.InboxSource:
|
||||
return n.Inbox.CheckEnable(channel)
|
||||
case constant.AllNewQuestionSource:
|
||||
return n.AllNewQuestion.CheckEnable(channel)
|
||||
case constant.AllNewQuestionForFollowingTagsSource:
|
||||
return n.AllNewQuestionForFollowingTags.CheckEnable(channel)
|
||||
if n.Inbox.Key == "" {
|
||||
n.Inbox.Key = constant.EmailChannel
|
||||
n.Inbox.Enable = false
|
||||
}
|
||||
if n.AllNewQuestion.Key == "" {
|
||||
n.AllNewQuestion.Key = constant.EmailChannel
|
||||
n.AllNewQuestion.Enable = false
|
||||
}
|
||||
if n.AllNewQuestionForFollowingTags.Key == "" {
|
||||
n.AllNewQuestionForFollowingTags.Key = constant.EmailChannel
|
||||
n.AllNewQuestionForFollowingTags.Enable = false
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// UpdateUserNotificationConfigReq update user notification config request
|
||||
|
||||
@@ -21,6 +21,9 @@ package schema
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/apache/incubator-answer/internal/base/reason"
|
||||
"github.com/apache/incubator-answer/internal/base/translator"
|
||||
"github.com/segmentfault/pacman/errors"
|
||||
|
||||
"github.com/apache/incubator-answer/internal/base/constant"
|
||||
"github.com/apache/incubator-answer/internal/base/validator"
|
||||
@@ -80,6 +83,8 @@ type UserLoginResp struct {
|
||||
Location string `json:"location"`
|
||||
// language
|
||||
Language string `json:"language"`
|
||||
// Color scheme
|
||||
ColorScheme string `json:"color_scheme"`
|
||||
// access token
|
||||
AccessToken string `json:"access_token"`
|
||||
// role id
|
||||
@@ -110,6 +115,9 @@ func (r *GetCurrentLoginUserInfoResp) ConvertFromUserEntity(userInfo *entity.Use
|
||||
r.CreatedAt = userInfo.CreatedAt.Unix()
|
||||
r.LastLoginDate = userInfo.LastLoginDate.Unix()
|
||||
r.Status = constant.ConvertUserStatus(userInfo.Status, userInfo.MailStatus)
|
||||
if len(r.ColorScheme) == 0 {
|
||||
r.ColorScheme = constant.ColorSchemeDefault
|
||||
}
|
||||
}
|
||||
|
||||
// GetOtherUserInfoByUsernameResp get user response
|
||||
@@ -278,10 +286,25 @@ func (req *UpdateInfoRequest) Check() (errFields []*validator.FormErrorField, er
|
||||
type UpdateUserInterfaceRequest struct {
|
||||
// language
|
||||
Language string `validate:"required,gt=1,lte=100" json:"language"`
|
||||
// Color scheme
|
||||
ColorScheme string `validate:"required,gt=1,lte=100" json:"color_scheme"`
|
||||
// user id
|
||||
UserId string `json:"-"`
|
||||
}
|
||||
|
||||
func (req *UpdateUserInterfaceRequest) Check() (errFields []*validator.FormErrorField, err error) {
|
||||
if !translator.CheckLanguageIsValid(req.Language) {
|
||||
return nil, errors.BadRequest(reason.LangNotFound)
|
||||
}
|
||||
if req.ColorScheme != constant.ColorSchemeDefault &&
|
||||
req.ColorScheme != constant.ColorSchemeLight &&
|
||||
req.ColorScheme != constant.ColorSchemeDark &&
|
||||
req.ColorScheme != constant.ColorSchemeSystem {
|
||||
req.ColorScheme = constant.ColorSchemeDefault
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
type UserRetrievePassWordRequest struct {
|
||||
Email string `validate:"required,email,gt=0,lte=500" json:"e_mail"`
|
||||
CaptchaID string `json:"captcha_id"`
|
||||
@@ -325,6 +348,7 @@ type UserBasicInfo struct {
|
||||
Avatar string `json:"avatar"`
|
||||
Website string `json:"website"`
|
||||
Location string `json:"location"`
|
||||
Language string `json:"language"`
|
||||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
|
||||
@@ -36,10 +36,6 @@ func (cs *CaptchaService) ValidationStrategy(ctx context.Context, unit, actionTy
|
||||
log.Error(err)
|
||||
return false
|
||||
}
|
||||
// If no operation previously, it is considered to be the first operation
|
||||
if info == nil {
|
||||
return true
|
||||
}
|
||||
switch actionType {
|
||||
case entity.CaptchaActionEmail:
|
||||
return cs.CaptchaActionEmail(ctx, unit, info)
|
||||
@@ -71,119 +67,152 @@ func (cs *CaptchaService) ValidationStrategy(ctx context.Context, unit, actionTy
|
||||
return false
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionEmail(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionEmail(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
// You need a verification code every time
|
||||
return false
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionPassword(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionPassword(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 3
|
||||
setTime := int64(60 * 30) //seconds
|
||||
now := time.Now().Unix()
|
||||
if now-actioninfo.LastTime <= setTime && actioninfo.Num >= setNum {
|
||||
if now-actionInfo.LastTime <= setTime && actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
if now-actioninfo.LastTime != 0 && now-actioninfo.LastTime > setTime {
|
||||
if now-actionInfo.LastTime != 0 && now-actionInfo.LastTime > setTime {
|
||||
cs.captchaRepo.SetActionType(ctx, unit, entity.CaptchaActionPassword, "", 0)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionEditUserinfo(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionEditUserinfo(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 3
|
||||
setTime := int64(60 * 30) //seconds
|
||||
now := time.Now().Unix()
|
||||
if now-actioninfo.LastTime <= setTime && actioninfo.Num >= setNum {
|
||||
if now-actionInfo.LastTime <= setTime && actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
if now-actioninfo.LastTime != 0 && now-actioninfo.LastTime > setTime {
|
||||
if now-actionInfo.LastTime != 0 && now-actionInfo.LastTime > setTime {
|
||||
cs.captchaRepo.SetActionType(ctx, unit, entity.CaptchaActionEditUserinfo, "", 0)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionQuestion(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionQuestion(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 10
|
||||
setTime := int64(5) //seconds
|
||||
now := time.Now().Unix()
|
||||
if now-actioninfo.LastTime <= setTime || actioninfo.Num >= setNum {
|
||||
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionAnswer(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionAnswer(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 10
|
||||
setTime := int64(5) //seconds
|
||||
now := time.Now().Unix()
|
||||
if now-actioninfo.LastTime <= setTime || actioninfo.Num >= setNum {
|
||||
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionComment(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionComment(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 30
|
||||
setTime := int64(1) //seconds
|
||||
now := time.Now().Unix()
|
||||
if now-actioninfo.LastTime <= setTime || actioninfo.Num >= setNum {
|
||||
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionEdit(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionEdit(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 10
|
||||
if actioninfo.Num >= setNum {
|
||||
if actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionInvitationAnswer(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionInvitationAnswer(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 30
|
||||
if actioninfo.Num >= setNum {
|
||||
if actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionSearch(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionSearch(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
now := time.Now().Unix()
|
||||
setNum := 20
|
||||
setTime := int64(60) //seconds
|
||||
if now-int64(actioninfo.LastTime) <= setTime && actioninfo.Num >= setNum {
|
||||
if now-int64(actionInfo.LastTime) <= setTime && actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
if now-actioninfo.LastTime > setTime {
|
||||
if now-actionInfo.LastTime > setTime {
|
||||
cs.captchaRepo.SetActionType(ctx, unit, entity.CaptchaActionSearch, "", 0)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionReport(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionReport(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 30
|
||||
setTime := int64(1) //seconds
|
||||
now := time.Now().Unix()
|
||||
if now-actioninfo.LastTime <= setTime || actioninfo.Num >= setNum {
|
||||
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionDelete(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionDelete(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 5
|
||||
setTime := int64(5) //seconds
|
||||
now := time.Now().Unix()
|
||||
if now-actioninfo.LastTime <= setTime || actioninfo.Num >= setNum {
|
||||
if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cs *CaptchaService) CaptchaActionVote(ctx context.Context, unit string, actioninfo *entity.ActionRecordInfo) bool {
|
||||
func (cs *CaptchaService) CaptchaActionVote(ctx context.Context, unit string, actionInfo *entity.ActionRecordInfo) bool {
|
||||
if actionInfo == nil {
|
||||
return true
|
||||
}
|
||||
setNum := 40
|
||||
if actioninfo.Num >= setNum {
|
||||
if actionInfo.Num >= setNum {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
|
||||
@@ -206,7 +206,7 @@ func (as *ActivityService) getTimelineActivityComment(ctx context.Context, objec
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
} else {
|
||||
return revision.Log
|
||||
return converter.Markdown2HTML(revision.Log)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -218,7 +218,7 @@ func (as *ActivityService) getTimelineActivityComment(ctx context.Context, objec
|
||||
} else {
|
||||
closeMsg := &schema.CloseQuestionMeta{}
|
||||
if err := json.Unmarshal([]byte(metaInfo.Value), closeMsg); err == nil {
|
||||
return closeMsg.CloseMsg
|
||||
return converter.Markdown2HTML(closeMsg.CloseMsg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,9 +21,6 @@ package comment
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/apache/incubator-answer/pkg/token"
|
||||
"time"
|
||||
|
||||
"github.com/apache/incubator-answer/internal/base/constant"
|
||||
"github.com/apache/incubator-answer/internal/base/pager"
|
||||
"github.com/apache/incubator-answer/internal/base/reason"
|
||||
@@ -38,10 +35,12 @@ import (
|
||||
"github.com/apache/incubator-answer/internal/service/permission"
|
||||
usercommon "github.com/apache/incubator-answer/internal/service/user_common"
|
||||
"github.com/apache/incubator-answer/pkg/htmltext"
|
||||
"github.com/apache/incubator-answer/pkg/token"
|
||||
"github.com/apache/incubator-answer/pkg/uid"
|
||||
"github.com/jinzhu/copier"
|
||||
"github.com/segmentfault/pacman/errors"
|
||||
"github.com/segmentfault/pacman/log"
|
||||
"time"
|
||||
)
|
||||
|
||||
// CommentRepo comment repository
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user