Merge branch 'Awesome-Technologies:master' into user_erased_details
This commit is contained in:
commit
74d314b0ad
2
.github/workflows/build-test.yml
vendored
2
.github/workflows/build-test.yml
vendored
@ -16,6 +16,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
node-version: "18"
|
node-version: "18"
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn --frozen-lockfile
|
run: yarn --immutable
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: yarn test
|
run: yarn test
|
||||||
|
2
.github/workflows/edge_ghpage.yml
vendored
2
.github/workflows/edge_ghpage.yml
vendored
@ -16,7 +16,7 @@ jobs:
|
|||||||
node-version: "18"
|
node-version: "18"
|
||||||
- name: Install and Build 🔧
|
- name: Install and Build 🔧
|
||||||
run: |
|
run: |
|
||||||
yarn install
|
yarn install --immutable
|
||||||
yarn build
|
yarn build
|
||||||
|
|
||||||
- name: Deploy 🚀
|
- name: Deploy 🚀
|
||||||
|
4
.github/workflows/github-release.yml
vendored
4
.github/workflows/github-release.yml
vendored
@ -17,14 +17,14 @@ jobs:
|
|||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: "18"
|
node-version: "18"
|
||||||
- run: yarn install
|
- run: yarn install --immutable
|
||||||
- run: yarn build
|
- run: yarn build
|
||||||
- run: |
|
- run: |
|
||||||
version=`git describe --dirty --tags || echo unknown`
|
version=`git describe --dirty --tags || echo unknown`
|
||||||
mkdir -p dist
|
mkdir -p dist
|
||||||
cp -r build synapse-admin-$version
|
cp -r build synapse-admin-$version
|
||||||
tar chvzf dist/synapse-admin-$version.tar.gz synapse-admin-$version
|
tar chvzf dist/synapse-admin-$version.tar.gz synapse-admin-$version
|
||||||
- uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844
|
- uses: softprops/action-gh-release@3198ee18f814cdf787321b4a32a26ddbf37acc52
|
||||||
with:
|
with:
|
||||||
files: dist/*.tar.gz
|
files: dist/*.tar.gz
|
||||||
env:
|
env:
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
dist: focal
|
|
||||||
language: node_js
|
|
||||||
node_js:
|
|
||||||
- 18
|
|
||||||
|
|
||||||
cache: yarn
|
|
@ -1,12 +1,12 @@
|
|||||||
# Builder
|
# Builder
|
||||||
FROM node:lts as builder
|
FROM node:lts as builder
|
||||||
|
LABEL org.opencontainers.image.url=https://github.com/Awesome-Technologies/synapse-admin org.opencontainers.image.source=https://github.com/Awesome-Technologies/synapse-admin
|
||||||
ARG REACT_APP_SERVER
|
ARG REACT_APP_SERVER
|
||||||
|
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
|
|
||||||
COPY . /src
|
COPY . /src
|
||||||
RUN yarn --network-timeout=300000 install
|
RUN yarn --network-timeout=300000 install --immutable
|
||||||
RUN REACT_APP_SERVER=$REACT_APP_SERVER yarn build
|
RUN REACT_APP_SERVER=$REACT_APP_SERVER yarn build
|
||||||
|
|
||||||
|
|
||||||
|
17
package.json
17
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "synapse-admin",
|
"name": "synapse-admin",
|
||||||
"version": "0.9.0",
|
"version": "0.9.2",
|
||||||
"description": "Admin GUI for the Matrix.org server Synapse",
|
"description": "Admin GUI for the Matrix.org server Synapse",
|
||||||
"author": "Awesome Technologies Innovationslabor GmbH",
|
"author": "Awesome Technologies Innovationslabor GmbH",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
@ -11,9 +11,9 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@testing-library/jest-dom": "^6.0.0",
|
"@testing-library/jest-dom": "^6.0.0",
|
||||||
"@testing-library/react": "^14.0.0",
|
"@testing-library/react": "^15.0.2",
|
||||||
"@testing-library/user-event": "^14.5.2",
|
"@testing-library/user-event": "^14.5.2",
|
||||||
"eslint": "^8.56.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-config-react-app": "^7.0.1",
|
"eslint-config-react-app": "^7.0.1",
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
@ -21,16 +21,17 @@
|
|||||||
"prettier": "^3.2.5"
|
"prettier": "^3.2.5"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@mui/icons-material": "^5.15.7",
|
"@mui/icons-material": "^5.15.15",
|
||||||
"@mui/material": "^5.15.7",
|
"@mui/material": "^5.15.15",
|
||||||
"@mui/styles": "^5.15.8",
|
"@mui/styles": "^5.15.15",
|
||||||
"papaparse": "^5.4.1",
|
"papaparse": "^5.4.1",
|
||||||
"ra-language-chinese": "^2.0.10",
|
"ra-language-chinese": "^2.0.10",
|
||||||
"ra-language-french": "^4.16.9",
|
"ra-language-french": "^4.16.15",
|
||||||
"ra-language-german": "^3.13.4",
|
"ra-language-german": "^3.13.4",
|
||||||
"ra-language-italian": "^3.13.1",
|
"ra-language-italian": "^3.13.1",
|
||||||
|
"ra-language-farsi": "^4.2.0",
|
||||||
"react": "^18.0.0",
|
"react": "^18.0.0",
|
||||||
"react-admin": "^4.16.9",
|
"react-admin": "^4.16.15",
|
||||||
"react-dom": "^18.0.0",
|
"react-dom": "^18.0.0",
|
||||||
"react-scripts": "^5.0.1"
|
"react-scripts": "^5.0.1"
|
||||||
},
|
},
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
id,displayname,password,is_guest,admin,deactivated
|
id,displayname,password,is_guest,admin,deactivated
|
||||||
@testuser22:example.org,Jane Doe,secretpassword,false,true,false
|
testuser22,Jane Doe,secretpassword,false,true,false
|
||||||
,John Doe,,false,false,false
|
,John Doe,,false,false,false
|
||||||
|
|
@ -1,9 +1,10 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import { render } from "@testing-library/react";
|
import { render, screen } from "@testing-library/react";
|
||||||
import App from "./App";
|
import App from "./App";
|
||||||
|
|
||||||
describe("App", () => {
|
describe("App", () => {
|
||||||
it("renders", () => {
|
it("renders", async () => {
|
||||||
render(<App />);
|
render(<App />);
|
||||||
|
await screen.findAllByText("Welcome to Synapse-admin");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -292,6 +292,7 @@ const LoginPage = () => {
|
|||||||
<MenuItem value="fr">Français</MenuItem>
|
<MenuItem value="fr">Français</MenuItem>
|
||||||
<MenuItem value="it">Italiano</MenuItem>
|
<MenuItem value="it">Italiano</MenuItem>
|
||||||
<MenuItem value="zh">简体中文</MenuItem>
|
<MenuItem value="zh">简体中文</MenuItem>
|
||||||
|
<MenuItem value="fa">Persian(فارسی)</MenuItem>
|
||||||
</Select>
|
</Select>
|
||||||
<FormDataConsumer>
|
<FormDataConsumer>
|
||||||
{formDataProps => <UserData {...formDataProps} />}
|
{formDataProps => <UserData {...formDataProps} />}
|
||||||
|
@ -132,7 +132,7 @@ export const RegistrationTokenEdit = props => (
|
|||||||
);
|
);
|
||||||
|
|
||||||
const resource = {
|
const resource = {
|
||||||
name: "users",
|
name: "registration_tokens",
|
||||||
icon: RegistrationTokenIcon,
|
icon: RegistrationTokenIcon,
|
||||||
list: RegistrationTokenList,
|
list: RegistrationTokenList,
|
||||||
edit: RegistrationTokenEdit,
|
edit: RegistrationTokenEdit,
|
||||||
|
@ -134,6 +134,7 @@ export const RoomShow = props => {
|
|||||||
<Datagrid
|
<Datagrid
|
||||||
style={{ width: "100%" }}
|
style={{ width: "100%" }}
|
||||||
rowClick={(id, resource, record) => "/users/" + id}
|
rowClick={(id, resource, record) => "/users/" + id}
|
||||||
|
bulkActionButtons={false}
|
||||||
>
|
>
|
||||||
<TextField
|
<TextField
|
||||||
source="id"
|
source="id"
|
||||||
@ -218,7 +219,7 @@ export const RoomShow = props => {
|
|||||||
target="room_id"
|
target="room_id"
|
||||||
addLabel={false}
|
addLabel={false}
|
||||||
>
|
>
|
||||||
<Datagrid style={{ width: "100%" }}>
|
<Datagrid style={{ width: "100%" }} bulkActionButtons={false}>
|
||||||
<TextField source="type" sortable={false} />
|
<TextField source="type" sortable={false} />
|
||||||
<DateField
|
<DateField
|
||||||
source="origin_server_ts"
|
source="origin_server_ts"
|
||||||
@ -256,7 +257,7 @@ export const RoomShow = props => {
|
|||||||
target="room_id"
|
target="room_id"
|
||||||
addLabel={false}
|
addLabel={false}
|
||||||
>
|
>
|
||||||
<Datagrid style={{ width: "100%" }}>
|
<Datagrid style={{ width: "100%" }} bulkActionButtons={false}>
|
||||||
<TextField source="id" sortable={false} />
|
<TextField source="id" sortable={false} />
|
||||||
<DateField
|
<DateField
|
||||||
source="received_ts"
|
source="received_ts"
|
||||||
|
@ -419,7 +419,7 @@ export const UserEdit = props => {
|
|||||||
source="devices[].sessions[0].connections"
|
source="devices[].sessions[0].connections"
|
||||||
label="resources.connections.name"
|
label="resources.connections.name"
|
||||||
>
|
>
|
||||||
<Datagrid style={{ width: "100%" }}>
|
<Datagrid style={{ width: "100%" }} bulkActionButtons={false}>
|
||||||
<TextField source="ip" sortable={false} />
|
<TextField source="ip" sortable={false} />
|
||||||
<DateField
|
<DateField
|
||||||
source="last_seen"
|
source="last_seen"
|
||||||
@ -482,6 +482,7 @@ export const UserEdit = props => {
|
|||||||
<Datagrid
|
<Datagrid
|
||||||
style={{ width: "100%" }}
|
style={{ width: "100%" }}
|
||||||
rowClick={(id, resource, record) => "/rooms/" + id + "/show"}
|
rowClick={(id, resource, record) => "/rooms/" + id + "/show"}
|
||||||
|
bulkActionButtons={false}
|
||||||
>
|
>
|
||||||
<TextField
|
<TextField
|
||||||
source="id"
|
source="id"
|
||||||
@ -511,7 +512,7 @@ export const UserEdit = props => {
|
|||||||
target="user_id"
|
target="user_id"
|
||||||
addLabel={false}
|
addLabel={false}
|
||||||
>
|
>
|
||||||
<Datagrid style={{ width: "100%" }}>
|
<Datagrid style={{ width: "100%" }} bulkActionButtons={false}>
|
||||||
<TextField source="kind" sortable={false} />
|
<TextField source="kind" sortable={false} />
|
||||||
<TextField source="app_display_name" sortable={false} />
|
<TextField source="app_display_name" sortable={false} />
|
||||||
<TextField source="app_id" sortable={false} />
|
<TextField source="app_id" sortable={false} />
|
||||||
|
382
src/i18n/fa.js
Normal file
382
src/i18n/fa.js
Normal file
@ -0,0 +1,382 @@
|
|||||||
|
import farsiMessages from "ra-language-farsi";
|
||||||
|
|
||||||
|
const fa = {
|
||||||
|
...farsiMessages,
|
||||||
|
synapseadmin: {
|
||||||
|
auth: {
|
||||||
|
base_url: "آدرس سرور",
|
||||||
|
welcome: "به پنل مدیریت سیناپس خوش آمدید!",
|
||||||
|
server_version: "نسخه",
|
||||||
|
username_error: "لطفاً شناسه کاربر را وارد کنید: '@user:domain'",
|
||||||
|
protocol_error: "URL باید با 'http://' یا 'https://' شروع شود",
|
||||||
|
url_error: "آدرس وارد شده یک سرور معتبر نیست",
|
||||||
|
sso_sign_in: "با SSO وارد شوید",
|
||||||
|
},
|
||||||
|
users: {
|
||||||
|
invalid_user_id: "بخش محلی یک شناسه کاربری ماتریکس بدون سرور خانگی.",
|
||||||
|
tabs: { sso: "SSO" },
|
||||||
|
},
|
||||||
|
rooms: {
|
||||||
|
tabs: {
|
||||||
|
basic: "اصلی",
|
||||||
|
members: "اعضا",
|
||||||
|
detail: "جزئیات",
|
||||||
|
permission: "مجوزها",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
reports: { tabs: { basic: "اصلی", detail: "جزئیات" } },
|
||||||
|
},
|
||||||
|
import_users: {
|
||||||
|
error: {
|
||||||
|
at_entry: "در هنگام ورود %{entry}: %{message}",
|
||||||
|
error: "Error",
|
||||||
|
required_field: "فیلد الزامی '%{field}' وجود ندارد",
|
||||||
|
invalid_value:
|
||||||
|
"خطا در خط %{row}. '%{field}' فیلد ممکن است فقط 'درست' یا 'نادرست' باشد",
|
||||||
|
unreasonably_big:
|
||||||
|
"از بارگذاری فایل هایی با حجم غیر منطقی خودداری کنید %{size} مگابایت",
|
||||||
|
already_in_progress: "یک بارگذاری از قبل در حال انجام است",
|
||||||
|
id_exits: "شناسه %{id} موجود است",
|
||||||
|
},
|
||||||
|
title: "کاربران را از طریق فایل CSV وارد کنید",
|
||||||
|
goToPdf: "رفتن به PDF",
|
||||||
|
cards: {
|
||||||
|
importstats: {
|
||||||
|
header: "وارد کردن کاربران",
|
||||||
|
users_total:
|
||||||
|
"%{smart_count} user in CSV file |||| %{smart_count} users in CSV file",
|
||||||
|
guest_count: "%{smart_count} guest |||| %{smart_count} guests",
|
||||||
|
admin_count: "%{smart_count} admin |||| %{smart_count} admins",
|
||||||
|
},
|
||||||
|
conflicts: {
|
||||||
|
header: "استراتژی متغارض",
|
||||||
|
mode: {
|
||||||
|
stop: "توقف",
|
||||||
|
skip: "نمایش خطا و رد شدن",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ids: {
|
||||||
|
header: "شناسنامه ها",
|
||||||
|
all_ids_present: "شناسه های موجود در هر ورودی",
|
||||||
|
count_ids_present:
|
||||||
|
"%{smart_count} ورود با شناسه |||| %{smart_count} ورودی با شناسه",
|
||||||
|
mode: {
|
||||||
|
ignore: "شناسه ها را در CSV نادیده بگیر و شناسه های جدید ایجاد کن",
|
||||||
|
update: "سوابق موجود را به روز کنید",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
passwords: {
|
||||||
|
header: "رمز عبور",
|
||||||
|
all_passwords_present: "رمزهای عبور موجود در هر ورودی",
|
||||||
|
count_passwords_present:
|
||||||
|
"%{smart_count} ورود با رمز عبور |||| %{smart_count} ورودی با رمز عبور",
|
||||||
|
use_passwords: "از پسوردهای CSV استفاده کنید",
|
||||||
|
},
|
||||||
|
upload: {
|
||||||
|
header: "Input CSV file",
|
||||||
|
explanation:
|
||||||
|
"در اینجا می توانید فایلی را با مقادیر جدا شده با کاما بارگذاری کنید که برای ایجاد یا به روز رسانی کاربران پردازش می شود. فایل باید شامل فیلدهای 'id' و 'displayname' باشد. می توانید یک فایل نمونه را از اینجا دانلود و تطبیق دهید: ",
|
||||||
|
},
|
||||||
|
startImport: {
|
||||||
|
simulate_only: "فقط شبیه سازی",
|
||||||
|
run_import: "بارگذاری",
|
||||||
|
},
|
||||||
|
results: {
|
||||||
|
header: "بارگذاری نتایج",
|
||||||
|
total: "%{smart_count} ورودی در کل |||| %{smart_count} ورودی ها در کل",
|
||||||
|
successful: "%{smart_count} ورودی ها با موفقیت وارد شدند",
|
||||||
|
skipped: "%{smart_count} ورودی ها نادیده گرفته شدند",
|
||||||
|
download_skipped: "دانلود رکوردهای نادیده گرفته شده",
|
||||||
|
with_error:
|
||||||
|
"%{smart_count} ورود با خطا ||| %{smart_count} ورودی های دارای خطا",
|
||||||
|
simulated_only: "اجرا فقط شبیه سازی شد",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
resources: {
|
||||||
|
users: {
|
||||||
|
name: "کاربر |||| کاربران",
|
||||||
|
email: "ایمیل",
|
||||||
|
msisdn: "شماره تلفن",
|
||||||
|
threepid: "ایمیل / شماره تلفن",
|
||||||
|
fields: {
|
||||||
|
avatar: "آواتار",
|
||||||
|
id: "شناسه کاربر",
|
||||||
|
name: "نام",
|
||||||
|
is_guest: "مهمان",
|
||||||
|
admin: "مدیر سرور",
|
||||||
|
deactivated: "غیرفعال",
|
||||||
|
guests: "نمایش مهمانان",
|
||||||
|
show_deactivated: "نمایش کاربران غیرفعال شده",
|
||||||
|
user_id: "جستجوی کاربر",
|
||||||
|
displayname: "نام نمایشی",
|
||||||
|
password: "رمز عبور",
|
||||||
|
avatar_url: "آواتار سرور",
|
||||||
|
avatar_src: "آواتار",
|
||||||
|
medium: "متوسط",
|
||||||
|
threepids: "سرویس احراز هویت",
|
||||||
|
address: "آدرس",
|
||||||
|
creation_ts_ms: "ساخته شده در",
|
||||||
|
consent_version: "Consent نسخه",
|
||||||
|
auth_provider: "ارائه دهنده",
|
||||||
|
user_type: "نوع کاربر",
|
||||||
|
},
|
||||||
|
helper: {
|
||||||
|
password: "با تغییر رمز عبور کاربر از تمام دستگاه ها خارج می شود.",
|
||||||
|
deactivate: "برای فعالسازی مجدد حساب باید رمز عبور وارد کنید.",
|
||||||
|
erase: "کاربر را به عنوان GDPR پاک شده علامت گذاری کنید",
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
erase: "پاک کردن اطلاعات کاربر",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rooms: {
|
||||||
|
name: "اتاق |||| اتاق ها",
|
||||||
|
fields: {
|
||||||
|
room_id: "شناسه اتاق",
|
||||||
|
name: "نام",
|
||||||
|
canonical_alias: "نام مستعار",
|
||||||
|
joined_members: "اعضا",
|
||||||
|
joined_local_members: "اعضای محلی",
|
||||||
|
joined_local_devices: "دستگاه های محلی",
|
||||||
|
state_events: "رویدادهای حالت / پیچیدگی",
|
||||||
|
version: "نسخه",
|
||||||
|
is_encrypted: "رمزگذاری شده است",
|
||||||
|
encryption: "رمزگذاری",
|
||||||
|
federatable: "Federatable",
|
||||||
|
public: "قابل مشاهده در فهرست اتاق",
|
||||||
|
creator: "سازنده",
|
||||||
|
join_rules: "به قوانین بپیوندید",
|
||||||
|
guest_access: "دسترسی مهمان",
|
||||||
|
history_visibility: "مشاهده تاریخچه",
|
||||||
|
topic: "موضوع",
|
||||||
|
avatar: "آواتار",
|
||||||
|
},
|
||||||
|
helper: {
|
||||||
|
forward_extremities:
|
||||||
|
"اندام های رو به جلو، رویدادهای برگ در انتهای نمودار غیر چرخه ای جهت دار (DAG) در یک اتاق هستند، رویدادهایی که فرزند ندارند. هر چه تعداد بیشتری در یک اتاق وجود داشته باشد، وضوح حالت بیشتری را که سیناپس باید انجام دهد (نکته: این یک عملیات گران است). در حالی که Synapse کدی برای جلوگیری از وجود تعداد زیادی از این موارد در یک زمان در اتاق دارد، گاهی اوقات باگها میتوانند دوباره ظاهر شوند. اگر اتاقی بیش از 10 انتهای رو به جلو دارد، بهتر است بررسی کنید که کدام اتاق مقصر است و احتمالاً آنها را با استفاده از جستارهای SQL ذکر شده در آن حذف کنید. #1760.",
|
||||||
|
},
|
||||||
|
enums: {
|
||||||
|
join_rules: {
|
||||||
|
public: "عمومی",
|
||||||
|
knock: "در زدن",
|
||||||
|
invite: "دعوت کردن",
|
||||||
|
private: "خصوصی",
|
||||||
|
},
|
||||||
|
guest_access: {
|
||||||
|
can_join: "مهمانان می توانند ملحق شوند",
|
||||||
|
forbidden: "مهمانان نمی توانند ملحق شوند",
|
||||||
|
},
|
||||||
|
history_visibility: {
|
||||||
|
invited: "از آنجایی که دعوت شده است",
|
||||||
|
joined: "از زمانی که پیوست",
|
||||||
|
shared: "از آنجایی که به اشتراک گذاشته شده است",
|
||||||
|
world_readable: "هر کسی",
|
||||||
|
},
|
||||||
|
unencrypted: "رمزگذاری نشده",
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
erase: {
|
||||||
|
title: "حذف اتاق",
|
||||||
|
content:
|
||||||
|
"آیا مطمئن هستید که می خواهید اتاق را حذف کنید؟ این قابل بازگشت نیست. همه پیام ها و رسانه های مشترک در اتاق از سرور حذف می شوند!",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
reports: {
|
||||||
|
name: "رویداد گزارش شده |||| رویدادهای گزارش شده",
|
||||||
|
fields: {
|
||||||
|
id: "شناسه",
|
||||||
|
received_ts: "زمان گزارش",
|
||||||
|
user_id: "گوینده",
|
||||||
|
name: "نام اتاق",
|
||||||
|
score: "نمره",
|
||||||
|
reason: "دلیل",
|
||||||
|
event_id: "شناسه رویداد",
|
||||||
|
event_json: {
|
||||||
|
origin: "سرور مبدا",
|
||||||
|
origin_server_ts: "زمان ارسال",
|
||||||
|
type: "نوع رویداد",
|
||||||
|
content: {
|
||||||
|
msgtype: "نوع محتوا",
|
||||||
|
body: "محتوا",
|
||||||
|
format: "قالب",
|
||||||
|
formatted_body: "محتوای قالب بندی شده",
|
||||||
|
algorithm: "الگوریتم",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
connections: {
|
||||||
|
name: "اتصالات",
|
||||||
|
fields: {
|
||||||
|
last_seen: "تاریخ",
|
||||||
|
ip: "آدرس آی پی",
|
||||||
|
user_agent: "نماینده کاربر",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
devices: {
|
||||||
|
name: "دستگاه |||| دستگاه ها",
|
||||||
|
fields: {
|
||||||
|
device_id: "شناسه دستگاه",
|
||||||
|
display_name: "نام دستگاه",
|
||||||
|
last_seen_ts: "مهر زمان",
|
||||||
|
last_seen_ip: "آدرس آی پی",
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
erase: {
|
||||||
|
title: "حذف کردن %{id}",
|
||||||
|
content:
|
||||||
|
'آیا مطمئن هستید که می خواهید دستگاه را حذف کنید؟ "%{name}"?',
|
||||||
|
success: "دستگاه با موفقیت حذف شد.",
|
||||||
|
failure: "خطایی رخ داده است.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
users_media: {
|
||||||
|
name: "رسانه ها",
|
||||||
|
fields: {
|
||||||
|
media_id: "شناسه رسانه",
|
||||||
|
media_length: "اندازه فایل (به بایت)",
|
||||||
|
media_type: "نوع",
|
||||||
|
upload_name: "نام فایل",
|
||||||
|
quarantined_by: "قرنطینه شده توسط",
|
||||||
|
safe_from_quarantine: "امان از قرنطینه",
|
||||||
|
created_ts: "ایجاد شده",
|
||||||
|
last_access_ts: "آخرین دسترسی",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
delete_media: {
|
||||||
|
name: "رسانه ها",
|
||||||
|
fields: {
|
||||||
|
before_ts: "آخرین دسترسی قبل",
|
||||||
|
size_gt: "بزرگتر از آن (به بایت)",
|
||||||
|
keep_profiles: "تصاویر پروفایل را نگه دارید",
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
send: "حذف رسانه ها",
|
||||||
|
send_success: "درخواست با موفقیت ارسال شد.",
|
||||||
|
send_failure: "خطایی رخ داده است.",
|
||||||
|
},
|
||||||
|
helper: {
|
||||||
|
send: "این API رسانه های محلی را از دیسک سرور خود حذف می کند. این شامل هر تصویر کوچک محلی و کپی از رسانه دانلود شده است. این API بر رسانههایی که در مخازن رسانه خارجی آپلود شدهاند تأثیری نخواهد گذاشت.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
protect_media: {
|
||||||
|
action: {
|
||||||
|
create: "محافظت نشده، حفاظت ایجاد کنید",
|
||||||
|
delete: "محافظت شده، حفاظت را بردارید",
|
||||||
|
none: "در قرنطینه",
|
||||||
|
send_success: "وضعیت حفاظت با موفقیت تغییر کرد.",
|
||||||
|
send_failure: "خطایی رخ داده است.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
quarantine_media: {
|
||||||
|
action: {
|
||||||
|
name: "قرنطینه",
|
||||||
|
create: "به قرنطینه اضافه کنید",
|
||||||
|
delete: "در قرنطینه، غیر قرنطینه",
|
||||||
|
none: "از قرنطینه محافظت می شود",
|
||||||
|
send_success: "وضعیت قرنطینه با موفقیت تغییر کرد.",
|
||||||
|
send_failure: "خطایی رخ داده است.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pushers: {
|
||||||
|
name: "هل دهنده |||| هل دهنده ها",
|
||||||
|
fields: {
|
||||||
|
app: "برنامه",
|
||||||
|
app_display_name: "نام نمایش برنامه",
|
||||||
|
app_id: "شناسه برنامه",
|
||||||
|
device_display_name: "نام نمایشی برنامه",
|
||||||
|
kind: "نوع",
|
||||||
|
lang: "زبان",
|
||||||
|
profile_tag: "برچسب پروفایل",
|
||||||
|
pushkey: "کلید",
|
||||||
|
data: { url: "URL" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
servernotices: {
|
||||||
|
name: "اطلاعیه های سرور",
|
||||||
|
send: "ارسال اعلانات سرور",
|
||||||
|
fields: {
|
||||||
|
body: "پیام",
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
send: "ارسال یادداشت",
|
||||||
|
send_success: "اعلان سرور با موفقیت ارسال شد.",
|
||||||
|
send_failure: "خطایی رخ داده است.",
|
||||||
|
},
|
||||||
|
helper: {
|
||||||
|
send: "اعلان سرور را برای کاربران انتخاب شده ارسال می کند. ویژگی 'اعلامیه های سرور' باید در سرور فعال شود.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
user_media_statistics: {
|
||||||
|
name: "رسانه کاربران",
|
||||||
|
fields: {
|
||||||
|
media_count: "شمارش رسانه ها",
|
||||||
|
media_length: "طول رسانه",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
forward_extremities: {
|
||||||
|
name: "Forward Extremities",
|
||||||
|
fields: {
|
||||||
|
id: "شناسه رویداد",
|
||||||
|
received_ts: "مهر زمان",
|
||||||
|
depth: "عمق",
|
||||||
|
state_group: "گروه دولتی",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
room_state: {
|
||||||
|
name: "رویدادهای وضعیت",
|
||||||
|
fields: {
|
||||||
|
type: "نوع",
|
||||||
|
content: "محتوا",
|
||||||
|
origin_server_ts: "زمان ارسال",
|
||||||
|
sender: "فرستنده",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
room_directory: {
|
||||||
|
name: "راهنمای اتاق",
|
||||||
|
fields: {
|
||||||
|
world_readable: "کاربران مهمان می توانند بدون عضویت مشاهده کنند",
|
||||||
|
guest_can_join: "کاربران مهمان ممکن است ملحق شوند",
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
title:
|
||||||
|
"اتاق را از فهرست حذف کنید |||| حذف کنید %{smart_count} اتاق ها از دایرکتوری",
|
||||||
|
content:
|
||||||
|
"آیا مطمئنید که می خواهید این اتاق را از فهرست راهنمای حذف کنید؟ |||| آیا مطمئن هستید که می خواهید این موارد را %{smart_count} از راهنمای اتاق ها حذف کنید؟",
|
||||||
|
erase: "حذف از فهرست اتاق",
|
||||||
|
create: "انتشار در راهنما اتاق",
|
||||||
|
send_success: "اتاق با موفقیت منتشر شد.",
|
||||||
|
send_failure: "خطایی رخ داده است.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
destinations: {
|
||||||
|
name: "سرور های مرتبط",
|
||||||
|
fields: {
|
||||||
|
destination: "آدرس",
|
||||||
|
failure_ts: "زمان شکست",
|
||||||
|
retry_last_ts: "آخرین زمان اتصال",
|
||||||
|
retry_interval: "بازه امتحان مجدد",
|
||||||
|
last_successful_stream_ordering: "آخرین جریان موفق",
|
||||||
|
stream_ordering: "جریان",
|
||||||
|
},
|
||||||
|
action: { reconnect: "دوباره وصل شوید" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
registration_tokens: {
|
||||||
|
name: "توکن های ثبت نام",
|
||||||
|
fields: {
|
||||||
|
token: "توکن",
|
||||||
|
valid: "توکن معتبر",
|
||||||
|
uses_allowed: "موارد استفاده مجاز",
|
||||||
|
pending: "انتظار",
|
||||||
|
completed: "تکمیل شد",
|
||||||
|
expiry_time: "زمان انقضا",
|
||||||
|
length: "طول",
|
||||||
|
},
|
||||||
|
helper: { length: "طول توکن در صورت عدم ارائه توکن." },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
export default fa;
|
Loading…
Reference in New Issue
Block a user