Compare commits

..

1 Commits

3210 changed files with 28692 additions and 76889 deletions

View File

View File

21
.eslintignore Normal file
View File

@@ -0,0 +1,21 @@
node_modules/
*.sublime-project
*.sublime-workspace
.project
.vagrant
.DS_Store
logs/
/public/templates
/public/uploads
/public/vendor
/public/src/modules/string.js
.idea/
.vscode/
*.ipr
*.iws
/coverage
/build
.eslintrc
test/files
*.min.js
install/docker/

3
.eslintrc Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": "nodebb"
}

View File

@@ -16,88 +16,17 @@ permissions:
packages: write
jobs:
build:
strategy:
matrix:
include:
- os: ubuntu-latest
platforms: linux/amd64
required: true
- os: ubuntu-24.04-arm
platforms: linux/arm64
required: true
continue-on-error: ${{ !matrix.required }}
runs-on: ${{ matrix.os }}
steps:
- name: Prepare
run: |
platform=${{ matrix.platforms }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV
- uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE }}
- name: Cache node_modules
id: cache-node-modules
uses: actions/cache@v5
with:
path: var-cache-node-modules
key: var-cache-node-modules-${{ hashFiles('Dockerfile', 'install/package.json') }}
- name: Build and push Docker images
id: build
uses: docker/build-push-action@v6
with:
cache-from: type=gha
cache-to: type=gha,mode=min
context: .
file: ./Dockerfile
platforms: ${{ matrix.platforms }}
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ env.IMAGE }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
- name: Export digest
run: |
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v6
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
merge:
release:
runs-on: ubuntu-latest
needs:
- build
steps:
- name: Prepare
run: |
echo "IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV
echo "CURRENT_DATE_NST=$(date +'%Y%m%d-%H%M%S' -d '-3 hours -30 minutes')" >> $GITHUB_ENV
- name: Download digests
uses: actions/download-artifact@v7
- uses: actions/checkout@v4
with:
path: ${{ runner.temp }}/digests
pattern: digests-*
merge-multiple: true
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -107,25 +36,26 @@ jobs:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE }}
images: ghcr.io/${{ github.repository }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}.x
type=raw,value=latest,enable={{is_default_branch}}
type=ref,event=branch,enable=${{ github.event.repository.default_branch != github.ref }}
type=raw,value=${{ env.CURRENT_DATE_NST }}
flavor: |
latest=true
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.IMAGE }}@sha256:%s ' *)
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.IMAGE }}:${{ steps.meta.outputs.version }}
- name: Build and push Docker images
uses: docker/build-push-action@v5
with:
cache-from: type=gha
cache-to: type=gha,mode=max
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
push: true
tags: ${{ steps.meta.outputs.tags }}

View File

@@ -27,19 +27,19 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest]
node: [20, 22]
node: [18, 20]
database: [mongo-dev, mongo, redis, postgres]
include:
# only run coverage once
- os: ubuntu-latest
node: 22
node: 18
coverage: true
# test under development once
- database: mongo-dev
test_env: development
# only run eslint once
- os: ubuntu-latest
node: 22
node: 18
database: mongo-dev
lint: true
runs-on: ${{ matrix.os }}
@@ -48,7 +48,7 @@ jobs:
services:
postgres:
image: 'postgres:18-alpine'
image: 'postgres:16-alpine'
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
@@ -63,7 +63,7 @@ jobs:
- 5432:5432
redis:
image: 'redis:8.4.0'
image: 'redis:7.2.3'
# Set health checks to wait until redis has started
options: >-
--health-cmd "redis-cli ping"
@@ -75,18 +75,18 @@ jobs:
- 6379:6379
mongo:
image: 'mongo:8.2'
image: 'mongo:7.0'
ports:
# Maps port 27017 on service container to the host
- 27017:27017
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
- run: cp install/package.json package.json
- name: Install Node
uses: actions/setup-node@v6
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
@@ -192,7 +192,7 @@ jobs:
run: npm run coverage
- name: Test coverage
uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # v2.2.3
if: matrix.coverage
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
@@ -206,7 +206,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Coveralls Finished
uses: coverallsapp/github-action@648a8eb78e6d50909eff900e4ec85cab4524a45b # v2.3.6
uses: coverallsapp/github-action@3dfc5567390f6fa9267c0ee9c251e4c8c3f18949 # v2.2.3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
parallel-finished: true

3
.gitignore vendored
View File

@@ -71,5 +71,4 @@ package-lock.json
link-plugins.sh
test.sh
.docker/**
!**/.gitkeep
.docker/

5722
.tx/config

File diff suppressed because it is too large Load Diff

View File

@@ -1,22 +0,0 @@
'use strict';
const { readFile, writeFile } = require('fs').promises;
(async () => {
const contents = await readFile('./config', { encoding: 'utf-8' });
const blocks = contents
.split('\n\n')
.map((block) => {
block = block.split('\n').sort((a, b) => {
if (!a.startsWith('trans') || !b.startsWith('trans')) {
return 0;
}
return a.localeCompare(b);
})
return block.join('\n');
});
await writeFile('./config', blocks.join('\n\n'), { encoding: 'utf-8' });
})();

File diff suppressed because it is too large Load Diff

View File

@@ -1,76 +1,51 @@
FROM node:lts as build
FROM --platform=$BUILDPLATFORM node:lts as npm
ENV NODE_ENV=production \
DAEMON=false \
SILENT=false \
USER=nodebb \
UID=1001 \
GID=1001
RUN mkdir -p /usr/src/build && \
chown -R node:node /usr/src/build
WORKDIR /usr/src/build
WORKDIR /usr/src/app/
ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
COPY . /usr/src/app/
COPY --chown=node:node install/package.json /usr/src/build/package.json
# Install corepack to allow usage of other package managers
RUN corepack enable
USER node
# Removing unnecessary files for us
RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \;
RUN npm install --omit=dev
# Prepage package.json
RUN cp /usr/src/app/install/package.json /usr/src/app/
FROM node:lts as rebuild
RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive \
apt-get -y --no-install-recommends install \
tini
ARG BUILDPLATFORM
ARG TARGETPLATFORM
RUN groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& chown -R ${USER}:${USER} /usr/src/app/
RUN mkdir -p /usr/src/build && \
chown -R node:node /usr/src/build
USER ${USER}
COPY --from=npm /usr/src/build /usr/src/build
RUN npm install --omit=dev \
&& rm -rf .npm
# TODO: generate lockfiles for each package manager
## pnpm import \
RUN if [ $BUILDPLATFORM != $TARGETPLATFORM ]; then \
npm rebuild && \
npm cache clean --force; fi
FROM node:lts-slim AS final
FROM node:lts-slim as run
ENV NODE_ENV=production \
DAEMON=false \
SILENT=false \
USER=nodebb \
UID=1001 \
GID=1001
ARG NODE_ENV
ENV NODE_ENV=$NODE_ENV \
daemon=false \
silent=false
WORKDIR /usr/src/app/
RUN mkdir -p /usr/src/app && \
chown -R node:node /usr/src/app
RUN corepack enable \
&& groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& mkdir -p /usr/src/app/logs/ /opt/config/ \
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/
COPY --chown=node:node --from=rebuild /usr/src/build /usr/src/app
COPY --from=build --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/
COPY --from=build --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh \
&& chmod +x /usr/local/bin/tini
WORKDIR /usr/src/app
# TODO: Have docker-compose use environment variables to create files like setup.json and config.json.
# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate
USER node
USER ${USER}
COPY --chown=node:node . /usr/src/app
EXPOSE 4567
VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"]
# Utilising tini as our init system within the Docker container for graceful start-up and termination.
# Tini serves as an uncomplicated init system, adept at managing the reaping of zombie processes and forwarding signals.
# This approach is crucial to circumvent issues with unmanaged subprocesses and signal handling in containerised environments.
# By integrating tini, we enhance the reliability and stability of our Docker containers.
# Ensures smooth start-up and shutdown processes, and reliable, safe handling of signal processing.
ENTRYPOINT ["tini", "--", "entrypoint.sh"]
VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config"]
ENTRYPOINT ["./install/docker/entrypoint.sh"]

View File

@@ -173,10 +173,7 @@ module.exports = function (grunt) {
winston.error(err.stack);
}
if (worker) {
worker.send({
compiling: compiling,
livereload: true, // Send livereload event via Socket.IO for instant browser refresh
});
worker.send({ compiling: compiling });
}
});
});

View File

@@ -39,8 +39,8 @@ Our minimalist "Harmony" theme gets you going right away, no coding experience r
NodeBB requires the following software to be installed:
* A version of Node.js at least 20 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
* MongoDB, version 5 or greater **or** Redis, version 7.2 or greater
* A version of Node.js at least 16 or greater ([installation/upgrade instructions](https://github.com/nodesource/distributions))
* MongoDB, version 3.6 or greater **or** Redis, version 2.8.9 or greater
* If you are using [clustering](https://docs.nodebb.org/configuring/scaling/) you need Redis installed and configured.
* nginx, version 1.3.13 or greater (**only if** intending to use nginx to proxy requests to a NodeBB)

View File

@@ -1,78 +0,0 @@
FROM node:lts AS git
ENV USER=nodebb \
UID=1001 \
GID=1001
WORKDIR /usr/src/app/
RUN groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& chown -R ${USER}:${USER} /usr/src/app/
RUN apt-get update \
&& apt-get -y --no-install-recommends install tini
USER ${USER}
# Change to the git branch you want to test
RUN git clone --recurse-submodules -j8 --depth 1 https://github.com/NodeBB/NodeBB.git .
RUN find . -mindepth 1 -maxdepth 1 -name '.*' ! -name '.' ! -name '..' -exec bash -c 'echo "Deleting {}"; rm -rf {}' \;
FROM node:lts AS node_modules_touch
ENV NODE_ENV=development \
USER=nodebb \
UID=1001 \
GID=1001
WORKDIR /usr/src/app/
RUN corepack enable \
&& groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& chown -R ${USER}:${USER} /usr/src/app/
COPY --from=git --chown=${USER}:${USER} /usr/src/app/install/package.json /usr/src/app/
USER ${USER}
RUN npm install \
&& rm -rf .npm
FROM node:lts-slim AS final
ENV NODE_ENV=development \
DAEMON=false \
SILENT=false \
USER=nodebb \
UID=1001 \
GID=1001
WORKDIR /usr/src/app/
RUN corepack enable \
&& groupadd --gid ${GID} ${USER} \
&& useradd --uid ${UID} --gid ${GID} --home-dir /usr/src/app/ --shell /bin/bash ${USER} \
&& mkdir -p /usr/src/app/logs/ /opt/config/ \
&& chown -R ${USER}:${USER} /usr/src/app/ /opt/config/
COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/install/docker/setup.json /usr/src/app/
COPY --from=git --chown=${USER}:${USER} /usr/bin/tini /usr/src/app/install/docker/entrypoint.sh /usr/local/bin/
COPY --from=node_modules_touch --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/
COPY --from=git --chown=${USER}:${USER} /usr/src/app/ /usr/src/app/
RUN chmod +x /usr/local/bin/entrypoint.sh \
&& chmod +x /usr/local/bin/tini
# TODO: Have docker-compose use environment variables to create files like setup.json and config.json.
# COPY --from=hairyhenderson/gomplate:stable /gomplate /usr/local/bin/gomplate
USER ${USER}
EXPOSE 4567
VOLUME ["/usr/src/app/node_modules", "/usr/src/app/build", "/usr/src/app/public/uploads", "/opt/config/"]
ENTRYPOINT ["tini", "--", "entrypoint.sh"]

View File

@@ -1,70 +0,0 @@
version: '3.8'
services:
nodebb:
build: .
# image: ghcr.io/nodebb/nodebb:latest
restart: unless-stopped
ports:
- '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
volumes:
- nodebb-build:/usr/src/app/build
- nodebb-uploads:/usr/src/app/public/uploads
- nodebb-config:/opt/config
- ./install/docker/setup.json:/usr/src/app/setup.json
postgres:
image: postgres:18.1-alpine
restart: unless-stopped
environment:
POSTGRES_USER: nodebb
POSTGRES_PASSWORD: nodebb
POSTGRES_DB: nodebb
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:8.4.0-alpine
restart: unless-stopped
command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning']
# command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF
volumes:
- redis-data:/data
profiles:
- redis
volumes:
postgres-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/postgresql/data
redis-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/redis
nodebb-build:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/build
nodebb-uploads:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/public/uploads
nodebb-config:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/config

View File

@@ -1,51 +0,0 @@
version: '3.8'
services:
nodebb:
build: .
# image: ghcr.io/nodebb/nodebb:latest
restart: unless-stopped
ports:
- '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
volumes:
- nodebb-build:/usr/src/app/build
- nodebb-uploads:/usr/src/app/public/uploads
- nodebb-config:/opt/config
- ./install/docker/setup.json:/usr/src/app/setup.json
redis:
image: redis:8.4.0-alpine
restart: unless-stopped
command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning']
# command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF
volumes:
- redis-data:/data
volumes:
redis-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/redis
nodebb-build:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/build
nodebb-uploads:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/public/uploads
nodebb-config:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/config

View File

@@ -1,89 +1,55 @@
version: '3.8'
services:
nodebb:
build: .
# image: ghcr.io/nodebb/nodebb:latest
restart: unless-stopped
ports:
- '4567:4567' # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
- "4567:4567/tcp" # comment this out if you don't want to expose NodeBB to the host, or change the first number to any port you want
# uncomment if you want to use another container as a reverse proxy
# expose:
# - 4567
volumes:
- nodebb-build:/usr/src/app/build
- nodebb-uploads:/usr/src/app/public/uploads
- nodebb-config:/opt/config
- ./.docker/build:/usr/src/app/build
- ./.docker/public/uploads:/usr/src/app/public/uploads
- ./.docker:/opt/config
- ./install/docker/setup.json:/usr/src/app/setup.json
mongo:
image: 'mongo:7-jammy'
image: "mongo:7-jammy"
restart: unless-stopped
ports:
- '27017:27017'
expose:
- "27017"
environment:
MONGO_INITDB_ROOT_USERNAME: nodebb
MONGO_INITDB_ROOT_PASSWORD: nodebb
MONGO_INITDB_DATABASE: nodebb
volumes:
- mongo-data:/data/db
- ./.docker/database/mongo/config:/etc/mongo
- ./.docker/database/mongo/data:/data/db
- ./install/docker/mongodb-user-init.js:/docker-entrypoint-initdb.d/user-init.js
redis:
image: redis:8.4.0-alpine
restart: unless-stopped
command: ['redis-server', '--appendonly', 'yes', '--loglevel', 'warning']
# command: ['redis-server', '--save', '60', '1', '--loglevel', 'warning'] # uncomment if you want to use snapshotting instead of AOF
volumes:
- redis-data:/data
profiles:
- redis
- mongo
postgres:
image: postgres:18.1-alpine
image: postgres:16.1-alpine
restart: unless-stopped
expose:
- "5432"
environment:
POSTGRES_USER: nodebb
POSTGRES_PASSWORD: nodebb
POSTGRES_DB: nodebb
volumes:
- postgres-data:/var/lib/postgresql/data
- ./.docker/database/postgresql/data:/var/lib/postgresql/data
profiles:
- postgres
volumes:
mongo-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/mongo/data
redis-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/redis
postgres-data:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/database/postgresql/data
nodebb-build:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/build
nodebb-uploads:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/public/uploads
nodebb-config:
driver: local
driver_opts:
o: bind
type: none
device: ./.docker/config
redis:
image: redis:7.2.3-alpine
restart: unless-stopped
command: ["redis-server", "--appendonly", "yes", "--loglevel", "warning"]
# command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"] # uncomment if you want to use snapshotting instead of AOF
expose:
- "6379"
volumes:
- ./.docker/database/redis:/data
profiles:
- redis

View File

@@ -1,65 +0,0 @@
'use strict';
import serverConfig from 'eslint-config-nodebb';
import publicConfig from 'eslint-config-nodebb/public';
import commonRules from 'eslint-config-nodebb/common';
import { defineConfig } from 'eslint/config';
import stylisticJs from '@stylistic/eslint-plugin'
import js from '@eslint/js';
import globals from 'globals';
export default defineConfig([
{
ignores: [
'node_modules/',
'.project',
'.vagrant',
'.DS_Store',
'.tx',
'logs/',
'public/uploads/',
'public/vendor/',
'.idea/',
'.vscode/',
'*.ipr',
'*.iws',
'coverage/',
'build/',
'test/files/',
'*.min.js',
'install/docker/',
],
},
// tests
{
plugins: {
js,
'@stylistic/js': stylisticJs,
},
extends: ['js/recommended'],
files: ['test/**/*.js'],
languageOptions: {
ecmaVersion: 2020,
sourceType: 'commonjs',
globals: {
...globals.node,
...globals.browser,
it: 'readonly',
describe: 'readonly',
before: 'readonly',
beforeEach: 'readonly',
after: 'readonly',
afterEach: 'readonly',
},
},
rules: {
...commonRules,
'no-unused-vars': 'off',
'no-prototype-builtins': 'off',
}
},
...publicConfig,
...serverConfig
]);

View File

@@ -36,24 +36,22 @@
"maximumTagsPerTopic": 5,
"minimumTagLength": 3,
"maximumTagLength": 15,
"undoTimeout": 0,
"undoTimeout": 10000,
"allowTopicsThumbnail": 1,
"showPostUploadsAsThumbnails": 1,
"registrationType": "normal",
"registrationApprovalType": "normal",
"allowAccountDelete": 1,
"privateUploads": 0,
"allowedFileExtensions": "png,jpg,bmp,txt,webp,webm,mp4,gif",
"allowedFileExtensions": "png,jpg,bmp,txt",
"uploadRateLimitThreshold": 10,
"uploadRateLimitCooldown": 60,
"allowUserHomePage": 1,
"allowMultipleBadges": 1,
"allowMultipleBadges": 0,
"maximumFileSize": 2048,
"stripEXIFData": 1,
"orphanExpiryDays": 0,
"resizeImageWidthThreshold": 2000,
"resizeImageWidth": 760,
"resizeImageKeepOriginal": 1,
"rejectImageWidth": 5000,
"rejectImageHeight": 5000,
"resizeImageQuality": 80,
@@ -68,7 +66,6 @@
"maximumAboutMeLength": 1000,
"maximumUsersInChatRoom": 0,
"maximumChatMessageLength": 1000,
"maximumRemoteChatMessageLength": 5000,
"maximumChatRoomNameLength": 50,
"maximumProfileImageSize": 256,
"maximumCoverImageSize": 2048,
@@ -77,7 +74,7 @@
"profile:keepAllUserImages": 0,
"gdpr_enabled": 1,
"allowProfileImageUploads": 1,
"teaserPost": "last-post",
"teaserPost": "last-reply",
"showPostPreviewsOnHover": 1,
"allowPrivateGroups": 1,
"unreadCutoff": 2,
@@ -102,21 +99,16 @@
"min:rep:aboutme": 0,
"min:rep:signature": 0,
"flags:limitPerTarget": 0,
"flags:postFlagsPerDay": 10,
"flags:userFlagsPerDay": 10,
"flags:autoFlagOnDownvoteThreshold": 0,
"flags:actionOnResolve": "rescind",
"flags:actionOnReject": "rescind",
"notificationType_upvote": "notification",
"notificationType_new-topic": "notification",
"notificationType_new-topic-with-tag": "notification",
"notificationType_new-topic-in-category": "notification",
"notificationType_new-reply": "notification",
"notificationType_post-edit": "notification",
"notificationType_follow": "notification",
"notificationType_new-chat": "notification",
"notificationType_new-group-chat": "notification",
"notificationType_new-public-chat": "none",
"notificationType_group-invite": "notification",
"notificationType_group-leave": "notification",
"notificationType_group-request-membership": "notification",
@@ -143,13 +135,11 @@
"sitemapTopics": 500,
"maintenanceMode": 0,
"maintenanceModeStatus": 503,
"upvoteVisibility": "all",
"downvoteVisibility": "privileged",
"votesArePublic": 0,
"maximumInvites": 0,
"username:disableEdit": 0,
"email:disableEdit": 0,
"email:smtpTransport:pool": 0,
"email:smtpTransport:allow-self-signed": 0,
"hideFullname": 0,
"hideEmail": 0,
"showFullnameAsDisplayName": 0,
@@ -186,7 +176,7 @@
"onlineCutoff": 30,
"timeagoCutoff": 30,
"necroThreshold": 7,
"categoryWatchState": "tracking",
"categoryWatchState": "watching",
"submitPluginUsage": 1,
"showAverageApprovalTime": 1,
"autoApproveTime": 0,
@@ -197,12 +187,5 @@
"composer:allowPluginHelp": 1,
"maxReconnectionAttempts": 5,
"reconnectionDelay": 1500,
"disableCustomUserSkins": 0,
"activitypubEnabled": 1,
"activitypubAllowLoopback": 0,
"activitypubProbe": 1,
"activitypubProbeTimeout": 2000,
"activitypubContentPruneDays": 30,
"activitypubUserPruneDays": 7,
"activitypubFilter": 0
}
"disableCustomUserSkins": 0
}

View File

@@ -41,14 +41,6 @@
"textClass": "d-lg-none",
"text": "[[global:header.popular]]"
},
{
"route": "/world",
"title": "[[global:header.world]]",
"enabled": true,
"iconClass": "fa-globe",
"textClass": "d-lg-none",
"text": "[[global:header.world]]"
},
{
"route": "/users",
"title": "[[global:header.users]]",

View File

@@ -1,198 +1,46 @@
#!/bin/bash
set -e
export CONFIG_DIR="${CONFIG_DIR:-/opt/config}"
export CONFIG=$CONFIG_DIR/config.json
export FORCE_BUILD_BEFORE_START="${FORCE_BUILD_BEFORE_START:-false}"
# Function to set default values for environment variables
set_defaults() {
export CONFIG_DIR="${CONFIG_DIR:-/opt/config}"
export CONFIG="$CONFIG_DIR/config.json"
export NODEBB_INIT_VERB="${NODEBB_INIT_VERB:-install}"
export NODEBB_BUILD_VERB="${NODEBB_BUILD_VERB:-build}"
export START_BUILD="${START_BUILD:-${FORCE_BUILD_BEFORE_START:-false}}"
export SETUP="${SETUP:-}"
export PACKAGE_MANAGER="${PACKAGE_MANAGER:-npm}"
export OVERRIDE_UPDATE_LOCK="${OVERRIDE_UPDATE_LOCK:-false}"
}
# Supported verbs: install (web install), setup (interactive CLI session). Default: web install
# TODO: constraint it using a hash set (or hash table)
export NODEBB_INIT_VERB="${NODEBB_INIT_VERB:-install}"
# Setup variable for backward compatibility, default: <empty>
export SETUP="${SETUP:-}"
# Function to check if a directory exists and is writable
check_directory() {
local dir="$1"
if [ ! -d "$dir" ]; then
echo "Error: Directory $dir does not exist. Creating..."
mkdir -p "$dir" || {
echo "Error: Failed to create directory $dir"
exit 1
}
fi
if [ ! -w "$dir" ]; then
echo "Warning: No write permission for directory $dir, attempting to fix..."
chown -R $USER:$USER "$dir" || true # attempt to change ownership, do not exit on failure
chmod -R 760 "$dir" || true # attempt to change permissions, do not exit on failure
if [ ! -w "$dir" ]; then
echo "Error: No write permission for directory $dir. Exiting..."
exit 1
fi
fi
}
mkdir -p $CONFIG_DIR
# Function to copy or link package.json and lock files based on package manager
copy_or_link_files() {
local src_dir="$1"
local dest_dir="$2"
local package_manager="$3"
local lock_file
# if the folder is mounted as a volume this can fail, the check below is to ensure there is still write access
chmod -fR 760 $CONFIG_DIR 2> /dev/null
case "$package_manager" in
yarn) lock_file="yarn.lock" ;;
npm) lock_file="package-lock.json" ;;
pnpm) lock_file="pnpm-lock.yaml" ;;
*)
echo "Unknown package manager: $package_manager"
exit 1
;;
esac
if [[ ! -w $CONFIG_DIR ]]; then
echo "panic: no write permission for $CONFIG_DIR"
exit 1
fi
# Check if source and destination files are the same
if [ "$(realpath "$src_dir/package.json")" != "$(realpath "$dest_dir/package.json")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then
cp "$src_dir/package.json" "$dest_dir/package.json"
fi
[[ -f $CONFIG_DIR/package.json ]] || cp install/package.json $CONFIG_DIR/package.json
[[ -f $CONFIG_DIR/package-lock.json ]] || touch $CONFIG_DIR/package-lock.json
if [ "$(realpath "$src_dir/$lock_file")" != "$(realpath "$dest_dir/$lock_file")" ] || [ "$OVERRIDE_UPDATE_LOCK" = true ]; then
cp "$src_dir/$lock_file" "$dest_dir/$lock_file"
fi
ln -fs $CONFIG_DIR/package.json package.json
ln -fs $CONFIG_DIR/package-lock.json package-lock.json
# Remove unnecessary lock files in src_dir
rm -f "$src_dir/"{yarn.lock,package-lock.json,pnpm-lock.yaml}
npm install --omit=dev
# Symbolically link the copied files in src_dir to dest_dir
ln -fs "$dest_dir/package.json" "$src_dir/package.json"
ln -fs "$dest_dir/$lock_file" "$src_dir/$lock_file"
}
# Function to install dependencies using pnpm
install_dependencies() {
case "$PACKAGE_MANAGER" in
yarn) yarn install || {
echo "Failed to install dependencies with yarn"
exit 1
} ;;
npm) npm install || {
echo "Failed to install dependencies with npm"
exit 1
} ;;
pnpm) pnpm install || {
echo "Failed to install dependencies with pnpm"
exit 1
} ;;
*)
echo "Unknown package manager: $PACKAGE_MANAGER"
exit 1
;;
esac
}
# Function to start setup session
start_setup_session() {
local config="$1"
if [[ -n $SETUP ]]; then
echo "Setup environmental variable detected"
echo "Starting setup session"
exec /usr/src/app/nodebb setup --config="$config"
}
# Handle building and upgrading NodeBB
build_forum() {
local config="$1"
local start_build="$2"
local package_hash=$(md5sum install/package.json | head -c 32)
if [ "$package_hash" != "$(cat $CONFIG_DIR/install_hash.md5 || true)" ]; then
echo "package.json was updated. Upgrading..."
/usr/src/app/nodebb upgrade --config="$config" || {
echo "Failed to build NodeBB. Exiting..."
exit 1
}
elif [ "$start_build" = true ]; then
echo "Build before start is enabled. Building..."
/usr/src/app/nodebb "${NODEBB_BUILD_VERB}" --config="$config" || {
echo "Failed to build NodeBB. Exiting..."
exit 1
}
else
echo "No changes in package.json. Skipping build..."
return
./nodebb setup --config=$CONFIG
elif [ -f $CONFIG ]; then
echo "Config file exist at $CONFIG, assuming it is a valid config"
echo "Starting forum"
if [ "$FORCE_BUILD_BEFORE_START" = true ]; then
./nodebb build --config=$CONFIG
fi
echo -n $package_hash > $CONFIG_DIR/install_hash.md5
}
# Function to start forum
start_forum() {
local config="$1"
local start_build="$2"
build_forum "$config" "$start_build"
case "$PACKAGE_MANAGER" in
yarn)
yarn start --config="$config" --no-silent --no-daemon || {
echo "Failed to start forum with yarn"
exit 1
}
;;
npm)
npm start -- --config="$config" --no-silent --no-daemon || {
echo "Failed to start forum with npm"
exit 1
}
;;
pnpm)
pnpm start -- --config="$config" --no-silent --no-daemon || {
echo "Failed to start forum with pnpm"
exit 1
}
;;
*)
echo "Unknown package manager: $PACKAGE_MANAGER"
exit 1
;;
esac
}
# Function to start installation session
start_installation_session() {
local nodebb_init_verb="$1"
local config="$2"
echo "Config file not found at $config"
./nodebb start --config=$CONFIG
else
echo "Config file not found at $CONFIG"
echo "Starting installation session"
exec /usr/src/app/nodebb "$nodebb_init_verb" --config="$config"
}
# Function for debugging and logging
debug_log() {
local message="$1"
echo "DEBUG: $message"
}
# Main function
main() {
set_defaults
check_directory "$CONFIG_DIR"
copy_or_link_files /usr/src/app "$CONFIG_DIR" "$PACKAGE_MANAGER"
install_dependencies
debug_log "PACKAGE_MANAGER: $PACKAGE_MANAGER"
debug_log "CONFIG location: $CONFIG"
debug_log "START_BUILD: $START_BUILD"
if [ -n "$SETUP" ]; then
start_setup_session "$CONFIG"
fi
if [ -f "$CONFIG" ]; then
start_forum "$CONFIG" "$START_BUILD"
else
start_installation_session "$NODEBB_INIT_VERB" "$CONFIG"
fi
}
# Execute main function
main "$@"
./nodebb "${NODEBB_INIT_VERB}" --config=$CONFIG
fi

View File

@@ -1,23 +1,21 @@
{
"defaults": {
"mongo": {
"host": "mongo",
"port": 27017,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
},
"redis": {
"host": "redis",
"port": 6379,
"database": 0
},
"postgres": {
"host": "postgres",
"port": 5432,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
}
"mongo": {
"host": "mongo",
"port": 27017,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
},
"redis": {
"host": "redis",
"port": 6379,
"database": 0
},
"postgres": {
"host": "postgres",
"port": 5432,
"database": "nodebb",
"username": "nodebb",
"password": "nodebb"
}
}

View File

@@ -2,7 +2,7 @@
"name": "nodebb",
"license": "GPL-3.0",
"description": "NodeBB Forum",
"version": "4.7.0",
"version": "3.5.1",
"homepage": "https://www.nodebb.org",
"repository": {
"type": "git",
@@ -29,158 +29,150 @@
},
"dependencies": {
"@adactive/bootstrap-tagsinput": "0.8.2",
"@fontsource-utils/scss": "0.2.2",
"@fontsource/inter": "5.2.8",
"@fontsource/poppins": "5.2.7",
"@fortawesome/fontawesome-free": "6.7.2",
"@isaacs/ttlcache": "2.1.3",
"@nodebb/spider-detector": "2.0.3",
"@fontsource/inter": "5.0.15",
"@fontsource/poppins": "5.0.8",
"@fortawesome/fontawesome-free": "6.4.2",
"@isaacs/ttlcache": "1.4.1",
"@popperjs/core": "2.11.8",
"@textcomplete/contenteditable": "0.1.13",
"@textcomplete/core": "0.1.13",
"@textcomplete/textarea": "0.1.13",
"ace-builds": "1.43.5",
"archiver": "7.0.1",
"async": "3.2.6",
"autoprefixer": "10.4.23",
"bcryptjs": "3.0.3",
"benchpressjs": "2.5.5",
"body-parser": "2.2.1",
"bootbox": "6.0.4",
"bootstrap": "5.3.8",
"bootswatch": "5.3.8",
"ace-builds": "1.31.2",
"archiver": "6.0.1",
"async": "3.2.5",
"autoprefixer": "10.4.16",
"bcryptjs": "2.4.3",
"benchpressjs": "2.5.1",
"body-parser": "1.20.2",
"bootbox": "6.0.0",
"bootstrap": "5.3.2",
"bootswatch": "5.3.2",
"chalk": "4.1.2",
"chart.js": "4.5.1",
"chart.js": "4.4.0",
"cli-graph": "3.2.2",
"clipboard": "2.0.11",
"commander": "14.0.2",
"compare-versions": "6.1.1",
"compression": "1.8.1",
"colors": "1.4.0",
"commander": "11.1.0",
"compare-versions": "6.1.0",
"compression": "1.7.4",
"connect-flash": "0.1.1",
"connect-mongo": "6.0.0",
"connect-pg-simple": "10.0.0",
"connect-redis": "9.0.0",
"cookie-parser": "1.4.7",
"cron": "4.4.0",
"cropperjs": "1.6.2",
"csrf-sync": "4.2.1",
"connect-mongo": "5.1.0",
"connect-multiparty": "2.2.0",
"connect-pg-simple": "9.0.1",
"connect-redis": "7.1.0",
"cookie-parser": "1.4.6",
"cron": "3.1.6",
"cropperjs": "1.6.1",
"csrf-sync": "4.0.1",
"daemon": "1.1.0",
"diff": "8.0.2",
"esbuild": "0.27.1",
"express": "4.22.1",
"express-session": "1.18.2",
"express-useragent": "2.0.2",
"fetch-cookie": "3.2.0",
"diff": "5.1.0",
"esbuild": "0.19.5",
"express": "4.18.2",
"express-session": "1.17.3",
"express-useragent": "1.0.15",
"file-loader": "6.2.0",
"fs-extra": "11.3.2",
"fs-extra": "11.1.1",
"graceful-fs": "4.2.11",
"helmet": "7.2.0",
"helmet": "7.1.0",
"html-to-text": "9.0.5",
"imagesloaded": "5.0.0",
"ipaddr.js": "2.3.0",
"ipaddr.js": "2.1.0",
"jquery": "3.7.1",
"jquery-deserialize": "2.0.0",
"jquery-form": "4.3.0",
"jquery-serializeobject": "1.0.0",
"jquery-ui": "1.14.1",
"jsesc": "3.1.0",
"jquery-ui": "1.13.2",
"jsesc": "3.0.2",
"json2csv": "5.0.7",
"jsonwebtoken": "9.0.3",
"jsonwebtoken": "9.0.2",
"lodash": "4.17.21",
"logrotate-stream": "0.2.9",
"lru-cache": "11.2.4",
"lru-cache": "10.0.2",
"mime": "3.0.0",
"mkdirp": "3.0.1",
"mongodb": "7.0.0",
"morgan": "1.10.1",
"mongodb": "6.3.0",
"morgan": "1.10.0",
"mousetrap": "1.6.5",
"multer": "2.0.2",
"nconf": "0.13.0",
"nodebb-plugin-2factor": "7.6.0",
"nodebb-plugin-composer-default": "10.3.1",
"nodebb-plugin-dbsearch": "6.3.4",
"nodebb-plugin-emoji": "6.0.5",
"nodebb-plugin-emoji-android": "4.1.1",
"nodebb-plugin-link-preview": "2.1.5",
"nodebb-plugin-markdown": "13.2.2",
"nodebb-plugin-mentions": "4.8.3",
"nodebb-plugin-spam-be-gone": "2.3.2",
"nodebb-plugin-web-push": "0.7.6",
"nodebb-rewards-essentials": "1.0.2",
"nodebb-theme-harmony": "2.1.26",
"nodebb-theme-lavender": "7.1.19",
"nodebb-theme-peace": "2.2.49",
"nodebb-theme-persona": "14.1.18",
"nodebb-widget-essentials": "7.0.41",
"nodemailer": "7.0.11",
"multiparty": "4.2.3",
"nconf": "0.12.1",
"nodebb-plugin-2factor": "7.4.0",
"nodebb-plugin-composer-default": "10.2.27",
"nodebb-plugin-dbsearch": "6.2.3",
"nodebb-plugin-emoji": "5.1.13",
"nodebb-plugin-emoji-android": "4.0.0",
"nodebb-plugin-markdown": "12.2.5",
"nodebb-plugin-mentions": "4.3.7",
"nodebb-plugin-ntfy": "1.7.3",
"nodebb-plugin-spam-be-gone": "2.2.0",
"nodebb-rewards-essentials": "1.0.0",
"nodebb-theme-harmony": "1.1.99",
"nodebb-theme-lavender": "7.1.5",
"nodebb-theme-peace": "2.1.25",
"nodebb-theme-persona": "13.2.47",
"nodebb-widget-essentials": "7.0.14",
"nodemailer": "6.9.7",
"nprogress": "0.2.0",
"passport": "0.7.0",
"passport": "0.6.0",
"passport-http-bearer": "1.0.1",
"passport-local": "1.0.0",
"pg": "8.16.3",
"pg-cursor": "2.15.3",
"postcss": "8.5.6",
"pg": "8.11.3",
"pg-cursor": "2.10.3",
"postcss": "8.4.31",
"postcss-clean": "1.2.0",
"pretty": "^2.0.0",
"progress-webpack-plugin": "1.0.16",
"prompt": "1.3.0",
"redis": "5.10.0",
"rimraf": "6.1.2",
"ioredis": "5.3.2",
"request": "2.88.2",
"request-promise-native": "1.0.9",
"rimraf": "5.0.5",
"rss": "1.2.2",
"rtlcss": "4.3.0",
"sanitize-html": "2.17.0",
"sass": "1.96.0",
"satori": "0.18.3",
"sbd": "^1.0.19",
"semver": "7.7.3",
"serve-favicon": "2.5.1",
"sharp": "0.34.5",
"sitemap": "9.0.0",
"socket.io": "4.8.1",
"socket.io-client": "4.8.1",
"@socket.io/redis-adapter": "8.3.0",
"sortablejs": "1.15.6",
"spdx-license-list": "6.10.0",
"terser-webpack-plugin": "5.3.16",
"rtlcss": "4.1.1",
"sanitize-html": "2.11.0",
"sass": "1.69.5",
"semver": "7.5.4",
"serve-favicon": "2.5.0",
"sharp": "0.32.6",
"sitemap": "7.1.1",
"socket.io": "4.7.2",
"socket.io-client": "4.7.2",
"@socket.io/redis-adapter": "8.2.1",
"sortablejs": "1.15.0",
"spdx-license-list": "6.8.0",
"spider-detector": "2.0.1",
"terser-webpack-plugin": "5.3.9",
"textcomplete": "0.18.2",
"textcomplete.contenteditable": "0.1.1",
"timeago": "1.6.7",
"tinycon": "0.6.8",
"toobusy-js": "0.5.1",
"tough-cookie": "6.0.0",
"undici": "^7.10.0",
"validator": "13.15.23",
"webpack": "5.103.0",
"webpack-merge": "6.0.1",
"winston": "3.19.0",
"workerpool": "10.0.1",
"validator": "13.11.0",
"webpack": "5.89.0",
"webpack-merge": "5.10.0",
"winston": "3.11.0",
"workerpool": "8.0.0",
"xml": "1.0.1",
"xregexp": "5.1.2",
"xregexp": "5.1.1",
"yargs": "17.7.2",
"zxcvbn": "4.4.2"
},
"devDependencies": {
"@apidevtools/swagger-parser": "10.1.0",
"@commitlint/cli": "20.2.0",
"@commitlint/config-angular": "20.2.0",
"@commitlint/cli": "18.4.2",
"@commitlint/config-angular": "18.4.2",
"coveralls": "3.1.1",
"@eslint/js": "9.39.2",
"@stylistic/eslint-plugin": "5.6.1",
"eslint-config-nodebb": "1.1.11",
"eslint-plugin-import": "2.32.0",
"eslint": "8.54.0",
"eslint-config-nodebb": "0.2.1",
"eslint-plugin-import": "2.29.0",
"grunt": "1.6.1",
"grunt-contrib-watch": "1.1.0",
"husky": "8.0.3",
"jsdom": "27.3.0",
"lint-staged": "16.2.7",
"mocha": "11.7.5",
"jsdom": "22.1.0",
"lint-staged": "15.1.0",
"mocha": "10.2.0",
"mocha-lcov-reporter": "1.3.0",
"mockdate": "3.0.5",
"nyc": "17.1.0",
"smtp-server": "3.17.1"
"nyc": "15.1.0",
"smtp-server": "3.13.0"
},
"optionalDependencies": {
"sass-embedded": "1.96.0"
"sass-embedded": "1.69.5"
},
"resolutions": {
"*/jquery": "3.7.1"
@@ -189,7 +181,7 @@
"url": "https://github.com/NodeBB/NodeBB/issues"
},
"engines": {
"node": ">=20"
"node": ">=16"
},
"maintainers": [
{
@@ -203,4 +195,4 @@
"url": "https://github.com/barisusakli"
}
]
}
}

View File

@@ -2,7 +2,6 @@
const winston = require('winston');
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const fs = require('fs');
const path = require('path');
@@ -14,10 +13,7 @@ const nconf = require('nconf');
const Benchpress = require('benchpressjs');
const { mkdirp } = require('mkdirp');
const { paths } = require('../src/constants');
const utils = require('../src/utils');
const sass = utils.getSass();
const { generateToken, csrfSynchronisedProtection } = require('../src/middleware/csrf');
const sass = require('../src/utils').getSass();
const app = express();
let server;
@@ -77,13 +73,6 @@ web.install = async function (port) {
app.use(bodyParser.urlencoded({
extended: true,
}));
app.use(session({
secret: utils.generateUUID(),
resave: false,
saveUninitialized: false,
}));
try {
await Promise.all([
compileTemplate(),
@@ -114,8 +103,8 @@ function launchExpress(port) {
}
function setupRoutes() {
app.get('/', csrfSynchronisedProtection, welcome);
app.post('/', csrfSynchronisedProtection, install);
app.get('/', welcome);
app.post('/', install);
app.get('/testdb', testDatabase);
app.get('/ping', ping);
app.get('/sping', ping);
@@ -171,7 +160,6 @@ function welcome(req, res) {
minimumPasswordStrength: defaults.minimumPasswordStrength,
installing: installing,
percentInstalled: installing ? ((Date.now() - timeStart) / totalTime * 100).toFixed(2) : 0,
csrf_token: generateToken(req),
});
}

View File

@@ -26,7 +26,7 @@ if (!fs.existsSync(logDir)) {
mkdirp.sync(path.dirname(outputLogFilePath));
}
const output = logrotate({ file: outputLogFilePath, size: '10m', keep: 3, compress: true });
const output = logrotate({ file: outputLogFilePath, size: '1m', keep: 3, compress: true });
const silent = nconf.get('silent') === 'false' ? false : nconf.get('silent') !== false;
let numProcs;
const workers = [];
@@ -99,13 +99,6 @@ Loader.start = function () {
function forkWorker(index, isPrimary) {
const ports = getPorts();
const args = [];
const execArgv = [];
if (nconf.get('max-memory')) {
execArgv.push(`--max-old-space-size=${nconf.get('max-memory')}`);
}
if (nconf.get('expose-gc')) {
execArgv.push('--expose-gc');
}
if (!ports[index]) {
return console.log(`[cluster] invalid port for worker : ${index} ports: ${ports.length}`);
@@ -114,10 +107,10 @@ function forkWorker(index, isPrimary) {
process.env.isPrimary = isPrimary;
process.env.isCluster = nconf.get('isCluster') || ports.length > 1;
process.env.port = ports[index];
const worker = fork(appPath, args, {
silent: silent,
env: process.env,
execArgv: execArgv,
});
worker.index = index;

3
public/.eslintrc Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": "nodebb/public"
}

View File

@@ -1,41 +0,0 @@
<html>
<head>
<title>Internal Server Error</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/assets/5xx.css" />
<script type="text/javascript">
window.onload = function() {
let count = 0;
const bounce = document.getElementById('click-me');
bounce.onclick = function() {
count++;
bounce.className = '';
setTimeout(function() {
bounce.className = 'animated bounce';
}, 50);
if (count > 5) {
document.getElementById('hide').className = '';
}
};
}
</script>
</head>
<body>
<div class="wrapper">
<div class="center">
<h1 id="click-me" class="animated bounce">500</h1>
<p>
<strong>Internal server error. </strong>
</p>
<p>
{message}
</p>
<p>
&nbsp;<small id="hide" class="hide">Alright. You can stop clicking... it's not going to make the site come back sooner!</small>
</p>
</div>
</div>
</body>
</html>

View File

@@ -2,12 +2,147 @@
<head>
<title>Excessive Load Warning</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/assets/5xx.css" />
<style type="text/css">
body {
background: #00A9EA;
color: white;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
text-align: center;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
h1 {
font-size: 250px;
color: #fff;
opacity: 0.5;
margin: 10px;
cursor: pointer;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
}
p {
font-size: 20px;
}
p strong {
font-size: 28px;
}
@media (max-width: 640px) {
h1 {
font-size: 125px;
}
p {
font-size: 16px;
}
p strong {
font-size: 20px;
}
}
.center {
position: relative;
top: 50%;
-webkit-transform: translateY(50%);
-ms-transform: translateY(50%);
transform: translateY(50%);
}
@-webkit-keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
@keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
.bounce {
-webkit-animation-name: bounce;
animation-name: bounce;
-webkit-transform-origin: center bottom;
-ms-transform-origin: center bottom;
transform-origin: center bottom;
}
.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
.animated.infinite {
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
}
.animated.hinge {
-webkit-animation-duration: 2s;
animation-duration: 2s;
}
.hide {
display: none;
}
</style>
<script type="text/javascript">
window.onload = function() {
let count = 0;
const bounce = document.getElementById('click-me');
var count = 0,
bounce = document.getElementById('click-me');
bounce.onclick = function() {
count++;
bounce.className = '';

View File

@@ -1,135 +0,0 @@
body {
background: #00A9EA;
color: white;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
text-align: center;
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
h1 {
font-size: 250px;
color: #fff;
opacity: 0.5;
margin: 10px;
cursor: pointer;
-moz-user-select: none;
-khtml-user-select: none;
-webkit-user-select: none;
}
p {
font-size: 20px;
}
p strong {
font-size: 28px;
}
@media (max-width: 640px) {
h1 {
font-size: 125px;
}
p {
font-size: 16px;
}
p strong {
font-size: 20px;
}
}
.center {
position: relative;
top: 50%;
-webkit-transform: translateY(50%);
-ms-transform: translateY(50%);
transform: translateY(50%);
}
@-webkit-keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
@keyframes bounce {
0%, 20%, 53%, 80%, 100% {
-webkit-transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
transition-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
-webkit-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);
}
40%, 43% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -30px, 0);
transform: translate3d(0, -30px, 0);
}
70% {
-webkit-transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
transition-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
-webkit-transform: translate3d(0, -15px, 0);
transform: translate3d(0, -15px, 0);
}
90% {
-webkit-transform: translate3d(0,-4px,0);
transform: translate3d(0,-4px,0);
}
}
.bounce {
-webkit-animation-name: bounce;
animation-name: bounce;
-webkit-transform-origin: center bottom;
-ms-transform-origin: center bottom;
transform-origin: center bottom;
}
.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}
.animated.infinite {
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
}
.animated.hinge {
-webkit-animation-duration: 2s;
animation-duration: 2s;
}
.hide {
display: none;
}

View File

@@ -9,9 +9,5 @@
"filter-type": "نوع الحدث",
"filter-start": "تاريخ البدء",
"filter-end": "تاريخ الانتهاء",
"filter-user": "Filter by User",
"filter-user.placeholder": "قم بكتابة اسم مستخدم للتصفية...",
"filter-group": "Filter by Group",
"filter-group.placeholder": "قم بكتابة اسم مجموعة للتصفية...",
"filter-per-page": "لكل صفحة"
}

View File

@@ -75,7 +75,6 @@
"graphs.page-views-registered": "زيارات الصفحات المسجلة",
"graphs.page-views-guest": "زيارات الصفحات للزوار",
"graphs.page-views-bot": "زيارات الصفحات الآلية",
"graphs.page-views-ap": "ActivityPub Page Views",
"graphs.unique-visitors": "زوار فريدين",
"graphs.registered-users": "مستخدمين مسجلين",
"graphs.guest-users": "المستخدمين الزوار",
@@ -95,8 +94,5 @@
"view-as-json": "View as JSON",
"expand-analytics": "Expand analytics",
"clear-search-history": "Clear Search History",
"clear-search-history-confirm": "Are you sure you want to clear entire search history?",
"search-term": "Term",
"search-count": "Count",
"view-all": "View all"
"clear-search-history-confirm": "Are you sure you want to clear entire search history?"
}

View File

@@ -3,7 +3,7 @@
"ip": "رقم الآي بي <strong> %1 </strong>",
"nodes-responded": "عدد %1 نقطة/نقاط استجابوا خلال %2 جزء من الثانية.",
"host": "المضيف",
"primary": "primary / jobs",
"primary": "primary / run jobs",
"pid": "pid",
"nodejs": "nodejs",
"online": "online",
@@ -19,7 +19,6 @@
"registered": "Registered",
"sockets": "Sockets",
"connection-count": "Connection Count",
"guests": "Guests",
"info": "Info"

View File

@@ -12,8 +12,6 @@
"container.card": "Card",
"container.card-header": "Card Header",
"container.card-body": "Card Body",
"container.title": "Title",
"container.body": "Body",
"container.alert": "Alert",
"alert.confirm-delete": "Are you sure you wish to delete this widget?",

View File

@@ -1,22 +1,13 @@
{
"manage-categories": "Manage Categories",
"add-category": "Add category",
"add-local-category": "Add Local category",
"add-remote-category": "Add Remote category",
"remove": "Remove",
"rename": "Rename",
"jump-to": "Jump to...",
"settings": "اعدادات القسم",
"edit-category": "Edit Category",
"privileges": "الصلاحيات",
"back-to-categories": "Back to categories",
"id": "Category ID",
"name": "Category Name",
"handle": "Category Handle",
"handle.help": "Your category handle is used as a representation of this category across other networks, similar to a username. A category handle must not match an existing username or user group.",
"description": "Category Description",
"topic-template": "Topic Template",
"topic-template.help": "Define a template for new topics created in this category.",
"bg-color": "Background Colour",
"text-color": "Text Colour",
"bg-image-size": "Background Image Size",
@@ -46,7 +37,6 @@
"disable": "Disable",
"edit": "Edit",
"analytics": "Analytics",
"federation": "Federation",
"view-category": "View category",
"set-order": "Set order",
@@ -86,32 +76,10 @@
"analytics.topics-daily": "<strong>Figure 3</strong> &ndash; Daily topics created in this category</small>",
"analytics.posts-daily": "<strong>Figure 4</strong> &ndash; Daily posts made in this category</small>",
"federation.title": "Federation settings for \"%1\" category",
"federation.disabled": "Federation is disabled site-wide, so category federation settings are currently unavailable.",
"federation.disabled-cta": "Federation Settings &rarr;",
"federation.syncing-header": "Synchronization",
"federation.syncing-intro": "A category can follow a \"Group Actor\" via the ActivityPub protocol. If content is received from one of the actors listed below, it will be automatically added to this category.",
"federation.syncing-caveat": "N.B. Setting up syncing here establishes a one-way synchronization. NodeBB attempts to subscribe/follow the actor, but the reverse cannot be assumed.",
"federation.syncing-none": "This category is not currently following anybody.",
"federation.syncing-add": "Synchronize with...",
"federation.syncing-actorUri": "Actor",
"federation.syncing-follow": "Follow",
"federation.syncing-unfollow": "Unfollow",
"federation.followers": "Remote users following this category",
"federation.followers-handle": "Handle",
"federation.followers-id": "ID",
"federation.followers-none": "No followers.",
"federation.followers-autofill": "Autofill",
"alert.created": "Created",
"alert.create-success": "Category successfully created!",
"alert.none-active": "You have no active categories.",
"alert.create": "Create a Category",
"alert.add": "Add a Category",
"alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.<br /><br /><strong>Note</strong> — The remote category may not reflect all topics published unless at least one local user tracks/watches it.",
"alert.rename": "Rename a Remote Category",
"alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.",
"alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.",
"alert.confirm-purge": "<p class=\"lead\">Do you really want to purge this category \"%1\"?</p><h5><strong class=\"text-danger\">Warning!</strong> All topics and posts in this category will be purged!</h5> <p class=\"help-block\">Purging a category will remove all topics and posts, and delete the category from the database. If you want to remove a category <em>temporarily</em>, you'll want to \"disable\" the category instead.</p>",
"alert.purge-success": "Category purged!",
"alert.copy-success": "Settings Copied!",

View File

@@ -1,28 +0,0 @@
{
"title": "Manage Custom User Fields",
"create-field": "Create Field",
"edit-field": "Edit Field",
"manage-custom-fields": "Manage Custom Fields",
"type-of-input": "Type of input",
"key": "Key",
"name": "Name",
"icon": "Icon",
"type": "Type",
"min-rep": "Minimum Reputation",
"input-type-text": "Input (Text)",
"input-type-link": "Input (Link)",
"input-type-number": "Input (Number)",
"input-type-date": "Input (Date)",
"input-type-select": "Select",
"input-type-select-multi": "Select Multiple",
"select-options": "Options",
"select-options-help": "Add one option per line for the select element",
"minimum-reputation": "Minimum reputation",
"minimum-reputation-help": "If a user has less than this value they won't be able to use this field",
"delete-field-confirm-x": "Do you really want to delete custom field \"%1\"?",
"custom-fields-saved": "Custom fields saved",
"visibility": "Visibility",
"visibility-all": "Everyone can see the field",
"visibility-loggedin": "Only logged in users can see the field",
"visibility-privileged": "Only privileged users like admins & moderators can see the field"
}

View File

@@ -22,7 +22,6 @@
"delete-content": "Delete User(s) <strong>Content</strong>",
"purge": "Delete <strong>User(s)</strong> and <strong>Content</strong>",
"download-csv": "Download CSV",
"custom-user-fields": "Custom User Fields",
"manage-groups": "Manage Groups",
"set-reputation": "Set Reputation",
"add-group": "Add Group",
@@ -122,28 +121,6 @@
"alerts.email-sent-to": "An invitation email has been sent to %1",
"alerts.x-users-found": "%1 user(s) found, (%2 seconds)",
"alerts.select-a-single-user-to-change-email": "Select a single user to change email",
"export": "Export",
"export-users-fields-title": "Select CSV Fields",
"export-field-email": "Email",
"export-field-username": "Username",
"export-field-uid": "UID",
"export-field-ip": "IP",
"export-field-joindate": "Join date",
"export-field-lastonline": "Last Online",
"export-field-lastposttime": "Last Post Time",
"export-field-reputation": "Reputation",
"export-field-postcount": "Post Count",
"export-field-topiccount": "Topic Count",
"export-field-profileviews": "Profile Views",
"export-field-followercount": "Follower Count",
"export-field-followingcount": "Following Count",
"export-field-fullname": "Full Name",
"export-field-website": "Website",
"export-field-location": "Location",
"export-field-birthday": "Birthday",
"export-field-signature": "Signature",
"export-field-aboutme": "About Me",
"export-users-started": "Exporting users as csv, this might take a while. You will receive a notification when it is complete.",
"export-users-completed": "Users exported as csv, click here to download.",
"email": "Email",

View File

@@ -38,7 +38,6 @@
"settings/tags": "الكلمات المفتاحية",
"settings/notifications": "التنبيهات",
"settings/api": "API Access",
"settings/activitypub": "Federation (ActivityPub)",
"settings/sounds": "Sounds",
"settings/social": "Social",
"settings/cookies": "Cookies",

View File

@@ -1,48 +0,0 @@
{
"intro-lead": "What is Federation?",
"intro-body": "NodeBB is able to communicate with other NodeBB instances that support it. This is achieved through a protocol called <a href=\"https://activitypub.rocks/\">ActivityPub</a>. If enabled, NodeBB will also be able to communicate with other apps and websites that use ActivityPub (e.g. Mastodon, Peertube, etc.)",
"general": "General",
"pruning": "Content Pruning",
"content-pruning": "Days to keep remote content",
"content-pruning-help": "Note that remote content that has received engagement (a reply or a upvote/downvote) will be preserved. (0 for disabled)",
"user-pruning": "Days to cache remote user accounts",
"user-pruning-help": "Remote user accounts will only be pruned if they have no posts. Otherwise they will be re-retrieved. (0 for disabled)",
"enabled": "Enable Federation",
"enabled-help": "If enabled, will allow this NodeBB will be able to communicate with all Activitypub-enabled clients on the wider fediverse.",
"allowLoopback": "Allow loopback processing",
"allowLoopback-help": "Useful for debugging purposes only. You should probably leave this disabled.",
"probe": "Open in App",
"probe-enabled": "Try to open ActivityPub-enabled resources in NodeBB",
"probe-enabled-help": "If enabled, NodeBB will check every external link for an ActivityPub equivalent, and load it in NodeBB instead.",
"probe-timeout": "Lookup Timeout (milliseconds)",
"probe-timeout-help": "(Default: 2000) If the lookup query does not receive a response within the set timeframe, will send the user to the link directly instead. Adjust this number higher if sites are responding slowly and you wish to give extra time.",
"rules": "Categorization",
"rules-intro": "Content discovered via ActivityPub can be automatically categorized based on certain rules (e.g. hashtag)",
"rules.modal.title": "How it works",
"rules.modal.instructions": "Any incoming content is checked against these categorization rules, and matching content is automatically moved into the category of choice.<br /><br /><strong>N.B.</strong> Content that is already categorized (i.e. in a remote category) will not pass through these rules.",
"rules.add": "Add New Rule",
"rules.help-hashtag": "Topics containing this case-insensitive hashtag will match. Do not enter the <code>#</code> symbol",
"rules.help-user": "Topics created by the entered user will match. Enter a handle or full ID (e.g. <code>bob@example.org</code> or <code>https://example.org/users/bob</code>.",
"rules.type": "Type",
"rules.value": "Value",
"rules.cid": "Category",
"relays": "Relays",
"relays.intro": "A relay improves discovery of content to and from your NodeBB. Subscribing to a relay means content received by the relay is forwarded here, and content posted here is syndicated outward by the relay.",
"relays.warning": "Note: Relays can send larges amounts of traffic in, and may increase storage and processing costs.",
"relays.litepub": "NodeBB follows the LitePub-style relay standard. The URL you enter here should end with <code>/actor</code>.",
"relays.add": "Add New Relay",
"relays.relay": "Relay",
"relays.state": "State",
"relays.state-0": "Pending",
"relays.state-1": "Receiving only",
"relays.state-2": "Active",
"server-filtering": "Filtering",
"count": "This NodeBB is currently aware of <strong>%1</strong> server(s)",
"server.filter-help": "Specify servers you would like to bar from federating with your NodeBB. Alternatively, you may opt to selectively <em>allow</em> federation with specific servers, instead. Both options are supported, although they are mutually exclusive.",
"server.filter-help-hostname": "Enter just the instance hostname below (e.g. <code>example.org</code>), separated by line breaks.",
"server.filter-allow-list": "Use this as an Allow List instead"
}

View File

@@ -41,6 +41,9 @@
"sockets.default-placeholder": "Default: %1",
"sockets.delay": "Reconnection Delay",
"analytics.settings": "Analytics Settings",
"analytics.max-cache": "Analytics Cache Max Value",
"analytics.max-cache-help": "On high-traffic installs, the cache could be exhausted continuously if there are more concurrent active users than the Max Cache value. (Restart required)",
"compression.settings": "Compression Settings",
"compression.enable": "Enable Compression",
"compression.help": "This setting enables gzip compression. For a high-traffic website in production, the best way to put compression in place is to implement it at a reverse proxy level. You can enable it here for testing purposes."

View File

@@ -5,8 +5,6 @@
"disable-editing": "Disable chat message editing/deletion",
"disable-editing-help": "Administrators and global moderators are exempt from this restriction",
"max-length": "Maximum length of chat messages",
"max-length-remote": "Maximum length of remote chat messages",
"max-length-remote-help": "This value is usually set higher than the chat message maximum for local users as remote messages tend to be longer (with @ mentions, etc.)",
"max-chat-room-name-length": "Maximum length of chat room names",
"max-room-size": "Maximum number of users in chat rooms",
"delay": "Time between chat messages (ms)",

View File

@@ -28,8 +28,6 @@
"smtp-transport.password": "Password",
"smtp-transport.pool": "Enable pooled connections",
"smtp-transport.pool-help": "Pooling connections prevents NodeBB from creating a new connection for every email. This option only applies if SMTP Transport is enabled.",
"smtp-transport.allow-self-signed": "Allow self-signed certificates",
"smtp-transport.allow-self-signed-help": "Enabling this setting will allow you to use self-signed or invalid TLS certificates.",
"template": "Edit Email Template",
"template.select": "Select Email Template",

View File

@@ -15,7 +15,7 @@
"title-layout": "Title Layout",
"title-layout-help": "Define how the browser title will be structured ie. &#123;pageTitle&#125; | &#123;browserTitle&#125;",
"description.placeholder": "A short description about your community",
"description": "Site Description",
"description": "وصف الموقع",
"keywords": "الكلمات الدليله للموقع",
"keywords-placeholder": "Keywords describing your community, comma-separated",
"logo-and-icons": "Site Logo & Icons",
@@ -48,16 +48,5 @@
"background-color-help": "Color used for splash screen background when website is installed as a PWA",
"undo-timeout": "Undo Timeout",
"undo-timeout-help": "Some operations such as moving topics will allow for the moderator to undo their action within a certain timeframe. Set to 0 to disable undo completely.",
"topic-tools": "Topic Tools",
"home-page": "Home Page",
"home-page-route": "Home Page Route",
"home-page-description": "Choose what page is shown when users navigate to the root URL of your forum.",
"custom-route": "Custom Route",
"allow-user-home-pages": "Allow User Home Pages",
"home-page-title": "Title of the home page (default \"Home\")",
"default-language": "اللغة الافتراضية",
"auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي",
"default-language-help": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى. <br />يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.",
"post-sharing": "Post Sharing",
"info-plugins-additional": "Plugins can add additional networks for sharing posts."
}
"topic-tools": "Topic Tools"
}

View File

@@ -0,0 +1,8 @@
{
"settings": "Settings",
"guest-settings": "Guest Settings",
"handles.enabled": "Allow guest handles",
"handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"",
"topic-views.enabled": "Allow guests to increase topic view counts",
"reply-notifications.enabled": "Allow guests to generate reply notifications"
}

View File

@@ -0,0 +1,8 @@
{
"home-page": "Home Page",
"description": "Choose what page is shown when users navigate to the root URL of your forum.",
"home-page-route": "Home Page Route",
"custom-route": "Custom Route",
"allow-user-home-pages": "Allow User Home Pages",
"home-page-title": "Title of the home page (default \"Home\")"
}

View File

@@ -0,0 +1,6 @@
{
"language-settings": "اعدادات اللغة",
"description": "تُحدد اللغة الافتراضية إعدادات اللغة لجميع المستخدمين الذين يزورون المنتدى. <br />يمكن للأعضاء تجاوز اللغة الافتراضية من خلال صفحة إعدادات الحساب الخاصة بهم.",
"default-language": "اللغة الافتراضية",
"auto-detect": "الكشف عن إعدادات اللغة للزوار بشكل آلي"
}

View File

@@ -10,7 +10,7 @@
"id": "ID: <small>optional</small>",
"properties": "Properties:",
"show-to-groups": "Show to Groups:",
"groups": "Groups:",
"open-new-window": "Open in a new window",
"dropdown": "Dropdown",
"dropdown-placeholder": "Place your dropdown menu items below, ie: <br/>&lt;li&gt;&lt;a class=&quot;dropdown-item&quot; href&#x3D;&quot;https://myforum.com&quot;&gt;Link 1&lt;/a&gt;&lt;/li&gt;",

View File

@@ -4,11 +4,8 @@
"sorting.post-default": "Default Post Sorting",
"sorting.oldest-to-newest": "Oldest to Newest",
"sorting.newest-to-oldest": "Newest to Oldest",
"sorting.recently-replied": "Recently Replied",
"sorting.recently-created": "Recently Created",
"sorting.most-votes": "Most Votes",
"sorting.most-posts": "Most Posts",
"sorting.most-views": "Most Views",
"sorting.topic-default": "Default Topic Sorting",
"length": "Post Length",
"post-queue": "Post Queue",

View File

@@ -2,14 +2,7 @@
"reputation": "Reputation Settings",
"disable": "Disable Reputation System",
"disable-down-voting": "Disable Down Voting",
"upvote-visibility": "Up Vote visibility",
"upvote-visibility-all": "Everyone can see up votes",
"upvote-visibility-loggedin": "Only logged in users can see up votes",
"upvote-visibility-privileged": "Only privileged users like admins & moderators can see up votes",
"downvote-visibility": "Down Vote visibility",
"downvote-visibility-all": "Everyone can see down votes",
"downvote-visibility-loggedin": "Only logged in users can see down votes",
"downvote-visibility-privileged": "Only privileged users like admins & moderators can see down votes",
"votes-are-public": "All Votes Are Public",
"thresholds": "Activity Thresholds",
"min-rep-upvote": "Minimum reputation to upvote posts",
"upvotes-per-day": "Upvotes per day (set to 0 for unlimited upvotes)",
@@ -20,6 +13,7 @@
"min-rep-chat": "Minimum reputation to send chat messages",
"min-rep-post-links": "Minimum reputation to post links",
"min-rep-flag": "Minimum reputation to flag posts",
"min-rep-website": "Minimum reputation to add \"Website\" to user profile",
"min-rep-aboutme": "Minimum reputation to add \"About me\" to user profile",
"min-rep-signature": "Minimum reputation to add \"Signature\" to user profile",
"min-rep-profile-picture": "Minimum reputation to add \"Profile Picture\" to user profile",
@@ -29,12 +23,7 @@
"flags.limit-per-target": "Maximum number of times something can be flagged",
"flags.limit-per-target-placeholder": "Default: 0",
"flags.limit-per-target-help": "When a post or user is flagged multiple times, each additional flag is considered a &quot;report&quot; and added to the original flag. Set this option to a number other than zero to limit the number of reports an item can receive.",
"flags.limit-post-flags-per-day": "Maximum number of times a user can flag posts in a day",
"flags.limit-post-flags-per-day-help": "Set to 0 to disable, (default: 10)",
"flags.limit-user-flags-per-day": "Maximum number of times a user can flag users in a day",
"flags.limit-user-flags-per-day-help": "Set to 0 to disable, (default: 10)",
"flags.auto-flag-on-downvote-threshold": "Number of downvotes to auto flag posts",
"flags.auto-flag-on-downvote-threshold-help": "Set to 0 to disable, (default: 0)",
"flags.auto-flag-on-downvote-threshold": "Number of downvotes to auto flag posts (Set to 0 to disable, default: 0)",
"flags.auto-resolve-on-ban": "Automatically resolve all of a user's tickets when they are banned",
"flags.action-on-resolve": "Do the following when a flag is resolved",
"flags.action-on-reject": "Do the following when a flag is rejected",

View File

@@ -0,0 +1,4 @@
{
"post-sharing": "Post Sharing",
"info-plugins-additional": "Plugins can add additional networks for sharing posts."
}

View File

@@ -9,10 +9,9 @@
"private-extensions": "File extensions to make private",
"private-uploads-extensions-help": "Enter comma-separated list of file extensions to make private here (e.g. <code>pdf,xls,doc</code>). An empty list means all files are private.",
"resize-image-width-threshold": "Resize images if they are wider than specified width",
"resize-image-width-threshold-help": "(in pixels, default: 2000 pixels, set to 0 to disable)",
"resize-image-width-threshold-help": "(in pixels, default: 1520 pixels, set to 0 to disable)",
"resize-image-width": "Resize images down to specified width",
"resize-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)",
"resize-image-keep-original": "Keep original image after resize",
"resize-image-quality": "Quality to use when resizing images",
"resize-image-quality-help": "Use a lower quality setting to reduce the file size of resized images.",
"max-file-size": "الحد الأقصى لحجم الملف (بالكيبيبايت)",
@@ -22,7 +21,6 @@
"reject-image-height": "Maximum Image Height (in pixels)",
"reject-image-height-help": "Images taller than this value will be rejected.",
"allow-topic-thumbnails": "السماح للاعضاء برفع الصور المصغرة للموضوع",
"show-post-uploads-as-thumbnails": "Show post uploads as thumbnails",
"topic-thumb-size": "حجم الصورة المصغرة للموضوع",
"allowed-file-extensions": "إمتدادات الملفات المسموح بها",
"allowed-file-extensions-help": "أدخل قائمة بامتدادات الملفات مفصولة بفواصل (مثال: <code>pdf,xls,doc</code>). القائمة الفارغة تعني أن كل الامتدادات مسموح بها.",

View File

@@ -64,7 +64,6 @@
"show-email": "عرض البريد الإلكتروني",
"show-fullname": "عرض الاسم الكامل",
"restrict-chat": "السماح فقط برسائل الدردشة من المستخدمين الذين أتبعهم",
"disable-incoming-chats": "Disable incoming chat messages",
"outgoing-new-tab": "Open outgoing links in new tab",
"topic-search": "Enable In-Topic Searching",
"update-url-with-post-index": "Update url with post index while browsing topics",
@@ -89,10 +88,5 @@
"restrictions.seconds-before-new": "Seconds before a new user can make their first post",
"restrictions.seconds-edit-after-new": "Number of seconds a post remains editable for new users (set to 0 to disable)",
"restrictions.milliseconds-between-messages": "Time between chat messages for new users (ms)",
"restrictions.groups-exempt-from-new-user-restrictions": "Select groups that should be exempt from the new user restrictions",
"guest-settings": "Guest Settings",
"handles.enabled": "Allow guest handles",
"handles.enabled-help": "This option exposes a new field that allows guests to pick a name to associate with each post they make. If disabled, they will simply be called \"Guest\"",
"topic-views.enabled": "Allow guests to increase topic view counts",
"reply-notifications.enabled": "Allow guests to generate reply notifications"
}
"restrictions.groups-exempt-from-new-user-restrictions": "Select groups that should be exempt from the new user restrictions"
}

View File

@@ -1,9 +0,0 @@
{
"post-sort-option": "Post sort option, %1",
"topic-sort-option": "Topic sort option, %1",
"user-avatar-for": "User avatar for %1",
"profile-page-for": "Profile page for user %1",
"user-watched-tags": "User watched tags",
"delete-upload-button": "Delete upload button",
"group-page-link-for": "Group page link for %1"
}

View File

@@ -1,13 +1,9 @@
{
"category": "قسم",
"subcategories": "قسم فرعي",
"uncategorized": "Uncategorized",
"uncategorized.description": "Topics that do not strictly fit in with any existing categories",
"handle.description": "This category can be followed from the open social web via the handle %1",
"new-topic-button": "موضوع جديد",
"guest-login-post": "سجل الدخول للمشاركة",
"no-topics": "<strong>لا توجد مواضيع في هذه القسم</strong>لم لا تحاول إنشاء موضوع؟<br />",
"no-followers": "Nobody on this website is tracking or watching this category. Track or watch this category in order to begin receiving updates.",
"browsing": "تصفح",
"no-replies": "لم يرد أحد",
"no-new-posts": "لا توجد مشاركات جديدة.",

View File

@@ -3,7 +3,6 @@
"invalid-json": "Invalid JSON",
"wrong-parameter-type": "A value of type %3 was expected for property `%1`, but %2 was received instead",
"required-parameters-missing": "Required parameters were missing from this API call: %1",
"reserved-ip-address": "Network requests to reserved IP ranges are not allowed.",
"not-logged-in": "لم تقم بتسجيل الدخول",
"account-locked": "تم حظر حسابك مؤقتًا.",
"search-requires-login": "البحث في المنتدى يتطلب حساب - الرجاء تسجيل الدخول أو التسجيل",
@@ -33,7 +32,7 @@
"folder-exists": "Folder exists",
"invalid-pagination-value": "رقم الصفحة غير صحيح ، يجب أن يكون بين %1 و %2 .",
"username-taken": "اسم المستخدم مأخوذ",
"email-taken": "Email address is already taken.",
"email-taken": "البريد الالكتروني مأخوذ",
"email-nochange": "The email entered is the same as the email already on file.",
"email-invited": "Email was already invited",
"email-not-confirmed": "Posting in some categories or topics is enabled once your email is confirmed, please click here to send a confirmation email.",
@@ -68,8 +67,7 @@
"no-chat-room": "Chat room does not exist",
"no-privileges": "لاتملك الصلاحيات اللازمة للقيام بهذه العملية",
"category-disabled": "قائمة معطلة",
"post-deleted": "Post deleted",
"topic-locked": "Topic locked",
"topic-locked": "الموضوع مقفول",
"post-edit-duration-expired": "يسمح لك بتعديل مشاركتك حتى %1 ثانية من نشرها",
"post-edit-duration-expired-minutes": "يسمح لك بتعديل مشاركتك حتى %1 دقيقة من نشرها",
"post-edit-duration-expired-minutes-seconds": "يسمح لك بتعديل مشاركتك حتى %1 دقيقة و %2 ثوان من نشرها",
@@ -155,9 +153,6 @@
"about-me-too-long": "نأسف، ( عني ) لا يمكن أن يكون أكثر من %1 حرف.",
"cant-chat-with-yourself": "لايمكنك فتح محادثة مع نفسك",
"chat-restricted": "هذا المستخدم عطل المحادثات الواردة عليه. يجب أن يتبعك حتى تتمكن من فتح محادثة معه.",
"chat-allow-list-user-already-added": "This user is already in your allow list",
"chat-deny-list-user-already-added": "This user is already in your deny list",
"chat-user-blocked": "You have been blocked by this user.",
"chat-disabled": "نظام المحادثة معطل.",
"too-many-messages": "لقد أرسلت الكثير من الرسائل، الرجاء اﻹنتظار قليلاً",
"invalid-chat-message": "الرسالة غير صالحة.",
@@ -172,7 +167,6 @@
"cant-add-users-to-chat-room": "Can't add users to chat room.",
"cant-remove-users-from-chat-room": "Can't remove users from chat room.",
"chat-room-name-too-long": "Chat room name too long. Names can't be longer than %1 characters.",
"remote-chat-received-too-long": "You received a chat message from %1, but it was too long and was rejected.",
"already-voting-for-this-post": "لقد شاركت بالتصويت ، ألا تذكر؟",
"reputation-system-disabled": "نظام السمعة معطل",
"downvoting-disabled": "التصويتات السلبية معطلة",
@@ -186,20 +180,10 @@
"not-enough-reputation-min-rep-signature": "You need %1 reputation to add a signature",
"not-enough-reputation-min-rep-profile-picture": "You need %1 reputation to add a profile picture",
"not-enough-reputation-min-rep-cover-picture": "You need %1 reputation to add a cover picture",
"not-enough-reputation-custom-field": "You need %1 reputation for %2",
"custom-user-field-value-too-long": "Custom field value too long, %1",
"custom-user-field-select-value-invalid": "Custom field selected option is invalid, %1",
"custom-user-field-invalid-text": "Custom field text is invalid, %1",
"custom-user-field-invalid-link": "Custom field link is invalid, %1",
"custom-user-field-invalid-number": "Custom field number is invalid, %1",
"custom-user-field-invalid-date": "Custom field date is invalid, %1",
"invalid-custom-user-field": "Invalid custom user field, \"%1\" is already used by NodeBB",
"post-already-flagged": "You have already flagged this post",
"user-already-flagged": "You have already flagged this user",
"post-flagged-too-many-times": "This post has been flagged by others already",
"user-flagged-too-many-times": "This user has been flagged by others already",
"too-many-post-flags-per-day": "You can only flag %1 post(s) per day",
"too-many-user-flags-per-day": "You can only flag %1 user(s) per day",
"cant-flag-privileged": "You are not allowed to flag the profiles or content of privileged users (moderators/global moderators/admins)",
"cant-locate-flag-report": "Cannot locate flag report",
"self-vote": "You cannot vote on your own post",
@@ -235,14 +219,10 @@
"already-unblocked": "This user is already unblocked",
"no-connection": "There seems to be a problem with your internet connection",
"socket-reconnect-failed": "Unable to reach the server at this time. Click here to try again, or try again later",
"invalid-plugin-id": "Invalid plugin ID",
"plugin-not-whitelisted": "Unable to install plugin &ndash; only plugins whitelisted by the NodeBB Package Manager can be installed via the ACP",
"cannot-toggle-system-plugin": "You cannot toggle the state of a system plugin",
"plugin-installation-via-acp-disabled": "Plugin installation via ACP is disabled",
"plugins-set-in-configuration": "You are not allowed to change plugin state as they are defined at runtime (config.json, environmental variables or terminal arguments), please modify the configuration instead.",
"theme-not-set-in-configuration": "When defining active plugins in configuration, changing themes requires adding the new theme to the list of active plugins before updating it in the ACP",
"topic-event-unrecognized": "Topic event '%1' unrecognized",
"category.handle-taken": "Category handle is already taken, please choose another.",
"cant-set-child-as-parent": "Can't set child as parent category",
"cant-set-self-as-parent": "Can't set self as parent category",
"api.master-token-no-uid": "A master token was received without a corresponding `_uid` in the request body",
@@ -255,12 +235,5 @@
"api.500": "An unexpected error was encountered while attempting to service your request.",
"api.501": "The route you are trying to call is not implemented yet, please try again tomorrow",
"api.503": "The route you are trying to call is not currently available due to a server configuration",
"api.reauth-required": "The resource you are trying to access requires (re-)authentication.",
"activitypub.not-enabled": "Federation is not enabled on this server",
"activitypub.invalid-id": "Unable to resolve the input id, likely as it is malformed.",
"activitypub.get-failed": "Unable to retrieve the specified resource.",
"activitypub.pubKey-not-found": "Unable to resolve public key, so payload verification cannot take place.",
"activitypub.origin-mismatch": "The received object's origin does not match the sender's origin",
"activitypub.actor-mismatch": "The received activity is being carried out by an actor that is different from expected.",
"activitypub.not-implemented": "The request was denied because it or an aspect of it is not implemented by the recipient server"
"api.reauth-required": "The resource you are trying to access requires (re-)authentication."
}

View File

@@ -84,18 +84,12 @@
"modal-reason-offensive": "Offensive",
"modal-reason-other": "Other (specify below)",
"modal-reason-custom": "Reason for reporting this content...",
"modal-notify-remote": "Forward this report to %1",
"modal-submit": "Submit Report",
"modal-submit-success": "Content has been flagged for moderation.",
"modal-confirm-rescind": "Rescind Report?",
"bulk-actions": "Bulk Actions",
"bulk-resolve": "Resolve Flag(s)",
"confirm-purge": "Are you sure you want to permanently delete these flags?",
"purge-cancelled": "Flag Purge Cancelled",
"bulk-purge": "Purge Flag(s)",
"bulk-success": "%1 flags updated",
"flagged-timeago": "Flagged <span class=\"timeago\" title=\"%1\"></span>",
"flagged-timeago-readable": "Flagged <span class=\"timeago\" title=\"%1\"></span> (%2)",
"auto-flagged": "[Auto Flagged] Received %1 downvotes."
}

View File

@@ -24,15 +24,8 @@
"cancel": "Cancel",
"close": "أغلق",
"pagination": "الصفحات",
"pagination.previouspage": "Previous Page",
"pagination.nextpage": "Next Page",
"pagination.firstpage": "First Page",
"pagination.lastpage": "Last Page",
"pagination.out-of": "%1 من %2",
"pagination.enter-index": "Go to post index",
"pagination.go-to-page": "Go to page",
"pagination.page-x": "Page %1",
"header.brand-logo": "Brand Logo",
"header.admin": "مدير النظام",
"header.categories": "الأقسام",
"header.recent": "حديث",
@@ -50,11 +43,12 @@
"header.navigation": "الاستكشاف",
"header.manage": "Manage",
"header.drafts": "Drafts",
"header.world": "World",
"notifications.loading": "تحميل التنبيهات",
"chats.loading": "تحميل الدردشات",
"drafts.loading": "Loading Drafts",
"motd.welcome": "مرحبا بكم في NodeBB، منصة المناقشة المستقبلية.",
"previouspage": "الصفحة السابقة",
"nextpage": "الصفحة التالية",
"alert.success": "نجاح",
"alert.error": "خطأ",
"alert.warning": "Warning",
@@ -82,7 +76,6 @@
"downvoted": "مصوت بالسالب",
"views": "المشاهدات",
"posters": "Posters",
"watching": "Watching",
"reputation": "السمعة",
"lastpost": "Last post",
"firstpost": "First post",
@@ -112,7 +105,6 @@
"dnd": "عدم الإزعاج",
"invisible": "مخفي",
"offline": "غير متصل",
"remote-user": "This user is from outside of this forum",
"email": "عنوان البريد الإلكتروني",
"language": "اللغة",
"guest": "زائر",
@@ -143,12 +135,9 @@
"edited": "حُرِر",
"disabled": "معطل",
"select": "تحديد",
"selected": "Selected",
"copied": "Copied",
"user-search-prompt": "Type something here to find users...",
"hidden": "Hidden",
"sort": "Sort",
"actions": "Actions",
"rss-feed": "RSS Feed",
"skip-to-content": "Skip to content"
"actions": "Actions"
}

View File

@@ -1,9 +1,8 @@
{
"chat.room-id": "Room %1",
"chat.chatting-with": "Chat with",
"chat.placeholder": "Type chat message here, drag & drop images",
"chat.placeholder.mobile": "Type chat message",
"chat.placeholder.message-room": "Message #%1",
"chat.placeholder": "Type chat message here, drag & drop images, press enter to send",
"chat.placeholder.mobile": "Type chat message here",
"chat.scroll-up-alert": "Go to most recent message",
"chat.usernames-and-x-others": "%1 & %2 others",
"chat.chat-with-usernames": "Chat with %1",
@@ -48,7 +47,6 @@
"chat.add-user": "Add User",
"chat.notification-settings": "Notification Settings",
"chat.default-notification-setting": "Default Notification Setting",
"chat.join-leave-messages": "Join/Leave Messages",
"chat.notification-setting-room-default": "Room Default",
"chat.notification-setting-none": "No notifications",
"chat.notification-setting-at-mention-only": "@mention only",
@@ -116,8 +114,6 @@
"composer.discard-all-drafts": "Discard all drafts",
"composer.no-drafts": "You have no drafts",
"composer.discard-draft-confirm": "Do you want to discard this draft?",
"composer.remote-pid-editing": "Editing a remote post",
"composer.remote-pid-content-immutable": "The content of remote posts cannot be edited. However, you are able change the topic title and tags.",
"bootbox.ok": "OK",
"bootbox.cancel": "إلغاء",
"bootbox.confirm": "تأكيد",

View File

@@ -52,10 +52,10 @@
"user-posted-to-multiple": "<strong>%1</strong>, <strong>%2</strong> and %3 others have posted replies to: <strong>%4</strong>",
"user-posted-topic": "<strong>%1</strong> أنشأ موضوعًا جديدًا: <strong>%2</strong>",
"user-edited-post": "<strong>%1</strong> has edited a post in <strong>%2</strong>",
"user-posted-topic-with-tag": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3)",
"user-posted-topic-with-tag-dual": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3 and %4)",
"user-posted-topic-with-tag-triple": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3, %4, and %5)",
"user-posted-topic-with-tag-multiple": "<strong>%1</strong> has posted <strong>%2</strong> (tagged %3)",
"user-posted-topic-with-tag": "<strong>%1</strong> has posted a new topic with tag <strong>%2</strong>",
"user-posted-topic-with-tag-dual": "<strong>%1</strong> has posted a new topic with tags <strong>%2</strong> and <strong>%3</strong>",
"user-posted-topic-with-tag-triple": "<strong>%1</strong> has posted a new topic with tags <strong>%2</strong>, <strong>%3</strong> and <strong>%4</strong>",
"user-posted-topic-with-tag-multiple": "<strong>%1</strong> has posted a new topic with tags <strong>%2</strong>",
"user-posted-topic-in-category": "<strong>%1</strong> has posted a new topic in <strong>%2</strong>",
"user-started-following-you": "<strong>%1</strong> صار يتابعك.",
"user-started-following-you-dual": "<strong>%1</strong> and <strong>%2</strong> started following you.",
@@ -97,9 +97,5 @@
"notificationType-post-queue": "When a new post is queued",
"notificationType-new-post-flag": "When a post is flagged",
"notificationType-new-user-flag": "When a user is flagged",
"notificationType-new-reward": "When you earn a new reward",
"activitypub.announce": "<strong>%1</strong> shared your post in <strong>%2</strong> to their followers.",
"activitypub.announce-dual": "<strong>%1</strong> and <strong>%2</strong> shared your post in <strong>%3</strong> to their followers.",
"activitypub.announce-triple": "<strong>%1</strong>, <strong>%2</strong> and <strong>%3</strong> shared your post in <strong>%4</strong> to their followers.",
"activitypub.announce-multiple": "<strong>%1</strong>, <strong>%2</strong> and %3 others shared your post in <strong>%4</strong> to their followers."
"notificationType-new-reward": "When you earn a new reward"
}

View File

@@ -36,7 +36,6 @@
"chat": "Chatting with %1",
"flags": "Flags",
"flag-details": "Flag %1 Details",
"world": "World",
"account/edit": "Editing \"%1\"",
"account/edit/password": "Editing password of \"%1\"",
"account/edit/username": "Editing username of \"%1\"",
@@ -55,7 +54,6 @@
"account/settings-of": "Changing settings of %1",
"account/watched": "Topics watched by %1",
"account/ignored": "Topics ignored by %1",
"account/read": "Topics read by %1",
"account/upvoted": "Posts upvoted by %1",
"account/downvoted": "Posts downvoted by %1",
"account/best": "Best posts made by %1",
@@ -63,7 +61,6 @@
"account/blocks": "Blocked users for %1",
"account/uploads": "Uploads by %1",
"account/sessions": "Login Sessions",
"account/shares": "Topics shared by %1",
"confirm": "تم التحقق من عنوان البريد الإلكتروني",
"maintenance.text": "%1 is currently undergoing maintenance.<br/>Please come back another time.",
"maintenance.messageIntro": "بالإضافة إلى ذلك، قام مدبر النظام بترك هذه الرسالة:",

View File

@@ -38,6 +38,5 @@
"remove-selected": "Remove Selected",
"remove-selected-confirm": "Do you want to remove %1 selected posts?",
"bulk-accept-success": "%1 posts accepted",
"bulk-reject-success": "%1 posts rejected",
"links-in-this-post": "Links in this post"
"bulk-reject-success": "%1 posts rejected"
}

View File

@@ -7,7 +7,5 @@
"alltime": "دائمًا",
"no-recent-topics": "لايوجد مواضيع جديدة",
"no-popular-topics": "لا يوجد مواضيع شائعة",
"load-new-posts": "Load new posts",
"uncategorized.title": "All known topics",
"uncategorized.intro": "This page shows a chronological listing of every topic that this forum has received.<br />The views and opinions expressed in the topics below are not moderated and may not represent the views and opinions of this website."
"load-new-posts": "Load new posts"
}

View File

@@ -7,7 +7,6 @@
"in-titles": "In titles",
"in-titles-posts": "In titles and posts",
"in-posts": "In posts",
"in-bookmarks": "In bookmarks",
"in-categories": "In categories",
"in-users": "In users",
"in-tags": "In tags",

View File

@@ -8,7 +8,5 @@
"log-in-with-facebook": "تسجيل الدخول باستخدام فيسبوك",
"continue-with-facebook": "التسجيل باستخدام فيسبوك",
"sign-in-with-linkedin": "Sign in with LinkedIn",
"sign-up-with-linkedin": "Sign up with LinkedIn",
"sign-in-with-wordpress": "Sign in with WordPress",
"sign-up-with-wordpress": "Sign up with WordPress"
"sign-up-with-linkedin": "Sign up with LinkedIn"
}

View File

@@ -3,7 +3,7 @@
"no-tag-topics": "لا يوجد مواضيع بهذه الكلمة الدلالية.",
"no-tags-found": "No tags found",
"tags": "الكلمات الدلالية",
"enter-tags-here": "Enter tags, %1 - %2 characters.",
"enter-tags-here": "Enter tags here, between %1 and %2 characters each.",
"enter-tags-here-short": "أدخل الكلمات الدلالية...",
"no-tags": "لا يوجد كلمات دلالية بعد.",
"select-tags": "Select Tags",

View File

@@ -3,21 +3,15 @@
"skins": "Skins",
"collapse": "Collapse",
"expand": "Expand",
"sidebar-toggle": "Sidebar Toggle",
"login-register-to-search": "Login or register to search.",
"settings.title": "Theme settings",
"settings.enableQuickReply": "Enable quick reply",
"settings.enableBreadcrumbs": "Show breadcrumbs in Category and Topic pages",
"settings.enableBreadcrumbs.why": "Breadcrumbs are visible in most pages for ease-of-navigation. The base design of the category and topic pages has alternative means to link back to parent pages, but the breadcrumb can be toggled off to reduce clutter.",
"settings.centerHeaderElements": "Center header elements",
"settings.mobileTopicTeasers": "Show topic teasers on mobile",
"settings.stickyToolbar": "Sticky toolbar",
"settings.stickyToolbar.help": "The toolbar on topic and category pages will stick to the top of the page",
"settings.topicSidebarTools": "Topic sidebar tools",
"settings.topicSidebarTools.help": "This option will move the topic tools to the sidebar on desktop",
"settings.autohideBottombar": "Auto hide mobile navigation bar",
"settings.autohideBottombar.help": "The mobile bar will be hidden when the page is scrolled down",
"settings.topMobilebar": "Move the mobile navigation bar to the top",
"settings.autohideBottombar": "Auto hide bottom bar",
"settings.autohideBottombar.help": "The bottom bar on mobile view will be hidden when the page is scrolled down",
"settings.openSidebars": "Open sidebars",
"settings.chatModals": "Enable chat modals"
}

View File

@@ -1,4 +1,4 @@
{
"title": "أعلى الصفحة",
"no-top-topics": "لا توجد مواضيع أعلى الصفحة"
"title": "Top",
"no-top-topics": "No top topics"
}

View File

@@ -15,7 +15,6 @@
"replies-to-this-post": "%1 الردود",
"one-reply-to-this-post": "1 رد",
"last-reply-time": "آخر رد",
"reply-options": "Reply options",
"reply-as-topic": "رد بموضوع",
"guest-login-reply": "يجب عليك تسجيل الدخول للرد",
"login-to-view": "سجل الدخول للمشاهدة",
@@ -27,7 +26,6 @@
"restore": "استعادة",
"move": "نقل",
"change-owner": "Change Owner",
"manage-editors": "Manage Editors",
"fork": "فرع",
"link": "رابط",
"share": "نشر",
@@ -36,7 +34,6 @@
"pinned": "مثبت",
"pinned-with-expiry": "مثبت حتى %1",
"scheduled": "Scheduled",
"deleted": "Deleted",
"moved": "منقول",
"moved-from": "Moved from %1",
"copy-code": "Copy Code",
@@ -61,8 +58,6 @@
"user-restored-topic-on": "%1 restored this topic on %2",
"user-moved-topic-from-ago": "%1 moved this topic from %2 %3",
"user-moved-topic-from-on": "%1 moved this topic from %2 on %3",
"user-shared-topic-ago": "%1 shared this topic %2",
"user-shared-topic-on": "%1 shared this topic on %2",
"user-queued-post-ago": "%1 <a href=\"%2\">queued</a> post for approval %3",
"user-queued-post-on": "%1 <a href=\"%2\">queued</a> post for approval on %3",
"user-referenced-topic-ago": "%1 <a href=\"%2\">referenced</a> this topic %3",
@@ -106,7 +101,6 @@
"thread-tools.move-posts": "Move Posts",
"thread-tools.move-all": "نقل الكل",
"thread-tools.change-owner": "Change Owner",
"thread-tools.manage-editors": "Manage Editors",
"thread-tools.select-category": "Select Category",
"thread-tools.fork": "إنشاء فرع الموضوع",
"thread-tools.tag": "Tag Topic",
@@ -137,7 +131,6 @@
"bookmarks": "Bookmarks",
"bookmarks.has-no-bookmarks": "You haven't bookmarked any posts yet.",
"copy-permalink": "Copy Permalink",
"go-to-original": "View Original Post",
"loading-more-posts": "تحميل المزيد من المشاركات",
"move-topic": "نقل الموضوع",
"move-topics": "نقل المواضيع",
@@ -162,7 +155,6 @@
"move-posts-instruction": "Click the posts you want to move then enter a topic ID or go to the target topic",
"move-topic-instruction": "Select the target category and then click move",
"change-owner-instruction": "Click the posts you want to assign to another user",
"manage-editors-instruction": "Manage the users who can edit this post below.",
"composer.title-placeholder": "أدخل عنوان موضوعك هنا...",
"composer.handle-placeholder": "Enter your name/handle here",
"composer.hide": "Hide",
@@ -188,8 +180,6 @@
"sort-by": "ترتيب حسب",
"oldest-to-newest": "من الأقدم إلى الأحدث",
"newest-to-oldest": "من الأحدث إلى الأقدم",
"recently-replied": "Recently Replied",
"recently-created": "Recently Created",
"most-votes": "Most Votes",
"most-posts": "Most Posts",
"most-views": "Most Views",
@@ -214,15 +204,7 @@
"last-post": "Last post",
"go-to-my-next-post": "Go to my next post",
"no-more-next-post": "You don't have more posts in this topic",
"open-composer": "Open composer",
"post-quick-reply": "Quick reply",
"navigator.index": "Post %1 of %2",
"navigator.unread": "%1 unread",
"upvote-post": "Upvote post",
"downvote-post": "Downvote post",
"post-tools": "Post tools",
"unread-posts-link": "Unread posts link",
"thumb-image": "Topic thumbnail image",
"announcers": "Shares",
"announcers-x": "Shares (%1)"
"navigator.unread": "%1 unread"
}

View File

@@ -3,7 +3,6 @@
"no-unread-topics": "ليس هناك أي موضوع غير مقروء",
"load-more": "حمل المزيد",
"mark-as-read": "حدد غير مقروء",
"mark-as-unread": "Mark as Unread",
"selected": "المحددة",
"all": "الكل",
"all-categories": "كل الفئات",

View File

@@ -1,9 +1,6 @@
{
"user-menu": "قائمة المستخدم",
"banned": "محظور",
"unbanned": "Unbanned",
"muted": "كتم",
"unmuted": "Unmuted",
"offline": "غير متصل",
"deleted": "محذوف",
"username": "إسم المستخدم",
@@ -16,7 +13,7 @@
"ban-account": "حظر الحساب",
"ban-account-confirm": "هل تريد حقاً حظر هاذا العضو؟",
"unban-account": "إزالة حظر الحساب",
"mute-account": "كتم الحساب",
"mute-account": "Mute Account",
"unmute-account": "Unmute Account",
"delete-account": "حذف الحساب",
"delete-account-as-admin": "Delete <strong>Account</strong>",
@@ -39,15 +36,13 @@
"reputation": "السمعة",
"bookmarks": "المفضلات",
"watched-categories": "الأقسام المُتابعة",
"watched-tags": "الوسوم المُتابعة",
"watched-tags": "Watched tags",
"change-all": "غير الكل",
"watched": "متابع",
"ignored": "تم تجاهله",
"read": "Read",
"default-category-watch-state": "حالة مشاهدة اﻻقسام الافتراضية",
"followers": "المتابعون",
"following": "يتابع",
"shares": "Shares",
"blocks": "الكتل",
"blocked-users": "Blocked users",
"block-toggle": "تبديل الكتلة",
@@ -59,12 +54,9 @@
"chat": "محادثة",
"chat-with": "متابعة الدردشة مع %1",
"new-chat-with": "بدء دردشة جديدة مع %1",
"view-remote": "View Original",
"flag-profile": "ضع علامة على الملف الشخصي",
"profile-flagged": "Already flagged",
"follow": "تابع",
"unfollow": "إلغاء المتابعة",
"cancel-follow": "Cancel follow request",
"more": "المزيد",
"profile-update-success": "تم تحديث الملف الشخصي بنجاح",
"change-picture": "تغيير الصورة",
@@ -79,11 +71,10 @@
"upload-new-picture": "رفع صورة جديدة",
"upload-new-picture-from-url": "رفع صورة جديدة من رابط",
"current-password": "كلمة السر الحالية",
"new-password": "كلمة السر الجديدة",
"new-password": "New Password",
"change-password": "تغيير كلمة السر",
"change-password-error": "كلمة سر غير صحيحة",
"change-password-error-wrong-current": "كلمة السر الحالية ليست صحيحة",
"change-password-error-same-password": "كلمة السر الجديدة مطابقة لكلمة السر الحالية, فضلاً قم بإدخال كلمة سر جديدة.",
"change-password-error-match": "كلمة السر غير مطابقة لتأكيد كلمة السر",
"change-password-error-privileges": "ليس لديك الصلاحيات الكافية لتغيير كلمة السر هذه.",
"change-password-success": "تم تحديث كلمة السر خاصتك.",
@@ -105,10 +96,6 @@
"show-email": "أظهر بريدي الإلكتروني",
"show-fullname": "أظهر اسمي الكامل",
"restrict-chats": "لاتسمح بورود محادثات إلا من طرف المستخدمين الذين أتابعهم.",
"disable-incoming-chats": "Disable incoming chat messages <a data-bs-toggle=\"tooltip\" href=\"#\" title=\"Admins and moderators can still send you messages\"><i class=\"fa-solid fa-circle-info\"></i></a>",
"chat-allow-list": "Allow chat messages from the following users",
"chat-deny-list": "Deny chat messages from the following users",
"chat-list-add-user": "Add user",
"digest-label": "اشترك في النشرة الدورية",
"digest-description": "استلام اشعارات بآخر مستجدات هذا القسم (التنبيهات والمواضيع الجديدة) عبر البريد الإلكتروني وفقا لجدول زمني محدد.",
"digest-off": "غير مفعل",
@@ -123,12 +110,10 @@
"has-no-topics": "هذا المستخدم لم يكتب أي موضوع حتى الآن.",
"has-no-watched-topics": "هذا المستخدم لم يقم بمراقبة اية مواضيع حتى الآن.",
"has-no-ignored-topics": "هذا المستخدم لم يقم بتجاهل اية مواضيع حتى الآن.",
"has-no-read-topics": "هذا المستخدم لم يقم بقراءة أي مشاركة حتى الاّن.",
"has-no-upvoted-posts": "هذا المستخدم لم يقم بالتصويت للأعلى لأي مشاركة حتى الآن.",
"has-no-downvoted-posts": "هذا المستخدم لم يقم بالتصويت للأسفل لأي مشاركة حتى الآن.",
"has-no-controversial-posts": "هذا المستخدم ﻻيمتلك تصويت للأسفل لأي مشاركة حتى الآن.",
"has-no-blocks": "أنت لم تحظر اي مستخدم",
"has-no-shares": "This user has not shared any topics.",
"email-hidden": "البريد الإلكتروني مخفي",
"hidden": "مخفي",
"paginate-description": "عرض المواضيع والردود موزعة على صفحات عوضاً عن التمرير اللانهائي.",
@@ -156,10 +141,6 @@
"follow-topics-you-create": "متابعة المواضيع التي تقوم بإنشائها",
"grouptitle": "عنوان المجموعة",
"group-order-help": "Select a group and use the arrows to order titles",
"show-group-title": "Show group title",
"hide-group-title": "Hide group title",
"order-group-up": "Order group up",
"order-group-down": "Order group down",
"no-group-title": "لا يوجد عنوان للمجموعة",
"select-skin": "إختر سمة",
"default": "Default (%1)",
@@ -176,16 +157,11 @@
"sso.dissociate-confirm-title": "تأكيد الفصل",
"sso.dissociate-confirm": "هل تريد بالتأكيد فصل حسابك عن %1؟",
"info.latest-flags": "أحدث العلامات",
"info.profile": "Profile",
"info.post": "Post",
"info.view-flag": "View flag",
"info.reported-by": "Reported by:",
"info.no-flags": "لم يتم العثور على مشاركات معلمة",
"info.ban-history": "سجل الحظر الأحدث",
"info.no-ban-history": "هذا المستخدم لم يتم حظره مطلقا",
"info.banned-until": "محظور حتى %1",
"info.banned-expiry": "Expiry",
"info.ban-expired": "Ban expired",
"info.banned-permanently": "محظور بشكل دائم",
"info.banned-reason-label": "سبب",
"info.banned-no-reason": "لم يتم إعطاء سبب.",

View File

@@ -1,6 +1,5 @@
{
"all-users": "كل المستخدمين",
"followed-users": "Followed Users",
"all-users": "All Users",
"latest-users": "أحدث الأعضاء",
"top-posters": "اﻷكثر مشاركة",
"most-reputation": "أعلى سمعة",

View File

@@ -1,21 +0,0 @@
{
"name": "World",
"popular": "Popular topics",
"recent": "All topics",
"help": "Help",
"help.title": "What is this page?",
"help.intro": "Welcome to your corner of the fediverse.",
"help.fediverse": "The \"fediverse\" is a network of interconnected applications and websites that all talk to one another and whose users can see each other. This forum is federated, and can interact with that social web (or \"fediverse\"). This page is your corner of the fediverse. It consists solely of topics created by — and shared from — users <strong>you</strong> follow.",
"help.build": "There might not be a lot of topics here to start; that's normal. You will start to see more content here over time when you start following other users.",
"help.federating": "Likewise, if users from outside of this forum start following <em>you</em>, then your posts will start appearing on those apps and websites as well.",
"help.next-generation": "This is the next generation of social media, start contributing today!",
"onboard.title": "Your window to the fediverse...",
"onboard.what": "This is your personalized category made up of only content found outside of this forum. Whether something shows up in this page depends on whether you follow them, or whether that post was shared by someone you follow.",
"onboard.why": "There's a lot that goes on outside of this forum, and not all of it is relevant to your interests. That's why following people is the best way to signal that you want to see more from someone.",
"onboard.how": "In the meantime, you can click on the shortcut buttons at the top to see what else this forum knows about, and start discovering some new content!",
"show-categories": "Show categories",
"hide-categories": "Hide categories"
}

View File

@@ -1,3 +0,0 @@
# The files here are not meant to be edited directly
Please see the &rarr; [Internalization README](../README.md).

View File

@@ -1,18 +0,0 @@
{
"alert.confirm-rebuild-and-restart": "NodeBB-ni yenidən qurmaq və yenidən başlatmaq istədiyinizə əminsiniz?",
"alert.confirm-restart": "NodeBB-ni yenidən başlatmaq istədiyinizə əminsiniz?",
"acp-title": "%1 | NodeBB İdarəetmə Paneli",
"settings-header-contents": "Məzmun",
"changes-saved": "Dəyişikliklər yadda saxlandı",
"changes-saved-message": "NodeBB konfiqurasiyasına etdiyiniz dəyişikliklər yadda saxlanıldı.",
"changes-not-saved": "Dəyişikliklər saxlanmadı",
"changes-not-saved-message": "NodeBB dəyişikliklərinizi yadda saxlayarkən problemlə qarşılaşdı. (% 1)",
"save-changes": "Dəyişiklikləri yadda saxlayın",
"min": "Min:",
"max": "Maks:",
"view": "Bax",
"edit": "Redaktə et",
"add": "Əlavə et",
"select-icon": "İkonu seç"
}

View File

@@ -1,10 +0,0 @@
{
"cache": "Keş",
"post-cache": "Yazıların keşi",
"group-cache": "Qrup keşi",
"local-cache": "Lokal keş",
"object-cache": "Obyekt keşi",
"percent-full": "%1% dolu",
"post-cache-size": "Yazıların keş ölçüsü",
"items-in-cache": "Keşdəki elementlər"
}

View File

@@ -1,52 +0,0 @@
{
"x-b": "%1 b",
"x-mb": "%1 mb",
"x-gb": "%1 gb",
"uptime-seconds": "Saniyələrlə işləmə müddəti",
"uptime-days": "Günlərlə işləmə müddəti",
"mongo": "MongoDB",
"mongo.version": "MongoDB versiyası",
"mongo.storage-engine": "Saxlama Motoru",
"mongo.collections": "Kolleksiyalar",
"mongo.objects": "Obyektlər",
"mongo.avg-object-size": "Orta. Obyekt Ölçüsü",
"mongo.data-size": "Data ölçüsü",
"mongo.storage-size": "Yaddaş ölçüsü",
"mongo.index-size": "İndeks ölçüsü",
"mongo.file-size": "Fayl ölçüsü",
"mongo.resident-memory": "Rezident yaddaş",
"mongo.virtual-memory": "Virtual yaddaş",
"mongo.mapped-memory": "Xəritəli yaddaş",
"mongo.bytes-in": "Daxil olan Baytlar",
"mongo.bytes-out": "Xaric olan Baytlar",
"mongo.num-requests": "Sorğuların sayı",
"mongo.raw-info": "MongoDB raw məlumatı",
"mongo.unauthorized": "NodeBB müvafiq statistika üçün MongoDB verilənlər bazasını sorğulaya bilmədi. NodeBB tərəfindən istifadə edilən istifadəçinin &quot;clusterMonitor&quot; &quot;admin&quot; üçün rol; verilənlər bazası.",
"redis": "Redis",
"redis.version": "Redis versiyası",
"redis.keys": "Açarlar",
"redis.expires": "Vaxtı bitir",
"redis.avg-ttl": "Ortalama TTL",
"redis.connected-clients": "Qoşulmuş müştərilər",
"redis.connected-slaves": "Əlaqədar qullar",
"redis.blocked-clients": "Blok edilmiş müştərilər",
"redis.used-memory": "İstifadə edilən yaddaş",
"redis.memory-frag-ratio": "Yaddaşın fraqmentasiya nisbəti",
"redis.total-connections-recieved": "Alınan ümumi əlaqələr",
"redis.total-commands-processed": "Cəmi əmrlər işlənib",
"redis.iops": "Dərhal əməliyyatlar. Saniyədə",
"redis.iinput": "Saniyədə ani daxiletmə",
"redis.ioutput": "Saniyədə ani çıxış",
"redis.total-input": "Ümumi giriş",
"redis.total-output": "Ümumi çıxış",
"redis.keyspace-hits": "Klaviatura xitləri",
"redis.keyspace-misses": "Klaviatura boşluqları boşdur",
"redis.raw-info": "Redis raw məlumatı",
"postgres": "Postgres",
"postgres.version": "PostgreSQL sersiyası",
"postgres.raw-info": "Postgres raw məlumatı"
}

View File

@@ -1,15 +0,0 @@
{
"errors": "Xətalar",
"figure-x": "Şəkil %1",
"error-events-per-day": "Gündə <code>%1</code> hadisə",
"error.404": "404 tapılmadı",
"error.503": "503 xidmət əlçatan deyil",
"manage-error-log": "Xəta qeydlərini idarə et",
"export-error-log": "İxrac xətası jurnalı (CSV)",
"clear-error-log": "Xəta loqlarını sil",
"route": "Marşrut",
"count": "Say",
"no-routes-not-found": "Yaşasın! 404 səhv yoxdur!",
"clear404-confirm": "404 xəta qeydlərini təmizləmək istədiyinizə əminsiniz?",
"clear404-success": "\"404 Tapılmadı\" xətaları silindi"
}

View File

@@ -1,17 +0,0 @@
{
"events": "Hadisələr",
"no-events": "Hadisə yoxdur",
"control-panel": "Hadisələrin İdarəetmə Paneli",
"delete-events": "Tədbirləri sil",
"confirm-delete-all-events": "Daxil edilmiş bütün hadisələri silmək istədiyinizə əminsiniz?",
"filters": "Filtrlər",
"filters-apply": "Filtrləri tətbiq et",
"filter-type": "Hadisə növü",
"filter-start": "Başlama tarixi",
"filter-end": "Bitmə tarixi",
"filter-user": "İstifadəçiyə görə filtrlə",
"filter-user.placeholder": "Filtr etmək üçün istifadəçi adını daxil edin...",
"filter-group": "Qrup üzrə filtrlə",
"filter-group.placeholder": "Filtr etmək üçün qrup adını yazın...",
"filter-per-page": "Hər səhifə üçün"
}

View File

@@ -1,7 +0,0 @@
{
"logs": "Loqlar",
"control-panel": "Loqların idarəetmə paneli",
"reload": "Loqları yenidən yükləyin",
"clear": "Loqları təmizləyin",
"clear-success": "Loqlar təmizləndi!"
}

View File

@@ -1,20 +0,0 @@
{
"customise": "Fərdiləşdirmək",
"custom-css": "Fərdi CSS/SASS",
"custom-css.description": "Buraya bütün digər üslublardan sonra tətbiq olunacaq öz CSS/SASS bəyannamələrinizi daxil edin.",
"custom-css.enable": "Fərdi CSS/SASS-ı aktiv edin",
"custom-js": "Fərdi JavaScript",
"custom-js.description": "Burada öz javascriptinizi daxil edin. Səhifə tamamilə yükləndikdən sonra yerinə yetiriləcək.",
"custom-js.enable": "Fərdi Javascript-i aktiv edin",
"custom-header": "Fərdi başlıq",
"custom-header.description": "Bura xüsusi HTML daxil edin (məs. Meta Teqlər və s.), o <code>&lt;head&gt;</code> forumunuzun işarələmə bölməsi. <a href=\"#custom-js\" data-toggle=\"tab\">Xüsusi Javascript</a> nişanı mövcud olduğu üçün skript teqlərinə icazə verilir, lakin bunlar qadağandır.",
"custom-header.enable": "Fərdi Başlığı aktivləşdir",
"custom-css.livereload": "Canlı Yenidən Yükləməni aktiv et",
"custom-css.livereload.description": "Hesabınızın altındakı hər bir cihazdakı bütün sessiyaları yadda saxla düyməsini kliklədiyiniz zaman yeniləməyə məcbur etmək üçün bunu aktiv edin",
"bsvariables": "_variables.scss",
"bsvariables.description": "Bootstrap dəyişənlərini burada ləğv edin. Siz həmçinin <a href=\"https://bootstrap.build/app\">bootstrap.build</a> kimi alətdən istifadə edib nəticəni bura yapışdıra bilərsiniz. <br/>Dəyişikliklər yenidən qurmaq və yenidən işə salmaq tələb olunur.",
"bsvariables.enable": "_variables.scss-i aktivləşdirin"
}

View File

@@ -1,18 +0,0 @@
{
"skins": "Örtüklər",
"bootswatch-skins": "Bootswatch örtükləri",
"custom-skins": "Fərdi örtüklər",
"add-skin": "Örtük əlavə et",
"save-custom-skins": "Fərdi örtüyü saxla",
"save-custom-skins-success": "Fərdi örtüklər uğurla yadda saxlanıldı",
"custom-skin-name": "Fərdi örtük adı",
"custom-skin-variables": "Fərdi örtük dəyişənləri",
"loading": "Örtüklər yüklənir...",
"homepage": "Əsas səhifə",
"select-skin": "Örtüyü seçin",
"revert-skin": "Örtüyü bərpa edin",
"current-skin": "Cari örtük",
"skin-updated": "Örtük yeniləndi",
"applied-success": "%1 örtük uğurla tətbiq olundu",
"revert-success": "Örtük əsas rənglərə qayıtdı"
}

View File

@@ -1,13 +0,0 @@
{
"themes": "Mövzular",
"checking-for-installed": "Quraşdırılmış mövzular yoxlanılır...",
"homepage": "Əsas səhifə",
"select-theme": "Mövzu seç",
"revert-theme": "Mövzunu geri qaytar",
"current-theme": "Cari mövzu",
"no-themes": "Quraşdırılmış mövzu tapılmadı",
"revert-confirm": "Defolt NodeBB mövzusunu bərpa etmək istədiyinizə əminsiniz?",
"theme-changed": "Mövzu dəyişdirildi",
"revert-success": "Siz NodeBB-ni müvəffəqiyyətlə defolt mövzuya qaytardınız.",
"restart-to-activate": "Zəhmət olmasa, bu mövzunu tam aktivləşdirmək üçün NodeBB-ni yenidən qurun və başladın."
}

View File

@@ -1,102 +0,0 @@
{
"forum-traffic": "Forum trafiki",
"page-views": "Səhifə baxışları",
"unique-visitors": "Unikal ziyarətçilər",
"logins": "Daxil olmalar",
"new-users": "Yeni istifadəçilər",
"posts": "Yazılar",
"topics": "Mövzular",
"page-views-seven": "Son 7 Gün",
"page-views-thirty": "Son 30 Gün",
"page-views-last-day": "Son 24 saat",
"page-views-custom": "Fərdi tarix aralığı",
"page-views-custom-start": "Aralığın başlanğıcı",
"page-views-custom-end": "Aralığın sonu",
"page-views-custom-help": "Baxmaq istədiyiniz səhifə baxışlarının tarix diapazonunu daxil edin. Əgər tarix seçici mövcud deyilsə, qəbul edilən format <code>YYYY-AA-GG</code>-dir",
"page-views-custom-error": "Lütfən, <code>YYYY-AA-GG</code> formatında etibarlı tarix diapazonu daxil edin",
"stats.yesterday": "Dünən",
"stats.today": "Bu gün",
"stats.last-week": "Keçən həftə",
"stats.this-week": "Bu həftə",
"stats.last-month": "Keçən ay",
"stats.this-month": "Bu ay",
"stats.all": "Bütün zamanlar",
"updates": "Yeniləmələr",
"running-version": "Siz NodeBB v%1 işlədirsiniz.",
"keep-updated": "Həmişə NodeBB-nin ən son təhlükəsizlik yamaları və xətaların düzəldilməsi üçün yeni olduğundan əmin olun.",
"up-to-date": "Siz son <strong>variantasınız</strong> <i class=\"fa fa-check\"></i>",
"upgrade-available": "Yeni versiya (v%1) buraxılmışdır. NodeBB-ni <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">təkmilləşdirməyi nəzərdən keçirin</a>.",
"prerelease-upgrade-available": "Bu, NodeBB proqramının köhnəlmiş buraxılışdan əvvəlki versiyasıdır. Yeni versiya (v%1) buraxılmışdır. NodeBB-ni <a href=\"https://docs.nodebb.org/configuring/upgrade/\" target=\"_blank\">təkmilləşdirməyi nəzərdən keçirin</a>.",
"prerelease-warning": "Bu, NodeBB-nin <strong>buraxılışdan öncəki</strong> versiyasıdır. Gözlənilməz səhvlər baş verə bilər. <i class=\"fa fa-exclamation-triangle\"></i>",
"fallback-emailer-not-found": "Yekun e-poçt göndərişi tapılmadı!",
"running-in-development": "Forum inkişaf rejimində işləyir. Forum potensial boşluqlar üçün açıq ola bilər; lütfən sistem inzibatçısı ilə əlaqə saxlayın",
"latest-lookup-failed": "NodeBB-nin ən son mövcud versiyasını axtarmaq alınmadı",
"notices": "Bildirişlər",
"restart-not-required": "Yenidən başlama tələb olunmur",
"restart-required": "Yenidən başlatma tələb olunur",
"search-plugin-installed": "Axtarış plagini quraşdırılıb",
"search-plugin-not-installed": "Axtarış plagini quraşdırılmayıb",
"search-plugin-tooltip": "Axtarış funksiyasını aktivləşdirmək üçün plagin səhifəsindən axtarış plaqini quraşdır",
"control-panel": "Sistem nəzarəti",
"rebuild-and-restart": "Yenidən qur &amp; başlat",
"restart": "Yenidən başlat",
"restart-warning": "NodeBB-nin yenidən qurulması və ya yenidən işə salınması bütün mövcud əlaqələri bir neçə saniyəyə kəsəcək.",
"restart-disabled": "NodeBB-nin yenidən qurulması və yenidən işə salınması qeyri-aktiv edilib, çünki siz onu uyğun demon vasitəsilə idarə etmirsiniz.",
"maintenance-mode": "Texniki baxım rejimi",
"maintenance-mode-title": "NodeBB üçün texniki xidmət rejimini qurmaq üçün bura kliklə",
"dark-mode": "Qaranlıq rejimi",
"realtime-chart-updates": "Real vaxt qrafiki yeniləmələri",
"active-users": "Aktiv istifadəçilər",
"active-users.users": "İstifadəçilər",
"active-users.guests": "Qonaqlar",
"active-users.total": "Cəmi",
"active-users.connections": "Bağlantılar",
"guest-registered-users": "Qonaq və Qeydiyyatdan keçmiş istifadəçilər",
"guest": "Qonaq",
"registered": "Qeydiyyatdan keçib",
"user-presence": "İstifadəçi mövcudluğu",
"on-categories": "Kateqoriyalar siyahısında",
"reading-posts": "Yazıların oxunması",
"browsing-topics": "Mövzulara baxış",
"recent": "Ən yeni",
"unread": "Oxunmamış",
"high-presence-topics": "Yüksək mövzular",
"popular-searches": "Populyar axtarışlar",
"graphs.page-views": "Səhifə baxışları",
"graphs.page-views-registered": "Səhifə Baxışları qeydə alınıb",
"graphs.page-views-guest": "Səhifə baxışı qonaq",
"graphs.page-views-bot": "Səhifə baxış botu",
"graphs.page-views-ap": "ActivityPub Page Views",
"graphs.unique-visitors": "Unikal ziyarətçilər",
"graphs.registered-users": "Qeydiyyatdan keçmiş istifadəçilər",
"graphs.guest-users": "Qonaqlar",
"last-restarted-by": "Sonuncu dəfə yenidən başlat",
"no-users-browsing": "Axtarış edən heç bir istifadəçi yoxdur",
"back-to-dashboard": "İdarə Panelinə qayıt",
"details.no-users": "Seçilmiş müddət ərzində heç bir istifadəçi qoşulmayıb",
"details.no-topics": "Seçilmiş vaxt çərçivəsində heç bir mövzu yerləşdirilməyib",
"details.no-searches": "Seçilmiş müddət ərzində heç bir axtarış aparılmayıb",
"details.no-logins": "Seçilmiş müddət ərzində heç bir giriş qeydə alınmayıb",
"details.logins-static": "NodeBB yalnız %1 gün ərzində sessiya məlumatlarını saxlayır və buna görə də aşağıdakı cədvəldə yalnız ən son aktiv sessiyalar göstəriləcək",
"details.logins-login-time": "Daxil olma vaxtı",
"start": "Başlanğıc",
"end": "Son",
"filter": "Filtr",
"view-as-json": "JSON kimi bax",
"expand-analytics": "Analitikanı genişləndir",
"clear-search-history": "Axtarış tarixçəsini təmizlə",
"clear-search-history-confirm": "Bütün axtarış tarixçəsini təmizləmək istədiyinizə əminsiniz?",
"search-term": "Qayda",
"search-count": "Say",
"view-all": "Hamısına bax"
}

View File

@@ -1,26 +0,0 @@
{
"you-are-on": "Siz <strong>%1:%2</strong>-dəsiniz",
"ip": "IP <strong>%1</strong>",
"nodes-responded": "%1 nod %2ms ərzində cavab verdi!",
"host": "host",
"primary": "əsas / iş",
"pid": "pid",
"nodejs": "nodejs",
"online": "onlayn",
"git": "git",
"process-memory": "proses yaddaşı",
"system-memory": "sistem yaddaşı",
"used-memory-process": "Proseslər yaddaşdan istifadə edir",
"used-memory-os": "İstifadə olunmuş sistem yaddaşı",
"total-memory-os": "Ümumi sistem yaddaşı",
"load": "sistem yükləməsi",
"cpu-usage": "CPU istifadəsi",
"uptime": "işləmə müddəti",
"registered": "Qeydiyyatdan keçib",
"sockets": "Sockets",
"connection-count": "Bağlantı sayı",
"guests": "Qonaqlar",
"info": "Məlumat"
}

View File

@@ -1,13 +0,0 @@
{
"logger": "Logger",
"logger-settings": "Logger ayarları",
"description": "Yoxlama qutularını aktivləşdirməklə, siz terminalınıza qeydlər alacaqsınız. Bir yol göstərsəniz, qeydlər bunun əvəzinə faylda saxlanacaq. HTTP girişi, forumunuzda insanların kim, nə vaxt və nəyə daxil olması ilə bağlı statistika toplamaq üçün faydalıdır. HTTP sorğularını qeyd etməklə yanaşı, biz socket.io hadisələrini də qeyd edə bilərik. Socket.io girişi, redis-cli monitoru ilə birlikdə NodeBB-nin daxili hissələrini öyrənmək üçün çox faydalı ola bilər.",
"explanation": "Aktivləşdirmək və ya söndürmək üçün sadəcə giriş parametrlərini çek/ançek edin. Yenidən başlatmağa ehtiyac yoxdur.",
"enable-http": "HTTP loqunu aktiv edin",
"enable-socket": "Socket.io hadisə qeydini aktiv edin",
"file-path": "Loq faylına yol",
"file-path-placeholder": "/path/to/log/file.log ::: terminalınıza loqlamaq üçün boş saxlayın",
"control-panel": "Logger idarəetmə paneli",
"update-settings": "Logger parametrlərini yenilə"
}

View File

@@ -1,58 +0,0 @@
{
"plugins": "Plaginlər",
"trending": "Trend",
"installed": "Quraşdırılıb",
"active": "Aktiv",
"inactive": "Qeyri-aktiv",
"out-of-date": "Vaxtı keçmiş",
"none-found": "Heç bir plagin tapılmadı.",
"none-active": "Aktiv plaginlər yoxdur",
"find-plugins": "Pluginləri tapın",
"plugin-search": "Plugin axtarışı",
"plugin-search-placeholder": "Plugin axtarın...",
"submit-anonymous-usage": "Anonim plagin istifadə məlumatlarını təqdim edin.",
"reorder-plugins": "Pluginləri təkrar sifariş et",
"order-active": "Aktiv plaginlər sifariş et",
"dev-interested": "NodeBB üçün plaginlər yazmaqla maraqlanırsınız?",
"docs-info": "Plugin müəllifliyi ilə bağlı tam sənədləri <a target=\"_blank\" href=\"https://docs.nodebb.org/development/plugins/\">NodeBB Sənədlər Portalında</a> tapa bilərsiniz.",
"order.description": "Bəzi plaginlər digər plaginlərdən əvvəl/sonra işə salındıqda ideal şəkildə işləyir.",
"order.explanation": "Pluginlər burada göstərilən ardıcıllıqla yuxarıdan aşağı yüklənir",
"plugin-item.themes": "Mövzular",
"plugin-item.deactivate": "Deaktiv et",
"plugin-item.activate": "Aktiv et",
"plugin-item.install": "Quraşdır",
"plugin-item.uninstall": "Sil",
"plugin-item.settings": "Parametrlər",
"plugin-item.installed": "Quraşdırılıb",
"plugin-item.latest": "Ən son",
"plugin-item.upgrade": "Təkmilləşdir",
"plugin-item.more-info": "Ətraflı məlumat üçün:",
"plugin-item.unknown": "Naməlum",
"plugin-item.unknown-explanation": "Bu plaqinin vəziyyəti yanlış konfiqurasiya xətası səbəbindən müəyyən edilə bilmədi.",
"plugin-item.compatible": "Bu plagin NodeBB %1-də işləyir",
"plugin-item.not-compatible": "Bu plaqinin uyğunluq məlumatı yoxdur, prod mühitinizdə quraşdırmadan əvvəl onun işlədiyinə əmin olun.",
"alert.enabled": "Plugin aktivdir",
"alert.disabled": "Plugin deaktivdir",
"alert.upgraded": "Plugin təkmilləşdirildi",
"alert.installed": "Plugin quraşdırılıb",
"alert.uninstalled": "Plugin silindi",
"alert.activate-success": "Bu plaqini tam aktivləşdirmək üçün NodeBB-ni yenidən qurun və yenidən başladın",
"alert.deactivate-success": "Plugin uğurla deaktiv edildi",
"alert.upgrade-success": "Bu plaqini tam təkmilləşdirmək üçün NodeBB-ni yenidən qurun və yenidən başladın.",
"alert.install-success": "Plugin uğurla quraşdırıldı, lütfən, plaqini aktivləşdirin.",
"alert.uninstall-success": "Plugin uğurla deaktiv edildi və silindi.",
"alert.suggest-error": "<p>NodeBB paket menecerinə çata bilmədi, ən son versiyanın quraşdırılmasına davam edin?</p><div class=\"alert alert-danger\"><strong> Server qaytarıldı (%1)</strong>: %2</div>",
"alert.package-manager-unreachable": "<p>NodeBB paket menecerinə müraciət edə bilmədi, hazırda təkmilləşdirmə təklif edilmir.</p>",
"alert.incompatible": "<p>NodeBB versiyanız (v%1) yalnız bu plaqinin v%2-yə yüksəldilməsi üçün silinib. Bu plaqinin daha yeni versiyasını quraşdırmaq istəyirsinizsə, lütfən, NodeBB-ni yeniləyin.</p>",
"alert.possibly-incompatible": "<div class=\"alert alert-warning\"><p><strong>Uyğunluq haqqında məlumat tapılmadı. </strong></p><p>Bu plagin sizin NodeBB versiyanızı nəzərə alaraq quraşdırma üçün xüsusi versiyanı təyin etməyib.</p></div><p> Tam uyğunluğa zəmanət verilə bilməz və NodeBB-nin artıq düzgün başlamamasına səbəb ola bilər. NodeBB düzgün yüklənə bilmədikdə:<pre><code>$ ./nodebb reset plugin=\"%1\"</code></pre><p>Bu plaqinin ən son versiyasının quraşdırılmasına davam edilsin?</p>",
"alert.reorder": "Pluginlər yenidən sifariş edildi",
"alert.reorder-success": "Prosesi tam başa çatdırmaq üçün NodeBB-ni yenidən qurun və yenidən başladın.",
"license.title": "Plugin lisenziya məlumatı",
"license.intro": "%1 plaqini %2 altında lisenziyalaşdırılıb. Bu plagini aktivləşdirməzdən əvvəl lisenziya şərtlərini oxuyun və anlayın.",
"license.cta": "Bu plaqini aktivləşdirməyə davam etmək istəyirsiniz?"
}

View File

@@ -1,17 +0,0 @@
{
"rewards": "Mükafatlar",
"add-reward": "Mükafat əlavə et",
"condition-if-users": "Əgər istifadəçi",
"condition-is": "Əgər:",
"condition-then": "O zaman:",
"max-claims": "Mükafatın tələb oluna biləcəyi vaxtların miqdarı",
"zero-infinite": "Sonsuzluq üçün 0 daxil edin",
"select-reward": "Mükafat seç",
"delete": "Sil",
"enable": "Aktivləşdir",
"disable": "Qeyri-aktiv et",
"alert.delete-success": "Mükafat uğurla silindi",
"alert.no-inputs-found": "Xətalı mükafat - heç bir giriş tapılmadı!",
"alert.save-success": "Mükafatlar müvəffəqiyyətlə yadda saxlanıldı"
}

View File

@@ -1,37 +0,0 @@
{
"widgets": "Vidjetlər",
"available": "Mövcud vidjetlər",
"explanation": "Açılan menyudan vidceti seçin və sonra onu sol tərəfdəki şablonun widget sahəsinə sürükləyib buraxın.",
"none-installed": "Heç bir vidcet tapılmadı! <a href=\"%1\">Pluginlərin</a> idarəetmə panelində əsas vidjet plaginini aktivləşdirin.",
"clone-from": "Vidjetləri klonla",
"containers.available": "Mövcud konteynerlər",
"containers.explanation": "İstənilən vidcetin üzərinə sürükləyin və buraxın",
"containers.none": "Heç biri",
"container.well": "Yaxşı",
"container.jumbotron": "Jumbotron",
"container.card": "Kart",
"container.card-header": "Kart başlığı",
"container.card-body": "Kart gövdəsi",
"container.title": "Başlıq",
"container.body": "Gövdə",
"container.alert": "Xəbərdarlıq",
"alert.confirm-delete": "Bu vidceti silmək istədiyinizə əminsiniz?",
"alert.updated": "Vidjetlər yeniləndi",
"alert.update-success": "Vidjetlər uğurla yeniləndi",
"alert.clone-success": "Vidjetlər uğurla klonlandı",
"error.select-clone": "Zəhmət olmasa klonlamaq üçün səhifə seçin",
"title": "Başlıq",
"title.placeholder": "Başlıq (yalnız bəzi konteynerlərdə göstərilir)",
"container": "Konteyner",
"container.placeholder": "Konteyneri sürükləyib buraxın və ya bura HTML daxil edin.",
"show-to-groups": "Qruplara göstər",
"hide-from-groups": "Qruplardan gizlət",
"start-date": "Başlama tarixi",
"end-date": "Bitmə tarixi",
"hide-on-mobile": "Mobildə gizlət",
"hide-drafts": "Qaralamaları gizlət",
"show-drafts": "Qaralamaları göstər"
}

View File

@@ -1,13 +0,0 @@
{
"manage-admins-and-mods": "Adminləri və Moderlərı idarə et",
"administrators": "Administratorlar",
"global-moderators": "Qlobal moderatorlar",
"moderators": "Moderatorlar",
"no-global-moderators": "Qlobal moderator yoxdur",
"no-sub-categories": "Alt kateqoriya yoxdur",
"view-children": "Uşaqlara baxmaq (% 1)",
"no-moderators": "Moderator yoxdur",
"add-administrator": "Administrator əlavə et",
"add-global-moderator": "Qlobal moderator əlavə et",
"add-moderator": "Moderator əlavə et"
}

View File

@@ -1,131 +0,0 @@
{
"manage-categories": "Kateqoriyaları idarə et",
"add-category": "Kateqoriya əlavə et",
"add-local-category": "Add Local category",
"add-remote-category": "Add Remote category",
"remove": "Remove",
"rename": "Rename",
"jump-to": "Keç...",
"settings": "Kateqoriya parametrləri",
"edit-category": "Kateqoriyanı redaktə et",
"privileges": "İmtiyazlar",
"back-to-categories": "Kateqoriyalara qayıt",
"id": "Category ID",
"name": "Kateqoriya adı",
"handle": "Kateqoriya dəstəyi",
"handle.help": "Kateqoriya dəstəyiniz istifadəçi adına bənzər digər şəbəkələrdə bu kateqoriyanın təmsili kimi istifadə olunur. Kateqoriya sapı mövcud istifadəçi adı və ya istifadəçi qrupuna uyğun olmamalıdır.",
"description": "Kateqoriya təsviri",
"topic-template": "Topic Template",
"topic-template.help": "Define a template for new topics created in this category.",
"bg-color": "Arxa fon rəngi",
"text-color": "Mətnin rəngi",
"bg-image-size": "Fon şəklinin ölçüsü",
"custom-class": "Fərdi sinif",
"num-recent-replies": "# son cavablar",
"ext-link": "# son cavablar",
"subcategories-per-page": "Səhifə başına alt kateqoriyalar",
"is-section": "Bu kateqoriyanı bir bölmə kimi nəzərə al",
"post-queue": "Yazı növbəsi",
"tag-whitelist": "İcazəli təq",
"upload-image": "Şəkil yüklə",
"upload": "Yüklə",
"delete-image": "Sil",
"category-image": "Kateqoriya şəkli",
"image-and-icon": "Şəkil və ikon",
"parent-category": "Ana kateqoriya",
"optional-parent-category": "(İstəyə görə) Ana kateqoriya",
"top-level": "Yuxarı səviyyə",
"parent-category-none": "(Heç biri)",
"copy-parent": "Valideyni kopyala",
"copy-settings": "Parametrləri kopyala",
"optional-clone-settings": "(İstəyə bağlı) Kateqoriyadan parametrləri klonla",
"clone-children": "Uşaq kateqoriyalarını və parametrlərini klonla",
"purge": "Kateqoriyanı təmizlə",
"enable": "Aktivləşdir",
"disable": "Qeyri-aktiv et",
"edit": "Redaktə et",
"analytics": "Analitika",
"federation": "Federasiya",
"view-category": "Kateqoriyaya bax",
"set-order": "Ardıcıllığı təyin et",
"set-order-help": "Kateqoriya sırasının təyin edilməsi bu kateqoriyanı həmin sıraya köçürəcək və lazım gəldikdə digər kateqoriyaların sırasını yeniləyəcək. Minimum sifariş 1-dir ki, bu da kateqoriyanı yuxarıya qoyur.",
"select-category": "Kateqoriya seç",
"set-parent-category": "Ana kateqoriya seç",
"privileges.description": "Siz bu bölmədə saytın hissələri üçün girişə nəzarət imtiyazlarını konfiqurasiya edə bilərsiniz. İmtiyazlar hər istifadəçi və ya qrup üzrə verilə bilər. Aşağıdakıılan menyudan təsir sahəsini seçin.",
"privileges.category-selector": "İmtiyazların konfiqurasiyası",
"privileges.warning": "<strong>Qeyd</strong>: İmtiyaz parametrləri dərhal qüvvəyə minir. Bu parametrləri tənzimlədikdən sonra kateqoriyanı saxlamaq lazım deyil.",
"privileges.section-viewing": "Baxış imtiyazları",
"privileges.section-posting": "Yazıların imtiyazları",
"privileges.section-moderation": "Moderasiya imtiyazları",
"privileges.section-other": "Digər",
"privileges.section-user": "İstifadəçi",
"privileges.search-user": "İstifadəçi əlavə et",
"privileges.no-users": "Bu kateqoriyada istifadəçiyə məxsus imtiyazlar yoxdur.",
"privileges.section-group": "Qrup",
"privileges.group-private": "Bu qrup şəxsidir",
"privileges.inheritance-exception": "Bu qrup qeydiyyatdan keçmiş istifadəçilər qrupundan imtiyazları devralmır",
"privileges.banned-user-inheritance": "Qadağan edilmiş istifadəçilər qadağan olunmuş istifadəçilər qrupundan imtiyazları miras alırlar",
"privileges.search-group": "Qrup əlavə et",
"privileges.copy-to-children": "Uşaqlara kopyala",
"privileges.copy-from-category": "Kateqoriyadan kopyala",
"privileges.copy-privileges-to-all-categories": "Bütün kateqoriyalara kopyala",
"privileges.copy-group-privileges-to-children": "Bu qrupun imtiyazlarını bu kateqoriyadan olan uşaqlara köçür",
"privileges.copy-group-privileges-to-all-categories": "Bu qrupun imtiyazlarını bütün kateqoriyalara köçür",
"privileges.copy-group-privileges-from": "Bu qrupun imtiyazlarını başqa kateqoriyadan köçür",
"privileges.inherit": "<code>Qeydiyyatdan keçmiş istifadəçilər</code> qrupuna xüsusi imtiyaz verilirsə, bütün digər qruplar açıq şəkildə müəyyən edilməmiş/yoxlanılmamış olsa belə, <strong>gizli imtiyaz</strong> alır. Bu gizli imtiyaz sizə göstərilir, çünki bütün istifadəçilər <code>qeydiyyatdan keçmiş istifadəçilər</code> qrupunun bir hissəsidir və buna görə də əlavə qruplar üçün imtiyazların açıq şəkildə verilməsinə ehtiyac yoxdur.",
"privileges.copy-success": "İmtiyazlar kopyalandı!",
"analytics.back": "Kateqoriyalar siyahısına qayıt",
"analytics.title": "\"% 1\" kateqoriyası üçün analitika",
"analytics.pageviews-hourly": "<strong>Şəkil 1</strong> &ndash; Bu kateqoriya üçün saatlıq səhifə baxışları</small>",
"analytics.pageviews-daily": "<strong>Şəkil 2</strong> &ndash; Bu kateqoriya üçün gündəlik səhifə baxışları</small>",
"analytics.topics-daily": "<strong>Şəkil 3</strong> &ndash; Bu kateqoriyada yaradılan gündəlik mövzular</small>",
"analytics.posts-daily": "<strong>Şəkil 4</strong> &ndash; Bu kateqoriyada gündəlik yazılar hazırlanır</small>",
"federation.title": "\"%1\" kateqoriyası üçün federasiya parametrləri",
"federation.disabled": "Federasiya sayt boyu deaktiv edilib, buna görə kateqoriya federasiya parametrləri hazırda əlçatan deyil.",
"federation.disabled-cta": "Federasiya parametrləri &rarr;",
"federation.syncing-header": "Sinxronizasiya",
"federation.syncing-intro": "Kateqoriya ActivityPub protokolu vasitəsilə \"Qrup Aktyoru\"nu izləyə bilər. Məzmun aşağıda sadalanan aktyorlardan birindən alınarsa, o, avtomatik olaraq bu kateqoriyaya əlavə olunacaq.",
"federation.syncing-caveat": "N.B. Sinxronizasiyanın burada qurulması birtərəfli sinxronizasiya yaradır. NodeBB aktyora abunə olmağa/izləməyə çalışır, lakin bunun əksini güman etmək olmaz.",
"federation.syncing-none": "Bu kateqoriyanı hal-hazırda heç kimi izləmir.",
"federation.syncing-add": "Sinxronizasiya et...",
"federation.syncing-actorUri": "Aktyor",
"federation.syncing-follow": "İzlə",
"federation.syncing-unfollow": "İzləməni dayandır",
"federation.followers": "Bu kateqoriyanı izləyən uzaq istifadəçilər",
"federation.followers-handle": "Dəstək",
"federation.followers-id": "ID",
"federation.followers-none": "İzləyici yoxdur.",
"federation.followers-autofill": "Avtomatik doldur",
"alert.created": "Yaradıldı",
"alert.create-success": "Kateqoriya uğurla yaradıldı!",
"alert.none-active": "Aktiv kateqoriyalarınız yoxdur.",
"alert.create": "Kateqoriya yarat",
"alert.add": "Add a Category",
"alert.add-help": "Remote categories can be added to the categories listing by specifying their handle.<br /><br /><strong>Note</strong> — The remote category may not reflect all topics published unless at least one local user tracks/watches it.",
"alert.rename": "Rename a Remote Category",
"alert.rename-help": "Please enter a new name for this category. Leave blank to restore original name.",
"alert.confirm-remove": "Do you really want to remove this category? You can add it back at any time.",
"alert.confirm-purge": "<p class=\"lead\">Bu \"%1\" kateqoriyasını həqiqətən təmizləmək istəyirsiniz?</p><h5><strong class=\"text-danger\"> Xəbərdarlıq!</strong> Bu kateqoriyadakı bütün mövzular və yazılar silinəcək! </h5><p class=\"help-block\">Kateqoriyanın təmizlənməsi bütün mövzuları və yazıları siləcək və kateqoriyanı verilənlər bazasından siləcək. Kateqoriyanı <em>müvəqqəti</em> olaraq silmək istəyirsinizsə, bunun əvəzinə kateqoriyanı \"deaktiv etmək\" istəyəcəksiniz.</p>",
"alert.purge-success": "Kateqoriya təmizləndi!",
"alert.copy-success": "Parametrlər kopyalandı!",
"alert.set-parent-category": "Ana kateqoriya seç",
"alert.updated": "Yenilənmiş kateqoriyalar",
"alert.updated-success": "Kateqoriya ID-ləri %1 uğurla yeniləndi.",
"alert.upload-image": "Kateqoriya şəklini yüklə",
"alert.find-user": "İstifadəçi axtar",
"alert.user-search": "İstifadəçini burada axtar...",
"alert.find-group": "Qrup tap",
"alert.group-search": "Qrupu burada axtarın...",
"alert.not-enough-whitelisted-tags": "Ağ siyahıya alınmış teqlər minimum teqlərdən azdır, daha çox ağ siyahıya alınmış teqlər yaratmalısınız!",
"collapse-all": "Hamısını yığ",
"expand-all": "Hamısını aç",
"disable-on-create": "Yaradarkən deaktiv et",
"no-matches": "Uyğunluq yoxdur"
}

View File

@@ -1,22 +0,0 @@
{
"lead": "Aşağıda həzm çatdırılması statistikası və vaxtlarının siyahısı göstərilir.",
"disclaimer": "Nəzərə alın ki, e-poçt texnologiyasının təbiətinə görə e-poçt çatdırılmasına zəmanət verilmir. Bir çox dəyişənlər alıcının serverinə göndərilən e-poçtun son nəticədə istifadəçinin gələnlər qutusuna daxil olub-olmamasına, o cümlədən server reputasiyasına, qara siyahıya alınmış IP ünvanlarına və DKIM/SPF/DMARC-nin konfiqurasiya edilib-edilməməsinə təsir göstərir.",
"disclaimer-continued": "Uğurlu çatdırılma mesajın NodeBB tərəfindən uğurla göndərilməsi və alıcı server tərəfindən təsdiqlənməsi deməkdir. Bu, e-poçtun gələnlər qutusuna düşməsi demək deyil. Ən yaxşı nəticələr üçün biz <a href=\"https://sendgrid.com/why-sendgrid/\">SendGrid</a> kimi üçüncü tərəfin e-poçt çatdırılması xidmətindən istifadə etməyi tövsiyə edirik.",
"user": "İstifadəçi",
"subscription": "Abunə növü",
"last-delivery": "Sonuncu uğurlu çatdırılma",
"default": "Sistemin defolt",
"default-help": "<em>Sistem defolt</em> o deməkdir ki, istifadəçi hazırda həzmlər üçün qlobal forum parametrini ləğv etməyib: &quot;<strong>%1</strong>&quot;",
"resend": "Digesti yenidən göndərin",
"resend-all-confirm": "Bu həzm işini əl ilə yerinə yetirmək istədiyinizə əminsiniz?",
"resent-single": "Manual digest yenidən göndərmə tamamlandı",
"resent-day": "Gündəlik həzm hirslənir",
"resent-week": "Həftəlik həzm hirsləndi",
"resent-biweek": "İki həftəlik həzm rezidenti",
"resent-month": "Aylıq həzm yenidən göndərildi",
"null": "<em>Heç vaxt</em>",
"manual-run": "Əl ilə həzm işlət:",
"no-delivery-data": "Çatdırılma məlumatı tapılmadı"
}

View File

@@ -1,49 +0,0 @@
{
"manage-groups": "Qrupları idarə et",
"add-group": "Qrup əlavə et",
"edit-group": "Qrupu redaktə et",
"back-to-groups": "Qruplara qayıt",
"view-group": "Qrupa bax",
"icon-and-title": "İkon və Başlıq",
"name": "Qrupun adı",
"badge": "Nişan",
"properties": "Xüsusiyyətlər",
"description": "Qrupun təsviri",
"member-count": "Üzv sayı",
"system": "Sistem",
"hidden": "Gizli",
"private": "Şəxsi",
"edit": "Redaktə et",
"delete": "Sil",
"privileges": "İmtiyazlar",
"members-csv": "Üzvlər (CSV)",
"search-placeholder": "Axtarış",
"create": "Qrup yarat",
"description-placeholder": "Qrupunuz haqqında qısa məlumat",
"create-button": "Yaratmaq",
"alerts.create-failure": "<strong>Uh-Oh</strong> <p>Qrupunuzu yaratarkən problem yarandı. Daha sonra yenidən cəhd edin!</p>",
"alerts.confirm-delete": "Bu qrupu silmək istədiyinizə əminsiniz?",
"edit.name": "Adı",
"edit.description": "Təsviri",
"edit.user-title": "Üzvlərin adı",
"edit.icon": "Qrup ikonu",
"edit.label-color": "Qrup başlığı rəngi",
"edit.text-color": "Qrup mətn rəngi",
"edit.show-badge": "Nişanı göstər",
"edit.private-details": "Aktiv edilərsə, qruplara qoşulmaq üçün qrup sahibinin təsdiqi tələb olunur.",
"edit.private-override": "Xəbərdarlıq: Şəxsi qruplar sistem səviyyəsində deaktiv edilib və bu seçimi ləğv edir.",
"edit.disable-join": "Qoşulma sorğularını deaktiv edin",
"edit.disable-leave": "İstifadəçilərin qrupdan çıxmasına icazə verməyin",
"edit.hidden": "Gizli",
"edit.hidden-details": "Aktivləşdirilərsə, bu qrup qruplar siyahısında tapılmayacaq və istifadəçilər əl ilə dəvət olunmalı olacaqlar",
"edit.add-user": "İstifadəçini qrupa əlavə et",
"edit.add-user-search": "İstifadəçiləri axtar",
"edit.members": "Üzv siyahısı",
"control-panel": "Qrup idarəetmə paneli",
"revert": "Geri qaytar",
"edit.no-users-found": "İstifadəçi tapılmadı",
"edit.confirm-remove-user": "Bu istifadəçini silmək istədiyinizə əminsiniz?"
}

View File

@@ -1,66 +0,0 @@
{
"manage-privileges": "İmtiyazları idarə et",
"discard-changes": "Dəyişiklikləri ləğv et",
"global": "Qlobal",
"admin": "Admin",
"group-privileges": "Qrup imtiyazları",
"user-privileges": "İstifadəçi imtiyazları",
"edit-privileges": "İmtiyazları redaktə et",
"select-clear-all": "Hamısını seç/sil",
"chat": "Söhbət",
"chat-with-privileged": "İmtiyazlı ilə söhbət et",
"upload-images": "Şəkilləri yüklə",
"upload-files": "Faylları yüklə",
"signature": "İmza",
"ban": "Qadağa et",
"mute": "Səssizləşdir",
"invite": "Dəvət et",
"search-content": "Məzmunu axtar",
"search-users": "İstifadəçiləri axtar",
"search-tags": "Teqləri axtar",
"view-users": "İstifadəçilərə bax",
"view-tags": "Teqlərə bax",
"view-groups": "Qruplara bax",
"allow-local-login": "Lokal giriş",
"allow-group-creation": "Qrup yarat",
"view-users-info": "İstifadəçi məlumatlarına bax",
"find-category": "Kateqoriya tap",
"access-category": "Kateqoriyaya giriş",
"access-topics": "Mövzulara daxil olun",
"create-topics": "Mövzular yarat",
"reply-to-topics": "Mövzulara cavab ver",
"schedule-topics": "Mövzuları təqvim et",
"tag-topics": "Mövzuları teqlə",
"edit-posts": "Yazıları redaktə et",
"view-edit-history": "Redaktə tarixçəsinə bax",
"delete-posts": "Yazıları sil",
"view-deleted": "Silinmiş yazılara bax",
"upvote-posts": "Yazılara müsbət səs ver",
"downvote-posts": "Yazılara mənfi səs ver",
"delete-topics": "Mövzuları sil",
"purge": "Təmizlə",
"moderate": "Moderasiya",
"admin-dashboard": "İdarə paneli",
"admin-categories": "Kateqoriyalar",
"admin-privileges": "İmtiyazlar",
"admin-users": "İstifadəçilər",
"admin-admins-mods": "Adminlər &amp; Moderatorlar",
"admin-groups": "Qruplar",
"admin-tags": "Teqlər",
"admin-settings": "Parametrlər",
"alert.confirm-moderate": "<strong>Bu istifadəçi qrupuna moderasiya imtiyazı vermək istədiyinizə əminsiniz?</strong> Bu qrup ictimaidir və istənilən istifadəçi öz istəyi ilə qoşula bilər.",
"alert.confirm-admins-mods": "<strong>Siz &quot;Adminlər &amp; Mods&quot; bu istifadəçi/qrup üçün imtiyaz varmı?</strong> Bu imtiyazlı istifadəçilər digər istifadəçiləri super administrator da daxil olmaqla imtiyazlı vəzifələrə <em>yüksəldə və aşağı sala bilərlər.</em>",
"alert.confirm-save": "Bu imtiyazları saxlamaq niyyətinizi təsdiq et",
"alert.confirm-discard": "İmtiyaz dəyişikliklərinizi ləğv etmək istədiyinizə əminsiniz?",
"alert.discarded": "İmtiyaz dəyişiklikləri ləğv et",
"alert.confirm-copyToAll": "Bu <strong>%1 </strong>dəstini <strong>bütün kateqoriyalara tətbiq etmək istədiyinizə əminsiniz</strong>?",
"alert.confirm-copyToAllGroup": "Bu qrupun <strong>%1</strong> dəstini <strong>bütün kateqoriyalara tətbiq etmək istədiyinizə əminsiniz</strong>?",
"alert.confirm-copyToChildren": "Bu <strong>%1</strong> dəstini <strong>bütün nəsil (uşaq) kateqoriyalara tətbiq etmək istədiyinizə əminsiniz</strong>?",
"alert.confirm-copyToChildrenGroup": "Bu qrupun <strong>%1</strong> dəstini <strong>bütün nəsil (uşaq) kateqoriyalara tətbiq etmək istədiyinizə əminsiniz</strong>?",
"alert.no-undo": "<em>Bu əməliyyat geri qaytarıla bilməz.</em>",
"alert.admin-warning": "Administratorlar dolayısı ilə bütün imtiyazları əldə edirlər",
"alert.copyPrivilegesFrom-title": "Kopyalamaq üçün kateqoriya seç",
"alert.copyPrivilegesFrom-warning": "Bu, seçilmiş kateqoriyadan %1-ni kopyalayacaq.",
"alert.copyPrivilegesFromGroup-warning": "Bu, bu qrupun %1 dəstini seçilmiş kateqoriyadan kopyalayacaq."
}

View File

@@ -1,20 +0,0 @@
{
"queue": "Növbə",
"description": "Qeydiyyat növbəsində heç bir istifadəçi yoxdur. <br>Bu funksiyanı aktivləşdirmək üçün <a href=\"%1\">Parametrlərə keçin &rarr; İstifadəçi &rarr;</a> İstifadəçi Qeydiyyatı və <strong>Qeydiyyat Tipini</strong> \"Admin Təsdiqi\" olaraq təyin edin.",
"list.name": "Adı",
"list.email": "E-poçt",
"list.ip": "IP",
"list.time": "Zaman",
"list.username-spam": "Tezlik: %1 Görünür: %2 Etibarlılıq: %3",
"list.email-spam": "Tezlik: %1 Görünür: %2",
"list.ip-spam": "Tezlik: %1 Görünür: %2",
"invitations": "Dəvətlər",
"invitations.description": "Aşağıda göndərilən dəvətlərin tam siyahısı verilmişdir. Siyahıda e-poçt və ya istifadəçi adı ilə axtarış etmək üçün ctrl-f düymələrindən istifadə edin. <br><br>İstifadəçi adı dəvətnamələrini istifadə etmiş istifadəçilər üçün e-poçtların sağında göstəriləcək.",
"invitations.inviter-username": "Dəvət edənin istifadəçi adı",
"invitations.invitee-email": "Dəvət olunanın E-poçtu",
"invitations.invitee-username": "Dəvət edən istifadəçi adı (qeydiyyatdan keçmişdirsə)",
"invitations.confirm-delete": "Bu dəvəti silmək istədiyinizə əminsiniz?"
}

View File

@@ -1,20 +0,0 @@
{
"manage-tags": "Teqləri idarə et",
"none": "Forumunuzda hələ teqləri olan mövzu yoxdur.",
"bg-color": "Arxa fon rəngi",
"text-color": "Mətnin rəngi",
"description": "Klikləyərək və ya sürükləyərək teqləri seçin, birdən çox teq seçmək üçün <code>CTRL</code> düyməsini istifadə edin.",
"create": "Teq yarat",
"add-tag": "Teq əlavə et",
"modify": "Teqləri dəyiş",
"rename": "Teqlərin adını dəyiş",
"delete": "Seçilmiş teqləri sil",
"search": "Teqləri axtarın...",
"settings": "Teqlər parametrləri",
"name": "Teq adı",
"alerts.editing": "Teq(lər)i redaktə et",
"alerts.confirm-delete": "Seçilmiş teqləri silmək istəyirsiniz?",
"alerts.update-success": "Teq yeniləndi!",
"reset-colors": "Rəngləri sıfırla"
}

View File

@@ -1,12 +0,0 @@
{
"manage-uploads": "Yükləmələri idarə et",
"upload-file": "Faylı yüklə",
"filename": "Faylın adı",
"usage": "Yazıdan istifadə",
"orphaned": "Yetim qalmış",
"size/filecount": "Həcmi / Fayl sayı",
"confirm-delete": "Bu faylı həqiqətən silmək istəyirsiniz?",
"filecount": "%1 fayl",
"new-folder": "Yeni qovluq",
"name-new-folder": "Yeni qovluq üçün ad daxil edin"
}

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