diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index dd85ed699b76..d6d6abd54ed1 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,42 +1,253 @@
# Contributing to Rocket.Chat
-:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
+**First off, thanks for taking the time to contribute! :tada::+1:**
-The following is a set of guidelines for contributing to Rocket.Chat and its packages, which are hosted in the [Rocket.Chat Organization](https://github.com/RocketChat) on GitHub.
+> There are many ways to contribute to Rocket.Chat even if you're not technical or a developer:
+>
+> * Email us at marketing@rocket.chat to tell us how much you love the project
+> * Write about us in your blogs
+> * Fix some small typos in our [documentation](https://docs.rocket.chat/contributing)
+> * Become our [GitHub sponsor](https://github.com/sponsors/RocketChat)
+> * Tell others about us and help us spread the word
+>
+> Every bit of contribution is appreciated 🙂 thank you!
+
+The following is a set of guidelines for contributing to Rocket.Chat, which are hosted in the [Rocket.Chat Organization](https://github.com/RocketChat) on GitHub.
__Note:__ If there's a feature you'd like, there's a bug you'd like to fix, or you'd just like to get involved please raise an issue and start a conversation. We'll help as much as we can so you can get contributing - although we may not always be able to respond right away :)
-## ECMAScript 2015 vs CoffeeScript
+## Setup
+
+Your development workstation needs to have at least 8GB or RAM to be able to build the Rocket.Chat's source code.
+
+Rocket.Chat runs on top of [Meteor](https://www.meteor.com/). To run it on development mode you need to [install Meteor](https://www.meteor.com/install) and clone/download the Rocket.Chat's code, then just open the code folder and run:
+```shell
+meteor npm install && meteor
+```
+It should build and run the application and database for you, now you can access the UI on (http://localhost:3000)
+
+It's not necessary to install Nodejs or NPM, every time you need to use them you can run `meteor node` or `meteor npm`.
+
+It's important to always run the NPM commands using `meteor npm` to ensure that you are installing the modules using the right Nodejs version.
+
+## Coding
+
+We provide a [.editorconfig](../.editorconfig) file that will help you to keep some standards in place.
+
+### ECMAScript vs TypeScript
+
+We are currently adopting TypeScript as the default language on our projects, the current codebase will be migrated incrementally from JavaScript to TypeScript.
+
+While we still have a lot of JavaScript files you should not create new ones. As much as possible new code contributions should be in **TypeScript**.
-While we still have a lot of CoffeeScript files you should not create new ones. New code contributions should be in **ECMAScript 2015**.
+### Blaze vs React
-## Coding standards
+We are currently adopting React over Blaze as our UI engine, the current codebase is under migration and will continue. You will still find Blaze templates in our code. Code changes or contributions may need to be made in Blaze while we continue to evolve our components library.
-Most of the coding standards are covered by `.editorconfig` and `.eslintrc.js`.
+[Fuselage](https://github.com/RocketChat/Rocket.Chat.Fuselage) is our component library based on React, check it out when contributing to the Rocket.Chat UI and feel free to contribute new components or fixes.
+
+### Standards
+
+Most of the coding standards are covered by ESLint configured at [.eslintrc](../.eslintrc), and most of them came from our own [ESLint Config Package](https://github.com/RocketChat/eslint-config-rocketchat).
Things not covered by `eslint`:
-* `exports`/`module.exports` should be at the end of the file
-* Longer, descriptive variable names are preferred, e.g. `error` vs `err`
+* Prefer longer/descriptive variable names, e.g. `error` vs `err`, unless dealing with common record properties already shortened, e.g. `rid` and `uid`
+* Use return early pattern. [See more](https://blog.timoxley.com/post/47041269194/avoid-else-return-early)
+* Prefer `Promise` over `callbacks`
+* Prefer `await` over `then/catch`
+* Don't create queries outside models, the query description should be inside the model class.
+* Don't hardcode fields inside models. Same method can be used for different purposes, using different fields.
+* Prefer create REST endpoints over Meteor methods
+* Prefer call REST endpoints over Meteor methods when both are available
+* v1 REST endpoints should follow the following pattern: `/api/v1/dashed-namespace.camelCaseAction`
+* Prefer TypeScript over JavaScript. Check [ECMAScript vs TypeScript](#ecmascript-vs-typescript)
-We acknowledge all the code does not meet these standards but we are working to change this over time.
+#### Blaze
+* Import the HTML file from it's sibling JS/TS file
### Syntax check
Before submitting a PR you should get no errors on `eslint`.
-To check your files, first install `eslint`:
+To check your files run:
+
+```shell
+meteor npm run lint
+```
+
+## Tests
+
+There are 2 types of tests we run on Rocket.Chat, **Unit** tests and **End to End** tests. The major difference is that End to End tests require a Rocket.Chat instance running to execute the API and UI checks.
+
+### End to End Tests
+
+First you need to run a Rocket.Chat server on **Test Mode** and on a **Empty Database**:
+```shell
+# Running with a local mongodb database
+MONGO_URL=mongodb://localhost/empty MONGO_OPLOG_URL=mongodb://localhost/local TEST_MODE=true meteor
+```
+```shell
+# Running with a local mongodb database but cleaning it before
+mongo --eval "db.dropDatabase()" empty && MONGO_URL=mongodb://localhost/empty MONGO_OPLOG_URL=mongodb://localhost/local TEST_MODE=true meteor
+```
+
+Now you can run the tests:
+```shell
+meteor npm test
+```
+
+### Unit Tests
+
+Unit tests are simpler to setup and run. They do not require a working Rocket.Chat instance.
+```shell
+meteor npm run testunit
+```
+
+It's possible to run on watch mode as well:
+```shell
+meteor npm run testunit-watch
+```
+
+
+
+## Before Push your code
+
+It's important to run the lint and tests before push your code or submit a Pull Request, otherwise your contribution may fail quickly on the CI. Reviewers are forced to demand fixes and the review of your contribution will be further delayed.
+
+Rocket.Chat uses [husky](https://www.npmjs.com/package/husky) to run the **lint** and **unit tests** before proceed to the code push process, so you may notice a delay when pushing your code to your repository.
+
+## Choosing a good PR title
+
+It is very important to note that we use PR titles when creating our change log. Keep this in mind when you title your PR. Make sure the title makes sense to a person reading a releases' change log!
+
+Keep your PR's title as short and concise as possible, use PR's description section, which you can find in the PR's template, to provide more details into the changelog.
+
+Good titles require thinking from a user's point of view. Don't get technical and talk code or architecture. What is the actual user-facing feature or the bug fixed? For example:
+
+```
+[NEW] Allow search permissions and settings by name instead of only ID
+```
+
+Even it's being something new in the code the users already expect the filter to filter by what they see (translations), a better one would be:
+
+```
+[FIX] Permissions' search doesn't filter base on presented translation, only on internal ids
+```
+
+## Choosing the right PR tag
+
+You can use several tags do describe your PR, i.e.: `[FIX]`, `[NEW]`, etc. You can use the descriptions below to better understand the meaning of each one, and decide which one you should use:
+
+### `[NEW]`
+
+#### When
+- When adding a new feature that is important to the end user
+
+#### How
+
+Do not start repeating the section (`Add ...` or `New ...`)
+Always describe what's being fixed, improved or added and not *how* it was fixed, improved or added.
+
+Exemple of **bad** PR titles:
+
+```
+[NEW] Add ability to set tags in the Omnichannel room closing dialog
+[NEW] Adds ability for Rocket.Chat Apps to create discussions
+[NEW] Add MMS support to Voxtelesys
+[NEW] Add Color variable to left sidebar
+```
+
+Exemple of **good** PR titles:
```
-npm install -g eslint
+[NEW] Ability to set tags in the Omnichannel room closing dialog
+[NEW] Ability for Rocket.Chat Apps to create discussions
+[NEW] MMS support to Voxtelesys
+[NEW] Color variable to left sidebar
```
-Then run:
+### `[FIX]`
+
+#### When
+- When fixing something not working or behaving wrong from the end user perspective
+
+#### How
+
+Always describe what's being fixed and not *how* it was fixed.
+
+Exemple of a **bad** PR title:
```
-eslint .
+[FIX] Add Content-Type for public files with JWT
```
-# Contributor License Agreement
+Exemple of a **good** PR title:
+
+```
+[FIX] Missing Content-Type header for public files with JWT
+```
+
+### `[IMPROVE]`
+
+#### When
+- When a change enhances a not buggy behavior. When in doubt if it's a Improve or Fix prefer to use as fix.
+
+#### How
+Always describe what's being improved and not *how* it was improved.
+
+Exemple of **good** PR title:
+
+```
+[IMPROVE] Displays Nothing found on admin sidebar when search returns nothing
+```
+
+### `[BREAK]`
+
+#### When
+- When the changes affect a working feature
+
+##### Back-End
+- When the API contract (data structure and endpoints) are limited, expanded as required or removed
+- When the business logic (permissions and roles) are limited, expanded (without migration) or removed
+
+##### Front-End
+- When the change limits (format, size, etc) or removes the ability of read or change the data (when the limitation was not caused by the back-end)
+
+### Second tag e.g. `[NEW][ENTERPRISE]`
+
+Use a second tag to group entries on the change log, we currently use it only for the Enterprise items but we are going to expand it's usage soon, please do not use it until we create a patter for it.
+
+### Minor Changes
+
+For those PRs that aren't important for the end user, we are working on a better pattern, but for now please use the same tags, use them without the brackets and in camel case:
+
+```
+Fix: Missing Content-Type header for public files with JWT
+```
+
+All those PRs will be grouped under the `Minor changes` section which is collapsed, so users can expand it to check for those minor things but they are not visible directly on changelog.
+
+## Security Best Practices
+
+- Never expose unnecessary data to the APIs' responses
+- Always check for permissions or create new ones when you must expose sensitive data
+- Never provide new APIs without rate limiters
+- Always escape the user's input when rendering data
+- Always limit the user's input size on server side
+- Always execute the validations on the server side even when executing on the client side as well
+
+## Performance Best Practices
+
+- Prefer inform the fields you want, and only the necessary ones, when querying data from database over query the full documents
+- Limit the number of returned records to a reasonable value
+- Check if the query is using indexes, it it's not create new indexes
+- Prefer queues over long executions
+- Create new metrics to mesure things whenever possible
+- Cache data and returns whenever possible
+
+## Contributor License Agreement
+
+To have your contribution accepted you must sign our [Contributor License Agreement](https://cla-assistant.io/RocketChat/Rocket.Chat). In case you submit a Pull Request before sign the CLA GitHub will alert you with a new comment asking you to sign and will block the Pull Request from be merged by us.
Please review and sign our CLA at https://cla-assistant.io/RocketChat/Rocket.Chat
diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml
index 2d74d00f0e17..bf8c1bed7ff9 100644
--- a/.github/workflows/build_and_test.yml
+++ b/.github/workflows/build_and_test.yml
@@ -227,7 +227,7 @@ jobs:
MONGO_URL: mongodb://localhost:27017/rocketchat
MONGO_OPLOG_URL: mongodb://localhost:27017/local
run: |
- for i in $(seq 1 5); do (docker exec mongo mongo rocketchat --eval 'db.dropDatabase()') && xvfb-run --auto-servernum npm test && s=0 && break || s=$? && sleep 1; done; (exit $s)
+ for i in $(seq 1 5); do (docker exec mongo mongo rocketchat --eval 'db.dropDatabase()') && xvfb-run --auto-servernum npm run testci && s=0 && break || s=$? && sleep 1; done; (exit $s)
# notification:
# runs-on: ubuntu-latest
diff --git a/.scripts/start.js b/.scripts/start.js
index aa9e3b334757..1159290bbbb9 100644
--- a/.scripts/start.js
+++ b/.scripts/start.js
@@ -112,7 +112,7 @@ function startChimp() {
startProcess({
name: 'Chimp',
command: 'npm',
- params: ['run', 'testci'],
+ params: ['test'],
// command: 'exit',
// params: ['2'],
options: {
diff --git a/app/apps/server/bridges/internal.js b/app/apps/server/bridges/internal.js
index ef883a68437f..db6671541907 100644
--- a/app/apps/server/bridges/internal.js
+++ b/app/apps/server/bridges/internal.js
@@ -6,6 +6,10 @@ export class AppInternalBridge {
}
getUsernamesOfRoomById(roomId) {
+ if (!roomId) {
+ return [];
+ }
+
const records = Subscriptions.findByRoomIdWhenUsernameExists(roomId, {
fields: {
'u.username': 1,
diff --git a/app/apps/server/bridges/listeners.js b/app/apps/server/bridges/listeners.js
index 259b937b1686..c3d481da7386 100644
--- a/app/apps/server/bridges/listeners.js
+++ b/app/apps/server/bridges/listeners.js
@@ -1,10 +1,53 @@
-import { AppInterface } from '@rocket.chat/apps-engine/server/compiler';
+import { AppInterface } from '@rocket.chat/apps-engine/definition/metadata';
export class AppListenerBridge {
constructor(orch) {
this.orch = orch;
}
+ async handleEvent(event, ...payload) {
+ const method = (() => {
+ switch (event) {
+ case AppInterface.IPreMessageSentPrevent:
+ case AppInterface.IPreMessageSentExtend:
+ case AppInterface.IPreMessageSentModify:
+ case AppInterface.IPostMessageSent:
+ case AppInterface.IPreMessageDeletePrevent:
+ case AppInterface.IPostMessageDeleted:
+ case AppInterface.IPreMessageUpdatedPrevent:
+ case AppInterface.IPreMessageUpdatedExtend:
+ case AppInterface.IPreMessageUpdatedModify:
+ case AppInterface.IPostMessageUpdated:
+ return 'messageEvent';
+ case AppInterface.IPreRoomCreatePrevent:
+ case AppInterface.IPreRoomCreateExtend:
+ case AppInterface.IPreRoomCreateModify:
+ case AppInterface.IPostRoomCreate:
+ case AppInterface.IPreRoomDeletePrevent:
+ case AppInterface.IPostRoomDeleted:
+ case AppInterface.IPreRoomUserJoined:
+ case AppInterface.IPostRoomUserJoined:
+ return 'roomEvent';
+ case AppInterface.IPostExternalComponentOpened:
+ case AppInterface.IPostExternalComponentClosed:
+ return 'externalComponentEvent';
+ /**
+ * @deprecated please prefer the AppInterface.IPostLivechatRoomClosed event
+ */
+ case AppInterface.ILivechatRoomClosedHandler:
+ case AppInterface.IPostLivechatRoomStarted:
+ case AppInterface.IPostLivechatRoomClosed:
+ case AppInterface.IPostLivechatAgentAssigned:
+ case AppInterface.IPostLivechatAgentUnassigned:
+ return 'livechatEvent';
+ case AppInterface.IUIKitInteractionHandler:
+ return 'uiKitInteractionEvent';
+ }
+ })();
+
+ return this[method](event, ...payload);
+ }
+
async messageEvent(inte, message) {
const msg = this.orch.getConverters().get('messages').convertMessage(message);
const result = await this.orch.getManager().getListenerManager().executeListener(inte, msg);
@@ -13,56 +56,44 @@ export class AppListenerBridge {
return result;
}
return this.orch.getConverters().get('messages').convertAppMessage(result);
-
- // try {
-
- // } catch (e) {
- // this.orch.debugLog(`${ e.name }: ${ e.message }`);
- // this.orch.debugLog(e.stack);
- // }
}
- async roomEvent(inte, room) {
+ async roomEvent(inte, room, ...payload) {
const rm = this.orch.getConverters().get('rooms').convertRoom(room);
- const result = await this.orch.getManager().getListenerManager().executeListener(inte, rm);
+
+ const params = (() => {
+ switch (inte) {
+ case AppInterface.IPreRoomUserJoined:
+ case AppInterface.IPostRoomUserJoined:
+ const [joiningUser, invitingUser] = payload;
+ return {
+ room: rm,
+ joiningUser: this.orch.getConverters().get('users').convertToApp(joiningUser),
+ invitingUser: this.orch.getConverters().get('users').convertToApp(invitingUser),
+ };
+ default:
+ return rm;
+ }
+ })();
+
+ const result = await this.orch.getManager().getListenerManager().executeListener(inte, params);
if (typeof result === 'boolean') {
return result;
}
return this.orch.getConverters().get('rooms').convertAppRoom(result);
-
- // try {
-
- // } catch (e) {
- // this.orch.debugLog(`${ e.name }: ${ e.message }`);
- // this.orch.debugLog(e.stack);
- // }
}
async externalComponentEvent(inte, externalComponent) {
- const result = await this.orch.getManager().getListenerManager().executeListener(inte, externalComponent);
-
- return result;
+ return this.orch.getManager().getListenerManager().executeListener(inte, externalComponent);
}
async uiKitInteractionEvent(inte, action) {
return this.orch.getManager().getListenerManager().executeListener(inte, action);
-
- // try {
-
- // } catch (e) {
- // this.orch.debugLog(`${ e.name }: ${ e.message }`);
- // this.orch.debugLog(e.stack);
- // }
}
async livechatEvent(inte, data) {
switch (inte) {
- case AppInterface.IPostLivechatRoomStarted:
- case AppInterface.IPostLivechatRoomClosed:
- const room = this.orch.getConverters().get('rooms').convertRoom(data);
-
- return this.orch.getManager().getListenerManager().executeListener(inte, room);
case AppInterface.IPostLivechatAgentAssigned:
case AppInterface.IPostLivechatAgentUnassigned:
return this.orch.getManager().getListenerManager().executeListener(inte, {
@@ -70,7 +101,9 @@ export class AppListenerBridge {
agent: this.orch.getConverters().get('users').convertToApp(data.user),
});
default:
- break;
+ const room = this.orch.getConverters().get('rooms').convertRoom(data);
+
+ return this.orch.getManager().getListenerManager().executeListener(inte, room);
}
}
}
diff --git a/app/apps/server/converters/rooms.js b/app/apps/server/converters/rooms.js
index 8c8aedbe1448..001ca0de6cbb 100644
--- a/app/apps/server/converters/rooms.js
+++ b/app/apps/server/converters/rooms.js
@@ -116,6 +116,7 @@ export class AppRoomsConverter {
customFields: 'customFields',
isWaitingResponse: 'waitingResponse',
isOpen: 'open',
+ _USERNAMES: '_USERNAMES',
isDefault: (room) => {
const result = !!room.default;
delete room.default;
diff --git a/app/apps/server/index.js b/app/apps/server/index.js
index aa24a2d78926..ad3096af3158 100644
--- a/app/apps/server/index.js
+++ b/app/apps/server/index.js
@@ -1,3 +1,3 @@
import './cron';
-export { Apps } from './orchestrator';
+export { Apps, AppEvents } from './orchestrator';
diff --git a/app/apps/server/orchestrator.js b/app/apps/server/orchestrator.js
index da9fca47fe61..2034b02ad13e 100644
--- a/app/apps/server/orchestrator.js
+++ b/app/apps/server/orchestrator.js
@@ -1,5 +1,7 @@
-import { Meteor } from 'meteor/meteor';
+import { EssentialAppDisabledException } from '@rocket.chat/apps-engine/definition/exceptions';
+import { AppInterface } from '@rocket.chat/apps-engine/definition/metadata';
import { AppManager } from '@rocket.chat/apps-engine/server/AppManager';
+import { Meteor } from 'meteor/meteor';
import { Logger } from '../../logger';
import { AppsLogsModel, AppsModel, AppsPersistenceModel, Permissions } from '../../models';
@@ -16,7 +18,6 @@ function isTesting() {
return process.env.TEST_MODE === 'true';
}
-
class AppServerOrchestrator {
constructor() {
this._isInitialized = false;
@@ -155,8 +156,23 @@ class AppServerOrchestrator {
return this._manager.updateAppsMarketplaceInfo(apps)
.then(() => this._manager.get());
}
+
+ async triggerEvent(event, ...payload) {
+ if (!this.isLoaded()) {
+ return;
+ }
+
+ return this.getBridges().getListenerBridge().handleEvent(event, ...payload).catch((error) => {
+ if (error instanceof EssentialAppDisabledException) {
+ throw new Meteor.Error('error-essential-app-disabled');
+ }
+
+ throw error;
+ });
+ }
}
+export const AppEvents = AppInterface;
export const Apps = new AppServerOrchestrator();
settings.addGroup('General', function() {
diff --git a/app/chatpal-search/server/provider/provider.js b/app/chatpal-search/server/provider/provider.js
index 18ee9a36f42b..6ce02e17b8f6 100644
--- a/app/chatpal-search/server/provider/provider.js
+++ b/app/chatpal-search/server/provider/provider.js
@@ -3,6 +3,7 @@ import { Meteor } from 'meteor/meteor';
import { searchProviderService, SearchProvider } from '../../../search/server';
import ChatpalLogger from '../utils/logger';
import { Subscriptions } from '../../../models';
+import { baseUrl } from '../utils/settings';
import Index from './index';
@@ -16,7 +17,9 @@ class ChatpalProvider extends SearchProvider {
constructor() {
super('chatpalProvider');
- this.chatpalBaseUrl = 'https://beta.chatpal.io/v1';
+ this.chatpalBaseUrl = `${ baseUrl }`;
+
+ ChatpalLogger.debug(`Using ${ this.chatpalBaseUrl } as chatpal base url`);
this._settings.add('Backend', 'select', 'cloud', {
values: [
@@ -220,24 +223,24 @@ class ChatpalProvider extends SearchProvider {
if (this._settings.get('Backend') === 'cloud') {
config.baseurl = this.chatpalBaseUrl;
config.language = this._settings.get('Main_Language');
- config.searchpath = '/search/search';
- config.updatepath = '/search/update';
- config.pingpath = '/search/ping';
- config.clearpath = '/search/clear';
- config.suggestionpath = '/search/suggest';
+ config.searchpath = 'search/search';
+ config.updatepath = 'search/update';
+ config.pingpath = 'search/ping';
+ config.clearpath = 'search/clear';
+ config.suggestionpath = 'search/suggest';
config.httpOptions = {
headers: {
'X-Api-Key': this._settings.get('API_Key'),
},
};
} else {
- config.baseurl = this._settings.get('Base_URL').endsWith('/') ? this._settings.get('Base_URL').slice(0, -1) : this._settings.get('Base_URL');
+ config.baseurl = this._settings.get('Base_URL').replace(/\/?$/, '/');
config.language = this._settings.get('Main_Language');
- config.searchpath = '/chatpal/search';
- config.updatepath = '/chatpal/update';
- config.pingpath = '/chatpal/ping';
- config.clearpath = '/chatpal/clear';
- config.suggestionpath = '/chatpal/suggest';
+ config.searchpath = 'chatpal/search';
+ config.updatepath = 'chatpal/update';
+ config.pingpath = 'chatpal/ping';
+ config.clearpath = 'chatpal/clear';
+ config.suggestionpath = 'chatpal/suggest';
config.httpOptions = {
headers: this._parseHeaders(),
};
diff --git a/app/chatpal-search/server/utils/settings.js b/app/chatpal-search/server/utils/settings.js
new file mode 100644
index 000000000000..a1450bc16b6d
--- /dev/null
+++ b/app/chatpal-search/server/utils/settings.js
@@ -0,0 +1 @@
+export const baseUrl = (process.env.CHATPAL_URL || 'https://api.chatpal.io/v1').replace(/\/?$/, '/');
diff --git a/app/chatpal-search/server/utils/utils.js b/app/chatpal-search/server/utils/utils.js
index 91b1ffe64f22..5707ca59b15c 100644
--- a/app/chatpal-search/server/utils/utils.js
+++ b/app/chatpal-search/server/utils/utils.js
@@ -1,10 +1,12 @@
import { Meteor } from 'meteor/meteor';
import { HTTP } from 'meteor/http';
+import { baseUrl } from './settings';
+
Meteor.methods({
'chatpalUtilsCreateKey'(email) {
try {
- const response = HTTP.call('POST', 'https://beta.chatpal.io/v1/account', { data: { email, tier: 'free' } });
+ const response = HTTP.call('POST', `${ baseUrl }account`, { data: { email, tier: 'free' } });
if (response.statusCode === 201) {
return response.data.key;
}
@@ -15,7 +17,7 @@ Meteor.methods({
},
'chatpalUtilsGetTaC'(lang) {
try {
- const response = HTTP.call('GET', `https://beta.chatpal.io/v1/terms/${ lang }.html`);
+ const response = HTTP.call('GET', `${ baseUrl }terms/${ lang }.html`);
if (response.statusCode === 200) {
return response.content;
}
diff --git a/app/lib/server/functions/addUserToRoom.js b/app/lib/server/functions/addUserToRoom.js
index 1e9878aadcd6..77627bba2585 100644
--- a/app/lib/server/functions/addUserToRoom.js
+++ b/app/lib/server/functions/addUserToRoom.js
@@ -1,8 +1,10 @@
+import { AppsEngineException } from '@rocket.chat/apps-engine/definition/exceptions';
import { Meteor } from 'meteor/meteor';
-import { Rooms, Subscriptions, Messages } from '../../../models';
+import { AppEvents, Apps } from '../../../apps/server';
import { callbacks } from '../../../callbacks';
-import { roomTypes, RoomMemberActions } from '../../../utils/server';
+import { Messages, Rooms, Subscriptions } from '../../../models';
+import { RoomMemberActions, roomTypes } from '../../../utils/server';
export const addUserToRoom = function(rid, user, inviter, silenced) {
const now = new Date();
@@ -27,6 +29,14 @@ export const addUserToRoom = function(rid, user, inviter, silenced) {
callbacks.run('beforeJoinRoom', user, room);
}
+ Promise.await(Apps.triggerEvent(AppEvents.IPreRoomUserJoined, room, user, inviter).catch((error) => {
+ if (error instanceof AppsEngineException) {
+ throw new Meteor.Error('error-app-prevented', error.message);
+ }
+
+ throw error;
+ }));
+
Subscriptions.createWithRoomAndUser(room, user, {
ts: now,
open: true,
@@ -59,6 +69,8 @@ export const addUserToRoom = function(rid, user, inviter, silenced) {
// Keep the current event
callbacks.run('afterJoinRoom', user, room);
+
+ Apps.triggerEvent(AppEvents.IPostRoomUserJoined, room, user, inviter);
});
}
diff --git a/app/lib/server/functions/createDirectRoom.js b/app/lib/server/functions/createDirectRoom.js
index 5474e2d67473..31702b2e96ba 100644
--- a/app/lib/server/functions/createDirectRoom.js
+++ b/app/lib/server/functions/createDirectRoom.js
@@ -1,7 +1,12 @@
+import { AppsEngineException } from '@rocket.chat/apps-engine/definition/exceptions';
+import { Meteor } from 'meteor/meteor';
+
+import { Apps } from '../../../apps/server';
+import { callbacks } from '../../../callbacks/server';
import { Rooms, Subscriptions } from '../../../models/server';
import { settings } from '../../../settings/server';
import { getDefaultSubscriptionPref } from '../../../utils/server';
-import { callbacks } from '../../../callbacks/server';
+
const generateSubscription = (fname, name, user, extra) => ({
alert: false,
@@ -40,7 +45,7 @@ export const createDirectRoom = function(members, roomExtraData = {}, options =
const isNewRoom = !room;
- const rid = room?._id || Rooms.insert({
+ const roomInfo = {
...uids.length === 2 && { _id: uids.join('') }, // Deprecated: using users' _id to compose the room _id is deprecated
t: 'd',
usernames,
@@ -49,7 +54,34 @@ export const createDirectRoom = function(members, roomExtraData = {}, options =
ts: new Date(),
uids,
...roomExtraData,
- });
+ };
+
+ if (isNewRoom) {
+ roomInfo._USERNAMES = usernames;
+
+ const prevent = Promise.await(Apps.triggerEvent('IPreRoomCreatePrevent', roomInfo).catch((error) => {
+ if (error instanceof AppsEngineException) {
+ throw new Meteor.Error('error-app-prevented', error.message);
+ }
+
+ throw error;
+ }));
+ if (prevent) {
+ throw new Meteor.Error('error-app-prevented', 'A Rocket.Chat App prevented the room creation.');
+ }
+
+ let result;
+ result = Promise.await(Apps.triggerEvent('IPreRoomCreateExtend', roomInfo));
+ result = Promise.await(Apps.triggerEvent('IPreRoomCreateModify', result));
+
+ if (typeof result === 'object') {
+ Object.assign(roomInfo, result);
+ }
+
+ delete roomInfo._USERNAMES;
+ }
+
+ const rid = room?._id || Rooms.insert(roomInfo);
if (members.length === 1) { // dm to yourself
Subscriptions.upsert({ rid, 'u._id': members[0]._id }, {
@@ -80,6 +112,8 @@ export const createDirectRoom = function(members, roomExtraData = {}, options =
const insertedRoom = Rooms.findOneById(rid);
callbacks.run('afterCreateDirectRoom', insertedRoom, { members });
+
+ Apps.triggerEvent('IPostRoomCreate', insertedRoom);
}
return {
diff --git a/app/lib/server/functions/createRoom.js b/app/lib/server/functions/createRoom.js
index 9b43a9c16080..3d5d4ca886ee 100644
--- a/app/lib/server/functions/createRoom.js
+++ b/app/lib/server/functions/createRoom.js
@@ -1,14 +1,16 @@
+import { AppsEngineException } from '@rocket.chat/apps-engine/definition/exceptions';
import { Meteor } from 'meteor/meteor';
import _ from 'underscore';
import s from 'underscore.string';
-import { Users, Rooms, Subscriptions } from '../../../models';
-import { callbacks } from '../../../callbacks';
+import { Apps } from '../../../apps/server';
import { addUserRoles } from '../../../authorization';
+import { callbacks } from '../../../callbacks';
+import { Rooms, Subscriptions, Users } from '../../../models';
import { getValidRoomName } from '../../../utils';
-import { Apps } from '../../../apps/server';
import { createDirectRoom } from './createDirectRoom';
+
export const createRoom = function(type, name, owner, members = [], readOnly, extraData = {}, options = {}) {
callbacks.run('beforeCreateRoom', { type, name, owner, members, readOnly, extraData, options });
@@ -62,21 +64,30 @@ export const createRoom = function(type, name, owner, members = [], readOnly, ex
ro: readOnly === true,
};
- if (Apps && Apps.isLoaded()) {
- const prevent = Promise.await(Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreatePrevent', room));
- if (prevent) {
- throw new Meteor.Error('error-app-prevented-creation', 'A Rocket.Chat App prevented the room creation.');
+ room._USERNAMES = members;
+
+ const prevent = Promise.await(Apps.triggerEvent('IPreRoomCreatePrevent', room).catch((error) => {
+ if (error instanceof AppsEngineException) {
+ throw new Meteor.Error('error-app-prevented', error.message);
}
- let result;
- result = Promise.await(Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateExtend', room));
- result = Promise.await(Apps.getBridges().getListenerBridge().roomEvent('IPreRoomCreateModify', result));
+ throw error;
+ }));
- if (typeof result === 'object') {
- room = Object.assign(room, result);
- }
+ if (prevent) {
+ throw new Meteor.Error('error-app-prevented', 'A Rocket.Chat App prevented the room creation.');
+ }
+
+ let result;
+ result = Promise.await(Apps.triggerEvent('IPreRoomCreateExtend', room));
+ result = Promise.await(Apps.triggerEvent('IPreRoomCreateModify', result));
+
+ if (typeof result === 'object') {
+ Object.assign(room, result);
}
+ delete room._USERNAMES;
+
if (type === 'c') {
callbacks.run('beforeCreateChannel', owner, room);
}
@@ -119,11 +130,7 @@ export const createRoom = function(type, name, owner, members = [], readOnly, ex
callbacks.run('afterCreateRoom', owner, room);
});
- if (Apps && Apps.isLoaded()) {
- // This returns a promise, but it won't mutate anything about the message
- // so, we don't really care if it is successful or fails
- Apps.getBridges().getListenerBridge().roomEvent('IPostRoomCreate', room);
- }
+ Apps.triggerEvent('IPostRoomCreate', room);
return {
rid: room._id, // backwards compatible
diff --git a/app/livechat/client/views/app/livechatCurrentChats.js b/app/livechat/client/views/app/livechatCurrentChats.js
index b8493dfeab53..bb5dbd0915d4 100644
--- a/app/livechat/client/views/app/livechatCurrentChats.js
+++ b/app/livechat/client/views/app/livechatCurrentChats.js
@@ -506,8 +506,6 @@ Template.livechatCurrentChats.onCreated(async function() {
this.customFields.set(customFields);
}
});
-
- this.loadDefaultFilters();
});
Template.livechatCurrentChats.onRendered(function() {
@@ -516,4 +514,6 @@ Template.livechatCurrentChats.onRendered(function() {
todayHighlight: true,
format: moment.localeData().longDateFormat('L').toLowerCase(),
});
+
+ this.loadDefaultFilters();
});
diff --git a/app/livechat/server/lib/Helper.js b/app/livechat/server/lib/Helper.js
index 3f008a98f8e0..8a7c9ada3a25 100644
--- a/app/livechat/server/lib/Helper.js
+++ b/app/livechat/server/lib/Helper.js
@@ -1,4 +1,3 @@
-import { AppInterface } from '@rocket.chat/apps-engine/server/compiler';
import { Meteor } from 'meteor/meteor';
import { Match, check } from 'meteor/check';
import { MongoInternals } from 'meteor/mongo';
@@ -8,7 +7,7 @@ import { Livechat } from './Livechat';
import { RoutingManager } from './RoutingManager';
import { callbacks } from '../../../callbacks/server';
import { settings } from '../../../settings';
-import { Apps } from '../../../apps/server';
+import { Apps, AppEvents } from '../../../apps/server';
export const createLivechatRoom = (rid, name, guest, roomInfo = {}, extraData = {}) => {
check(rid, String);
@@ -45,7 +44,7 @@ export const createLivechatRoom = (rid, name, guest, roomInfo = {}, extraData =
const roomId = Rooms.insert(room);
- Apps.getBridges().getListenerBridge().livechatEvent(AppInterface.IPostLivechatRoomStarted, room);
+ Apps.getBridges().getListenerBridge().livechatEvent(AppEvents.IPostLivechatRoomStarted, room);
callbacks.run('livechat.newRoom', room);
return roomId;
};
@@ -167,7 +166,7 @@ export const removeAgentFromSubscription = (rid, { _id, username }) => {
Subscriptions.removeByRoomIdAndUserId(rid, _id);
Messages.createUserLeaveWithRoomIdAndUser(rid, { _id, username });
- Apps.getBridges().getListenerBridge().livechatEvent(AppInterface.IPostLivechatAgentUnassigned, { room, user });
+ Apps.getBridges().getListenerBridge().livechatEvent(AppEvents.IPostLivechatAgentUnassigned, { room, user });
};
export const parseAgentCustomFields = (customFields) => {
diff --git a/app/livechat/server/lib/Livechat.js b/app/livechat/server/lib/Livechat.js
index 9eb1c5ffdb70..b57571205fa4 100644
--- a/app/livechat/server/lib/Livechat.js
+++ b/app/livechat/server/lib/Livechat.js
@@ -1,6 +1,5 @@
import dns from 'dns';
-import { AppInterface } from '@rocket.chat/apps-engine/server/compiler';
import { Meteor } from 'meteor/meteor';
import { Match, check } from 'meteor/check';
import { Random } from 'meteor/random';
@@ -38,7 +37,7 @@ import { updateMessage } from '../../../lib/server/functions/updateMessage';
import { deleteMessage } from '../../../lib/server/functions/deleteMessage';
import { FileUpload } from '../../../file-upload/server';
import { normalizeTransferredByData, parseAgentCustomFields } from './Helper';
-import { Apps } from '../../../apps/server';
+import { Apps, AppEvents } from '../../../apps/server';
export const Livechat = {
Analytics,
@@ -372,11 +371,11 @@ export const Livechat = {
Meteor.defer(() => {
/**
- * @deprecated the `AppInterface.ILivechatRoomClosedHandler` event will be removed
+ * @deprecated the `AppEvents.ILivechatRoomClosedHandler` event will be removed
* in the next major version of the Apps-Engine
*/
- Apps.getBridges().getListenerBridge().livechatEvent(AppInterface.ILivechatRoomClosedHandler, room);
- Apps.getBridges().getListenerBridge().livechatEvent(AppInterface.IPostLivechatRoomClosed, room);
+ Apps.getBridges().getListenerBridge().livechatEvent(AppEvents.ILivechatRoomClosedHandler, room);
+ Apps.getBridges().getListenerBridge().livechatEvent(AppEvents.IPostLivechatRoomClosed, room);
callbacks.run('livechat.closeRoom', room);
});
diff --git a/app/livechat/server/lib/RoutingManager.js b/app/livechat/server/lib/RoutingManager.js
index 2f4579f29b7b..f654415af4a8 100644
--- a/app/livechat/server/lib/RoutingManager.js
+++ b/app/livechat/server/lib/RoutingManager.js
@@ -1,4 +1,3 @@
-import { AppInterface } from '@rocket.chat/apps-engine/server/compiler';
import { Meteor } from 'meteor/meteor';
import { Match, check } from 'meteor/check';
@@ -12,7 +11,7 @@ import { createLivechatSubscription,
} from './Helper';
import { callbacks } from '../../../callbacks/server';
import { LivechatRooms, Rooms, Messages, Users, LivechatInquiry } from '../../../models/server';
-import { Apps } from '../../../apps/server';
+import { Apps, AppEvents } from '../../../apps/server';
export const RoutingManager = {
methodName: null,
@@ -81,7 +80,7 @@ export const RoutingManager = {
Messages.createCommandWithRoomIdAndUser('connected', rid, user);
dispatchAgentDelegated(rid, agent.agentId);
- Apps.getBridges().getListenerBridge().livechatEvent(AppInterface.IPostLivechatAgentAssigned, { room, user });
+ Apps.getBridges().getListenerBridge().livechatEvent(AppEvents.IPostLivechatAgentAssigned, { room, user });
return inquiry;
},
diff --git a/app/models/server/models/Users.js b/app/models/server/models/Users.js
index 6b388bfa3402..c9515a3b03e7 100644
--- a/app/models/server/models/Users.js
+++ b/app/models/server/models/Users.js
@@ -523,7 +523,7 @@ export class Users extends Base {
}
findOneByEmailAddress(emailAddress, options) {
- const query = { 'emails.address': new RegExp(`^${ s.escapeRegExp(emailAddress) }$`, 'i') };
+ const query = { 'emails.address': String(emailAddress).trim().toLowerCase() };
return this.findOne(query, options);
}
diff --git a/app/reactions/client/init.js b/app/reactions/client/init.js
index 81d3c44ecb9f..81c48cb6aca0 100644
--- a/app/reactions/client/init.js
+++ b/app/reactions/client/init.js
@@ -2,6 +2,7 @@ import { Meteor } from 'meteor/meteor';
import { Blaze } from 'meteor/blaze';
import { Template } from 'meteor/templating';
+import { roomTypes } from '../../utils/client';
import { Rooms } from '../../models';
import { MessageAction } from '../../ui-utils';
import { messageArgs } from '../../ui-utils/client/lib/messageArgs';
@@ -17,13 +18,7 @@ Template.room.events({
const user = Meteor.user();
const room = Rooms.findOne({ _id: rid });
- if (room.ro && !room.reactWhenReadOnly) {
- if (!Array.isArray(room.unmuted) || room.unmuted.indexOf(user.username) === -1) {
- return false;
- }
- }
-
- if (Array.isArray(room.muted) && room.muted.indexOf(user.username) !== -1) {
+ if (roomTypes.readOnly(room._id, user._id)) {
return false;
}
@@ -73,21 +68,15 @@ Meteor.startup(function() {
return false;
}
- if (room.ro && !room.reactWhenReadOnly) {
- if (!Array.isArray(room.unmuted) || room.unmuted.indexOf(user.username) === -1) {
- return false;
- }
- }
-
- if (Array.isArray(room.muted) && room.muted.indexOf(user.username) !== -1) {
+ if (!subscription) {
return false;
}
- if (!subscription) {
+ if (message.private) {
return false;
}
- if (message.private) {
+ if (roomTypes.readOnly(room._id, user._id)) {
return false;
}
diff --git a/app/reactions/client/methods/setReaction.js b/app/reactions/client/methods/setReaction.js
index db58a8b4ea66..14ec5010f7f6 100644
--- a/app/reactions/client/methods/setReaction.js
+++ b/app/reactions/client/methods/setReaction.js
@@ -4,6 +4,7 @@ import _ from 'underscore';
import { Messages, Rooms, Subscriptions } from '../../../models';
import { callbacks } from '../../../callbacks';
import { emoji } from '../../../emoji';
+import { roomTypes } from '../../../utils/client';
Meteor.methods({
setReaction(reaction, messageId) {
@@ -16,25 +17,19 @@ Meteor.methods({
const message = Messages.findOne({ _id: messageId });
const room = Rooms.findOne({ _id: message.rid });
- if (room.ro && !room.reactWhenReadOnly) {
- if (!Array.isArray(room.unmuted) || room.unmuted.indexOf(user.username) === -1) {
- return false;
- }
- }
-
- if (Array.isArray(room.muted) && room.muted.indexOf(user.username) !== -1) {
+ if (message.private) {
return false;
}
- if (!Subscriptions.findOne({ rid: message.rid })) {
+ if (!emoji.list[reaction]) {
return false;
}
- if (message.private) {
+ if (roomTypes.readOnly(room._id, user._id)) {
return false;
}
- if (!emoji.list[reaction]) {
+ if (!Subscriptions.findOne({ rid: message.rid })) {
return false;
}
diff --git a/app/reactions/server/setReaction.js b/app/reactions/server/setReaction.js
index f9a6751e6134..52adec6d8c29 100644
--- a/app/reactions/server/setReaction.js
+++ b/app/reactions/server/setReaction.js
@@ -3,11 +3,12 @@ import { Random } from 'meteor/random';
import { TAPi18n } from 'meteor/rocketchat:tap-i18n';
import _ from 'underscore';
-import { Messages, EmojiCustom, Subscriptions, Rooms } from '../../models';
+import { Messages, EmojiCustom, Rooms } from '../../models';
import { Notifications } from '../../notifications';
import { callbacks } from '../../callbacks';
import { emoji } from '../../emoji';
import { isTheLastMessage, msgStream } from '../../lib';
+import { hasPermission } from '../../authorization/server/functions/hasPermission';
const removeUserReaction = (message, reaction, username) => {
message.reactions[reaction].usernames.splice(message.reactions[reaction].usernames.indexOf(username), 1);
@@ -17,16 +18,17 @@ const removeUserReaction = (message, reaction, username) => {
return message;
};
-export function setReaction(room, user, message, reaction, shouldReact) {
+async function setReaction(room, user, message, reaction, shouldReact) {
reaction = `:${ reaction.replace(/:/g, '') }:`;
if (!emoji.list[reaction] && EmojiCustom.findByNameOrAlias(reaction).count() === 0) {
throw new Meteor.Error('error-not-allowed', 'Invalid emoji provided.', { method: 'setReaction' });
}
- if (room.ro && !room.reactWhenReadOnly) {
- if (!Array.isArray(room.unmuted) || room.unmuted.indexOf(user.username) === -1) {
- return false;
+ if (room.ro === true && (!room.reactWhenReadOnly && !hasPermission(user._id, 'post-readonly', room._id))) {
+ // Unless the user was manually unmuted
+ if (!(room.unmuted || []).includes(user.username)) {
+ throw new Error('You can\'t send messages because the room is readonly.');
}
}
@@ -38,8 +40,6 @@ export function setReaction(room, user, message, reaction, shouldReact) {
msg: TAPi18n.__('You_have_been_muted', {}, user.language),
});
return false;
- } if (!Subscriptions.findOne({ rid: message.rid })) {
- return false;
}
const userAlreadyReacted = Boolean(message.reactions) && Boolean(message.reactions[reaction]) && message.reactions[reaction].usernames.indexOf(user.username) !== -1;
@@ -92,18 +92,18 @@ Meteor.methods({
setReaction(reaction, messageId, shouldReact) {
const user = Meteor.user();
- const message = Messages.findOneById(messageId);
-
- const room = Meteor.call('canAccessRoom', message.rid, Meteor.userId());
-
if (!user) {
throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'setReaction' });
}
+ const message = Messages.findOneById(messageId);
+
if (!message) {
throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'setReaction' });
}
+ const room = Meteor.call('canAccessRoom', message.rid, Meteor.userId());
+
if (!room) {
throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'setReaction' });
}
diff --git a/app/ui-flextab/client/tabs/inviteUsers.js b/app/ui-flextab/client/tabs/inviteUsers.js
index 784a5757ab27..e8e0783f068b 100644
--- a/app/ui-flextab/client/tabs/inviteUsers.js
+++ b/app/ui-flextab/client/tabs/inviteUsers.js
@@ -7,7 +7,7 @@ import { Deps } from 'meteor/deps';
import toastr from 'toastr';
import { settings } from '../../../settings';
-import { t } from '../../../utils';
+import { t, handleError } from '../../../utils/client';
import { AutoComplete } from '../../../meteor-autocomplete/client';
const acEvents = {
@@ -106,7 +106,7 @@ Template.inviteUsers.events({
users,
}, function(err) {
if (err) {
- return toastr.error(err);
+ return handleError(err);
}
toastr.success(t('Users_added'));
instance.selectedUsers.set([]);
diff --git a/app/ui-message/client/blocks/index.js b/app/ui-message/client/blocks/index.js
index 5e332705c1d4..d081ff82163b 100644
--- a/app/ui-message/client/blocks/index.js
+++ b/app/ui-message/client/blocks/index.js
@@ -1,4 +1,10 @@
+import { HTML } from 'meteor/htmljs';
+
import { createTemplateForComponent } from '../../../../client/reactAdapters';
-createTemplateForComponent('ModalBlock', () => import('./ModalBlock'));
+createTemplateForComponent('ModalBlock', () => import('./ModalBlock'), {
+ // eslint-disable-next-line new-cap
+ renderContainerView: () => HTML.DIV({ class: 'rc-multiselect', style: 'display: flex; width:100%;' }),
+});
+
createTemplateForComponent('Blocks', () => import('./MessageBlock'));
diff --git a/app/ui-message/client/message.html b/app/ui-message/client/message.html
index d2e0bef5ceb9..5269bcc5711e 100644
--- a/app/ui-message/client/message.html
+++ b/app/ui-message/client/message.html
@@ -176,11 +176,9 @@
{{/unless}}
{{#if broadcast}}
- {{#with msg.u}}
-
- {{/with}}
+
{{/if}}
{{#unless hideReactions}}
diff --git a/app/utils/client/lib/handleError.js b/app/utils/client/lib/handleError.js
index 92117a95e216..d8707380109c 100644
--- a/app/utils/client/lib/handleError.js
+++ b/app/utils/client/lib/handleError.js
@@ -22,7 +22,7 @@ export const handleError = function(error, useToastr = true) {
}
const details = Object.entries(error.details || {})
.reduce((obj, [key, value]) => ({ ...obj, [key]: s.escapeHTML(value) }), {});
- const message = TAPi18n.__(error.error || error.message, details);
+ const message = TAPi18n.__(error.message || error.error, details);
const title = details.errorTitle && TAPi18n.__(details.errorTitle);
return toastr.error(message, title);
diff --git a/client/admin/integrations/edit/EditIncomingWebhook.js b/client/admin/integrations/edit/EditIncomingWebhook.js
index 2a6363d9f224..7fa24155c299 100644
--- a/client/admin/integrations/edit/EditIncomingWebhook.js
+++ b/client/admin/integrations/edit/EditIncomingWebhook.js
@@ -1,5 +1,5 @@
import React, { useMemo, useState } from 'react';
-import { Field, Box, Headline, Skeleton, Margins, Button } from '@rocket.chat/fuselage';
+import { Field, Box, Skeleton, Margins, Button } from '@rocket.chat/fuselage';
import { SuccessModal, DeleteWarningModal } from './EditIntegrationsPage';
import { useTranslation } from '../../../contexts/TranslationContext';
@@ -21,11 +21,11 @@ export default function EditIncomingWebhookWithData({ integrationId, ...props })
if (state === ENDPOINT_STATES.LOADING) {
return
-
+
-
+
-
+ ;
}
diff --git a/client/admin/integrations/edit/EditOutgoingWebhook.js b/client/admin/integrations/edit/EditOutgoingWebhook.js
index 7c20820b2a82..ea03cd5fdeab 100644
--- a/client/admin/integrations/edit/EditOutgoingWebhook.js
+++ b/client/admin/integrations/edit/EditOutgoingWebhook.js
@@ -2,7 +2,6 @@ import React, { useMemo, useState } from 'react';
import {
Field,
Box,
- Headline,
Skeleton,
Margins,
Button,
@@ -28,11 +27,11 @@ export default function EditOutgoingWebhookWithData({ integrationId, ...props })
if (state === ENDPOINT_STATES.LOADING) {
return
-
+
-
+
-
+ ;
}
diff --git a/client/admin/integrations/edit/OutgoingWebhookHistoryPage.js b/client/admin/integrations/edit/OutgoingWebhookHistoryPage.js
index e931ade0b90d..63752ce098d8 100644
--- a/client/admin/integrations/edit/OutgoingWebhookHistoryPage.js
+++ b/client/admin/integrations/edit/OutgoingWebhookHistoryPage.js
@@ -1,4 +1,4 @@
-import { Button, ButtonGroup, Icon, Headline, Skeleton, Box, Accordion, Field, FieldGroup, Pagination } from '@rocket.chat/fuselage';
+import { Button, ButtonGroup, Icon, Skeleton, Box, Accordion, Field, FieldGroup, Pagination } from '@rocket.chat/fuselage';
import React, { useMemo, useCallback, useState, useEffect } from 'react';
import Page from '../../../components/basic/Page';
@@ -174,11 +174,11 @@ function HistoryContent({ data, state, onChange, ...props }) {
if (!loadedData || state === ENDPOINT_STATES.LOADING) {
return
-
+
-
+
-
+ ;
}
diff --git a/client/admin/rooms/edit/EditRoom.js b/client/admin/rooms/edit/EditRoom.js
deleted file mode 100644
index 3ba4b679a911..000000000000
--- a/client/admin/rooms/edit/EditRoom.js
+++ /dev/null
@@ -1,194 +0,0 @@
-import React, { useCallback, useState, useMemo } from 'react';
-import { Box, Headline, Button, Margins, TextInput, Skeleton, Field, ToggleSwitch, Divider, Icon, Callout } from '@rocket.chat/fuselage';
-
-import { useTranslation } from '../../../contexts/TranslationContext';
-import { useEndpointDataExperimental, ENDPOINT_STATES } from '../../../hooks/useEndpointDataExperimental';
-import { roomTypes } from '../../../../app/utils/client';
-import { useMethod } from '../../../contexts/ServerContext';
-import { usePermission } from '../../../contexts/AuthorizationContext';
-import NotAuthorizedPage from '../../NotAuthorizedPage';
-import { useEndpointAction } from '../../../hooks/useEndpointAction';
-import Page from '../../../components/basic/Page';
-
-export function EditRoomContextBar({ rid }) {
- const canViewRoomAdministration = usePermission('view-room-administration');
- return canViewRoomAdministration ? : ;
-}
-
-function EditRoomWithData({ rid }) {
- const [cache, setState] = useState();
-
- const { data = {}, state, error } = useEndpointDataExperimental('rooms.adminRooms.getRoom', useMemo(() => ({ rid }), [rid, cache]));
-
- if (state === ENDPOINT_STATES.LOADING) {
- return
-
-
-
-
-
-
- ;
- }
-
- if (state === ENDPOINT_STATES.ERROR) {
- return error.message;
- }
-
- return setState(new Date())}/>;
-}
-
-function EditRoom({ room, onChange }) {
- const t = useTranslation();
-
- const [deleted, setDeleted] = useState(false);
- const [newData, setNewData] = useState({});
- const [changeArchivation, setChangeArchivation] = useState(false);
-
- const canDelete = usePermission(`delete-${ room.t }`);
-
- const hasUnsavedChanges = useMemo(() => Object.values(newData).filter((current) => current === null).length < Object.keys(newData).length, [JSON.stringify(newData)]);
- const saveQuery = useMemo(() => ({ rid: room._id, ...Object.fromEntries(Object.entries(newData).filter(([, value]) => value !== null)) }), [room._id, JSON.stringify(newData)]);
-
- const archiveSelector = room.archived ? 'unarchive' : 'archive';
- const archiveMessage = archiveSelector === 'archive' ? 'Room_has_been_archived' : 'Room_has_been_archived';
- const archiveQuery = useMemo(() => ({ rid: room._id, action: room.archived ? 'unarchive' : 'archive' }), [room.rid, changeArchivation]);
-
- const saveAction = useEndpointAction('POST', 'rooms.saveRoomSettings', saveQuery, t('Room_updated_successfully'));
- const archiveAction = useEndpointAction('POST', 'rooms.changeArchivationState', archiveQuery, t(archiveMessage));
-
- const updateType = (type) => () => (type === 'p' ? 'c' : 'p');
- const areEqual = (a, b) => a === b || !(a || b);
-
- const handleChange = (field, currentValue, getValue = (e) => e.currentTarget.value) => (e) => setNewData({ ...newData, [field]: areEqual(getValue(e), currentValue) ? null : getValue(e) });
- const handleSave = async () => {
- await Promise.all([hasUnsavedChanges && saveAction(), changeArchivation && archiveAction()].filter(Boolean));
- onChange('update');
- };
-
- const deleteRoom = useMethod('eraseRoom');
-
- const handleDelete = useCallback(async () => {
- await deleteRoom(room._id);
- setDeleted(true);
- }, [room]);
-
- const roomName = room.t === 'd' ? room.usernames.join(' x ') : roomTypes.getRoomName(room.t, { type: room.t, ...room });
- const roomType = newData.roomType ?? room.t;
- const readOnly = newData.readOnly ?? !!room.ro;
- const isArchived = changeArchivation ? !room.archived : !!room.archived;
- const isDefault = newData.default ?? !!room.default;
- const isFavorite = newData.favorite ?? !!room.favorite;
- const isFeatured = newData.featured ?? !!room.featured;
-
- return e.preventDefault(), [])}>
-
-
- {deleted && }
-
-
- {t('Name')}
-
-
-
-
- { room.t !== 'd' && <>
-
- {t('Owner')}
-
- {room.u?.username}
-
-
-
- {t('Topic')}
-
-
-
-
-
-
-
-
- {t('Public')}
- {t('All_users_in_the_channel_can_write_new_messages')}
-
-
-
-
-
- {t('Private')}
- {t('Just_invited_people_can_access_this_channel')}
-
-
-
-
-
-
-
-
-
- {t('Collaborative')}
- {t('All_users_in_the_channel_can_write_new_messages')}
-
-
- !readOnly)}/>
-
-
- {t('Read_only')}
- {t('Only_authorized_users_can_write_new_messages')}
-
-
-
-
-
-
-
-
- {t('Archived')}
- setChangeArchivation(!changeArchivation)}/>
-
-
-
-
-
-
- {t('Default')}
- !isDefault)}/>
-
-
-
-
-
-
- {t('Favorite')}
- !isFavorite)}/>
-
-
-
-
-
-
- {t('Featured')}
- !isFeatured)}/>
-
-
-
-
-
-
-
-
-
-
-
-
-
- >}
-
-
-
-
-
-
- ;
-}
diff --git a/client/admin/users/AddUser.js b/client/admin/users/AddUser.js
index 3b1076655daf..6547c9d8e00a 100644
--- a/client/admin/users/AddUser.js
+++ b/client/admin/users/AddUser.js
@@ -1,147 +1,68 @@
-import React, { useMemo, useState, useCallback } from 'react';
-import { Field, TextInput, Box, ToggleSwitch, Icon, TextAreaInput, MultiSelectFiltered, Margins, Button } from '@rocket.chat/fuselage';
+import React, { useMemo, useCallback } from 'react';
+import { Field, Box, Button } from '@rocket.chat/fuselage';
import { useTranslation } from '../../contexts/TranslationContext';
import { useEndpointData } from '../../hooks/useEndpointData';
import { useEndpointAction } from '../../hooks/useEndpointAction';
-import { isEmail } from '../../../app/utils/lib/isEmail.js';
import { useRoute } from '../../contexts/RouterContext';
-import VerticalBar from '../../components/basic/VerticalBar';
+import { useForm } from '../../hooks/useForm';
+import UserForm from './UserForm';
export function AddUser({ roles, ...props }) {
const t = useTranslation();
- const [newData, setNewData] = useState({});
-
const router = useRoute('admin-users');
const roleData = useEndpointData('roles.list', '') || {};
+ const {
+ values,
+ handlers,
+ reset,
+ hasUnsavedChanges,
+ } = useForm({
+ roles: [],
+ name: '',
+ username: '',
+ statusText: '',
+ bio: '',
+ email: '',
+ password: '',
+ verified: false,
+ requirePasswordChange: false,
+ setRandomPassword: false,
+ sendWelcomeEmail: true,
+ joinDefaultChannels: true,
+ customFields: {},
+ });
+
const goToUser = (id) => router.push({
context: 'info',
id,
});
- const saveQuery = useMemo(() => ({
- ...Object.fromEntries(Object.entries(newData).filter(([, value]) => value !== null)),
- }), [JSON.stringify(newData)]);
+ const saveQuery = useMemo(() => values, [JSON.stringify(values)]);
const saveAction = useEndpointAction('POST', 'users.create', saveQuery, t('User_created_successfully'));
- const handleSave = async () => {
- if (Object.keys(newData).length) {
- const result = await saveAction();
- if (result.success) {
- goToUser(result.user._id);
- }
+ const handleSave = useCallback(async () => {
+ const result = await saveAction();
+ if (result.success) {
+ goToUser(result.user._id);
}
- };
-
- const handleChange = (field, getValue = (e) => e.currentTarget.value) => (e) => setNewData({ ...newData, [field]: getValue(e) });
+ }, [saveAction]);
- const {
- roles: selectedRoles = [],
- name = '',
- username = '',
- statusText = '',
- bio = '',
- email = '',
- password = '',
- verified = false,
- requirePasswordChange = false,
- setRandomPassword = false,
- sendWelcomeEmail = true,
- joinDefaultChannels = true,
- } = newData;
+ const availableRoles = useMemo(() => (roleData && roleData.roles ? roleData.roles.map(({ _id, description }) => [_id, description || _id]) : []), [JSON.stringify(roleData)]);
- const availableRoles = roleData && roleData.roles ? roleData.roles.map(({ _id, description }) => [_id, description || _id]) : [];
+ const append = useMemo(() =>
+
+
+
+
+
+
+ , [reset, handleSave]);
- return e.preventDefault(), [])} { ...props }>
-
- {t('Name')}
-
-
-
-
-
- {t('Username')}
-
- }/>
-
-
-
- {t('Email')}
-
- 0 ? 'error' : undefined} onChange={handleChange('email')} addon={}/>
-
-
-
- {t('Verified')} !verified)} />
-
-
-
-
- {t('StatusMessage')}
-
- }/>
-
-
-
- {t('Bio')}
-
- }/>
-
-
-
- {t('Password')}
-
- }/>
-
-
-
-
-
- {t('Require_password_change')} !requirePasswordChange)} />
-
-
-
-
-
-
- {t('Set_random_password_and_send_by_email')} !setRandomPassword)} />
-
-
-
-
- {t('Roles')}
-
- value)} placeholder={t('Select_role')} />
-
-
-
-
-
- {t('Join_default_channels')} !joinDefaultChannels)} />
-
-
-
-
-
-
- {t('Send_welcome_email')} !sendWelcomeEmail)} />
-
-
-
-
-
-
-
-
-
-
-
-
-
- ;
+ return ;
}
diff --git a/client/admin/users/CustomFieldsForm.js b/client/admin/users/CustomFieldsForm.js
new file mode 100644
index 000000000000..e6ee3074fa5b
--- /dev/null
+++ b/client/admin/users/CustomFieldsForm.js
@@ -0,0 +1,80 @@
+import React, { useMemo, useEffect } from 'react';
+import { TextInput, Select, Field, Divider, Box } from '@rocket.chat/fuselage';
+
+import { useSetting } from '../../contexts/SettingsContext';
+import { useForm } from '../../hooks/useForm';
+import { useTranslation } from '../../contexts/TranslationContext';
+import { capitalize } from '../../helpers/capitalize';
+
+const CustomTextInput = (props) => {
+ const t = useTranslation();
+ const { name, required, minLength, maxLength, setState, state } = props;
+ const verify = useMemo(() => {
+ const error = [];
+ if (!state && required) { error.push(t('Field_required')); }
+ if (state.length < minLength) { error.push(t('Min_length_is', minLength)); }
+ return error.join(', ');
+ }, [required, minLength, maxLength, state]);
+
+ return useMemo(() =>
+ {name}
+
+ setState(e.currentTarget.value)}/>
+
+ {verify}
+ , [name, verify, state, required]);
+};
+
+const CustomSelect = (props) => {
+ const t = useTranslation();
+ const { name, required, options, setState, state } = props;
+ const mappedOptions = useMemo(() => Object.values(options).map((value) => [value, value]), [...options]);
+ const verify = useMemo(() => (!state.length && required ? t('Field_required') : ''), [required, state]);
+
+ return useMemo(() =>
+ {name}
+
+
+ {verify}
+ , [name, verify, state, required, JSON.stringify(mappedOptions)]);
+};
+
+const CustomFieldsAssembler = ({ formValues, formHandlers, customFields, ...props }) => Object.entries(customFields).map(([key, value]) => {
+ const extraProps = {
+ key,
+ name: key,
+ setState: formHandlers[`handle${ capitalize(key) }`],
+ state: formValues[key],
+ ...value,
+ };
+ return value.type === 'text'
+ ?
+ : ;
+});
+
+export default function CustomFieldsForm({ customFieldsData, setCustomFieldsData, ...props }) {
+ const t = useTranslation();
+
+ const customFieldsJson = useSetting('Accounts_CustomFields');
+
+ const customFields = useMemo(() => JSON.parse(customFieldsJson || '{}'), []);
+
+ if (!Object.values(customFields).length) {
+ return null;
+ }
+
+ const defaultFields = useMemo(() => Object.entries(customFields).reduce((data, [key, value]) => { data[key] = value.defaultValue ?? ''; return data; }, {}), []);
+
+ const { values, handlers } = useForm({ ...defaultFields, ...customFieldsData });
+
+ useEffect(() => {
+ setCustomFieldsData(values);
+ }, [JSON.stringify(values)]);
+
+ return <>
+
+ {t('Custom_Fields')}
+
+ >;
+}
diff --git a/client/admin/users/EditUser.js b/client/admin/users/EditUser.js
index 055b61576116..14e8e699d6ac 100644
--- a/client/admin/users/EditUser.js
+++ b/client/admin/users/EditUser.js
@@ -1,45 +1,52 @@
import React, { useMemo, useState, useCallback } from 'react';
-import { Field, TextInput, Box, Skeleton, ToggleSwitch, Icon, TextAreaInput, MultiSelectFiltered, Margins, Button } from '@rocket.chat/fuselage';
+import { Box, Field, Margins, Button } from '@rocket.chat/fuselage';
import { useTranslation } from '../../contexts/TranslationContext';
-import { useEndpointData } from '../../hooks/useEndpointData';
import { useEndpointDataExperimental, ENDPOINT_STATES } from '../../hooks/useEndpointDataExperimental';
import { useEndpointAction } from '../../hooks/useEndpointAction';
import { useEndpointUpload } from '../../hooks/useEndpointUpload';
-import { isEmail } from '../../../app/utils/lib/isEmail.js';
import { useRoute } from '../../contexts/RouterContext';
import UserAvatarEditor from '../../components/basic/avatar/UserAvatarEditor';
-import VerticalBar from '../../components/basic/VerticalBar';
+import { useForm } from '../../hooks/useForm';
+import UserForm from './UserForm';
+import { FormSkeleton } from './Skeleton';
-export function EditUserWithData({ userId, ...props }) {
+export function EditUserWithData({ uid, ...props }) {
const t = useTranslation();
- const roleData = useEndpointData('roles.list', '') || {};
- const { data, state, error } = useEndpointDataExperimental('users.info', useMemo(() => ({ userId }), [userId]));
-
- if (state === ENDPOINT_STATES.LOADING) {
- return
-
-
-
-
-
-
- ;
+ const { data: roleData, state: roleState, error: roleError } = useEndpointDataExperimental('roles.list', '') || {};
+ const { data, state, error } = useEndpointDataExperimental('users.info', useMemo(() => ({ userId: uid }), [uid]));
+
+ if ([state, roleState].includes(ENDPOINT_STATES.LOADING)) {
+ return ;
}
- if (error) {
+ if (error || roleError) {
return {t('User_not_found')};
}
return ;
}
+const getInitialValue = (data) => ({
+ roles: data.roles,
+ name: data.name ?? '',
+ password: '',
+ username: data.username,
+ status: data.status,
+ bio: data.bio ?? '',
+ email: (data.emails && data.emails[0].address) || '',
+ verified: (data.emails && data.emails[0].verified) || false,
+ setRandomPassword: false,
+ requirePasswordChange: data.setRandomPassword || false,
+ customFields: data.customFields ?? {},
+});
+
export function EditUser({ data, roles, ...props }) {
const t = useTranslation();
- const [newData, setNewData] = useState({});
const [avatarObj, setAvatarObj] = useState();
- const hasUnsavedChanges = useMemo(() => Object.values(newData).filter((current) => current === null).length < Object.keys(newData).length, [JSON.stringify(newData)]) || avatarObj;
+
+ const { values, handlers, reset, hasUnsavedChanges } = useForm(getInitialValue(data));
const router = useRoute('admin-users');
@@ -50,8 +57,8 @@ export function EditUser({ data, roles, ...props }) {
const saveQuery = useMemo(() => ({
userId: data._id,
- data: Object.fromEntries(Object.entries(newData).filter(([, value]) => value !== null)),
- }), [data._id, JSON.stringify(newData)]);
+ data: values,
+ }), [data._id, JSON.stringify(values)]);
const saveAvatarQuery = useMemo(() => ({
userId: data._id,
@@ -77,113 +84,30 @@ export function EditUser({ data, roles, ...props }) {
return saveAvatarAction(avatarObj);
};
- const handleSave = async () => {
- if (hasUnsavedChanges) {
- const result = await saveAction();
- if (result.success) {
- if (avatarObj) {
- await updateAvatar();
- }
- goToUser(data._id);
+ const handleSave = useCallback(async () => {
+ const result = await saveAction();
+ if (result.success) {
+ if (avatarObj) {
+ await updateAvatar();
}
+ goToUser(data._id);
}
- };
+ }, [saveAction, updateAvatar]);
- const rolesAreEqual = (a, b) => {
- if (a.length !== b.length) { return false; }
- const result = a.reduce((acc, aValue) => {
- const onlyOneMatches = b.reduce((acc, bValue) => (aValue === bValue ? acc + 1 : acc + 0), 0) === 1;
- return onlyOneMatches ? acc + 1 : acc + 0;
- }, 0);
- return result === a.length;
- };
+ const availableRoles = roles.map(({ _id, description }) => [_id, description || _id]);
- const testEqual = (a, b) => a === b || !(a || b);
- const handleChange = (field, currentValue, getValue = (e) => e.currentTarget.value, areEqual = testEqual) => (e) => setNewData({ ...newData, [field]: areEqual(getValue(e), currentValue) ? null : getValue(e) });
+ const prepend = useMemo(() => , []);
- const availableRoles = roles.map(({ _id, description }) => [_id, description || _id]);
- const selectedRoles = newData.roles ?? data.roles;
- const name = newData.name ?? data.name ?? '';
- const username = newData.username ?? data.username;
- const status = newData.status ?? data.status;
- const bio = newData.bio ?? data.bio ?? '';
- const email = newData.email ?? (data.emails && data.emails[0].address);
- const emailVerified = newData.verified ?? (data.emails && data.emails[0].verified);
- const setRandomPassword = newData.setRandomPassword || false;
- const requirePasswordChange = setRandomPassword || newData.requirePasswordChange || false;
-
- return e.preventDefault(), [])} qa-admin-user-edit='form' { ...props }>
-
-
- {t('Name')}
-
-
-
-
-
- {t('Username')}
-
- }/>
-
-
-
- {t('Email')}
-
- }/>
-
-
-
- {t('Verified')} !emailVerified)} />
-
-
-
-
- {t('StatusMessage')}
-
- }/>
-
-
-
- {t('Bio')}
-
- }/>
-
-
-
- {t('Password')}
-
- }/>
-
-
-
-
-
- {t('Require_password_change')} !requirePasswordChange)} />
-
-
-
-
-
-
- {t('Set_random_password_and_send_by_email')} !setRandomPassword)} />
-
-
-
-
- {t('Roles')}
-
- value, rolesAreEqual)} placeholder={t('Select_role')} />
-
-
-
-
-
-
-
-
-
-
-
-
- ;
+ const append = useMemo(() =>
+
+
+
+
+
+
+
+
+ , [handleSave, reset]);
+
+ return ;
}
diff --git a/client/admin/users/Skeleton.js b/client/admin/users/Skeleton.js
new file mode 100644
index 000000000000..2fc5e9097c14
--- /dev/null
+++ b/client/admin/users/Skeleton.js
@@ -0,0 +1,11 @@
+import React from 'react';
+import { Box, Skeleton } from '@rocket.chat/fuselage';
+
+export const FormSkeleton = (props) =>
+
+
+
+
+
+
+;
diff --git a/client/admin/users/UserForm.js b/client/admin/users/UserForm.js
new file mode 100644
index 000000000000..048074c7fe00
--- /dev/null
+++ b/client/admin/users/UserForm.js
@@ -0,0 +1,125 @@
+import React, { useCallback, useMemo } from 'react';
+import { Field, TextInput, TextAreaInput, MultiSelectFiltered, Box, ToggleSwitch, Icon } from '@rocket.chat/fuselage';
+
+import { useTranslation } from '../../contexts/TranslationContext';
+import { isEmail } from '../../../app/utils/lib/isEmail.js';
+import VerticalBar from '../../components/basic/VerticalBar';
+import CustomFieldsForm from './CustomFieldsForm';
+
+
+export default function UserForm({ formValues, formHandlers, availableRoles, append, prepend, ...props }) {
+ const t = useTranslation();
+
+ const {
+ name,
+ username,
+ email,
+ verified,
+ statusText,
+ bio,
+ password,
+ setRandomPassword,
+ requirePasswordChange,
+ roles,
+ customFields,
+ joinDefaultChannels,
+ sendWelcomeEmail,
+ } = formValues;
+
+ const {
+ handleName,
+ handleUsername,
+ handleEmail,
+ handleVerified,
+ handleStatusText,
+ handleBio,
+ handlePassword,
+ handleSetRandomPassword,
+ handleRequirePasswordChange,
+ handleRoles,
+ handleCustomFields,
+ handleJoinDefaultChannels,
+ handleSendWelcomeEmail,
+ } = formHandlers;
+
+ return e.preventDefault(), [])} { ...props }>
+ { prepend }
+ {useMemo(() =>
+ {t('Name')}
+
+
+
+ , [name, handleName])}
+ {useMemo(() =>
+ {t('Username')}
+
+ }/>
+
+ , [username, handleUsername])}
+ {useMemo(() =>
+ {t('Email')}
+
+ 0 ? 'error' : undefined} onChange={handleEmail} addon={}/>
+
+
+
+ {t('Verified')}
+
+
+ , [email, handleEmail, verified, handleVerified])}
+ {useMemo(() =>
+ {t('StatusMessage')}
+
+ }/>
+
+ , [statusText, handleStatusText])}
+ {useMemo(() =>
+ {t('Bio')}
+
+ }/>
+
+ , [bio, handleBio])}
+ {useMemo(() =>
+ {t('Password')}
+
+ }/>
+
+ , [password, handlePassword])}
+ {useMemo(() =>
+
+
+ {t('Require_password_change')}
+
+
+ , [requirePasswordChange, handleRequirePasswordChange])}
+ {useMemo(() =>
+
+
+ {t('Set_random_password_and_send_by_email')}
+
+
+ , [setRandomPassword, handleSetRandomPassword])}
+ {useMemo(() =>
+ {t('Roles')}
+
+
+
+ , [...roles, handleRoles, JSON.stringify(availableRoles)])}
+ {useMemo(() => handleJoinDefaultChannels &&
+
+
+ {t('Join_default_channels')}
+
+
+ , [joinDefaultChannels, handleJoinDefaultChannels])}
+ {useMemo(() => handleSendWelcomeEmail &&
+
+
+ {t('Send_welcome_email')}
+
+
+ , [sendWelcomeEmail, handleSendWelcomeEmail])}
+
+ { append }
+ ;
+}
diff --git a/client/admin/users/UserInfo.js b/client/admin/users/UserInfo.js
index bc1dd867be2c..32d570b18634 100644
--- a/client/admin/users/UserInfo.js
+++ b/client/admin/users/UserInfo.js
@@ -1,5 +1,5 @@
import React, { useMemo, useState, useEffect, useCallback } from 'react';
-import { Box, Avatar, Margins, Skeleton, Chip, Tag } from '@rocket.chat/fuselage';
+import { Box, Avatar, Margins, Chip, Tag } from '@rocket.chat/fuselage';
import moment from 'moment';
import { useEndpointDataExperimental, ENDPOINT_STATES } from '../../hooks/useEndpointDataExperimental';
@@ -9,6 +9,7 @@ import { DateFormat } from '../../../app/lib';
import { UserInfoActions } from './UserInfoActions';
import MarkdownText from '../../components/basic/MarkdownText';
import VerticalBar from '../../components/basic/VerticalBar';
+import { FormSkeleton } from './Skeleton';
const useTimezoneClock = (utcOffset = 0, updateInterval) => {
const [time, setTime] = useState();
@@ -28,23 +29,16 @@ const UTCClock = ({ utcOffset, ...props }) => {
return {time} UTC {utcOffset};
};
-export function UserInfoWithData({ userId, ...props }) {
+export function UserInfoWithData({ uid, ...props }) {
const t = useTranslation();
const [cache, setCache] = useState();
const onChange = () => setCache(new Date());
- const { data, state, error } = useEndpointDataExperimental('users.info', useMemo(() => ({ userId }), [userId, cache]));
+ const { data, state, error } = useEndpointDataExperimental('users.info', useMemo(() => ({ userId: uid }), [uid, cache]));
if (state === ENDPOINT_STATES.LOADING) {
- return
-
-
-
-
-
-
- ;
+ return ;
}
if (error) {
@@ -65,17 +59,17 @@ export function UserInfo({ data, onChange, ...props }) {
const avatarUrl = roomTypes.getConfig('d').getAvatarPath({ name: data.username || data.name, type: 'd', _id: data._id });
return e.preventDefault(), [])} {...props}>
-
-
+
+
- {data.name || data.username}
- {!!data.name && @{data.username}}
- {data.status}
+ {data.name || data.username}
+ {!!data.name && @{data.username}}
+ {data.status}
-
+
{data.bio && data.bio.trim().length > 0 && {data.bio}}
{!!data.roles.length && <>
@@ -89,7 +83,7 @@ export function UserInfo({ data, onChange, ...props }) {
{data.emails && <> {t('Email')}
- {data.emails[0].address}
+ {data.emails[0].address}
{data.emails[0].verified && {t('Verified')}}
{data.emails[0].verified || {t('Not_verified')}}
diff --git a/client/admin/users/UsersPage.js b/client/admin/users/UsersPage.js
index f9060964b630..02904be6dc2a 100644
--- a/client/admin/users/UsersPage.js
+++ b/client/admin/users/UsersPage.js
@@ -56,8 +56,8 @@ function UsersPage() {
- {context === 'info' && }
- {context === 'edit' && }
+ {context === 'info' && }
+ {context === 'edit' && }
{context === 'new' && }
{context === 'invite' && }
diff --git a/client/components/basic/VerticalBar.js b/client/components/basic/VerticalBar.js
index 52e0dae7677b..f9ce374bcd9a 100644
--- a/client/components/basic/VerticalBar.js
+++ b/client/components/basic/VerticalBar.js
@@ -10,6 +10,7 @@ function VerticalBar({ children, ...props }) {
return
{children}
diff --git a/client/helpers/capitalize.js b/client/helpers/capitalize.js
new file mode 100644
index 000000000000..e709a37503bf
--- /dev/null
+++ b/client/helpers/capitalize.js
@@ -0,0 +1,4 @@
+export const capitalize = (s) => {
+ if (typeof s !== 'string') { return ''; }
+ return s.charAt(0).toUpperCase() + s.slice(1);
+};
diff --git a/client/hooks/useEndpointDataExperimental.js b/client/hooks/useEndpointDataExperimental.js
index 5e3e16361cfa..dd284a7a6c84 100644
--- a/client/hooks/useEndpointDataExperimental.js
+++ b/client/hooks/useEndpointDataExperimental.js
@@ -5,14 +5,13 @@ import { useToastMessageDispatch } from '../contexts/ToastMessagesContext';
export const ENDPOINT_STATES = {
LOADING: 'LOADING',
- DELAYING: 'DELAYING',
DONE: 'DONE',
ERROR: 'ERROR',
};
const defaultState = { data: null, state: ENDPOINT_STATES.LOADING };
-export const useEndpointDataExperimental = (endpoint, params = {}) => {
+export const useEndpointDataExperimental = (endpoint, params = {}, { delayTimeout = 1000 } = {}) => {
const [data, setData] = useState(defaultState);
const getData = useEndpoint('GET', endpoint);
@@ -27,8 +26,8 @@ export const useEndpointDataExperimental = (endpoint, params = {}) => {
return;
}
- setData({ state: ENDPOINT_STATES.DELAYING });
- }, 1000);
+ setData({ delaying: true, state: ENDPOINT_STATES.LOADING });
+ }, delayTimeout);
try {
setData(defaultState);
diff --git a/client/hooks/useForm.js b/client/hooks/useForm.js
index 2d7f213b21a0..90d967d93fcc 100644
--- a/client/hooks/useForm.js
+++ b/client/hooks/useForm.js
@@ -1,20 +1,19 @@
import { useState, useCallback } from 'react';
-const getValue = (e) => (e.currentTarget ? e.currentTarget.value : e);
+import { capitalize } from '../helpers/capitalize';
-const capitalize = (s) => {
- if (typeof s !== 'string') { return ''; }
- return s.charAt(0).toUpperCase() + s.slice(1);
-};
+const getValue = (e) => (e.currentTarget ? e.currentTarget.value : e);
export const useForm = (obj) => {
const resetCallbacks = [];
+ const hasUnsavedChanges = [];
const ret = Object.keys(obj).sort().reduce((ret, key) => {
const value = obj[key];
const [data, setData] = useState(value);
ret.values = { ...ret.values, [key]: data };
ret.handlers = { ...ret.handlers, [`handle${ capitalize(key) }`]: useCallback(typeof value !== 'boolean' ? (e) => setData(getValue(e)) : () => setData(!data), [data]) };
+ hasUnsavedChanges.push(JSON.stringify(value) !== JSON.stringify(data));
resetCallbacks.push(() => setData(value));
return ret;
@@ -24,5 +23,7 @@ export const useForm = (obj) => {
resetCallbacks.forEach((reset) => reset());
};
+ ret.hasUnsavedChanges = hasUnsavedChanges.filter(Boolean).length > 0;
+
return ret;
};
diff --git a/ee/app/livechat-enterprise/server/lib/Helper.js b/ee/app/livechat-enterprise/server/lib/Helper.js
index 00964271e230..d3c525e85066 100644
--- a/ee/app/livechat-enterprise/server/lib/Helper.js
+++ b/ee/app/livechat-enterprise/server/lib/Helper.js
@@ -128,7 +128,7 @@ export const checkWaitingQueue = async (department) => {
return processWaitingQueue();
}
- return Promise.all(departments.forEach((department) => processWaitingQueue(department)));
+ return Promise.all(departments.map(async (department) => processWaitingQueue(department)));
};
export const allowAgentSkipQueue = (agent) => {
diff --git a/ee/i18n/ca.i18n.json b/ee/i18n/ca.i18n.json
index 6f31cf5a2e62..f1c1349afaa4 100644
--- a/ee/i18n/ca.i18n.json
+++ b/ee/i18n/ca.i18n.json
@@ -1 +1,67 @@
-{ }
\ No newline at end of file
+{
+ "error-canned-response-not-found": "No s'ha trobat la resposta de conserva",
+ "error-forwarding-department-target-not-allowed": "El reenviament al departament objectiu no està permès.",
+ "error-guests-cant-have-other-roles": "Els usuaris convidats no poden tenir cap altre paper.",
+ "error-invalid-priority": "Prioritat no vàlida",
+ "error-max-guests-number-reached": "Heu arribat al nombre màxim d’usuaris convidats que permet la vostra llicència. Poseu-vos en contacte amb venda@rocket.chat per obtenir una nova llicència.",
+ "error-max-number-simultaneous-chats-reached": "S'ha arribat al nombre màxim de xats simultanis per agent.",
+ "Add_monitor": "Afegir monitor",
+ "Available_departments": "Departaments disponibles",
+ "Canned Responses": "Respostes enllaunades",
+ "Canned_Response_Removed": "S'ha eliminat la resposta enllaçada",
+ "Canned_Responses_Enable": "Activa les respostes enllaçades",
+ "Closed_automatically": "Tancat automàticament pel sistema",
+ "Edit_Tag": "Edita l’etiqueta",
+ "Edit_Unit": "Edita la unitat",
+ "Edit_Priority": "Edita la prioritat",
+ "Enable_omnichannel_auto_close_abandoned_rooms": "Habilita el tancament automàtic d’habitacions abandonades pel visitant",
+ "Enter_a_custom_message": "Introduïu un missatge personalitzat",
+ "Enterprise_License": "Llicència d’empresa",
+ "Enterprise_License_Description": "Si el vostre espai de treball està registrat i la llicència la proporciona Rocket.Chat Cloud, no heu d’actualitzar manualment la llicència aquí.",
+ "Estimated_due_time": "Temps previst previst (temps en minuts)",
+ "Failed_to_add_monitor": "No s'ha pogut afegir el monitor",
+ "Invalid Canned Response": "Resposta enllaunada no vàlida",
+ "Invalid_Department": "Departament no vàlid",
+ "LDAP_Default_Role_To_User": "Funció predeterminada de l'usuari",
+ "LDAP_Default_Role_To_User_Description": "El rol RC predeterminat que s’aplicarà a l’usuari si l’usuari té algun rol LDAP que no es troba mapejat.",
+ "LDAP_Enable_LDAP_Roles_To_RC_Roles": "Activa el mapatge de rols des de LDAP a Rocket.Chat",
+ "LDAP_Query_To_Get_User_Groups": "Consulta LDAP per obtenir grups d’usuaris",
+ "LDAP_Query_To_Get_User_Groups_Description": "Consulta LDAP per obtenir els grups LDAP dels quals l'usuari forma part.",
+ "LDAP_Roles_To_Rocket_Chat_Roles": "Assignació de rols de LDAP a Rocket.Chat.",
+ "LDAP_Roles_To_Rocket_Chat_Roles_Description": "Mapeig de rols en format d'objectes on la clau d'objecte ha de ser el paper LDAP i el valor d'objecte ha de ser una matriu de rols RC. Exemple: { 'ldapRole': ['rcRole', 'anotherRCRole'] }",
+ "LDAP_Validate_Roles_For_Each_Login": "Valida el mapatge per a cada inici de sessió",
+ "LDAP_Validate_Roles_For_Each_Login_Description": "Si s’ha de produir la validació de cada inici de sessió (tingueu cura amb aquesta configuració perquè sobreescriurà els rols d’usuari de cada inici de sessió, en cas contrari, aquesta es validarà només en el moment de la creació d’usuaris).",
+ "List_of_departments_for_forward": "Llista de departaments permesos per al reenviament (opcional)",
+ "List_of_departments_for_forward_description": "Permet establir una llista restringida de departaments que poden rebre xats d’aquest departament",
+ "Livechat_abandoned_rooms_closed_custom_message": "Missatge personalitzat quan la sala es tanca automàticament per inactivitat del visitant",
+ "Livechat_Monitors": "Monitors",
+ "Livechat_monitors": "Monitors de Livechat",
+ "Max_number_of_chats_per_agent": "Màx. nombre de xats simultanis",
+ "Max_number_of_chats_per_agent_description": "Màx. nombre de xats simultanis als quals poden assistir els agents",
+ "Me": "Jo",
+ "Message_auditing": "Auditoria de missatges",
+ "Message_auditing_log": "Registre d’auditoria de missatges",
+ "Monitor_removed": "S'ha eliminat el monitor",
+ "Monitors": "Monitors",
+ "New_Canned_Response": "Nova resposta enllaunada",
+ "New_chat_priority": "Canvi de prioritat: __user__ ha canviat la prioritat a __priority__",
+ "New_Tag": "Nova etiqueta",
+ "New_Unit": "Nova unitat",
+ "New_Priority": "Nova prioritat",
+ "No_Canned_Responses": "No hi ha respostes enllaunades",
+ "Number_in_seconds": "Nombre en segons",
+ "Number_of_most_recent_chats_estimate_wait_time": "Nombre de xats recents per calcular el temps d’espera estimat",
+ "Number_of_most_recent_chats_estimate_wait_time_description": "Aquest número defineix el nombre d’últimes habitacions servides que s’utilitzaran per calcular els temps d’espera de la cua.",
+ "Others": "altres",
+ "Please_select_visibility": "Seleccioneu una visibilitat",
+ "Priorities": "Prioritats",
+ "Priority": "Prioritat",
+ "Priority_removed": "Es va eliminar la prioritat",
+ "Role_Mapping": "Assignació de rols",
+ "Selected_departments": "Departaments seleccionats",
+ "Selected_monitors": "Monitors seleccionats",
+ "Shortcut": "Drecera",
+ "Tag_removed": "Etiqueta suprimida",
+ "The_selected_user_is_not_a_monitor": "L'usuari seleccionat no és un monitor",
+ "There_are_no_available_monitors": "No hi ha monitors disponibles"
+}
diff --git a/ee/i18n/da.i18n.json b/ee/i18n/da.i18n.json
index 416276833b84..f4d1a54d35e2 100644
--- a/ee/i18n/da.i18n.json
+++ b/ee/i18n/da.i18n.json
@@ -14,7 +14,7 @@
"Edit_Tag": "Redigér mærke",
"Edit_Unit": "Redigér enhed",
"Edit_Priority": "Rediger prioritet",
- "Enable_omnichannel_auto_close_abandoned_rooms": "Aktivér automatisk lukning af værelser der er forladt af den besøgende",
+ "Enable_omnichannel_auto_close_abandoned_rooms": "Aktivér automatisk lukning af rum der er efterladt af den besøgende",
"Enter_a_custom_message": "Indtast en brugerdefineret besked",
"Enterprise_License": "Koncernlicens",
"Enterprise_License_Description": "Hvis dit arbejdsområde er registreret og en licens er tildelt af Rocket.Chat Cloud behøver du ikke manuelt at opdatere licensen her",
@@ -51,7 +51,7 @@
"No_Canned_Responses": "Ingen opbevarede svar",
"Number_in_seconds": "Antal i sekunder",
"Number_of_most_recent_chats_estimate_wait_time": "Antal seneste chats til beregning af estimeret ventetid",
- "Number_of_most_recent_chats_estimate_wait_time_description": "Dette antal definerer antallet af sidst anvendte værelser, der vil blive brugt til at beregne kø-ventetider.",
+ "Number_of_most_recent_chats_estimate_wait_time_description": "Dette antal definerer antallet af sidst anvendte rum, der vil blive brugt til at beregne kø-ventetider.",
"Others": "Andre",
"Please_select_visibility": "Vælg en synlighed",
"Priorities": "Prioriteter",
@@ -72,8 +72,8 @@
"Unit_removed": "Enhed fjernet",
"Use_this_response": "Brug dette svar",
"view-canned-responses": "Se opbevarede svar",
- "view-livechat-monitor": "Se livechat-monitore",
- "view-livechat-unit": "Se livechat-enheder",
+ "view-livechat-monitor": "Se Livechat-monitore",
+ "view-livechat-unit": "Se Livechat-enheder",
"Waiting_queue": "Ventende kø",
"Waiting_queue_message": "Meddelelse for ventende kø",
"Waiting_queue_message_description": "Meddelelse der vises for de besøgende, når de kommer i kø",
diff --git a/ee/i18n/ka-GE.i18n.json b/ee/i18n/ka-GE.i18n.json
index fc263faa6993..68c0fb47a100 100644
--- a/ee/i18n/ka-GE.i18n.json
+++ b/ee/i18n/ka-GE.i18n.json
@@ -1,49 +1,81 @@
{
- "error-canned-response-not-found": "დაკონსერვებული პასუხი ვერ მოიძებნა",
- "error-max-number-simultaneous-chats-reached": "ერთ აგენტიზე ერთდროული ჩატების მაქსიმალური რაოდენობა ამოწურულია.",
+ "error-canned-response-not-found": "შენაკული პასუხი ვერ მოიძებნა",
+ "error-forwarding-department-target-not-allowed": "სამიზნე განყოფილებაში გაგზავნა არ არის დაშვებული ",
+ "error-guests-cant-have-other-roles": "სტუმარ მომხმარებლებს არ შეიძლება ჰქონდეთ სხვა როლი",
+ "error-invalid-priority": "არასწორი პრიორიტეტი",
+ "error-max-guests-number-reached": "თქვენ მიაღწიეთ თქვენი ლიცენზიით დაშვებული სტუმრების მაქსიმალურ რაოდენობას. დაუკავშირდით sale@rocket.chat ახალი ლიცენზიის მისაღებად.",
+ "error-max-number-simultaneous-chats-reached": "მიღწეულია ერთ აგენტიზე ერთდროული ჩატების მაქსიმალური რაოდენობა",
"Add_monitor": "მონიტორის დამატება",
"Available_departments": "ხელმისაწვდომი დეპარტამენტები",
- "Canned Responses": "დაკონსერვებული პასუხები",
- "Canned_Response_Removed": "დაკონსერვებული პასუხი ამოღებულია",
- "Canned_Responses_Enable": "დაკონსერვებული პასუხების ჩართვა",
+ "Canned Responses": "შენახული პასუხები",
+ "Canned_Response_Removed": "შენახული პასუხი ამოღებულია",
+ "Canned_Responses_Enable": "შენახული პასუხების ჩართვა",
+ "Closed_automatically": "დაიხურა ავტომატურად სისტემის მიერ",
"Edit_Tag": "ტეგის რედაქტირება",
"Edit_Unit": "იუნიტის რედაქტირება",
+ "Edit_Priority": "პრიორიტეტის შეცვლა",
+ "Enable_omnichannel_auto_close_abandoned_rooms": "ჩართეთ სტუმრის მიერ მიტოვებული ოთახების ავტომატური დახურვა",
+ "Enter_a_custom_message": "შეიყვანეთ პირადი შეტყობინება",
"Enterprise_License": "საწარმოოს ლიცენზია",
- "Enterprise_License_Description": "თუ თქვენი სამუშაო ადგილი რეგისტრირებულია და ლიცენზია აქვს Rocket.Chat Cloud– ს, აქ ლიცენზიის ხელით განახლება არ დაგჭირდებათ.",
+ "Enterprise_License_Description": "თუ თქვენი სამუშაო ადგილი რეგისტრირებულია და ლიცენზირებულია Rocket.Chat Cloud–-ის მიერ , აქ ლიცენზიის ხელით განახლება არ დაგჭირდებათ.",
+ "Estimated_due_time": "სავარაუდო დრო (დრო წუთებში )",
"Failed_to_add_monitor": "მონიტორის დამატება ვერ მოხერხდა",
- "Invalid Canned Response": "არასწორი დაკონსერვებული პასუხი",
+ "Invalid Canned Response": "არასწორი შენახული პასუხი",
"Invalid_Department": "არასწორი დეპარტამენტი",
- "LDAP_Default_Role_To_User": "ნაგულისხმევი როლი მომხმარებლისთვის",
+ "LDAP_Default_Role_To_User": "ნაგულისხმევი(default) როლი მომხმარებლისთვის",
"LDAP_Default_Role_To_User_Description": "RC– ის ნაგულისხმევი როლი უნდა იქნას გამოყენებული მომხმარებლისთვის, თუ მომხმარებელს აქვს LDAP– ის გარკვეული როლი, რომელიც არ არის მიბმული.",
"LDAP_Enable_LDAP_Roles_To_RC_Roles": "ჩართეთ როლის მიბმა LDAP- დან Rocket.Chat-ში",
"LDAP_Query_To_Get_User_Groups": "LDAP მოთხოვნა, რომ მიიღოთ მომხმარებელთა ჯგუფები",
"LDAP_Query_To_Get_User_Groups_Description": "LDAP მოთხოვნა მიიღოთ LDAP ჯგუფები, რომელთა წევრიც არის მომხმარებელი.",
- "LDAP_Roles_To_Rocket_Chat_Roles": "როლის მიბმა LDAP- დან Rocket.Chat- მდე.",
+ "LDAP_Roles_To_Rocket_Chat_Roles": "როლის მიბმა LDAP- დან Rocket.Chat-ზე",
"LDAP_Roles_To_Rocket_Chat_Roles_Description": "როლის მობმა ობიექტის ფორმატში, სადაც ობიექტის გასაღები უნდა იყოს LDAP როლი და ობიექტის მნიშვნელობა უნდა იყოს RC როლების მასივი. მაგალითი: { 'ldapRole': ['rcRole', 'anotherRCRole'] }",
"LDAP_Validate_Roles_For_Each_Login": "მიბმის დადასტურება თითოეული შესვლისთვის",
"LDAP_Validate_Roles_For_Each_Login_Description": "თუ დადასტურება უნდა მოხდეს თითოეული შესვლისთვის (ფრთხილად იყავით ამ პარამეტრთან, რადგან ის გადაწერს მომხმარებლის როლებს ყოველი შესვლისას, წინააღმდეგ შემთხვევაში, ეს შემოწმდება მხოლოდ მომხმარებლის შექმნის მომენტში).",
+ "List_of_departments_for_forward": "გასაგზავნად ნებადართული განყოფილებების სია (არჩევითი)",
+ "List_of_departments_for_forward_description": "ნება დართეთ შეიქმნას შეზღუდული სია (განყოფილებების) , რომელთაც შეუძლიათ მიიღონ ჩათები ამ განყოფილებიდან",
+ "Livechat_abandoned_rooms_closed_custom_message": "პირადი შეტყობინების გაგზავნა, როდესაც ოთახი ავტომატურად იკეტება ვიზიტორთა უმოქმედობის გამო",
"Livechat_Monitors": "მონიტორები",
"Livechat_monitors": "Livechat-ის მონიტორები",
- "Max_number_of_chats_per_agent": "მაქსიმ. ერთდროული ჩეთები",
- "Max_number_of_chats_per_agent_description": "მაქსიმუმი. ერთდროული ჩეთების რაოდენობა, რომელთაც აგენტები შეძლებენ დაესწრონ",
+ "Max_number_of_chats_per_agent": "ერთდროული ჩეთების მაქსიმალური რაოდენობა",
+ "Max_number_of_chats_per_agent_description": "ერთდროული ჩეთების მაქსიმალური რაოდენობა, რომელთაც აგენტები შეძლებენ დაესწრონ",
"Me": "მე",
- "Message_auditing": "შეტყობინებების აუდიტი",
- "Message_auditing_log": "შეტყობინებების აუდიტის ჟურნალი",
+ "Message_auditing": "შეტყობინებების შემოწმება",
+ "Message_auditing_log": "შეტყობინებების შემოწმების ჟურნალი",
"Monitor_removed": "მონიტორი წაიშალა",
"Monitors": "მონიტორები",
- "New_Canned_Response": "ახალი დაკონსერვებული პასუხი",
+ "New_Canned_Response": "ახალი შენახული პასუხი",
+ "New_chat_priority": "პრიორიტეტი შეიცვალა: __user__– მა პრიორიტეტი შეცვალა __priority__– მდე",
"New_Tag": "ახალი ტეგი",
"New_Unit": "ახალი იუნიტი",
- "No_Canned_Responses": "დაკონსერვებული პასუხები არ არის",
- "Number_of_most_recent_chats_estimate_wait_time": "ბოლოდროინდელი ჩეტების რაოდენობა, ლოდინის სავარაუდო დროის გამოსათვლელად",
- "Number_of_most_recent_chats_estimate_wait_time_description": "ეს ნომერი განსაზღვრავს ბოლო მომსახურებული ოთახების რაოდენობას, რომლებიც გამოყენებული იქნება რიგების ლოდინის დროების გამოსათვლელად.",
+ "New_Priority": "ახალი პრიორიტეტი",
+ "No_Canned_Responses": "შენახული პასუხები არ არის",
+ "Number_in_seconds": "რიცხვი წამებში",
+ "Number_of_most_recent_chats_estimate_wait_time": "ახლანდელი ჩეტების რაოდენობა, ლოდინის სავარაუდო დროის გამოსათვლელად",
+ "Number_of_most_recent_chats_estimate_wait_time_description": "ეს რიცხვი განსაზღვრავს ბოლო მომსახურებული ოთახების რაოდენობას, რომლებიც გამოყენებული იქნება რიგების ლოდინის დროის გამოსათვლელად.",
"Others": "სხვები",
"Please_select_visibility": "გთხოვთ აირჩიოთ ხილვადობა",
+ "Priorities": "პრიორიტეტები",
+ "Priority": "პრიორიტეტი",
+ "Priority_removed": "პრიორიტეტი მოხსნილია",
"Role_Mapping": "როლის რუქა",
"Selected_departments": "არჩეული დეპარტამენტები",
"Selected_monitors": "არჩეული მონიტორები",
"Shortcut": "მალსახმობი",
"Tag_removed": "ტეგი ამოღებულია",
"The_selected_user_is_not_a_monitor": "არჩეული მომხმარებელი არ არის მონიტორი",
- "There_are_no_available_monitors": "არ არის ხელმისაწვდომი მონიტორები"
+ "There_are_no_available_monitors": "არ არის ხელმისაწვდომი მონიტორები",
+ "There_are_no_departments_added_to_this_tag_yet": "ამ ეტიკეტზე განყოფილებები ჯერ არ დამატებულა",
+ "There_are_no_departments_added_to_this_unit_yet": "ამ ქვედანაყოფში განყოფილებები ჯერ არ არის დამატებული",
+ "There_are_no_departments_available": "დეპარტამენტები არ არის ხელმისაწვდომი",
+ "There_are_no_monitors_added_to_this_unit_yet": "ამ განყოფილებაში მონიტორები ჯერ არ დამატებულა ",
+ "This_monitor_was_already_selected": "ეს მონიტორი უკვე არჩეული იყო",
+ "Unit_removed": "ქვედანაყოფი წაშლილია",
+ "Use_this_response": "გამოიყენეთ ეს პასუხი",
+ "view-canned-responses": "შენახული პასუხების ნახვა",
+ "view-livechat-monitor": "Livechat მონიტორების ნახვა",
+ "view-livechat-unit": "იხილეთ Livechat იუნიტები",
+ "Waiting_queue": "რიგის მოლოდინში",
+ "Waiting_queue_message": "რიგის შეტყობინების მოლოდინი",
+ "Waiting_queue_message_description": "მესიჯი, რომელსაც ნახავენ ვიზიტორები, როდესაც ისინი რიგში დგებიან",
+ "Without_priority": "პრიორიტეტის გარეშე"
}
\ No newline at end of file
diff --git a/ee/i18n/pl.i18n.json b/ee/i18n/pl.i18n.json
index 0eae394e3ced..278b8ac77354 100644
--- a/ee/i18n/pl.i18n.json
+++ b/ee/i18n/pl.i18n.json
@@ -1,13 +1,20 @@
{
+ "error-forwarding-department-target-not-allowed": "Przekazywanie do docelowego działu nie jest dozwolone.",
+ "error-guests-cant-have-other-roles": "Goście nie mogą mieć żadnych innych ról.",
+ "error-invalid-priority": "Niepoprawny priorytet",
+ "error-max-guests-number-reached": "Osiągnąłeś maksymalną liczbę gości dozwoloną przez twoją licencję. Skontakuj się z sale@rocket.chat by uzyskać nową licencję.",
+ "error-max-number-simultaneous-chats-reached": "Maksymalna liczba jednoczesnych rozmów agenta została osiągnięta.",
"Add_monitor": "Dodaj monitor",
"Available_departments": "Dostępne oddziały",
"Closed_automatically": "Automatycznie zamknięte przez system",
"Edit_Tag": "Edycja tagu",
"Edit_Unit": "Edycja jednostki",
+ "Edit_Priority": "Edycja priorytetu",
"Enable_omnichannel_auto_close_abandoned_rooms": "Włączenie automatycznego zamykania pomieszczeń opuszczonych przez odwiedzającego",
"Enter_a_custom_message": "Wprowadź niestandardowy komunikat",
"Enterprise_License": "Licencja Enterprise",
"Enterprise_License_Description": "Jeśli Twoja przestrzeń robocza jest zarejestrowana i licencja jest dostarczana przez Rocket.Chat Cloud, nie musisz ręcznie aktualizować licencji tutaj.",
+ "Estimated_due_time": "Szacowany czas (w minutach)",
"Failed_to_add_monitor": "Nieudane dodanie monitora",
"Invalid_Department": "Błędny oddział",
"LDAP_Default_Role_To_User": "Domyślna rola dla użytkownika",
@@ -17,6 +24,7 @@
"LDAP_Query_To_Get_User_Groups_Description": "Zapytanie LDAP do pobrania grup w których uczestniczy użytkownik",
"LDAP_Roles_To_Rocket_Chat_Roles": "Mapowanie ról z LDAP do Rocket.Chat",
"LDAP_Validate_Roles_For_Each_Login": "Zweryfikuj mapowanie przy każdym logowaniu",
+ "List_of_departments_for_forward": "Lista działow dozwolonych do przekazywania (opcjonalne)",
"Livechat_abandoned_rooms_closed_custom_message": "Niestandardowy komunikat, gdy pokój jest automatycznie zamykany przez brak aktywności odwiedzającego",
"Livechat_Monitors": "Monitory",
"Livechat_monitors": "Monitory Livechat",
@@ -29,8 +37,15 @@
"Monitors": "Monitory",
"New_Tag": "Nowy znacznik",
"New_Unit": "Nowa jednostka",
+ "New_Priority": "Nowy priorytet",
+ "Number_in_seconds": "Liczba w sekundach",
+ "Number_of_most_recent_chats_estimate_wait_time": "Liczba ostatnich rozmów do szacowania czasu oczekiwania",
+ "Number_of_most_recent_chats_estimate_wait_time_description": "Liczba ta określa liczbę ostatnio obsługiwanych pokoi, która będzie wykorzystana do obliczenia czasu oczekiwania w kolejce.",
"Others": "Inni",
"Please_select_visibility": "Proszę wybrać widoczność",
+ "Priorities": "Priorytety",
+ "Priority": "Priorytet",
+ "Priority_removed": "Priorytet usunięty",
"Role_Mapping": "Mapowanie ról",
"Selected_departments": "Wybrane oddziały",
"Selected_monitors": "Wybrane monitory",
@@ -48,5 +63,7 @@
"view-livechat-monitor": "Zobacz monitory Livechat",
"view-livechat-unit": "Zobacz jednostki Livechat",
"Waiting_queue": "Kolejka oczekujących",
- "Waiting_queue_message": "Kolejka oczekujących wiadomości"
+ "Waiting_queue_message": "Kolejka oczekujących wiadomości",
+ "Waiting_queue_message_description": "Wiadomość która będzie wyświetlona odwiedzającym kiedy zostaną umieszczeni w kolejce",
+ "Without_priority": "Bez priorytetu"
}
\ No newline at end of file
diff --git a/mocha_apps.opts b/mocha_apps.opts
deleted file mode 100644
index 7a631df0013d..000000000000
--- a/mocha_apps.opts
+++ /dev/null
@@ -1,8 +0,0 @@
---require babel-mocha-es6-compiler
---require babel-polyfill
---reporter spec
---ui bdd
---timeout 10000
---bail
---file tests/end-to-end/teardown.js
-tests/end-to-end/apps/*.js
diff --git a/mocha_api.opts b/mocha_end_to_end.opts
similarity index 73%
rename from mocha_api.opts
rename to mocha_end_to_end.opts
index a30078e5ccfe..a48288c76568 100644
--- a/mocha_api.opts
+++ b/mocha_end_to_end.opts
@@ -5,4 +5,4 @@
--timeout 10000
--bail
--file tests/end-to-end/teardown.js
-tests/end-to-end/api/*.js
+tests/end-to-end/api/*.js tests/end-to-end/apps/*.js
diff --git a/package-lock.json b/package-lock.json
index 6b60958afcb1..7d72f3451d7f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2797,9 +2797,9 @@
}
},
"@rocket.chat/apps-engine": {
- "version": "1.15.0-beta.3262",
- "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.15.0-beta.3262.tgz",
- "integrity": "sha512-Rh8aVd8L5d8RWf6i2nk+vUuTIz6rJLBux0Px8gdC+7uO8r5C7ZKxhs7TaeEqxPBAq05KLhor120sMjkIGN8xGA==",
+ "version": "1.15.0-alpha.3394",
+ "resolved": "https://registry.npmjs.org/@rocket.chat/apps-engine/-/apps-engine-1.15.0-alpha.3394.tgz",
+ "integrity": "sha512-f1ZrVHqxQS4C/jaM4ES8JIzVU1zgHNGEMuxXVMT1wbk1NnMt40Uw2fEWYV7Ijy3ttEJ35ekMSSV+3ctunsyq1A==",
"requires": {
"adm-zip": "^0.4.9",
"cryptiles": "^4.1.3",
diff --git a/package.json b/package.json
index 8e952066f0eb..e42509b4fab1 100644
--- a/package.json
+++ b/package.json
@@ -23,13 +23,12 @@
"deploy": "npm run build && pm2 startOrRestart pm2.json",
"postinstall": "node .scripts/npm-postinstall.js",
"coverage": "nyc -r html mocha --opts ./mocha.opts",
- "test": "node .scripts/start.js",
+ "testci": "node .scripts/start.js",
"testui": "cypress run --project tests",
+ "testapi": "mocha --opts ./mocha_end_to_end.opts",
"testunit": "mocha --opts ./mocha.opts",
"testunit-watch": "mocha --watch --opts ./mocha.opts",
- "testapi": "mocha --opts ./mocha_api.opts",
- "testapps": "mocha --opts ./mocha_apps.opts",
- "testci": "npm run testapi && npm run testapps && npm run testui",
+ "test": "npm run testapi && npm run testui",
"translation-diff": "node .scripts/translationDiff.js",
"translation-fix-order": "node .scripts/fix-i18n.js",
"version": "node .scripts/version.js",
@@ -126,7 +125,7 @@
"@nivo/heatmap": "^0.61.0",
"@nivo/line": "^0.61.1",
"@nivo/pie": "^0.61.1",
- "@rocket.chat/apps-engine": "^1.15.0-beta.3262",
+ "@rocket.chat/apps-engine": "1.15.0-alpha.3394",
"@rocket.chat/fuselage": "^0.6.3-dev.45",
"@rocket.chat/fuselage-hooks": "^0.6.3-dev.35",
"@rocket.chat/fuselage-polyfills": "^0.6.3-dev.45",
diff --git a/packages/rocketchat-i18n/i18n/ca.i18n.json b/packages/rocketchat-i18n/i18n/ca.i18n.json
index 0bac88069909..6cdb1e3a9cc6 100644
--- a/packages/rocketchat-i18n/i18n/ca.i18n.json
+++ b/packages/rocketchat-i18n/i18n/ca.i18n.json
@@ -13,8 +13,8 @@
"__username__was_set__role__by__user_by_": "Ara __username__ és __role__ (per __user_by__)",
"%_of_conversations": "% de converses",
"Accept": "Accepta",
- "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Acceptar sol·licituds de xat en viu entrant encara que no hi hagi agents en línia",
- "Accept_new_livechats_when_agent_is_idle": "Accepteu noves sol·licituds de Livechat quan l'agent estigui inactiu",
+ "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accepteu les sol·licituds omnicanals entrants, fins i tot si no hi ha agents en línia",
+ "Accept_new_livechats_when_agent_is_idle": "Accepteu les noves sol·licituds omnichannel quan l'agent està inactiu",
"Accept_with_no_online_agents": "Acceptar sense agents en línia",
"access-mailer": "Accedir a la pantalla d'enviament",
"access-mailer_description": "Permís per enviar correu-e massiu a tots els usuaris",
@@ -26,9 +26,9 @@
"Accessing_permissions": "L'accés als permisos",
"Account_SID": "Compte SID",
"Accounts": "Comptes",
- "Accounts_Admin_Email_Approval_Needed_Default": "
Comproveu \" -> Usuaris\" per activar-lo o eliminar-lo.
",
"Accounts_AllowAnonymousRead": "Permetre lectura anònima",
"Accounts_AllowAnonymousWrite": "Permetre escriptura anònima",
"Accounts_AllowDeleteOwnAccount": "Permetre als usuaris eliminar el seu propi compte",
@@ -365,6 +365,8 @@
"Apps_Framework_Development_Mode": "Habiliteu el mode de desenvolupament",
"Apps_Framework_Development_Mode_Description": "El mode de desenvolupament permet instal·lar aplicacions que no pertanyin al mercat de Rocket.Chat.",
"Apps_Framework_enabled": "Habiliteu el marc d'aplicació",
+ "Apps_Game_Center_Play_Game_Together": "@aquí Juguem __name__ junts!",
+ "Apps_Game_Center_Invite_Friends": "Convida els teus amics a unir-se",
"Apps_Marketplace_Deactivate_App_Prompt": "Vols realment desactivar aquesta aplicació?",
"Apps_Marketplace_Modify_App_Subscription": "Modifica la subscripció",
"Apps_Marketplace_Uninstall_App_Prompt": "Vols realment desinstal·lar aquesta aplicació?",
@@ -373,10 +375,15 @@
"Apps_Marketplace_Login_Required_Title": "Cal iniciar sessió al mercat",
"Apps_Marketplace_Login_Required_Description": "La compra d’aplicacions del mercat Rocket.Chat requereix registrar l’espai de treball i iniciar la sessió.",
"Apps_Marketplace_pricingPlan_monthly": "__price__ / mes",
+ "Apps_Marketplace_pricingPlan_startingAt_monthly": "a partir de __price__ / mes",
"Apps_Marketplace_pricingPlan_monthly_perUser": "__price__ / mes per usuari",
+ "Apps_Marketplace_pricingPlan_startingAt_monthly_perUser": "a partir de __price__ / mes per usuari",
"Apps_Marketplace_pricingPlan_yearly": "__price__ / any",
+ "Apps_Marketplace_pricingPlan_startingAt_yearly": "a partir de __price__ / any",
"Apps_Marketplace_pricingPlan_yearly_perUser": "__price__ / any per usuari",
+ "Apps_Marketplace_pricingPlan_startingAt_yearly_perUser": "a partir de __price__ / any per usuari",
"Apps_Settings": "Configuració de l'aplicació",
+ "Apps_User_Already_Exists": "El nom d'usuari \"__username__\" ja s'està utilitzant. Canviar el nom o eliminar l’usuari que l’utilitzi per instal·lar aquesta aplicació",
"Apps_WhatIsIt": "Aplicacions: què són?",
"Apps_WhatIsIt_paragraph1": "Una nova icona a l'àrea d'administració! Què vol dir això i què són les aplicacions?",
"Apps_WhatIsIt_paragraph2": "En primer lloc, les aplicacions en aquest context no fan referència a les aplicacions mòbils. De fet, seria millor pensar-los en termes de connectors o integracions avançades.",
@@ -390,10 +397,13 @@
"Are_you_sure": "N'estàs segur?",
"Are_you_sure_you_want_to_delete_your_account": "Estàs segur d'eliminar el teu compte?",
"Are_you_sure_you_want_to_disable_Facebook_integration": "Estàs segur que vols desactivar la integració de Facebook?",
+ "Are_you_sure_you_want_to_delete_this_record": "Esteu segur que voleu suprimir aquest registre?",
"Assets": "Actius",
"assign-admin-role": "Assignar rol d'administrador",
"assign-admin-role_description": "Permís per assignar el rol d'administrador a altres usuaris",
"Assign_admin": "Assignant admin",
+ "Assign_new_conversations_to_bot_agent": "Assigna les noves converses a l'agent bot",
+ "Assign_new_conversations_to_bot_agent_description": "El sistema d'encaminament intentarà trobar un agent bot abans d'abordar noves converses a un agent humà.",
"assign-roles": "Assigna rols",
"at": "a",
"At_least_one_added_token_is_required_by_the_user": "Almenys un usuari afegeix un token afegit",
@@ -401,6 +411,7 @@
"Attachment_File_Uploaded": "Fitxer pujat",
"Attribute_handling": "Tractament d'atributs",
"Audio": "Àudio",
+ "Audios": "Àudios",
"Audio_message": "Missatge d'àudio",
"Audio_Notification_Value_Description": "Pot ser un so personalitzat o els predeterminats: sonor, chelle, ding, droplet, highbell, estacions",
"Audio_Notifications_Default_Alert": "Notificacions d'àudio Alerta per defecte",
@@ -427,6 +438,7 @@
"Automatic_Translation": "Traducció automàtica",
"Author_Site": "Lloc de l'autor",
"AutoTranslate": "Autotraducció",
+ "Auto_Selection": "Selecció automàtica",
"Auto_Translate": "Autotraducció",
"AutoTranslate_APIKey": "Clau API",
"AutoTranslate_Change_Language_Description": "Canviar l'idioma d'autotraducció no traduirà els missatges anteriors.",
@@ -434,6 +446,8 @@
"AutoTranslate_Enabled": "Activa autotraducció",
"AutoTranslate_Enabled_Description": "L'activació de la traducció automàtica permetrà a les persones amb el permís traduir automàticament el permís de traduir tots els missatges automàticament al seu idioma seleccionat. Es poden aplicar tarifes.",
"AutoTranslate_Google": "Google",
+ "AutoTranslate_Microsoft": "Microsoft",
+ "AutoTranslate_Microsoft_API_Key": " Clau de subscripció Ocp-Apim",
"AutoTranslate_ServiceProvider": "Proveïdor de servei",
"Available": "En línia",
"Available_agents": "Agents disponibles",
@@ -443,6 +457,11 @@
"Avatar_url_invalid_or_error": "L'adreça URL proporcionada és invàlida o no accessible. Si us plau, torneu-ho a intentar amb una altra.",
"Avg_chat_duration": "Durada mitjana del xat",
"Avg_first_response_time": "Temps mitjà de primera resposta",
+ "Avg_of_abandoned_chats": "Mitjana de xats abandonats",
+ "Avg_of_available_service_time": "Mitjana del temps disponible del servei",
+ "Avg_of_chat_duration_time": "Mitjana de la durada del xat",
+ "Avg_of_service_time": "Mitjana del temps de servei",
+ "Avg_of_waiting_time": "Mitjana del temps d’espera",
"Avg_response_time": "Temps de resposta mitjà",
"Avg_reaction_time": "Temps de reacció mitjà",
"away": "absent",
@@ -2995,4 +3014,4 @@
"Your_push_was_sent_to_s_devices": "La notificació push s'ha enviat a %s dispositius",
"Your_server_link": "Enllaç del servidor",
"Your_workspace_is_ready": "El vostre espai de treball està a punt per utilitzar 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/cs.i18n.json b/packages/rocketchat-i18n/i18n/cs.i18n.json
index d6a2885c56f7..b0049864f84e 100644
--- a/packages/rocketchat-i18n/i18n/cs.i18n.json
+++ b/packages/rocketchat-i18n/i18n/cs.i18n.json
@@ -690,6 +690,7 @@
"Closing_chat": "Uzavření místnosti",
"Cloud": "Cloud",
"Cloud_Register_manually": "Registrovat ručně",
+ "Cloud_click_here": "Po zkopírování textu přejděte do cloudové konzole. [Klikněte zde](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "Po dokončení procesu registrace v cloudové konzoli byste měli dostat nějaký text. Pro dokončení registrace jej vložte sem.",
"Cloud_register_offline_helper": "Pracovní prostory lze ručně zaregistrovat, pokud je k nim omezen síťový přístup. Zkopírujte níže uvedený text a dokončete proces pomocí naší cloudové konzole.",
"Cloud_register_success": "Váš pracovní prostor byl úspěšně zaregistrován!",
diff --git a/packages/rocketchat-i18n/i18n/da.i18n.json b/packages/rocketchat-i18n/i18n/da.i18n.json
index a89bc5c81dd4..d2ad181b5d08 100644
--- a/packages/rocketchat-i18n/i18n/da.i18n.json
+++ b/packages/rocketchat-i18n/i18n/da.i18n.json
@@ -13,8 +13,8 @@
"__username__was_set__role__by__user_by_": "__username__ was set __role__ by __user_by__",
"%_of_conversations": "% af samtaler",
"Accept": "Acceptér",
- "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accepter indgående livechat-anmodninger, selvom der ikke er online agenter",
- "Accept_new_livechats_when_agent_is_idle": "Accepter nye livechat-anmodninger via omnikanal, når agenten er ledig",
+ "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Acceptér indgående Omnichannel-anmodninger, selvom der ikke er online agenter",
+ "Accept_new_livechats_when_agent_is_idle": "Accepter nye anmodninger fra omnikanalen når agenten er ledig",
"Accept_with_no_online_agents": "Acceptér uden online agenter",
"access-mailer": "Åbn mail-skærmen",
"access-mailer_description": "Tilladelse til at sende masse-e-mails til alle brugere.",
@@ -69,7 +69,7 @@
"Accounts_Email_Deactivated": "[navn]
Din konto blev deaktiveret.
",
"Accounts_Enrollment_Email_Default": "
Velkommen til [Site_Name]
Gå til [Site_URL] for at prøve den bedste open source-chatløsning, du kan få!
",
"Accounts_Email_Deactivated_Subject": "Konto deaktiveret",
- "Accounts_EmailVerification": "E-mail-bekræftelse",
+ "Accounts_EmailVerification": "Tillad kun bekræftede brugere at logge ind",
"Accounts_EmailVerification_Description": "Sørg for, at du har korrekte SMTP-indstillinger for at bruge denne funktion",
"Accounts_Enrollment_Email_Subject_Default": "Velkommen til [Site_Name]",
"Accounts_Enrollment_Email": "Tilmeldings-e-mail",
@@ -192,7 +192,7 @@
"Accounts_RegistrationForm_Public": "Offentlig",
"Accounts_RegistrationForm_Secret_URL": "Hemmelig url",
"Accounts_RegistrationForm_SecretURL": "Hemmelig url for tilmeldingsblanket",
- "Accounts_RegistrationForm_SecretURL_Description": "Du skal angive en tilfældig streng, som vil blive tilføjet til din registrerings-url. Eksempel: https://open.rocket.chat/register/[secret_hash]",
+ "Accounts_RegistrationForm_SecretURL_Description": "Du skal angive en tilfældig streng som vil blive tilføjet til din registrerings-URL. Eksempel: https://open.rocket.chat/register/[secret_hash]",
"Accounts_Registration_InviteUrlType": "Typen af invitations-URL",
"Accounts_Registration_InviteUrlType_Direct": "Direkte",
"Accounts_Registration_InviteUrlType_Proxy": "Proxy",
@@ -233,6 +233,7 @@
"MAU_value": "MAU __value__",
"Activity": "Aktivitet",
"Add": "Tilføj",
+ "Add_custom_emoji": "Tilføj brugerdefineret emoji",
"add-oauth-service": "Tilføj OAuth-tjeneste",
"add-oauth-service_description": "Tilladelse til at tilføje nye OAuth-tjenester",
"add-user": "Tilføj bruger",
@@ -281,6 +282,7 @@
"All": "Alle",
"All_added_tokens_will_be_required_by_the_user": "Alle tilføjede tokens vil blive krævet af brugeren",
"All_channels": "Alle kanaler",
+ "All_closed_chats_have_been_removed": "Alle lukkede chats er blevet fjernet",
"All_logs": "Alle logfiler",
"All_messages": "Alle beskeder",
"All_users": "Alle brugere",
@@ -386,6 +388,7 @@
"App_user_not_allowed_to_login": "App-brugere må ikke logge direkte på.",
"Appearance": "Udseende",
"Application_added": "Applikation tilføjet",
+ "Application_delete_warning": "Du vil ikke kunne gendanne dette program!",
"Application_Name": "Applikationens navn",
"Application_updated": "Applikationen er opdateret",
"Apply": "Anvend",
@@ -394,7 +397,7 @@
"Apps_Engine_Version": "Apps Engine Version",
"Apps_Framework_Development_Mode": "Aktivér udviklingstilstand",
"Apps_Framework_Development_Mode_Description": "Udviklingstilstand tillader installation af apps der ikke er fra Rocket.Chat's markedsplads.",
- "Apps_Framework_enabled": "Aktivér app-framework",
+ "Apps_Framework_enabled": "Aktivér App-framework",
"Apps_Game_Center": "Spilcenter",
"Apps_Game_Center_Back": "Tilbage til spilcenteret",
"Apps_Game_Center_enabled": "Aktivér spilcenter",
@@ -408,10 +411,14 @@
"Apps_Marketplace_Login_Required_Title": "Markedsplads-login påkræves",
"Apps_Marketplace_Login_Required_Description": "For at købe apps fra Rocket.Chat markedsplads, skal du registrere dit site og logge ind.",
"Apps_Marketplace_pricingPlan_monthly": "__price__ / måned",
+ "Apps_Marketplace_pricingPlan_startingAt_monthly": "Starter ved __price__ / måned",
"Apps_Marketplace_pricingPlan_monthly_perUser": "__price__ / måned pr. bruger",
+ "Apps_Marketplace_pricingPlan_startingAt_monthly_perUser": "Starter ved __price__ / måned pr. bruger",
"Apps_Marketplace_pricingPlan_yearly": "__price__ / år",
+ "Apps_Marketplace_pricingPlan_startingAt_yearly": "Starter ved __price__ / år",
"Apps_Marketplace_pricingPlan_yearly_perUser": "__price__ / år pr. bruger",
- "Apps_Settings": "Appens indstillinger",
+ "Apps_Marketplace_pricingPlan_startingAt_yearly_perUser": "Starter ved __price__ / år pr. bruger",
+ "Apps_Settings": "App'ens indstillinger",
"Apps_User_Already_Exists": "Brugernavnet \"__username__\" bruges allerede. Omdøb eller fjern brugeren, der bruges til at installere denne app",
"Apps_WhatIsIt": "Apps: Hvad er det?",
"Apps_WhatIsIt_paragraph1": "Et nyt ikon i administrationsområdet! Hvad betyder det, og hvad er apps?",
@@ -520,25 +527,30 @@
"Blockstack_Auth_Description": "Auth-beskrivelse",
"Blockstack_ButtonLabelText": "Tekst på knap",
"Blockstack_Generate_Username": "Generér brugernavn",
- "Body": "Legeme",
+ "Body": "Body",
+ "Bio": "Bio",
+ "Bio_Placeholder": "Opbevaring af Bio",
"bold": "fed",
- "bot_request": "Bot anmodning",
+ "bot_request": "Bot-anmodning",
"BotHelpers_userFields": "Brugerfelter",
- "BotHelpers_userFields_Description": "CSV af brugerfelter, der kan fås ved hjælp af bots hjælper metoder.",
+ "BotHelpers_userFields_Description": "CSV af brugerfelter der kan fås ved hjælp af bots hjælper-metode.",
"Bots": "Botter",
- "Branch": "Afdeling",
- "Broadcast_channel": "Broadcast Channel",
+ "Branch": "Filial",
+ "Broadcast_channel": "Broadcast-kanal",
"Broadcast_channel_Description": "Kun autoriserede brugere kan skrive nye beskeder, men andre brugere kan besvare dem",
- "Broadcast_Connected_Instances": "Broadcast Connected Instances",
- "Broadcasting_api_key": "API-nøgle for udsendelse",
- "Broadcasting_client_id": "Udsenders klient-id",
- "Broadcasting_client_secret": "Udsenders klient-hemmelighed",
- "Broadcasting_enabled": "Udsendelse aktiveret",
- "Broadcasting_media_server_url": "Udsenders medieserver-url",
+ "Broadcast_Connected_Instances": "Broadcast-forbundne instanser",
+ "Broadcasting_api_key": "API-nøgle for broadcasting",
+ "Broadcasting_client_id": "Client-Id for broadcasting",
+ "Broadcasting_client_secret": "Client-secret for broadcasting",
+ "Broadcasting_enabled": "Broadcasting aktiveret",
+ "Broadcasting_media_server_url": "Medieserver-URL for broadcasting",
+ "Browse_Files": "Gennemse filer",
+ "Browser_does_not_support_audio_element": "Din browser understøtter ikke lydelementet.",
+ "Browser_does_not_support_video_element": "Din browser understøtter ikke videoelementet.",
"Bugsnag_api_key": "Bugsnag API nøgle",
- "Build_Environment": "Byg miljø",
- "bulk-register-user": "Bulk Opret kanaler",
- "bulk-register-user_description": "Tilladelse til at oprette kanaler i bulk",
+ "Build_Environment": "Byg miljøet",
+ "bulk-register-user": "Opret brugere i bundter",
+ "bulk-register-user_description": "Tilladelse til at oprette brugere i bundter",
"Busiest_day": "Travleste dag",
"Busiest_time": "Travleste tidspunkt",
"busy": "travl",
@@ -550,59 +562,64 @@
"by": "ved",
"cache_cleared": "Cache ryddet",
"call-management": "Opkaldsadministration",
- "Cancel": "Afbestille",
- "Cancel_message_input": "Afbestille",
- "Cannot_invite_users_to_direct_rooms": "Kan ikke invitere brugere til at rette værelser",
- "Cannot_open_conversation_with_yourself": "Kan ikke direkte besked med dig selv",
+ "Cancel": "Annullér",
+ "Canceled": "Annulleret",
+ "Cancel_message_input": "Annullér",
+ "Cannot_invite_users_to_direct_rooms": "Kan ikke invitere brugere til at direkte rum",
+ "Cannot_open_conversation_with_yourself": "Kan ikke oprette direkte besked med dig selv",
"CAS_autoclose": "Autoclose login popup",
- "CAS_base_url": "SSO Base URL",
- "CAS_base_url_Description": "Basisadressen til din eksterne SSO-tjeneste fx: https: //sso.example.undef/sso/",
- "CAS_button_color": "Login Button Baggrundsfarve",
- "CAS_button_label_color": "Login Button Tekstfarve",
- "CAS_button_label_text": "Login Button Label",
+ "CAS_base_url": "SSO Base-URL",
+ "CAS_base_url_Description": "Base-adressen til din eksterne SSO-tjeneste fx: https: //sso.example.undef/sso/",
+ "CAS_button_color": "Login-knap's baggrundsfarve",
+ "CAS_button_label_color": "Login-knap's tekstfarve",
+ "CAS_button_label_text": "Login-knap's tekst",
"CAS_enabled": "Aktiveret",
"CAS_Login_Layout": "CAS Login Layout",
"CAS_login_url": "SSO Login URL",
"CAS_login_url_Description": "Login-adressen til din eksterne SSO-tjeneste fx: https: //sso.example.undef/sso/login",
- "CAS_popup_height": "Log ind Popup Højde",
- "CAS_popup_width": "Log ind Popup Width",
+ "CAS_popup_height": "Login Popup højde",
+ "CAS_popup_width": "Login Popup bredde",
"CAS_Sync_User_Data_Enabled": "Synkroniser altid brugerdata",
"CAS_Sync_User_Data_Enabled_Description": "Synkroniser altid eksterne CAS-brugerdata til tilgængelige attributter ved login. Bemærk: Attributter synkroniseres altid under oprettelse af konti.",
- "CAS_Sync_User_Data_FieldMap": "Attribut kort",
+ "CAS_Sync_User_Data_FieldMap": "Attributskort",
"CAS_Sync_User_Data_FieldMap_Description": "Brug denne JSON input til at opbygge interne attributter (nøgle) fra eksterne attributter (værdi). Eksterne attributnavne vedhæftet med '%' bliver interpoleret i værdisnor. Eksempel, `{\" email \":\"% email% \",\" navn \":\"% fornavn%,% efternavn% \"}`
Attribut-kortet er altid interpoleret. I CAS 1.0 er kun attributten `brugernavn 'tilgængelig. Tilgængelige interne attributter er: brugernavn, navn, email, værelser; værelser er en kommasepareret liste over værelser til at deltage i oprettelsen af brugeren, for eksempel: {\"rooms\": \"% team%,% department%\"} vil deltage i CAS-brugere ved oprettelse til deres team og afdelingskanal.",
+ "CAS_trust_username": "Stol på CAS-brugernavn",
+ "CAS_trust_username_description": "Når det er aktiveret, vil Rocket.Chat stole på, at ethvert brugernavn fra CAS tilhører den samme bruger på Rocket.Chat. Dette kan være nødvendigt, hvis en bruger omdøbes til CAS, men kan også give folk mulighed for at tage kontrol over Rocket.Chat konti ved at omdøbe deres egne CAS-brugere.",
"CAS_version": "CAS Version",
- "CAS_version_Description": "Brug kun en understøttet CAS-version, der understøttes af din CAS SSO-tjeneste.",
+ "CAS_version_Description": "Brug kun en supporteret CAS-version der understøttes af din CAS SSO-tjeneste.",
+ "Call": "Opkald",
"Categories": "Kategorier",
- "CDN_PREFIX": "CDN Prefix",
+ "CDN_PREFIX": "CDN præfiks",
"CDN_PREFIX_ALL": "Brug CDN-præfiks for alle aktiver",
"CDN_JSCSS_PREFIX": "CDN-præfiks for JS/CSS",
"Certificates_and_Keys": "Certifikater og nøgler",
- "Change_Room_Type": "Ændring af værelsestype",
+ "Change_Room_Type": "Ændring af rumtype",
"Changing_email": "Ændring af e-mail",
"channel": "kanal",
"Channel": "Kanal",
"Channel_already_exist": "Kanalen `#%s` eksisterer allerede.",
"Channel_already_exist_static": "Kanalen findes allerede.",
- "Channel_already_Unarchived": "Kanal med navn `#%s` er allerede i Unarchived state",
+ "Channel_already_Unarchived": "Kanal med navn `#%s` er allerede i ikke-arkiveret state",
"Channel_Archived": "Kanal med navn `#%s` er blevet arkiveret med succes",
- "Channel_created": "Kanalen `#%s` oprettet.",
+ "Channel_created": "Kanalen `#%s` blev oprettet.",
"Channel_doesnt_exist": "Kanalen `#%s` eksisterer ikke.",
"Channel_name": "Kanalnavn",
"Channel_Name_Placeholder": "Indtast kanalnavn ...",
"Channel_to_listen_on": "Kanal at lytte til",
"Channel_Unarchived": "Kanal med navn `#%s` er blevet arkiveret succesfuldt",
"Channels": "Kanaler",
- "Channels_are_where_your_team_communicate": "Kanaler er hvor dit team kommunikerer",
+ "Channels_are_where_your_team_communicate": "Kanaler er der hvor dit team kommunikerer",
"Channels_list": "Liste over offentlige kanaler",
"Chat_button": "Chat-knap",
"Chat_closed": "Chat lukket",
+ "Chat_closed_by_agent": "Chat lukket af agent",
"Chat_closed_successfully": "Chat sluttet succesfuldt",
"Chat_Now": "Chat nu",
- "Chat_window": "Chat vindue",
+ "Chat_window": "Chat-vindue",
"Chatops_Enabled": "Aktivér chatops",
- "Chatops_Title": "Chatops Panel",
- "Chatops_Username": "Chatops Brugernavn",
- "Chatpal_AdminPage": "Chatpal Admin Page",
+ "Chatops_Title": "Chatops-panel",
+ "Chatops_Username": "Chatops-brugernavn",
+ "Chatpal_AdminPage": "Chatpal administrationsside",
"Chatpal_All_Results": "Alle",
"Chatpal_API_Key": "API nøgle",
"Chatpal_API_Key_Description": "Du har endnu ikke en API-nøgle? Få en!",
@@ -635,7 +652,7 @@
"Chatpal_No_Results": "Ingen resultater",
"Chatpal_no_search_results": "Intet resultat",
"Chatpal_one_search_result": "Fundet 1 resultat",
- "Chatpal_Rooms": "Værelser",
+ "Chatpal_Rooms": "Rum",
"Chatpal_run_search": "Søg",
"Chatpal_search_page_of": "Side%s af%s",
"Chatpal_search_results": "Fundet%s resultater",
@@ -649,6 +666,8 @@
"Chatpal_Welcome": "Nyd din søgning!",
"Chatpal_Window_Size": "Indeksvinduestørrelse",
"Chatpal_Window_Size_Description": "Størrelsen af indeksvinduer i timer (ved opstart)",
+ "Check_All": "Tjek alt",
+ "Check_Progress": "Kontroller fremskridt",
"Choose_a_room": "Vælg et værelse",
"Choose_messages": "Vælg meddelelser",
"Choose_the_alias_that_will_appear_before_the_username_in_messages": "Vælg aliaset, der vises før brugernavnet i meddelelser.",
@@ -659,13 +678,16 @@
"clear": "Klar",
"Clear_all_unreads_question": "Ryd alle tavler?",
"clear_cache_now": "Ryd cache nu",
+ "Clear_filters": "Ryd filtre",
"clear_history": "Ryd historie",
"Click_here": "Klik her",
+ "Click_here_for_more_details_or_contact_sales_for_a_new_license": "Klik her for flere detaljer eller kontakt __email__ for en ny licens.",
"Click_here_for_more_info": "Klik her for mere info",
"Click_here_to_enter_your_encryption_password": "Tryk her for at indtaste dit krypteringskodeord",
"Click_here_to_view_and_copy_your_password": "Tryk her for at se og kopiere dit kodeord.",
"Click_the_messages_you_would_like_to_send_by_email": "Klik på de meddelelser, du gerne vil sende via e-mail",
"Click_to_join": "Klik for at deltage!",
+ "Click_to_load": "Klik for at indlæse",
"Client_ID": "Klient-id",
"Client_Secret": "Client Secret",
"Clients_will_refresh_in_a_few_seconds": "Kunderne opdateres om få sekunder",
@@ -677,21 +699,42 @@
"close-others-livechat-room": "Luk Livechat Room",
"Cloud_workspace_connected_without_account": "Din instans er nu forbundet til Rocket.Chat Cloud. Du kan logge ind i Rocket.Chat-skyen og forbinde din instans med din Cloud-konto, hvis du har lyst.",
"close-others-livechat-room_description": "Tilladelse til at lukke andre LiveChat-kanaler",
+ "Close_room_description": "Du skal til at lukke denne chat. Er du sikker på, at du vil fortsætte?",
"Closed": "Lukket",
+ "Closed_At": "Chat lukket ved",
"Closed_by_visitor": "Lukket af besøgende",
"Closing_chat": "Lukning af chat",
"Cloud": "Cloud",
+ "Cloud_Register_manually": "Registrer manuelt",
+ "Cloud_click_here": "Efter kopiering af teksten, gå til Cloud Console. [Klik her](__cloudConsoleUrl__)",
+ "Cloud_register_offline_finish_helper": "Efter afslutningen af registreringsprocessen i Cloud Console, skal du præsenteres for noget tekst. Indsæt det her for at afslutte registreringen.",
+ "Cloud_register_offline_helper": "Arbejdsområder kan registreres manuelt, hvis der ikke er netværksadgang eller den er begrænset. Kopier teksten nedenfor og gå til vores Cloud Console for at afslutte processen.",
+ "Cloud_register_success": "Dit arbejdsområde er blevet registreret!",
+ "Cloud_register_error": "Der har været en fejl ved forsøg på at behandle din anmodning. Prøv igen senere.",
+ "Cloud_connect_support": "Hvis du stadig ikke har modtaget en registrerings-e-mail, skal du sørge for, at din e-mail er opdateret ovenfor. Hvis du stadig har problemer, kan du kontakte support på",
+ "Cloud_console": "Cloud Console",
+ "Cloud_Info": "Cloud Info",
"Cloud_what_is_it": "Hvad er det her?",
"Cloud_what_is_it_description": "Rocket.Chat Cloud-forbindelse lader dig forbinde en Rocket.Chat-instans, som du selv er vært for, til vores sky. Hvis du gør det, kan du administrere dine licenser, regninger og support i Rocket.Chat Cloud.",
+ "Cloud_what_is_it_services_like": "Tjenester som:",
+ "Cloud_what_is_it_additional": "Derudover vil du være i stand til at administrere licenser, fakturering og support fra Rocket.Chat Cloud Console.",
+ "Cloud_workspace_connected": "Dit arbejdsområde er forbundet til Rocket.Chat Cloud. Ved at logge ind på din Rocket.Chat Cloud-konto her, giver det dig mulighed for at interagere med nogle tjenester som f.eks. Marketplace.",
+ "Cloud_workspace_support": "Hvis du har problemer med en cloud-tjenesten, skal du prøve at synkronisere først. Hvis problemet fortsætter, skal du åbne en supportbillet i Cloud Console.",
+ "Cloud_workspace_disconnect": "Hvis du ikke længere ønsker at bruge cloud-tjenesten, kan du afbryde dit arbejdsområde fra Rocket.Chat Cloud.",
"Cloud_login_to_cloud": "Log ind i Rocket.Chat Cloud",
+ "Cloud_logout": "Log ud af Rocket.Chat Cloud",
"Cloud_address_to_send_registration_to": "Den e-mailadresse, din Cloud-tilmelding skal sendes til.",
"Cloud_update_email": "Opdatér e-mail",
+ "Cloud_resend_email": "Gensend e-mail",
"Cloud_manually_input_token": "Indtast manuelt den token, der fulgte med Cloud-tilmeldingen.",
"Cloud_registration_required": "Tilmelding påkrævet",
"Cloud_registration_required_description": "Under konfigurationen valgte du tilsyneladende ikke at tilmelde din instans.",
"Cloud_registration_required_link_text": "Tryk her for at tilmelde din instans.",
"Cloud_error_in_authenticating": "Fejl i forbindelse med godkendelse",
"Cloud_error_code": "Kode: __errorCode__",
+ "Cloud_status_page_description": "Hvis en bestemt cloud-service har problemer, kan du tjekke for kendte problemer på vores statusside på",
+ "Cloud_Service_Agree_PrivacyTerms": "Cloud Service Agree PrivacyTerms",
+ "Cloud_troubleshooting": "Fejlfinding",
"Collaborative": "Samarbejde",
"Collapse_Embedded_Media_By_Default": "Skjul embedded media som standard",
"color": "Farve",
@@ -703,12 +746,14 @@
"Community": "Fællesskab",
"Compact": "Kompakt",
"Condensed": "kondenseret",
+ "Completed": "Fuldført",
"Computer": "Computer",
"Confirm_new_encryption_password": "Bekræft nyt krypteringskodeord",
"Confirm_password": "Bekræft dit kodeord",
"Connect": "Forbind",
"Connection_Closed": "Forbindelse lukket",
"Connection_Reset": "Forbindelsesnulstilling",
+ "Connectivity_Services": "Connectivity Services",
"Consulting": "Rådgivning",
"Consumer_Goods": "Forbrugsvarer",
"Contains_Security_Fixes": "Indeholder sikkerhedsrettelser",
@@ -719,16 +764,22 @@
"Conversation": "Samtale",
"Conversations": "Samtaler",
"Conversation_closed": "Konversation lukket: __comment__.",
+ "Conversation_closing_tags": "Afslutnings-tags for samtale",
+ "Conversation_closing_tags_description": "Afslutnings-tags tildeles automatisk til samtaler ved lukning.",
+ "Conversation_finished": "Samtale afsluttet",
"Conversation_finished_message": "Konversation Færdig Besked",
+ "Conversation_finished_text": "Afslutningstekst for samtale",
"Conversations_per_day": "Samtaler pr. dag",
"conversation_with_s": "samtalen med %s",
"Convert_Ascii_Emojis": "Konverter ASCII til emoji",
"Copied": "kopieret",
"Copy": "Kopi",
+ "Copy_text": "Kopier tekst",
"Copy_to_clipboard": "Kopier til udklipsholder",
"COPY_TO_CLIPBOARD": "KOPIER TIL UDKLIPSHOLDER",
"could-not-access-webdav": "Kunne ikke tilgå WebDAV",
"Count": "Tælle",
+ "Counters": "Tællere",
"Country": "Land",
"Country_Afghanistan": "Afghanistan",
"Country_Albania": "Albanien",
@@ -975,24 +1026,34 @@
"create-c_description": "Tilladelse til at oprette offentlige kanaler",
"create-d": "Opret direkte beskeder",
"create-d_description": "Tilladelse til at starte direkte meddelelser",
+ "create-invite-links": "Opret invitations-links",
+ "create-invite-links_description": "Tilladelse til at oprette invitations-link til kanaler",
"create-p": "Opret private kanaler",
"create-p_description": "Tilladelse til at oprette private kanaler",
+ "create-personal-access-tokens": "Opret personlige adgangs-tokens",
"create-user": "Opret bruger",
"create-user_description": "Tilladelse til at oprette brugere",
"Create_A_New_Channel": "Opret en ny kanal",
"Create_new": "Lav ny",
"Create_unique_rules_for_this_channel": "Opret unikke regler for denne kanal",
+ "Created": "Oprettet",
"Created_at": "Oprettet på",
+ "Created_by": " Oprettet af",
+ "Created_as": "Oprettet som",
"Created_at_s_by_s": "Oprettet på %s ved %s",
"Created_at_s_by_s_triggered_by_s": "Oprettet på %s ved %s udløst af %s",
"CRM_Integration": "CRM Integration",
+ "CROWD_Allow_Custom_Username": "Tillad brugerdefineret brugernavn i Rocket.Chat",
"CROWD_Reject_Unauthorized": "Afvis Uautoriseret",
"Crowd_sync_interval_Description": "Intervallet mellem synkroniseringer. Eksempel \"hver 24. time\" eller \"på den første dag i ugen\", flere eksempler på [Cron Text Parser] (http://bunkat.github.io/later/parsers.html#text)",
"Current_Chats": "Nuværende Chats",
+ "Current_File": "Nuværende fil",
+ "Current_Import_Operation": "Aktuel importhandling",
"Current_Status": "Nuværende status",
"Custom": "Brugerdefinerede",
"Custom CSS": "Brugerdefineret CSS",
"Custom_agent": "Brugerdefineret agent",
+ "Custom_dates": "Brugerdefinerede datoer",
"Custom_emoji": "Brugerdefinerede emojier",
"Custom_Emoji": "Brugerdefinerede emojier",
"Custom_Emoji_Add": "Tilføj ny emoji",
@@ -1008,9 +1069,14 @@
"Custom_oauth_unique_name": "Brugerdefineret oauth-unikt navn",
"Custom_Scripts": "Brugerdefinerede scripts",
"Custom_Script_Logged_In": "Brugerdefineret script til logget ind brugere",
+ "Custom_Script_Logged_In_Description": "Brugerdefineret script der ALTID kører og for ENHVER bruger der er logget ind. (F.eks. hver gang du går ind i chatten og du er logget ind)",
"Custom_Script_Logged_Out": "Brugerdefineret script til logget ud brugere",
+ "Custom_Script_Logged_Out_Description": "Brugerdefineret script der ALTID kører og for ENHVER bruger der IKKE er logget ind. (F.eks. hver gang du kommer til login-siden)",
+ "Custom_Script_On_Logout": "Brugerdefineret script til Logout Flow",
+ "Custom_Script_On_Logout_Description": "Brugerdefineret script, der KUN kører ved udførslen af Logout-flowet",
"Custom_Sound_Add": "Tilføj tilpasset lyd",
"Custom_Sound_Delete_Warning": "Sletning af en lyd kan ikke fortrydes.",
+ "Custom_Sound_Edit": "Tilpas brugerdefineret lyd",
"Custom_Sound_Error_Invalid_Sound": "Ugyldig lyd",
"Custom_Sound_Error_Name_Already_In_Use": "Det brugerdefinerede lydnavn er allerede i brug.",
"Custom_Sound_Has_Been_Deleted": "Den brugerdefinerede lyd er blevet slettet.",
@@ -1019,19 +1085,49 @@
"Custom_Sounds": "Brugerdefinerede lyde",
"Custom_Translations": "Brugerdefinerede oversættelser",
"Custom_Translations_Description": "Skal være et gyldigt JSON, hvor nøgler er sprog, der indeholder en ordbog med nøgle og oversættelser. Eksempel: {\n\"en\": {\n\"Kanaler\": \"Værelser\"\n},\n\"pt\": {\n\"Kanaler\": \"Salas\"\n}\n}",
+ "Custom_User_Status": "Tilpasset brugerstatus",
+ "Custom_User_Status_Edit": "Redigér tilpasset brugerstatus",
+ "Custom_User_Status_Add": "Tilføj brugerdefineret brugerstatus",
+ "Custom_User_Status_Added_Successfully": "Tilpasset brugerstatus blev tilføjet med succes",
+ "Custom_User_Status_Delete_Warning": "Sletning af en brugerdefineret brugerstatus kan ikke fortrydes.",
+ "Custom_User_Status_Error_Invalid_User_Status": "Ugyldig brugerstatus",
+ "Custom_User_Status_Error_Name_Already_In_Use": "Det brugerdefinerede brugerstatusnavn er allerede i brug.",
+ "Custom_User_Status_Has_Been_Deleted": "Den brugerdefinerede brugerstatus er blevet slettet",
+ "Custom_User_Status_Info": "Tilpasset brugerstatus-info",
+ "Custom_User_Status_Updated_Successfully": "Brugerdefineret brugerstatus blev tilføjet med succes",
"Customize": "Tilpas",
"CustomSoundsFilesystem": "Custom Sounds Filesystem",
"Dashboard": "instrumentbræt",
+ "Data_processing_consent_text": "Tekst om samtykke til databehandling",
+ "Data_processing_consent_text_description": "Brug denne indstilling til at forklare, at du kan indsamle, gemme og behandle kundens personlige oplysninger under samtalen.",
"Date": "Dato",
"Date_From": "Fra",
"Date_to": "til",
"days": "dage",
+ "Days": "Dage",
"DB_Migration": "Database Migration",
"DB_Migration_Date": "Database Migrationsdato",
+ "DDP_Rate_Limit_IP_Enabled": "Begrænsning via IP: Aktiveret",
+ "DDP_Rate_Limit_IP_Requests_Allowed": "Begræns efter IP: anmodninger tilladt",
+ "DDP_Rate_Limit_IP_Interval_Time": "Begræns efter IP: intervaltid",
+ "DDP_Rate_Limit_User_Enabled": "Begræns efter bruger: aktiveret",
+ "DDP_Rate_Limit_User_Requests_Allowed": "Begræns efter bruger: anmodninger tilladt",
+ "DDP_Rate_Limit_User_Interval_Time": "Begræns efter bruger: intervaltid",
+ "DDP_Rate_Limit_Connection_Enabled": "Begræns efter forbindelse: aktiveret",
+ "DDP_Rate_Limit_Connection_Requests_Allowed": "Begræns efter forbindelse: anmodninger tilladt",
+ "DDP_Rate_Limit_Connection_Interval_Time": "Begræns efter forbindelse: intervaltid",
+ "DDP_Rate_Limit_User_By_Method_Enabled": "Begræns efter bruger pr. metode: aktiveret",
+ "DDP_Rate_Limit_User_By_Method_Requests_Allowed": "Begræns efter bruger pr. metode: anmodninger tilladt",
+ "DDP_Rate_Limit_User_By_Method_Interval_Time": "Begræns efter bruger pr. metode: intervaltid",
+ "DDP_Rate_Limit_Connection_By_Method_Enabled": "Begræns efter forbindelse pr. metode: aktiveret",
+ "DDP_Rate_Limit_Connection_By_Method_Requests_Allowed": "Begræns efter forbindelse pr. metode: anmodninger tilladt",
+ "DDP_Rate_Limit_Connection_By_Method_Interval_Time": "Begræns efter forbindelse pr. metode: intervaltid",
"Deactivate": "Deaktiver",
"Decline": "Afslå",
+ "Decode_Key": "Afkodningsnøgle",
"Default": "Standard",
"Delete": "Slet",
+ "Delete_all_closed_chats": "Slet alle lukkede chats",
"delete-c": "Slet offentlige kanaler",
"delete-c_description": "Tilladelse til at slette offentlige kanaler",
"delete-d": "Slet direkte meddelelser",
@@ -1063,10 +1159,16 @@
"Desktop_Notifications_Duration": "Varighed af skrivebordsmeddelelser",
"Desktop_Notifications_Duration_Description": "Antal sekunder, som skrivebordsnotifikationer skal vises i. Dette kan påvirke OS X Notification Center. Hvis du vælger 0, bruges browserens standardindstillinger og OS X Notification Center påvirkes ikke.",
"Desktop_Notifications_Enabled": "Desktop Notifications er aktiveret",
+ "Desktop_Notifications_Not_Enabled": "Desktop-meddelelser er ikke aktiveret",
+ "Details": "Detaljer",
"Different_Style_For_User_Mentions": "Forskellige stil til bruger nævner",
+ "Direct_message_creation_description": "Du er ved at oprette en chat med flere brugere. Tilføj dem du gerne vil tale med, alle på samme sted ved hjælp af direkte beskeder.",
+ "Direct_message_you_have_joined": "Du har sluttet dig til en ny direkte besked med",
"Direct_message_someone": "Direkte besked nogen",
+ "Direct_Message": "Direkte besked",
"Direct_Messages": "Direkte meddelelser",
"Direct_Reply": "Direkte svar",
+ "Direct_Reply_Advice": "Du kan svare direkte på denne e-mail. Ændre ikke tidligere e-mails i tråden.",
"Direct_Reply_Debug": "Fejlsøg Direkte Svar",
"Direct_Reply_Debug_Description": "[Pas på] Aktivering af debug-tilstand vil vise din 'Almindelig tekstadgangskode' i administrationskonsollen.",
"Direct_Reply_Delete": "Slet opsnappede e-mails",
@@ -1086,12 +1188,26 @@
"Disable_Facebook_integration": "Deaktiver Facebook integration",
"Disable_Notifications": "Deaktiver notifikationer",
"Disable_two-factor_authentication": "Deaktiver tofaktorgodkendelse",
+ "Disable_two-factor_authentication_email": "Deaktiver to-faktor-godkendelse via e-mail",
"Disabled": "Handicappet",
"Disallow_reacting": "Tillade Reagering",
"Disallow_reacting_Description": "Tillader ikke at reagere",
+ "Disconnect": "Afbryd",
"Display_offline_form": "Vis offline formular",
+ "Display_setting_permissions": "Vis tilladelser til at ændre indstillinger",
+ "Display_chat_permissions": "Vis chat tilladelser",
"Display_unread_counter": "Vis antal ulæste meddelelser",
"Displays_action_text": "Viser handlingstekst",
+ "Discussion_name": "Diskussionsnavn",
+ "Discussion": "Diskussion",
+ "Discussions": "Diskussioner",
+ "Discussion_start": "Start en diskussion",
+ "Discussion_target_channel_description": "Vælg en kanal der er relateret til det du vil spørge om",
+ "Discussion_target_channel_prefix": "Du opretter en diskussion i",
+ "Discussion_target_channel": "Overordnet kanal eller gruppe",
+ "discussion-created": "__message__",
+ "Discussion_first_message_title": "Din besked",
+ "Discussion_title": "Opret en ny diskussion",
"Dont_ask_me_again": "Spørg mig ikke igen!",
"Dont_ask_me_again_list": "Spørg mig ikke igen listen",
"Do_not_display_unread_counter": "Vis ikke nogen disk af denne kanal",
@@ -1103,16 +1219,24 @@
"Domain_removed": "Domæne fjernet",
"Domains": "domæner",
"Domains_allowed_to_embed_the_livechat_widget": "Kommasepareret liste over domæner tilladt at integrere livechat-widgeten. Lad være tomt for at tillade alle domæner.",
+ "Downloading_file_from_external_URL": "Downloader fil fra ekstern URL",
+ "Download_Info": "Download Info",
"Download_My_Data": "Download mine data",
+ "Download_Pending_Files": "Download afventende filer",
"Download_Snippet": "Hent",
+ "Do_not_provide_this_code_to_anyone": "Giv ikke denne kode til nogen.",
"Drop_to_upload_file": "Drop for at uploade filen",
"Dry_run": "Tørt løb",
"Dry_run_description": "Sender kun en e-mail til samme adresse som i Fra. E-mailen skal tilhøre en gyldig bruger.",
+ "duplicated-account": "Konto-duplet",
"Duplicate_archived_channel_name": "Der findes en arkiveret kanal med navnet `#%s '",
"Duplicate_archived_private_group_name": "Der findes en arkiveret privat gruppe med navnet '%s'",
"Duplicate_channel_name": "Der findes en kanal med navnet '%s'",
+ "Duplicated_Email_address_will_be_ignored": "Duplikeret e-mail-adresse ignoreres.",
"Duplicate_private_group_name": "Der findes en privat gruppe med navn '%s'",
"Duration": "Varighed",
+ "E2E Encryption": "E2E-kryptering",
+ "E2E_Enabled": "E2E aktiveret",
"Edit": "Rediger",
"edit-message": "Rediger besked",
"edit-message_description": "Tilladelse til at redigere en besked i et rum",
@@ -1178,11 +1302,12 @@
"Entertainment": "Underholdning",
"Error": "Fejl",
"error-action-not-allowed": "__action__ er ikke tilladt",
+ "error-agent-offline": "Agent er offline",
"error-application-not-found": "Programmet blev ikke fundet",
"error-archived-duplicate-name": "Der er en arkiveret kanal med navnet '__room_name__'",
"error-avatar-invalid-url": "Ugyldig avatar URL: __url__",
"error-avatar-url-handling": "Fejl under håndtering af avatarindstilling fra en URL (__url__) til __username__",
- "error-cant-invite-for-direct-room": "Kan ikke invitere bruger til at lede værelser",
+ "error-cant-invite-for-direct-room": "Kan ikke invitere bruger til direkte rum",
"error-channels-setdefault-is-same": "Standardindstillingen for kanal er den samme som den, der ville blive ændret til.",
"error-channels-setdefault-missing-default-param": "BodyParam 'standard' er påkrævet",
"error-could-not-change-email": "Kunne ikke ændre e-mail",
@@ -1293,7 +1418,7 @@
"External_Service": "Ekstern service",
"Facebook_Page": "Facebook side",
"False": "Falsk",
- "Favorite_Rooms": "Aktivér foretrukne værelser",
+ "Favorite_Rooms": "Aktivér foretrukne rum",
"Favorite": "Favorit",
"Favorites": "Foretrukne",
"Feature_Depends_on_Livechat_Visitor_navigation_as_a_message_to_be_enabled": "Denne funktion afhænger af \"Send besøgendes navigationshistorik som en besked\" for at være aktiveret.",
@@ -1424,6 +1549,7 @@
"GoogleVision_Type_Similar": "Søg Lignende billeder",
"Government": "Regering",
"Group_by_Type": "Gruppe efter type",
+ "Group_discussions": "Gruppediskussioner",
"Group_favorites": "Gruppefavoritter",
"Group_mentions_disabled_x_members": "Gruppebenævnelserne \"@all\" og \"@here\" er blevet deaktiveret for rum med mere end __total__ medlemmer.",
"Group_mentions_only": "Gruppen nævner kun",
@@ -1439,7 +1565,7 @@
"Hide_counter": "Skjul tæller",
"Hide_flextab": "Skjul højre sidepanel med klik",
"Hide_Group_Warning": "Er du sikker på, at du vil skjule gruppen \"%s\"?",
- "Hide_Livechat_Warning": "Er du sikker på at du vil skjule livechat med \"%s\"?",
+ "Hide_Livechat_Warning": "Er du sikker på at du vil skjule chatten med \"%s\"?",
"Hide_Private_Warning": "Er du sikker på, at du vil skjule diskussionen med \"%s\"?",
"Hide_roles": "Skjul roller",
"Hide_room": "Skjul Værelse",
@@ -1604,7 +1730,7 @@
"IRC_Channel_Leave": "Output af DEL kommandoen.",
"IRC_Channel_Users": "Output af kommandoen NAMES.",
"IRC_Channel_Users_End": "Slutningen af udgangen af kommandoen NAMES.",
- "IRC_Description": "Internet Relay Chat (IRC) er et tekstbaseret gruppe kommunikationsværktøj. Brugere deltager i unikt navngivne kanaler eller værelser til åben diskussion. IRC understøtter også private meddelelser mellem individuelle brugere og fildelingsfunktioner. Denne pakke integrerer disse lag af funktionalitet med Rocket.Chat.",
+ "IRC_Description": "Internet Relay Chat (IRC) er et tekstbaseret gruppe kommunikationsværktøj. Brugere deltager i unikt navngivne kanaler eller rum til åben diskussion. IRC understøtter også private meddelelser mellem individuelle brugere og fildelingsfunktioner. Denne pakke integrerer disse lag af funktionalitet med Rocket.Chat.",
"IRC_Enabled": "Forsøg på at integrere IRC-support. Hvis du ændrer denne værdi, skal du genstarte Rocket.Chat.",
"IRC_Enabled_Alert": "IRC Support er et igangværende arbejde. Anvendelse på et produktionssystem anbefales ikke på nuværende tidspunkt.",
"IRC_Federation": "IRC Federation",
@@ -1630,6 +1756,7 @@
"italic": "Kursiv",
"italics": "kursiv",
"Mobex_sms_gateway_from_number": "Fra",
+ "Mobex_sms_gateway_from_number_desc": "Oprindelig adresse/telefonnummer når du sender en ny SMS til Livechat-klient",
"Mobex_sms_gateway_password": "Adgangskode",
"Mobex_sms_gateway_username": "Brugernavn",
"Jitsi_Chrome_Extension": "Chrome-udvidelses-id",
@@ -1777,7 +1904,7 @@
"leave-p": "Forlad private grupper",
"Leave": "Forlad",
"Leave_Group_Warning": "Er du sikker på, at du vil forlade gruppen \"%s\"?",
- "Leave_Livechat_Warning": "Er du sikker på at du vil forlade livechat med \"%s\"?",
+ "Leave_Livechat_Warning": "Er du sikker på at du vil forlade Omnichannel'en med \"%s\"?",
"Leave_Private_Warning": "Er du sikker på at du vil forlade diskussionen med \"%s\"?",
"Leave_room": "Forlad plads",
"Leave_Room_Warning": "Er du sikker på at du vil forlade rummet \"%s\"?",
@@ -1790,7 +1917,9 @@
"Livechat_agents": "Livechat agenter",
"Livechat_Agents": "Agenter",
"Livechat_AllowedDomainsList": "Livechat Tilladte Domæner",
+ "Livechat_Appearance": "Livechat-udseende",
"Livechat_Dashboard": "Livechat Dashboard",
+ "Livechat_DepartmentOfflineMessageToChannel": "Send denne afdelings Livechat offline-meddelelser til en kanal",
"Livechat_enabled": "Livechat aktiveret",
"Livechat_Facebook_API_Key": "OmniChannel API nøgle",
"Livechat_Facebook_API_Secret": "OmniChannel API Secret",
@@ -1799,9 +1928,11 @@
"Livechat_forward_open_chats_timeout": "Timeout (i sekunder) for at videresende chat",
"Livechat_guest_count": "Gæstetæller",
"Livechat_Inquiry_Already_Taken": "Livechat forespørgsel allerede taget",
+ "Livechat_Installation": "Livechat-installation",
"Livechat_managers": "Livechat-ledere",
"Livechat_offline": "Livechat offline",
"Livechat_online": "Livechat online",
+ "Livechat_OfflineMessageToChannel_enabled": "Send Livechat offline-beskeder til en kanal",
"Livechat_offline_message_sent": "Besked om offline livechat sendt",
"Livechat_Queue": "Livechat kø",
"Livechat_registration_form": "Tilmeldingsblanket",
@@ -1812,6 +1943,7 @@
"Livechat_title": "Livechat Titel",
"Livechat_title_color": "Livechat Titel Baggrundsfarve",
"Livechat_transcript_sent": "Livechat-afskrift sendt",
+ "Livechat_Triggers": "Livechat-triggers",
"Livechat_Users": "Livechat-brugere",
"LiveStream & Broadcasting": "Livestream og udsendelse",
"Livestream_close": "Luk Livestream",
@@ -2037,6 +2169,7 @@
"New_Department": "Ny afdeling",
"New_integration": "Ny integration",
"New_line_message_compose_input": "`%s` - Ny linje i meddelelsen komponerer input",
+ "New_Livechat_offline_message_has_been_sent": "En ny Livechat-offline-meddelelse er sendt",
"New_logs": "Nye logfiler",
"New_Message_Notification": "Ny meddelelsesmeddelelse",
"New_messages": "Nye meddelelser",
@@ -2071,6 +2204,7 @@
"No_snippet_messages": "Ingen uddrag",
"No_starred_messages": "Ingen stjernemarkerede meddelelser",
"No_such_command": "Ingen sådan kommando: `/ __command__`",
+ "No_discussions_yet": "Der er endnu ingen diskussioner",
"No_user_with_username_%s_was_found": "Ingen bruger med brugernavn \"%s\" blev fundet!",
"Nobody_available": "Ingen tilgængelig",
"Node_version": "Node Version",
@@ -2422,7 +2556,7 @@
"Room_type_of_default_rooms_cant_be_changed": "Dette er et standardrum, og typen kan ikke ændres. Kontakt venligst din administrator.",
"Room_unarchived": "Værelse unarchived",
"Room_uploaded_file_list_empty": "Ingen tilgængelige filer.",
- "Rooms": "Værelser",
+ "Rooms": "Rum",
"run-import": "Kør import",
"run-import_description": "Tilladelse til at køre importørerne",
"run-migration": "Kør migrering",
@@ -2624,20 +2758,20 @@
"Stats_Avg_Channel_Users": "Gennemsnitlige kanalbrugere",
"Stats_Avg_Private_Group_Users": "Gennemsnitlig Privat Gruppe Brugere",
"Stats_Away_Users": "Væk brugere",
- "Stats_Max_Room_Users": "Max værelser brugere",
+ "Stats_Max_Room_Users": "Maksimalt antal rum-brugere",
"Stats_Non_Active_Users": "Inaktive brugere",
"Stats_Offline_Users": "Offline brugere",
"Stats_Online_Users": "Online brugere",
"Stats_Total_Channels": "Samlede kanaler",
- "Stats_Total_Direct_Messages": "Antal direkte besked værelser",
- "Stats_Total_Livechat_Rooms": "I alt Livechat værelser",
+ "Stats_Total_Direct_Messages": "Direkte besked-rum i alt",
+ "Stats_Total_Livechat_Rooms": "Omnikanaler-rum i alt",
"Stats_Total_Messages": "Samlede meddelelser",
"Stats_Total_Messages_Channel": "Samlede meddelelser i kanaler",
"Stats_Total_Messages_Direct": "Samlet antal beskeder i direkte beskeder",
"Stats_Total_Messages_Livechat": "Samlet antal beskeder i Livechats",
"Stats_Total_Messages_PrivateGroup": "Samlede meddelelser i private grupper",
"Stats_Total_Private_Groups": "I alt private grupper",
- "Stats_Total_Rooms": "Værelser i alt",
+ "Stats_Total_Rooms": "Rum i alt",
"Stats_Total_Users": "Samlede brugere",
"Status": "Status",
"Step": "Trin",
@@ -2746,7 +2880,7 @@
"Title_bar_color_offline": "Titellinjefarve offline",
"Title_offline": "Titel offline",
"To_additional_emails": "Til yderligere e-mails",
- "To_install_RocketChat_Livechat_in_your_website_copy_paste_this_code_above_the_last_body_tag_on_your_site": "For at installere Rocket.Chat Livechat på dit websted, kopier & Indsæt denne kode over det sidste < / body > tag på dit websted.",
+ "To_install_RocketChat_Livechat_in_your_website_copy_paste_this_code_above_the_last_body_tag_on_your_site": "For at installere Rocket.Chat Livechat på dit websted, kopier & Indsæt denne kode ovenover det sidste < / body > tag på dit websted.",
"to_see_more_details_on_how_to_integrate": "at se flere detaljer om integration.",
"To_users": "Til brugere",
"Toggle_original_translated": "Skift originalt / oversat",
@@ -2763,11 +2897,13 @@
"Tokens_Required_Input_Error": "Ugyldige typede tokens.",
"Tokens_Required_Input_Placeholder": "Tokens aktivnavne",
"Topic": "Emne",
+ "Total_Discussions": "Samlede antal diskussioner",
"Total_messages": "Samlede meddelelser",
"Tourism": "Turisme",
"Transcript_Enabled": "Spørg besøgende, hvis de gerne vil have en transskription efter chat lukket",
"Transcript_message": "Meddelelse at vise, når du spørger om transskription",
"Transcript_of_your_livechat_conversation": "Udskrift af din livechat samtale.",
+ "transfer-livechat-guest": "Overfør Livechat-gæster",
"Translated": "oversat",
"Translations": "Oversættelser",
"Travel_and_Places": "Rejse & Steder",
@@ -2776,6 +2912,8 @@
"Triggers": "triggers",
"True": "Sandt",
"Troubleshoot_Disable_Notifications": "Deaktiver notifikationer",
+ "Troubleshoot_Disable_Livechat_Activity_Monitor": "Deaktivér Livechat Activity Monitor",
+ "Troubleshoot_Disable_Livechat_Activity_Monitor_Alert": "Denne indstilling stopper behandlingen af Livechat-besøgendes sessioner, hvilket afholder statistikkerne fra at fungere korrekt!",
"Tuesday": "tirsdag",
"Turn_OFF": "Sluk",
"Turn_ON": "Tænde for",
@@ -2816,8 +2954,8 @@
"Unread_Count_DM": "Ulæst tælle til direkte beskeder",
"Unread_Messages": "Ulæste meddelelser",
"Unread_on_top": "Ulæst ovenpå",
- "Unread_Rooms": "Ulæste værelser",
- "Unread_Rooms_Mode": "Ulæste værelser-tilstand",
+ "Unread_Rooms": "Ulæste rum",
+ "Unread_Rooms_Mode": "Ulæste rum-tilstand",
"Unread_Tray_Icon_Alert": "Uread Tray Icon Alert",
"Unstar_Message": "Fjern stjerne",
"Update_your_RocketChat": "Opdater din Rocket.Chat",
@@ -2958,11 +3096,11 @@
"view-join-code_description": "Tilladelse til at se kanalens adgangskode",
"view-joined-room": "Se Tilsluttet Værelse",
"view-joined-room_description": "Tilladelse til at se de tilsluttede kanaler",
- "view-l-room": "Se Livechat værelser",
+ "view-l-room": "Se omnikanal-rum",
"view-l-room_description": "Tilladelse til at se livechat-kanaler",
"view-livechat-manager": "Se Livechat Manager",
"view-livechat-manager_description": "Tilladelse til at se andre livechat-ledere",
- "view-livechat-rooms": "Se Livechat værelser",
+ "view-livechat-rooms": "Se omnikanal-rum",
"view-livechat-rooms_description": "Tilladelse til at se andre livechat kanaler",
"view-logs": "Se logfiler",
"view-logs_description": "Tilladelse til at se serverlogfilerne",
@@ -2976,7 +3114,7 @@
"view-room-administration": "Vis Room-administration",
"view-room-administration_description": "Tilladelse til offentlig, privat og direkte beskedstatistik. Inkluderer ikke evnen til at se samtaler eller arkiver",
"view-statistics": "Se statistik",
- "view-statistics_description": "Tilladelse til at få vist systemstatistikker som antal brugere logget ind, antal værelser, operativsystemoplysninger",
+ "view-statistics_description": "Tilladelse til at få vist systemstatistikker som f.eks. antal brugere logget ind, antal rum og operativsystemoplysninger",
"view-user-administration": "Vis brugeradministration",
"view-user-administration_description": "Tilladelse til delvis, skrivebeskyttet listevisning af andre brugerkonti, der for øjeblikket er logget ind i systemet. Ingen brugerkontooplysninger er tilgængelige med denne tilladelse",
"View_All": "Se alle medlemmer",
diff --git a/packages/rocketchat-i18n/i18n/de.i18n.json b/packages/rocketchat-i18n/i18n/de.i18n.json
index 6de29f4bbc03..a61373a92b79 100644
--- a/packages/rocketchat-i18n/i18n/de.i18n.json
+++ b/packages/rocketchat-i18n/i18n/de.i18n.json
@@ -660,6 +660,7 @@
"Closing_chat": "Schließe Chat",
"Cloud": "Cloud",
"Cloud_Register_manually": "Manuell registrieren",
+ "Cloud_click_here": "Wechseln Sie nach dem Kopieren des Texts zur Cloud-Konsole. [Klicke hier](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "Nach Abschluss des Registrierungsvorgangs in der Cloud-Konsole, sollte ein Text angezeigt werden. Bitte hier einfügen, um die Registrierung abzuschließen.",
"Cloud_register_offline_helper": "Arbeitsbereiche können manuell registriert werden, wenn ein Airgap besteht oder der Netzwerkzugriff eingeschränkt ist. Kopieren Sie den folgenden Text und rufen Sie unsere Cloud-Konsole auf, um den Vorgang abzuschließen.",
"Cloud_register_success": "Ihr Arbeitsbereich wurde erfolgreich registriert!",
diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json
index ffc3965f6d9c..359c65494b51 100644
--- a/packages/rocketchat-i18n/i18n/en.i18n.json
+++ b/packages/rocketchat-i18n/i18n/en.i18n.json
@@ -3813,4 +3813,4 @@
"Your_server_link": "Your server link",
"Your_temporary_password_is_password": "Your temporary password is [password].",
"Your_workspace_is_ready": "Your workspace is ready to use 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/es.i18n.json b/packages/rocketchat-i18n/i18n/es.i18n.json
index ab29e482610c..ced2c87ada50 100644
--- a/packages/rocketchat-i18n/i18n/es.i18n.json
+++ b/packages/rocketchat-i18n/i18n/es.i18n.json
@@ -685,6 +685,7 @@
"Closed_by_visitor": "Cerrado por el visitante",
"Closing_chat": "Cerrando chat",
"Cloud_Register_manually": "Registrar manualmente",
+ "Cloud_click_here": "Después de copiar el texto, ve a la consola Cloud. [Haga clic aquí](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "Después de completar el proceso de registro en la Cloud Console se le presentará un texto. Por favor, pégalo aquí para terminar el registro.",
"Cloud_register_offline_helper": "Los espacios de trabajo pueden registrarse manualmente si el acceso a la red está restringido. Copia el texto de abajo y ve a nuestra Cloud Console para completar el proceso.",
"Cloud_register_success": "¡Su espacio de trabajo ha sido registrado correctamente!",
diff --git a/packages/rocketchat-i18n/i18n/fa.i18n.json b/packages/rocketchat-i18n/i18n/fa.i18n.json
index 56e0c9601bfc..26812875cf77 100644
--- a/packages/rocketchat-i18n/i18n/fa.i18n.json
+++ b/packages/rocketchat-i18n/i18n/fa.i18n.json
@@ -661,6 +661,7 @@
"Closing_chat": "در حال بستن چت",
"Cloud": "ابر",
"Cloud_Register_manually": "ثبت دستی",
+ "Cloud_click_here": "پس از کپی کردن متن ، به کنسول ابری بروید. [اینجا کلیک کنید](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "پس از اتمام مراحل ثبت نام در بسترCloud ، باید متنی برای شما ارائه شود. لطفاً برای پایان ثبت نام آن را در اینجا جایگذاری کنید.",
"Cloud_register_offline_helper": "در صورت محدود بودن دسترسی به شبکه ، می توان مکان های کاری را به صورت دستی ثبت کرد. متن را کپی کنید و برای تکمیل مراحل به کنسول Cloud ما بروید.",
"Cloud_register_success": "فضای کاری شما با موفقیت ثبت شده است!",
diff --git a/packages/rocketchat-i18n/i18n/fr.i18n.json b/packages/rocketchat-i18n/i18n/fr.i18n.json
index a5e308554202..5d55d87dd879 100644
--- a/packages/rocketchat-i18n/i18n/fr.i18n.json
+++ b/packages/rocketchat-i18n/i18n/fr.i18n.json
@@ -3094,4 +3094,4 @@
"Your_question": "Votre question",
"Your_server_link": "Le lien de votre serveur",
"Your_workspace_is_ready": "Votre espace de travail est prêt à l'emploi 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/hr.i18n.json b/packages/rocketchat-i18n/i18n/hr.i18n.json
index 34be45dec63a..d694fd7d1f9e 100644
--- a/packages/rocketchat-i18n/i18n/hr.i18n.json
+++ b/packages/rocketchat-i18n/i18n/hr.i18n.json
@@ -2978,4 +2978,4 @@
"Your_push_was_sent_to_s_devices": "Push obavijest je poslana %s uređaje",
"Your_server_link": "Veza poslužitelja",
"Your_workspace_is_ready": "Radni je prostor spreman za upotrebu 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/hu.i18n.json b/packages/rocketchat-i18n/i18n/hu.i18n.json
index 974b45e77107..12807237aa57 100644
--- a/packages/rocketchat-i18n/i18n/hu.i18n.json
+++ b/packages/rocketchat-i18n/i18n/hu.i18n.json
@@ -3354,4 +3354,4 @@
"Your_question": "Kérdésed",
"Your_server_link": "A szerver linkje",
"Your_workspace_is_ready": "A munkaterület készen áll a 🎉 használatára"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/ja.i18n.json b/packages/rocketchat-i18n/i18n/ja.i18n.json
index 0c7a6a5138a0..ea87247903fa 100644
--- a/packages/rocketchat-i18n/i18n/ja.i18n.json
+++ b/packages/rocketchat-i18n/i18n/ja.i18n.json
@@ -233,6 +233,7 @@
"MAU_value": "MAU __value__",
"Activity": "アクティビティ順",
"Add": "追加",
+ "Add_custom_emoji": "カスタム絵文字を追加",
"add-oauth-service": "OAuthサービスを追加する",
"add-oauth-service_description": "新しいOAuthサービスを追加する権限",
"add-user": "ユーザーを追加する",
@@ -386,6 +387,7 @@
"App_user_not_allowed_to_login": "アプリユーザーは直接ログインできません。",
"Appearance": "表示設定",
"Application_added": "アプリケーションを追加しました",
+ "Application_delete_warning": "このアプリケーションを回復することはできません!",
"Application_Name": "アプリケーション名",
"Application_updated": "アプリケーションを更新しました",
"Apply": "適用します",
@@ -408,9 +410,13 @@
"Apps_Marketplace_Login_Required_Title": "マーケットプレイスへのログインが必要",
"Apps_Marketplace_Login_Required_Description": "Rocket.Chatマーケットプレースからアプリを購入するには、ワークスペースを登録してログインする必要があります。",
"Apps_Marketplace_pricingPlan_monthly": "__price__ / 月",
+ "Apps_Marketplace_pricingPlan_startingAt_monthly": "__price__ /月から",
"Apps_Marketplace_pricingPlan_monthly_perUser": "__price__ / 月 (ユーザ1人あたり)",
+ "Apps_Marketplace_pricingPlan_startingAt_monthly_perUser": "ユーザーあたり__price__ /月から",
"Apps_Marketplace_pricingPlan_yearly": "__price__ / 年",
+ "Apps_Marketplace_pricingPlan_startingAt_yearly": "__price__ /年から",
"Apps_Marketplace_pricingPlan_yearly_perUser": "__price__ / 年 (ユーザ1人あたり)",
+ "Apps_Marketplace_pricingPlan_startingAt_yearly_perUser": "ユーザーあたり__price__ /年から",
"Apps_Settings": "アプリの設定",
"Apps_User_Already_Exists": "ユーザー名「__username__」は既に使用されています。このアプリをインストールするためにそれを使用しているユーザーの名前を変更または削除します",
"Apps_WhatIsIt": "アプリ: これらは何ですか?",
@@ -674,6 +680,7 @@
"Clear_filters": "フィルターをクリア",
"clear_history": "履歴をクリア",
"Click_here": "ここをクリック",
+ "Click_here_for_more_details_or_contact_sales_for_a_new_license": "ここをクリックして詳細を確認するか、__email__に連絡して新しいライセンスを取得してください。",
"Click_here_for_more_info": "詳細はこちら",
"Click_here_to_enter_your_encryption_password": "暗号化パスワードを入力するにはここをクリックしてください",
"Click_here_to_view_and_copy_your_password": "パスワードを表示してコピーするには、ここをクリックしてください。",
@@ -698,6 +705,7 @@
"Closing_chat": "閉じるチャット",
"Cloud": "クラウド",
"Cloud_Register_manually": "手動で登録する",
+ "Cloud_click_here": "テキストをコピーしたら、クラウドコンソールに移動します。 [ここをクリック](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "Cloud Consoleで登録プロセスを完了すると、テキストが表示されます。ここに貼り付けて登録を完了してください。",
"Cloud_register_offline_helper": "エアギャップまたはネットワークアクセスが制限されている場合、ワークスペースを手動で登録できます。以下のテキストをコピーし、クラウドコンソールに移動してプロセスを完了します。",
"Cloud_register_success": "ワークスペースが正常に登録されました!",
@@ -1029,6 +1037,8 @@
"Create_unique_rules_for_this_channel": "このチャンネルのユニークなルールを作成する",
"Created": "作成した",
"Created_at": "作成日時",
+ "Created_by": "作成:",
+ "Created_as": "作成:",
"Created_at_s_by_s": "作成日時 %s by %s",
"Created_at_s_by_s_triggered_by_s": "%sにおいて、%sが作成 (%sがトリガー)",
"CRM_Integration": "CRM統合",
@@ -1065,6 +1075,7 @@
"Custom_Script_On_Logout_Description": "ログアウトフローのみで実行されるカスタムスクリプト",
"Custom_Sound_Add": "カスタムサウンドを追加する",
"Custom_Sound_Delete_Warning": "サウンドを削除すると元に戻すことはできません。",
+ "Custom_Sound_Edit": "カスタムサウンドの編集",
"Custom_Sound_Error_Invalid_Sound": "無効なサウンド",
"Custom_Sound_Error_Name_Already_In_Use": "カスタムサウンド名はすでに使用されています。",
"Custom_Sound_Has_Been_Deleted": "カスタムサウンドが削除されました。",
@@ -1074,6 +1085,7 @@
"Custom_Translations": "カスタム翻訳",
"Custom_Translations_Description": "キーが言語で値に翻訳の辞書を含む有効なJSONである必要があります。例: {\n \"en\": {\n \"Channels\": \"Rooms\"\n },\n \"ja\": {\n \"Channels\": \"部屋\"\n }\n}",
"Custom_User_Status": "カスタムユーザステータス",
+ "Custom_User_Status_Edit": "カスタムユーザーステータスの編集",
"Custom_User_Status_Add": "カスタムユーザーステータスを追加",
"Custom_User_Status_Added_Successfully": "カスタムユーザステータスが正常に追加されました",
"Custom_User_Status_Delete_Warning": "カスタムユーザステータスを削除すると元に戻すことはできません。",
@@ -1238,6 +1250,7 @@
"E2E_password_request_text": "暗号化されたプライベートグループとダイレクトメッセージにアクセスするには、暗号化パスワードを入力します。 キーがサーバーに保存されていないため、使用するすべてのクライアントでメッセージをエンコード/デコードするには、このパスワードを入力する必要があります。",
"E2E_Reset_Key_Explanation": "このオプションは、現在のE2Eキーを削除してログアウトします。 再度ログインすると、Rocket.Chatは新しいキーを生成し、1人以上のメンバーがオンラインになっている暗号化されたルームへのアクセスを復元します。 E2E暗号化の性質により、Rocket.Chatは、メンバーがオンラインになっていない暗号化された部屋へのアクセスを復元することはできません。",
"Edit": "編集",
+ "Edit_User": "ユーザーの編集",
"Edit_Invite": "招待を編集",
"Edit_Status": "ステータスを編集",
"edit-message": "メッセージの編集",
@@ -1288,6 +1301,7 @@
"email_style_description": "ネストされたセレクタを避ける",
"Email_verified": "メールアドレスは検証済みです",
"email_plain_text_only": "プレーンテキストのメールのみを送信する",
+ "Emails_sent_successfully!": "メールが正常に送信されました!",
"Emoji": "絵文字",
"Emoji_provided_by_JoyPixels": "絵文字提供:JoyPixels",
"EmojiCustomFilesystem": "カスタム絵文字ファイルシステム",
@@ -1412,6 +1426,7 @@
"error-unpinning-message": "メッセージの固定を解除できませんでした",
"error-push-disabled": "プッシュが無効になっています",
"error-remove-last-owner": "これは最後の所有者です。これを削除する前に、新しい所有者を設定してください。",
+ "error-returning-inquiry": "キューに問い合わせを返すときにエラーが発生しました",
"error-tags-must-be-assigned-before-closing-chat": "チャットを閉じる前にタグを割り当てる必要があります",
"error-role-in-use": "ロールは使用中のため削除できません",
"error-role-name-required": "ロール名は必須です",
@@ -1459,6 +1474,7 @@
"Everyone_can_access_this_channel": "誰もがこのチャンネルにアクセスできます",
"Exact": "正確",
"Example_s": "例: %s",
+ "Example_payload": "ペイロードの例",
"Exclude_Botnames": "ボットを除外する",
"Exclude_Botnames_Description": "上記の正規表現に一致する名前のボットからメッセージを伝播しないでください。空のままにすると、ボットのすべてのメッセージが伝播されます。",
"Exclude_pinned": "ピン留めされたメッセージを除外する",
@@ -1576,6 +1592,10 @@
"FileUpload_Webdav_Upload_Folder_Path_Description": "ファイルをアップロードするWebDAVフォルダパス",
"FileUpload_Webdav_Server_URL": "WebDAVサーバーのアクセスURL",
"Force_Disable_OpLog_For_Cache": "キャッシュのOpLogを強制的に無効にする",
+ "Force_Screen_Lock": "画面ロックを強制する",
+ "Force_Screen_Lock_description": "有効にすると、ユーザーは強制的に PIN / BIOMETRY / FACEID を使用してアプリのロックを解除できます。",
+ "Force_Screen_Lock_After": "後で画面ロックを強制する",
+ "Force_Screen_Lock_After_description": "最後のセッションの終了後に再度パスワードを要求する時間(秒単位)。",
"FileUpload_Webdav_Username": "WebDAVユーザー名",
"Force_Disable_OpLog_For_Cache_Description": "使用可能な場合でもOpLogを使用してキャッシュを同期させません",
"FileUpload_Webdav_Password": "WebDAVパスワード",
@@ -1827,6 +1847,8 @@
"Integration_Incoming_WebHook": "Incoming WebHook サービス連携",
"Integration_New": "新しいサービス連携",
"Integration_Outgoing_WebHook": "Outgoing WebHook サービス連携",
+ "Integration_Delete_Warning": "統合を削除すると、元に戻すことはできません。",
+ "Webhook_Details": "WebHookの詳細",
"Integration_Outgoing_WebHook_History": "発信WebHook統合履歴",
"Integration_Outgoing_WebHook_History_Data_Passed_To_Trigger": "統合に渡されたデータ",
"Integration_Outgoing_WebHook_History_Data_Passed_To_URL": "URLに渡されたデータ",
@@ -2133,6 +2155,7 @@
"Livechat_AllowedDomainsList": "ライブチャット可能なドメイン",
"Livechat_Appearance": "Livechatの外観",
"Livechat_Dashboard": "ライブチャット ダッシュボード",
+ "Livechat_DepartmentOfflineMessageToChannel": "この部門のLivechatオフラインメッセージをチャンネルに送信する",
"Livechat_enabled": "ライブチャットを有効にする",
"Livechat_Facebook_API_Key": "OmniChannel APIキー",
"Livechat_Facebook_API_Secret": "OmniChannel API Secret",
@@ -2146,6 +2169,7 @@
"Livechat_Managers": "管理者",
"Livechat_offline": "ライブチャットオフライン",
"Livechat_online": "ライブチャットオンライン",
+ "Livechat_OfflineMessageToChannel_enabled": "Livechatオフラインメッセージをチャンネルに送信する",
"Livechat_offline_message_sent": "Livechatオフラインメッセージが送信されました",
"Livechat_Queue": "ライブチャットキュー",
"Livechat_registration_form": "登録フォームへのアクセス",
@@ -2212,6 +2236,7 @@
"Mail_Messages": "メッセージをメール",
"Mail_Messages_Instructions": "メールで送信したいメッセージをクリックして選択してください",
"Room_uploaded_file_list": "ファイル一覧",
+ "Room_updated_successfully": "ルームが正常に更新されました!",
"Mail_Messages_Subject": "こちらは %s から選択されたメッセージです",
"Mailer": "メーラー",
"Mailer_body_tags": "[unsubscribe] を購読解除のリンクとして使わなければなりません。 ユーザーのフルネームに [name], [fname], [lname] を使用できます。姓 または 名 にも対応しています。 メールアドレスには、 [email] を使用できます。",
@@ -2276,6 +2301,7 @@
"Max_number_incoming_livechats_displayed_description": "(オプション) ライブチャット受信キューに表示されるアイテムの最大数。",
"Max_number_of_uses": "最大使用回数",
"Maximum": "最大",
+ "Maximum_number_of_guests_reached": "最大ゲスト数",
"Media": "メディア",
"Medium": "中間",
"Members": "会員",
@@ -2440,6 +2466,7 @@
"Name_optional": "名前 (オプション)",
"Name_Placeholder": "あなたの名前を入力してください...",
"Navigation_History": "ナビゲーションの歴史",
+ "Never": "決して",
"New_users": "新しいユーザー",
"New_Application": "新しいアプリケーション",
"New_chat_in_queue": "キューの新しいチャット",
@@ -2451,6 +2478,7 @@
"New_discussion_first_message": "通常、ディスカッションは「写真をアップロードする方法を教えてください」などの質問で始まります。",
"New_integration": "新しいサービス連携",
"New_line_message_compose_input": "`%s` - メッセージに改行を入力します",
+ "New_Livechat_offline_message_has_been_sent": "新しいLivechatオフラインメッセージが送信されました",
"New_logs": "新しい履歴",
"New_Message_Notification": "新規メッセージの通知",
"New_messages": "新しいメッセージ",
@@ -2667,6 +2695,7 @@
"post-readonly": "ReadOnlyを投稿",
"post-readonly_description": "読み取り専用チャンネルにメッセージを投稿する権限",
"Post_as": "投稿ユーザー",
+ "Post_to": "投稿:",
"Post_to_Channel": "投稿先チャンネル",
"Post_to_s_as_s": "%s へ %s として投稿",
"Preferences": "設定",
@@ -2815,6 +2844,7 @@
"Removed_User": "削除されたユーザー",
"Replied_on": "返信:",
"Reply": "返信",
+ "Replay": "リプレイ",
"reply_counter": "__counter__ 返信",
"reply_counter_plural": "__counter__ 返信",
"Replies": "返信",
@@ -2840,6 +2870,9 @@
"Reset_password": "パスワードをリセットする",
"Reset_section_settings": "セクション設定のリセット",
"Reset_Connection": "リセット接続",
+ "Responding": "応答",
+ "Response_description_pre": "ハンドラーがチャンネルに応答を投稿する場合は、応答の本文として次のJSONを返す必要があります。",
+ "Response_description_post": "空の本文または空のテキストプロパティを持つ本文は単に無視されます。 200以外の応答は、適切な回数再試行されます。上記で指定したエイリアスとアバターを使用して応答が投稿されます。上記の例のように、これらの情報を上書きできます。",
"Restart": "再起動",
"Restart_the_server": "サーバーを再起動",
"Retail": "小売り",
@@ -2976,6 +3009,7 @@
"Scan_QR_code": "Google Authenticator、Authy、Duoなどのオーセンティケーターアプリを使用して、QRコードをスキャンします。下に入力する必要がある6桁のコードが表示されます。",
"Scan_QR_code_alternative_s": "QRコードをスキャンできない場合は、代わりに手動でコードを入力することができます: __code__",
"Scope": "範囲",
+ "Screen_Lock": "画面ロック",
"Screen_Share": "画面共有",
"Script_Enabled": "スクリプトを有効にする",
"Search": "検索",
@@ -2984,12 +3018,14 @@
"Search_by_username": "ユーザー名で検索",
"Search_Channels": "チャンネルを検索",
"Search_current_provider_not_active": "現在の検索プロバイダーがアクティブではありません",
+ "Search_Integrations": "検索統合",
"Search_message_search_failed": "検索リクエストに失敗しました",
"Search_Messages": "メッセージを検索",
"Search_Page_Size": "ページサイズ",
"Search_Private_Groups": "プライベートグループを検索",
"Search_Provider": "検索プロバイダ",
"Search_Users": "ユーザーの検索",
+ "Search_Rooms": "ルームを検索",
"seconds": "秒",
"Secret_token": "シークレットトークン",
"Security": "セキュリティ",
@@ -3021,6 +3057,10 @@
"Send_me_the_code_again": "もう一度コードを送ってください",
"Send_request_on_agent_message": "エージェントメッセージに対するリクエスト送信",
"Send_request_on_chat_close": "チャットの近くにリクエストを送ります",
+ "Send_request_on_chat_queued": "待機中のチャットでリクエストを送信",
+ "Send_request_on_chat_start": "チャット開始時にリクエストを送信",
+ "Send_request_on_chat_taken": "チャットでリクエストを送信",
+ "Send_request_on_forwarding": "転送時にリクエストを送信",
"Send_request_on_lead_capture": "リードキャプチャでリクエストを送信する",
"Send_request_on_offline_messages": "オフラインメッセージの要求を送信します",
"Send_request_on_visitor_message": "訪問者メッセージにリクエストを送信する",
@@ -3031,6 +3071,8 @@
"Send_your_JSON_payloads_to_this_URL": "この URL へ JSON ペイロードを送信してください。",
"Sending": "送信しています...",
"Sent_an_attachment": "添付ファイルを送信しました",
+ "Sent_from": "送信:",
+ "Separate_multiple_words_with_commas": "複数の単語をコンマで区切る",
"Served_By": "提供者",
"Server_File_Path": "サーバーファイルパス",
"Server_Folder_Path": "サーバーフォルダーパス",
@@ -3122,6 +3164,7 @@
"Smarsh_MissingEmail_Email": "メールがありません",
"Smarsh_MissingEmail_Email_Description": "電子メールアドレスが見つからない場合にユーザーアカウントに表示する電子メールは、一般的にボットアカウントで発生します。",
"Smarsh_Timezone": "Smarsh タイムゾーン",
+ "Timezone": "タイムゾーン",
"Smileys_and_People": "顔文字と人々",
"SMS_Default_Omnichannel_Department": "オムニチャネル部門(デフォルト)",
"SMS_Default_Omnichannel_Department_Description": "設定されている場合、この統合によって開始されたすべての新しい着信チャットは、この部門にルーティングされます。",
@@ -3490,7 +3533,9 @@
"Use_url_for_avatar": "URL をアバターに使用",
"Use_User_Preferences_or_Global_Settings": "ユーザー設定かグローバル設定を使用する",
"User": "ユーザー",
+ "Users_and_rooms": "ユーザーとルーム",
"User Search": "ユーザー検索",
+ "User_created_successfully!": "ユーザーが正常に作成されました!",
"User Search (Group Validation)": "ユーザー検索 (グループ検証)",
"user-generate-access-token": "ユーザーがアクセストークンを生成する",
"user-generate-access-token_description": "ユーザーがアクセストークンを生成するためのアクセス許可",
@@ -3598,6 +3643,7 @@
"Verification_email_sent": "認証メールを送信しました",
"Verification_Email_Subject": "[Site_Name] - アカウントを確認する",
"Verified": "検証",
+ "Not_verified": "検証されていない",
"Verify": "確認します",
"Verify_your_email": "あなたの電子メールを確認します",
"Verify_your_email_for_the_code_we_sent": "送信したコードのメールを確認します",
@@ -3625,6 +3671,8 @@
"view-l-room": "ライブチャットルームを見る",
"view-l-room_description": "ライブチャットチャンネルを表示する権限",
"view-livechat-analytics": "ライブチャットの分析を閲覧",
+ "view-livechat-room-closed-by-another-agent": "別のエージェントによって閉じられたオムニチャンネルルームの表示",
+ "view-livechat-room-closed-same-department": "同じ部門の別のエージェントによって閉じられたオムニチャンネルルームの表示",
"view-livechat-departments": "ライブチャット部門を表示する",
"view-livechat-manager": "ライブチャットマネージャーを見る",
"view-livechat-manager_description": "他のライブチャットマネージャーの閲覧許可",
@@ -3657,7 +3705,9 @@
"Visible": "見える",
"Visit_Site_Url_and_try_the_best_open_source_chat_solution_available_today": "__Site_URL__ にアクセスして、現在最高のオープンソースのチャットソリューションをトライしましょう!",
"Visitor": "ビジター",
+ "Visitor_Email": "訪問者のメール",
"Visitor_Info": "ビジター情報",
+ "Visitor_Name": "訪問者の名前",
"Visitor_Navigation": "ビジターナビゲーション",
"Visitor_page_URL": "訪問者のページ URL",
"Visitor_time_on_site": "サイトの滞在時間",
@@ -3695,8 +3745,10 @@
"Welcome_to_the": "ようこそ",
"Where_are_the_messages_being_sent?": "メッセージはどこに送信されますか?",
"When_is_the_chat_busier?": "チャットはいつ忙しいですか?",
+ "When_a_line_starts_with_one_of_there_words_post_to_the_URLs_below": "行がこれらの単語のいずれかで始まる場合は、以下のURLに投稿してください",
"Why_do_you_want_to_report_question_mark": "なぜあなたは報告したいですか?",
"will_be_able_to": "は、以下ができるようになります",
+ "Will_be_available_here_after_saving": "保存後、こちらからご利用いただけます。",
"Worldwide": "全世界",
"Would_you_like_to_return_the_inquiry": "お問い合わせを返信しますか?",
"Yes": "はい",
@@ -3735,6 +3787,7 @@
"You_need_to_type_in_your_username_in_order_to_do_this": "あなたはこれを行うためにユーザー名を入力する必要があります!",
"You_need_to_verifiy_your_email_address_to_get_notications": "通知を受信するにはメールアドレスの検証が必要です。",
"You_need_to_write_something": "なにか書いてください!",
+ "You_reached_the_maximum_number_of_guest_users_allowed_by_your_license": "ライセンスで許可されているゲストユーザーの最大数に達しました。",
"You_should_inform_one_url_at_least": "少なくとも1つのURLを定義しましょう。",
"You_should_name_it_to_easily_manage_your_integrations": "連携は管理しやすい名前にしましょう。",
"You_will_not_be_able_to_recover": "このメッセージを復元できなくなります!",
diff --git a/packages/rocketchat-i18n/i18n/ka-GE.i18n.json b/packages/rocketchat-i18n/i18n/ka-GE.i18n.json
index ced7ec43b7d2..71a145ca5f1c 100644
--- a/packages/rocketchat-i18n/i18n/ka-GE.i18n.json
+++ b/packages/rocketchat-i18n/i18n/ka-GE.i18n.json
@@ -1,5 +1,5 @@
{
- "403": "Აკრძალული",
+ "403": "აკრძალულია",
"500": "შიდა სერვერული შეცდომა",
"#channel": "#არხი",
"0_Errors_Only": "0 - მხოლოდ შეცდომები",
@@ -9,19 +9,19 @@
"2_Erros_Information_and_Debug": "2 - შეცდომები, ინფორმაცია და Debug",
"@username": "@username",
"@username_message": "@username ",
- "__username__is_no_longer__role__defined_by__user_by_": "__username__ -ს ჩამოართვა __role__ უფლება მომხმარებელმა: __user_by__",
+ "__username__is_no_longer__role__defined_by__user_by_": "__username__ჩამეორთვა __role__ __user_by__მიერ",
"__username__was_set__role__by__user_by_": "__username__ -ს მისცა __role__ უფლება მომხმარებელმა: __user_by__",
"%_of_conversations": "საუბრების %",
- "Accept": "მიღება",
- "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "ცოცხალი ჩატის მოთხოვნის მიღება იმ შემთხვევაშიც, თუ ხაზზე აგენტი არაა",
- "Accept_new_livechats_when_agent_is_idle": "ცოცხალი ჩატის მიღება როდესაც აგენტი უმოქმედოა",
+ "Accept": "თანხმობა",
+ "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "მრავალარხიანი ჩატის მოთხოვნის მიღება იმ შემთხვევაშიც, თუ ხაზზე აგენტი არაა",
+ "Accept_new_livechats_when_agent_is_idle": "მრავალარხიანი ახალი ჩატის მიღება როდესაც აგენტი უმოქმედოა",
"Accept_with_no_online_agents": "მიღება ხაზზე მყოფი აგენტების გარეშე",
"access-mailer": "წვდომა Mailer-ზე",
"access-mailer_description": "მასობრივი ელ.ფოსტის ყველა მომხმარებლისთვის გაგზავნის ნებართვა.",
"access-permissions": "უფლებების გვერდზე წვდომა",
"access-permissions_description": "შეცვლეთ უფლებები სხვა და სხვა როლებისთვის",
"access-setting-permissions": "პარამეტრებზე დაფუძნებული უფლებების შეცვლა",
- "Access_not_authorized": "წვდომა დაუშვებელია",
+ "Access_not_authorized": "წვდომა არ არის დაშვებული",
"Access_Token_URL": "დაშვების თოქენის URL",
"Accessing_permissions": "უფლებები",
"Account_SID": "ანგარიშის SID",
@@ -39,10 +39,10 @@
"Accounts_AllowPasswordChange": "პაროლის შეცვლის დაშვება",
"Accounts_AllowRealNameChange": "სახელის შეცვლის დაშვება",
"Accounts_AllowUserAvatarChange": "მომხმარებლის ავატარის ცვლილების დაშვება",
- "Accounts_AllowUsernameChange": "მომხმარებლის ცვლილების დაშვება",
+ "Accounts_AllowUsernameChange": "მომხმარებლის სახელის ცვლილების დაშვება",
"Accounts_AllowUserProfileChange": "მომხმარებლის პროფილის ცვლილების დაშვება",
- "Accounts_AllowUserStatusMessageChange": "სასურველი სტატუსის დაშვება",
- "Accounts_AvatarBlockUnauthenticatedAccess": "ავატარებთან უნებართვო წვდომის აკრძალვა",
+ "Accounts_AllowUserStatusMessageChange": "პირადი სტატუსის შეტყობინების გამოჩენა",
+ "Accounts_AvatarBlockUnauthenticatedAccess": "ავატარებთან უნებართვო წვდომის დაბლოკვა",
"Accounts_AvatarCacheTime": "ავატარების ქეშირების დრო",
"Accounts_AvatarCacheTime_description": "წამების რაოდენობა, როცა http პროტოკოლი ინახავს ავატარის სურათებს",
"Accounts_AvatarResize": "ავატარების ზომის შეცვლა",
@@ -53,30 +53,31 @@
"Accounts_BlockedDomainsList_Description": "დაბლოკილი დომენების მძიმით გამოყოფილი სია",
"Accounts_BlockedUsernameList": "დაბლოკილი მომხმარებლები",
"Accounts_BlockedUsernameList_Description": "დაბლოკილი მომხმარებლების მძიმით გამოყოფილი სია",
+ "Accounts_CustomFields_Description": "უნდა იყოს მოქმედი JSON, სადაც გასაღებები არის ველების სახელები, რომლებიც შეიცავს ველების პარამეტრების ლექსიკონს. მაგალითი: {\n \"role\": {\n \"type\": \"select\",\n \"defaultValue\": \"student\",\n \"options\": [\"teacher\", \"student\"],\n \"required\": true,\n \"modifyRecordField\": {\n \"array\": true,\n \"field\": \"roles\"\n }}, \"twitter\": {\n \"type\": \"text\",\n \"required\": true,\n \"minLength\": 2,\n \"maxLength\": 10\n }} ",
"Accounts_CustomFieldsToShowInUserInfo": "მომხმარებლის ინფოში დამატებითი ველების ჩვენება",
"Accounts_Default_User_Preferences": "მომხმარებლის სტანდარტული პარამეტრები",
"Accounts_Default_User_Preferences_audioNotifications": "აუდიო შეტყობინებების ზარი",
- "Accounts_Default_User_Preferences_desktopNotifications": "სამაგიდო შეტყობინებების ზარი",
+ "Accounts_Default_User_Preferences_desktopNotifications": "სამაგიდო (desktop) შეტყობინებების ზარი",
"Accounts_Default_User_Preferences_mobileNotifications": "მობილური შეტყობინებების ზარი",
- "Accounts_Default_User_Preferences_not_available": "მომხმარებელს ჯერ არ გაუმართავს პარამეტრები",
- "Accounts_DefaultUsernamePrefixSuggestion": "ნაგულისხმები მომხმარებლის პრეფიქსის შეთავაზება",
+ "Accounts_Default_User_Preferences_not_available": "მომხმარებლის პარამეტრების მიღება ვერ მოხერხდა,მომხმარებელს ჯერ არ გაუმართავს პარამეტრები",
+ "Accounts_DefaultUsernamePrefixSuggestion": "ნაგულისხმები(default) მომხმარებლის პრეფიქსის შეთავაზება",
"Accounts_denyUnverifiedEmail": "შეუმოწმებელი ელ. ფოსტის დაბლოკვა",
"Accounts_Email_Activated": "[name]
გადადით ბმულზე [Site_URL] და გაიცანით ყველაზე მაგარი უფასო ჩატი!
",
+ "Accounts_Enrollment_Email_Default": "
მოგესალმებით [Site_Name] -ზე
გადადით ბმულზე [Site_URL] და გაეცანით საუკეთესო ოფენ სორს ჩატს!
",
"Accounts_Email_Deactivated_Subject": "ანგარიში გაუქმდა",
- "Accounts_EmailVerification": "ელ. ფოსტის შემოწმება",
- "Accounts_EmailVerification_Description": "დარწმუნდით რომ SMTP პარამეტრები სწორად გაქვთ",
+ "Accounts_EmailVerification": "დართეთ ავტორიზაციის ნება შემოწმებულ მომხმარებლებს",
+ "Accounts_EmailVerification_Description": "ამ ოფციის გამოსაყენებლად დარწმუნდით რომ SMTP პარამეტრები სწორად გაქვთ",
"Accounts_Enrollment_Email_Subject_Default": "მოგესალმებით [Site_Name] -ზე",
"Accounts_Enrollment_Email": "გაწევრიანების ელ. ფოსტა",
- "Accounts_Enrollment_Email_Description": "თქვენ შეგიძლიათ გამოიყენოთ შემდეგი ადგილის მონიშვნა:
[name], [fname], [lname] მომხმარებლის სრული სახელი, სახელი ან გვარი, შესაბამისად. [Html2e]
[email] მომხმარებლის ელ.ფოსტისთვის.
[Site_Name] და [Site_URL] განაცხადის სახელისა და მისამართების შესაბამისად.
",
+ "Accounts_Enrollment_Email_Description": "თქვენ შეგიძლიათ გამოიყენოთ შემდეგი ველები:
[name], [fname], [lname] მომხმარებლის სრული სახელი, სახელი ან გვარი, შესაბამისად. [Html2e]
[email] მომხმარებლის ელ.ფოსტისთვის.
[Site_Name] და [Site_URL] განაცხადის სახელისა და მისამართების შესაბამისად.
",
"Accounts_ForgetUserSessionOnWindowClose": "ფანჯრის დახურვისას წაიშალოს მომხმარებლის სესიაც",
"Accounts_Iframe_api_method": "API მეთოდი",
"Accounts_Iframe_api_url": "API-ს მისამართი",
- "Accounts_iframe_enabled": "ჩართული",
+ "Accounts_iframe_enabled": "ჩართულია",
"Accounts_iframe_url": "Iframe-ს მისამართი",
"Accounts_LoginExpiration": "მომხმარებლის ვადის გასვლის დრო (დღეებში)",
"Accounts_ManuallyApproveNewUsers": "ახალი მომხმარებლების ხელით შემოწმება",
@@ -88,23 +89,24 @@
"Accounts_OAuth_Custom_Enable": "ჩართვა",
"Accounts_OAuth_Custom_id": "Id",
"Accounts_OAuth_Custom_Identity_Path": "იდენტიფიკაციის მისამართი",
- "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "ინდენტიფიკაციის თოკენი გაგზავნილია",
+ "Accounts_OAuth_Custom_Identity_Token_Sent_Via": "ინდენტიფიკაციის ტოკენი გაგზავნილია",
"Accounts_OAuth_Custom_Login_Style": "ავტორიზაციის სტილი",
"Accounts_OAuth_Custom_Merge_Users": "მომხმარებლების შერწყმა",
"Accounts_OAuth_Custom_Access_Token_Param": "პარამეტრის სახელი წვდომის თოკენისთვის",
"Accounts_OAuth_Custom_Scope": "სფერო",
"Accounts_OAuth_Custom_Secret": "საიდუმლო",
"Accounts_OAuth_Custom_Show_Button_On_Login_Page": "ღილაკის ჩვენება ავტორიზაციის გვერდზე",
- "Accounts_OAuth_Custom_Token_Path": "თოკენის მისამართი",
- "Accounts_OAuth_Custom_Token_Sent_Via": "თოკენი გაგზავნილია",
+ "Accounts_OAuth_Custom_Token_Path": "ტოკენის მისამართი",
+ "Accounts_OAuth_Custom_Token_Sent_Via": "ტოკენი გაგზავნილია",
"Accounts_OAuth_Custom_Username_Field": "მომხმარებლის ველი",
+ "Accounts_OAuth_Custom_Email_Field": "ელ.ფოსტა",
"Accounts_OAuth_Custom_Name_Field": "სახელის ველი",
"Accounts_OAuth_Custom_Roles_Claim": "როლების/ჯგუფების ველის სახელი",
"Accounts_OAuth_Custom_Merge_Roles": "SSO-დან როლების შერწყმა",
- "Accounts_OAuth_Drupal": "ავტორიზაცია Drupal-ით ჩართულია",
+ "Accounts_OAuth_Drupal": "Drupal-ით ავტორიზაცია ჩართულია",
"Accounts_OAuth_Drupal_callback_url": "Drupal oAuth2 გადამისამართების URI",
"Accounts_OAuth_Drupal_id": "Drupal oAuth2 კლიენტის ID",
- "Accounts_OAuth_Drupal_secret": "Drupal oAuth2 კლიენტის საიდუმლო",
+ "Accounts_OAuth_Drupal_secret": "Drupal oAuth2 კლიენტის კოდი",
"Accounts_OAuth_Facebook": "Facebook-ით ავტორიზაცია",
"Accounts_OAuth_Facebook_callback_url": "Facebook-ის უკუკავშირის მისამართი",
"Accounts_OAuth_Facebook_id": "Facebook-ის აპლიკაციის ID",
@@ -114,7 +116,7 @@
"Accounts_OAuth_GitHub_Enterprise": "ჩართულია OAuth",
"Accounts_OAuth_GitHub_Enterprise_callback_url": "Github Enterprise-ს უკუკავშირის მისამართი",
"Accounts_OAuth_GitHub_Enterprise_id": "კლიენტის ID",
- "Accounts_OAuth_GitHub_Enterprise_secret": "კლიენტის კოდი",
+ "Accounts_OAuth_GitHub_Enterprise_secret": "კლიენტის საიდუმლო",
"Accounts_OAuth_Github_id": "კლიენტის ID",
"Accounts_OAuth_Github_secret": "კლიენტის კოდი",
"Accounts_OAuth_Gitlab": "ჩართულია OAuth",
@@ -131,33 +133,37 @@
"Accounts_OAuth_Linkedin_callback_url": "LinkedIn-ის უკუკავშირის მისამართი",
"Accounts_OAuth_Linkedin_id": "LinkedIn-ის ID",
"Accounts_OAuth_Linkedin_secret": "LinkedIn-ის კოდი",
- "Accounts_OAuth_Meteor": "Meteor-ის მომხმარებლის სახელი",
+ "Accounts_OAuth_Meteor": "Meteor- ავტორიზაცია",
"Accounts_OAuth_Meteor_callback_url": "Meteor-ის უკუკავშირის URL",
- "Accounts_OAuth_Meteor_id": "Meteor-ის აიდი",
- "Accounts_OAuth_Meteor_secret": "მეტეორის საიდუმლო სიტყვა",
+ "Accounts_OAuth_Meteor_id": "Meteor Id",
+ "Accounts_OAuth_Meteor_secret": "Meteor- ის კოდი",
"Accounts_OAuth_Nextcloud": "ჩართულია OAuth",
"Accounts_OAuth_Nextcloud_callback_url": "Nextcloud-ის უკუკავშირის URL",
"Accounts_OAuth_Nextcloud_id": "Nextcloud-ის ID",
"Accounts_OAuth_Nextcloud_secret": "კლიენტის კოდი",
- "Accounts_OAuth_Nextcloud_URL": "Nextcloud-ის სერვერ-ის URL",
+ "Accounts_OAuth_Nextcloud_URL": "Nextcloud-ის სერვერ-ის მისამართი",
"Accounts_OAuth_Proxy_host": "პროქსი ჰოსტი",
"Accounts_OAuth_Proxy_services": "პროქსი სერვისები",
- "Accounts_OAuth_Twitter": "Twitter მომხმარებელი",
+ "Accounts_OAuth_Tokenpass": "Tokenpass ავტორიზაცია",
+ "Accounts_OAuth_Tokenpass_callback_url": "Tokenpass უკუკავშირის ლინკი",
+ "Accounts_OAuth_Tokenpass_id": "Tokenpass Id",
+ "Accounts_OAuth_Tokenpass_secret": "Tokenpass კოდი",
+ "Accounts_OAuth_Twitter": "Twitter-ით ავტორიზაცია",
"Accounts_OAuth_Twitter_callback_url": "Twitter-ის Callback URL",
"Accounts_OAuth_Twitter_id": "Twitter-ის Id",
- "Accounts_OAuth_Twitter_secret": "Twitter-ის secret",
- "Accounts_OAuth_Wordpress": "WordPress-ის მომხმარებელი",
+ "Accounts_OAuth_Twitter_secret": "Twitter-ის კოდი",
+ "Accounts_OAuth_Wordpress": "WordPress-იიტ ავტორიზაცია",
"Accounts_OAuth_Wordpress_authorize_path": "ავტორიზაციის მისამართი",
- "Accounts_OAuth_Wordpress_callback_url": "WordPress-ის Callback URL",
+ "Accounts_OAuth_Wordpress_callback_url": "WordPress-ის უკუკავშირის მისამართი",
"Accounts_OAuth_Wordpress_id": "WordPress-ის Id",
"Accounts_OAuth_Wordpress_identity_path": "იდენტიფიკაციის მისამართი",
- "Accounts_OAuth_Wordpress_identity_token_sent_via": "ინდენტიფიკაციის თოკენი გაგზავნილია",
+ "Accounts_OAuth_Wordpress_identity_token_sent_via": "ინდენტიფიკაციის ტოკენი გაგზავნილია",
"Accounts_OAuth_Wordpress_scope": "სფერო",
"Accounts_OAuth_Wordpress_secret": "Wordpress-ის კოდი",
"Accounts_OAuth_Wordpress_server_type_custom": "მორგებული",
"Accounts_OAuth_Wordpress_server_type_wordpress_com": "Wordpress.com",
"Accounts_OAuth_Wordpress_server_type_wp_oauth_server": "WP Oauth სერვერის პლაგინი",
- "Accounts_OAuth_Wordpress_token_path": "თოკენის მისამართი",
+ "Accounts_OAuth_Wordpress_token_path": "ტოკენის მისამართი",
"Accounts_Password_Policy_AtLeastOneLowercase": "მინიმუმ 1 პატარა ასო",
"Accounts_Password_Policy_AtLeastOneLowercase_Description": "დარწმუნდით რომ პაროლი შეიცავს მინიმუმ 1 პატარა ასოს.",
"Accounts_Password_Policy_AtLeastOneNumber": "მინიმუმ 1 ციფრი",
@@ -165,19 +171,19 @@
"Accounts_Password_Policy_AtLeastOneSpecialCharacter": "მინიმუმ 1 სიმბოლო",
"Accounts_Password_Policy_AtLeastOneSpecialCharacter_Description": "დარწმუნდით რომ პაროლი შეიცავს მინიმუმ 1 სპეციალურ სიმბოლოს.",
"Accounts_Password_Policy_AtLeastOneUppercase": "მინიმუმ 1 დიდი ასო",
- "Accounts_Password_Policy_AtLeastOneUppercase_Description": "დარწმუნდით რომ პაროლი შეიცავს მინიმუმ 1 დიდ ასოს.",
- "Accounts_Password_Policy_Enabled": "პაროლის პოლიტიკის ჩართვა",
- "Accounts_Password_Policy_Enabled_Description": "ჩართვის შემთხვევაში, მომხმარებლებს მოუწევთ პაროლის გარკვეული პოლიტიკის გათვალისწინება. შენიშვნა: ეს წესი მოქმედებს მხოლოდ ახალ მომხმარებლებზე.",
+ "Accounts_Password_Policy_AtLeastOneUppercase_Description": "დარწმუნდით რომ პაროლი შეიცავს მინიმუმ 1 პატარა ასოს.",
+ "Accounts_Password_Policy_Enabled": "პაროლის წესების ჩართვა",
+ "Accounts_Password_Policy_Enabled_Description": "ჩართვის შემთხვევაში, მომხმარებლებს მოუწევთ პაროლის წესების გათვალისწინება. შენიშვნა: ეს წესი მოქმედებს მხოლოდ ახალ პაროლებზე.",
"Accounts_Password_Policy_ForbidRepeatingCharacters": "განმეორებითი სიმბოლოების აკრძალვა",
- "Accounts_Password_Policy_ForbidRepeatingCharacters_Description": "კრძალავს მიყოლებით ერთიდაიმავე სიმბოლოების გამოყენებას",
- "Accounts_Password_Policy_ForbidRepeatingCharactersCount": "განმეორებითი სიმბოლოების მაქსიმალური რაოდენობა",
+ "Accounts_Password_Policy_ForbidRepeatingCharacters_Description": "კრძალავს მიყოლებით ერთიდაიგივე სიმბოლოების გამოყენებას",
+ "Accounts_Password_Policy_ForbidRepeatingCharactersCount": "განმეორებადი სიმბოლოების მაქსიმალური რაოდენობა",
"Accounts_Password_Policy_ForbidRepeatingCharactersCount_Description": "სიმბოლოების განმეორების მაქსიმალური დაშვებული რაოდენობა",
"Accounts_Password_Policy_MaxLength": "მაქსიმალური სიგრძე",
"Accounts_Password_Policy_MaxLength_Description": "პაროლის მაქსიმალური სიგრძის ზღვარის დაწესება. გასათიშად ჩაწერეთ -1",
"Accounts_Password_Policy_MinLength": "მინიმალური სიგრძე",
"Accounts_Password_Policy_MinLength_Description": "პაროლის მინიმალური სიგრძის ზღვარის დაწესება. გასათიშად ჩაწერეთ -1",
- "Accounts_PasswordReset": "პაროლის აღდგენა",
- "Accounts_Registration_AuthenticationServices_Default_Roles": "ავტორიზებული სერვისების სტანდარტული როლი",
+ "Accounts_PasswordReset": "პაროლის განულება",
+ "Accounts_Registration_AuthenticationServices_Default_Roles": "ავტორიზებული სერვისების სტანდარტული(default) როლი",
"Accounts_Registration_AuthenticationServices_Default_Roles_Description": "სტანდარტული როლები (მძიმით-გამოყოფილი) რომელიც მომხმარებელს მიენიჭება რეგისტრაციისას",
"Accounts_Registration_AuthenticationServices_Enabled": "რეგისტრაცია ავტორიზაციის სერვისებით",
"Accounts_RegistrationForm": "სარეგისტრაციო ფორმა",
@@ -195,31 +201,155 @@
"Accounts_SearchFields": "ძებნაში გასათვალისწინებელი ველები",
"Accounts_Send_Email_When_Activating": "მომხმარებლის გააქტიურებისას მისთვის ელ. ფოსტის გაგზავნა",
"Accounts_Send_Email_When_Deactivating": "მომხმარებლის დეაქტივაციისას მისთვის წერილის გაგზავნა",
- "Accounts_TwoFactorAuthentication_Enabled": "ჩართეთ ორ-ფაქტორანი ავტორიზაცია",
+ "Accounts_Directory_DefaultView": "Default (ნაგულისხმევი) დირექტორიების სია",
+ "Accounts_SetDefaultAvatar": "Defult (ნაგულისხმევი) ავატარის დაყენება",
+ "Accounts_SetDefaultAvatar_Description": "ცდილობს დაადგინოს Default (ნაგულისხმევი) ავატარi OAuth- ის ან Gravatar– ის საფუძველზე",
+ "Accounts_Set_Email_Of_External_Accounts_as_Verified": "დააყენეთ გარე ანგარიშის ელ.ფოსტა როგორც შემოწმებული",
+ "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "გარე სერვისებისგან შექმნილ ანგარიშებს, როგორიცაა LDAP, OAth და ა.შ., მათი ელ.ფოსტა ავტომატურად დადასტურდება",
+ "Accounts_ShowFormLogin": "აჩვენეთ Default (ნაგულისხმები) შესვლის ფორმა",
+ "Accounts_TwoFactorAuthentication_By_Email_Enabled": "ჩართეთ ორი ფაქტორის ავტორიზაცია ელ.ფოსტით",
+ "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "მომხმარებლები დამოწმებული ელ.ფოსტით რომელთაც ეს ოფცია ჩართული აქვთ მიიღებენ დროებით კოდს ელ.ფოსტით, რათა განახორციელონ გარკვეული ქმედებები:ავტორიზაცია, შესვლა პროფილზე, პროფილის შენახვა და ა.შ.",
+ "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In": "ავტომატური ოფცია ახალი მომხმარებლებისთვის ელ.ფოსტით ორ ფაქტორიანი იდენტიფიკაციისთვის",
+ "Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "ახალ მომხმარებლებს ექნებათ ორი ფაქტორი ავთენტიფიკაცია ელექტრონული ფოსტით, ჩართულია ავტომატურად. მათ შეეძლებათ ის გამორთონ თავიანთი პროფილის გვერდზე.",
+ "Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "ელ.ფოსტაზე გამოგზავნილი კოდის ამოწურვის დრო წამებში",
+ "Accounts_TwoFactorAuthentication_Enabled": "ჩართეთ ორ-ფაქტორანი ავტორიზაცია TOTP-ით",
+ "Accounts_TwoFactorAuthentication_Enabled_Description": "მომხმარებლებს შეუძლიათ თავიანთი ორი ფაქტორის ავთენტიფიკაციის დაყენება, ნებისმიერი TOTP პროგრამის გამოყენებით, მაგალითად Google Authenticator ან Authy",
+ "Accounts_TwoFactorAuthentication_MaxDelta": "მაქსიმალური დელტა",
+ "Accounts_UserAddedEmail_Default": "
მოგესალმებით [Site_Name] -ზე
გადადით ბმულზე [Site_URL] და გაეცანით საუკეთესო ოფენ სორს ჩატს!
შეგიძლიათ ავტორიზაცია გაიაროთ ელ.ფოსტით (ელ.ფოსტა,პაროლი). თქვნ შეიძლება მოგეთხოვოთ მისი შეცვლა პირველი შესვლის შემდეგ",
+ "Accounts_TwoFactorAuthentication_MaxDelta_Description": "მაქსიმალური დელტა განსაზღვრავს რამდენი ტოკენია მოქმედი მოცემულ დროს. ტოქსების გენერირება ხდება ყოველ 30 წამში და მოქმედებს (30 * მაქსიმალური დელტა) წამით. მაგალითი: მაქსიმალური დელტას 10-ზე დაყენებისას, ყველა ნიშანი(token) შეიძლება გამოყენებულ იქნას 300 წამამდე, კომპიუტერის დროს პლიუს ან მინუს 300 წამი. ეს სასარგებლოა იმ შემთხვევაში, როდესაც კლიენტის საათი სერვერთან სწორად არ არის სინქრონიზებული.",
+ "Accounts_TwoFactorAuthentication_RememberFor": "დაიმახსოვრე ორი ფაქტორი დროის განმავლობაში (წამები)",
+ "Accounts_TwoFactorAuthentication_RememberFor_Description": "არ მოითხოვოთ ორ ფაქტორიანი ავტორიზაციის კოდი, თუ ის უკვე იყო მინიჭებული მოცემული დროისთვის.",
+ "Accounts_UseDefaultBlockedDomainsList": "გამოიყენეთ ნაგულისხმევი(default) დაბლოკილი დომენების სია",
+ "Accounts_UseDNSDomainCheck": "გამოიყენეთ DNS დომენის შემოწმება",
+ "Accounts_UserAddedEmailSubject_Default": "თქვენ დაგამატეს [Site_Name]",
+ "Accounts_UserAddedEmail_Description": "თქვენ შეგიძლიათ გამოიყენოთ შემდეგი ველები:
[name], [fname], [lname] მომხმარებლის სრული სახელი, სახელი ან გვარი, შესაბამისად. [Html2e]
[email] მომხმარებლის ელ.ფოსტისთვის.
[Site_Name] და [Site_URL] განაცხადის სახელისა და მისამართების შესაბამისად.
",
"Activate": "აქტივაცია",
+ "Active_users": "აქტიური მომხმარებლები",
+ "Daily_Active_Users": "ყოველდღიური აქტიური მომხმარებლები",
+ "Weekly_Active_Users": "ყოველკვირეული აქტიური მომხმარებლები",
+ "Monthly_Active_Users": "ყოველთვიური აქტიური მომხმარებლები",
+ "DAU_value": "DAU __value__",
+ "WAU_value": "WAU __value__",
+ "MAU_value": "MAU __value__",
"Activity": "აქტივობა",
"Add": "დამატება",
+ "Add_custom_emoji": "დაამატეთ პირადი სმაილი",
"add-oauth-service": "Oauth სერვისის დამატება",
"add-oauth-service_description": "Oauth სერვისის დამატების უფლება",
"add-user": "მომხმარებლის დამატება",
+ "add-user-to-any-c-room": "მომხმარებლის დამატება ნებისმიერ ღია არხში",
+ "add-user-to-any-c-room_description": "მომხმარებლის ნერბისმიერ ღია არხში დამატების უფლება",
+ "add-user-to-any-p-room": "დაამატეთ მომხმარებელი ნებისმიერ პირად არხში",
+ "add-user-to-any-p-room_description": "მომხმარებლის ნებისმიერ პირად არხში დამატების უფლება",
+ "add-user-to-joined-room": "მომხმარებლის დამატება ნებისმიერ საერთო არხში",
+ "add-user-to-joined-room_description": "ახლახანს გაწევრიანებულ არხში, მომხმარებლის დამატების უფლება",
+ "add-user_description": "სერვერზე ახალი მომხმარებლების დამატების ნებართვა მომხმარებელთა ეკრანის საშუალებით",
+ "Add_agent": "აგენტის დამატება",
+ "Add_custom_oauth": "დაამატეთ პირადი oauth",
+ "Add_Domain": "Domain-ის დამატება",
+ "Add_files_from": "დაამატეთ ფაილები (დან)",
+ "add-livechat-department-agents": "დაამატეთ მრავალარხიანი აგენტები დეპარტამენტებში",
+ "Add_manager": "მენეჯერის დამატება",
+ "Add_Role": "როლის დამატება",
+ "Add_user": "მომხმარებლის დამატება",
"Add_User": "მომხმარებლის დამატება",
+ "Add_users": "მომხმარებლების დამატება",
+ "Add_Reaction": "რეაქციის დამატება",
+ "Adding_OAuth_Services": "OAuth სერვისების დამატება",
+ "Adding_permission": "ნებართვის დამატება",
+ "Adding_user": "მომხმარებლის დამატება",
+ "Additional_emails": "დამატებითი ელ.ფოსტები",
+ "Additional_Feedback": "დამატებითი უკუკავშირი",
+ "additional_integrations_Bots": "თუ თქვენ ეძებთ თუ როგორ ჩაამატოთ თქვენი საკუთარი ბოტი, მაშინ ნახეთ ჩვენი ჰაბოტ გადამყვანი. https://github.com/RocketChat/hubot-rocketchat ",
+ "additional_integrations_Zapier": "გსურთ სხვა პროგრამული უზრუნველყოფისა და პროგრამების Rocket.Chat– ში ინტეგრაცია, მაგრამ ამის ხელით სკეთებლად დრო არ გაქვთ? ჩვენ გთავაზობთ Zapier გამოყენებას, რომელსაც ჩვენ სრულად ვუჭერთ მხარს. დაწვრილებით ამის შესახებ ჩვენს დოკუმენტაციაზე წაიკითხეთ. https://rocket.chat/docs/administrator-guides/integrations/zapier/using-zaps/ ",
+ "Admin_disabled_encryption": "თქვენს ადმინისტრატორს არ გაუაქტიურებია E2E დაშიფვრა.",
+ "Admin_Info": "ადმინისტრატორის ინფორმაცია",
+ "Administration": "ადმინისტრაცია",
+ "Adult_images_are_not_allowed": "ზრდასრულთა სურათების არ არის ნებადართული",
+ "Advocacy": "დაცვა",
+ "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "OAuth2 ავტორიზაციის შემდეგ, მომხმარებლები გადამისამართდებიან ამ URL- ზე მდებარე სიაზე. თქვენ შეგიძლიათ დაამატოთ ერთი URL თითო სტრიქონზე.",
+ "Agent": "აგენტი",
+ "Agent_Info": "აგენტის ინფორმაცია",
+ "Agents": "აგენტები",
+ "Agent_added": "აგენტი დამატებულია",
+ "Agent_removed": "აგენტი წაშლილია",
+ "Alerts": "შეტყობინებები",
+ "Alias": "ფსევდონიმი",
+ "Alias_Format": "ფსევდონიმის ფორმატი",
+ "Alias_Format_Description": "Slack- დან ფსევდონიმით მესიჯების იმპორტი, % ჩანაცვლებულია მომხმარებლის სახელით. თუ % ცარიელია, ფსევდონიმი არ იქნება გამოყენებული",
+ "Alias_Set": "ფსევდონიმების კრებული",
+ "Aliases": "ფსევდონიმები",
+ "All": "ყველა",
+ "All_added_tokens_will_be_required_by_the_user": "ყველა გამოყენებული ტოკები იქნება მოთხოვნილი მომხმარებლის მიერ",
+ "All_channels": "ყველა არხი",
+ "All_closed_chats_have_been_removed": "ყველა დახურული ჩატი რომლებიც წაიშალა",
"All_logs": "ყველა ლოგი",
"All_messages": "ყველა შეტყობინება",
"All_users": "ყველა მომხმარებელი",
- "All_users_in_the_channel_can_write_new_messages": "ყველა მომხმარებელს შეუძლია არხზე წერა",
+ "All_users_in_the_channel_can_write_new_messages": "არხში ყველა მომხმარებელს შეუძლია მესიჯის გაგზავნა",
+ "Allow_collect_and_store_HTTP_header_informations": "ნებართვა HTTP ჰედერების ინფორმაციის შეგროვება/შენახვისთვის",
+ "Allow_collect_and_store_HTTP_header_informations_description": "ეს პარამეტრი განსაზღვრავს Livechat-ს აქვს თუ არა უფლება, შეინახოს HTTP სათაურის მონაცემებიდან შეგროვილი ინფორმაცია, მაგალითად, IP მისამართი, მომხმარებელი აგენტი და ა.შ.",
+ "Allow_Invalid_SelfSigned_Certs": "ყველა არასწორი სერთიფიკატი",
+ "Allow_Invalid_SelfSigned_Certs_Description": "ნება დართეთ ყველა არასწორ და თვით-მინიჭებულ SSL სერთიფიკატს ლინკების დადასტურება და გადასახედად",
+ "Allow_switching_departments": "ვიზიტორისთვის დეპარტამენტის შეცვლის ნებართვა",
+ "Allow_Marketing_Emails": "ნებადართულია მარკეტინგ ელ.ფოსტა",
+ "Allow_Online_Agents_Outside_Office_Hours": "დაუშვით ონლაინ აგენტები სამუშაო საათების შემდეგ",
+ "Almost_done": "თითქმის დასრულებულია",
+ "Alphabetical": "ანბანური",
+ "Always_open_in_new_window": "ყოველთვის გახსენით ახალ ფანჯარაში",
"Analytics": "ანალიტიკა",
"Analytics_features_enabled": "ჩართული ფუნქციები",
- "Analytics_Google": "Google Analytics",
+ "Analytics_features_messages_Description": "აკონტროლებს პერსონალურ მოვლენებს, რომლებიც დაკავშირებულია მომხმარებლის მიერ შეტყობინებებზე მოქმედებაზე.",
+ "Analytics_features_rooms_Description": "აკვირდება არხზე ან ჯგუფში მოქმედებებთან დაკავშირებულ პერსონალურ მოვლენებს (შექმნა, დატოვება, წაშლა)",
+ "Analytics_features_users_Description": "აკონტროლებს პერსონალურ მოვლენებს, რომლებიც დაკავშირებულია მომხმარებლებთან დაკავშირებულ ქმედებებთან (პაროლის გადატვირთვის დრო, პროფილის სურათის შეცვლა და ა.შ.).",
+ "Analytics_Google": "Google ანალიტიკა",
+ "Analytics_Google_id": "Tracking ID",
+ "and": "და",
+ "And_more": "და __ სიგრძე__ მეტი",
"Animals_and_Nature": "ბუნება და ცხოველები",
- "Announcement": "ანონსები",
+ "Announcement": "განცხადებები",
"API": "API",
+ "API_Add_Personal_Access_Token": "დაამატეთ პერსონალური წვდომის ტოკენი",
+ "API_Allow_Infinite_Count": "ყველაფრის მიღების ნებართვა",
+ "API_Allow_Infinite_Count_Description": "გამოძახებები დანარჩენ API-სთან უნდა იყოს ნებადართული ყველაფრის ერთ გამოძახებაში დასაბრუნებლად?",
"API_Analytics": "ანალიტიკა",
+ "api-bypass-rate-limit": "სიჩქარის ლიმიტის უგულებელყოფა დანარჩენი API-სთვის",
+ "API_CORS_Origin": "CORS წარმოშობა",
+ "API_Default_Count": "ნაგულისხმევი(default) რაოდენობა",
+ "API_Default_Count_Description": "REST API- ს შედეგების ნაგულისხმევი(default) რაოდენობა, თუ მომხმარებელმა არ მიაწოდა რაიმე.",
"API_Drupal_URL": "Drupal-ის სერვერის URL",
+ "API_Drupal_URL_Description": "მაგალითი: http://domain.com (ბოლოში სლეშის გარეშე)",
+ "API_Embed": "მიმაგრებული ლინკის გადახედვა",
+ "API_EmbedDisabledFor": "მომხმარებლებისთვის ჩაშენების გამორთვა",
+ "API_EmbedDisabledFor_Description": "ჩაშენებული ლინკის გადახედვის გამოსართავად მომხმარებელთა სია გამოყავით მძიმით",
+ "API_EmbedIgnoredHosts": "ჩასვით იგნორირებული მასპინძლები (host)",
+ "API_EmbedIgnoredHosts_Description": "მძიმით გამოყოფილი მასპინძლების სია ან CIDR მისამართები მაგ. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16",
"API_EmbedSafePorts": "უსაფრთხო პორტები",
+ "API_EmbedSafePorts_Description": "გადასახედად ნებადართული პორტების სია, მძიმით გამოყოფილი",
+ "API_Enable_CORS": "ჩართეთ CORS",
+ "API_Enable_Direct_Message_History_EndPoint": "ჩართეთ პირდაპირი შეტყობინებების ისტორიის ბოლო წერტილი",
+ "API_Enable_Direct_Message_History_EndPoint_Description": "ეს საშუალებას აძლევს `/api/v1/im.history.others`, რაც საშუალებას აძლევს სხვა მომხმარებლების მიერ გაგზავნილ პირდაპირი შეტყობინებების ნახვას, რომლის მონაწილეც დამრეკი არ არის",
+ "API_Enable_Rate_Limiter": "ჩართეთ სიჩქარის ლიმიტი",
+ "API_Enable_Rate_Limiter_Dev": "ჩართეთ სიჩქარის ლიმიტი შემუშავებისას",
+ "API_GitHub_Enterprise_URL_Description": "მაგალითი: http://domain.com (ბოლოში სლეშის გარეშე)",
"API_Gitlab_URL": "GitLab-ის URL",
+ "API_Personal_Access_Token_Name": "პირადი წვდომის ნიშანი (token)",
+ "API_Personal_Access_Tokens_To_REST_API": "პირადი წვდომის ნიშნები (token) REST API– ზე",
+ "API_Personal_Access_Tokens_Remove_Modal": "დარწმუნებული ხართ, რომ გსურთ წაშალოთ ეს პირადი დაშვების ნიშანი(token)?",
+ "API_Personal_Access_Token_Generated": "პირადი დაშვების ნიშანი წარმატებით შეიქმნა",
+ "API_Personal_Access_Token_Generated_Text_Token_s_UserId_s": "გთხოვთ, შეინახოთ თქვენი ნიშანი კარგად, რადგან ამის შემდეგ მას ვეღარ ნახავთ. token: __token__ your user Id: __userId__",
+ "API_Personal_Access_Tokens_Regenerate_Modal": "თუ თქვენი ნიშანი დაკარგეთ ან დაგავიწყდათ, შეგიძლიათ მისი ხელახლა გენერირება, მაგრამ გახსოვდეთ, რომ ყველა პროგრამა, რომელიც ამ ნიშანს იყენებს, უნდა განახლდეს",
+ "API_Personal_Access_Tokens_Regenerate_It": "ნიშნის ხელახლა გენერირება",
+ "API_Shield_Types": "ფარის ტიპები",
+ "API_Shield_Types_Description": "მძიმით გამოყოფილი სიით ფარის ტიპის ჩასართავად აირჩიეთ `ონლაინ`,` არხი` ან `* * ყველასათვის",
+ "API_Shield_user_require_auth": "ავთენტიფიკაციის მოთხოვნა მომხმარებლის ფარისთვის",
+ "API_Token": "API ნიშანი",
+ "API_Tokenpass_URL": "Tokenpass სერვერის ლინკი",
"API_Tokenpass_URL_Description": "მაგ: https://domain.com",
"API_Upper_Count_Limit": "ჩანაწერების მაქსიმალური რაოდენობა",
"API_Upper_Count_Limit_Description": "რა არის ჩანაწერების მაქსიმალური რაოდენობა, რომელიც REST API-ის საშუალებით გაიცემა (როცა არ არის ლიმიტი)?",
+ "API_Use_REST_For_DDP_Calls": "Meteor calls-სთვის გამოიყენეთ REST ვებ სოკეტის ნაცვლად",
+ "API_Use_REST_For_DDP_Calls_Alert": "ეს არის ექსპერიმენტული და დროებითი ოფცია. ეს აიძულებს ვებ – კლიენტს და მობილური აპლიკაციას გამოიყენოს REST მოთხოვნები ვებ სოკეტის ნაცვლად Meteor method calls-ებისთვის",
"API_User_Limit": "მომხმარებლების რაოდენობის ლიმიტი არხზე დამატებისას",
"API_Wordpress_URL": "Word Press-ის URL",
"Apiai_Key": "Api.ai გასაღები",
@@ -254,6 +384,11 @@
"Apps_Framework_Development_Mode": "დეველოპერის რეჟიმის ჩართვა",
"Apps_Framework_Development_Mode_Description": "დეველოპერის რეჟიმში შესაძლებელია იმ აპლიკაციების დაყენება, რომლებიც Rocket.Chat-ის მარკეტში არ არის გამოქვეყნებული.",
"Apps_Framework_enabled": "აპლიკაციების ფრეიმვორკის ჩართვა",
+ "Apps_Game_Center": "გასართობი ცენტრი",
+ "Apps_Game_Center_Back": "უკან გასართობ ცენტრში",
+ "Apps_Game_Center_enabled": "ჩართეთ გასართობი ცენტრი",
+ "Apps_Game_Center_Play_Game_Together": "@ აქ მოდით __name__ ერთად ვითამაშოთ!",
+ "Apps_Game_Center_Invite_Friends": "მოიწვიე მეგობრები",
"Apps_Marketplace_Deactivate_App_Prompt": "ნამდვილად გსურთ ამ აპლიკაციის გამორთვა?",
"Apps_Marketplace_Modify_App_Subscription": "ხელმოწერის შეცვლა",
"Apps_Marketplace_Uninstall_App_Prompt": "ნამდვილად გსურთ ამ აპლიკაციის წაშლა?",
@@ -275,7 +410,37 @@
"Archive": "არქივი",
"archive-room": "არქივი Room",
"archive-room_description": "არხის არქივირების ნებართვა",
+ "are_also_typing": "ასევე ბეჭდავენ",
+ "are_typing": "ბეჭდავენ",
+ "Are_you_sure": "დარწმუნებული ხარ?",
+ "Are_you_sure_you_want_to_delete_your_account": "დარწმუნებული ხართ, რომ გსურთ თქვენი ანგარიშის წაშლა?",
+ "Are_you_sure_you_want_to_disable_Facebook_integration": "დარწმუნებული ხართ, რომ გსურთ გათიშოთ Facebook– ის ინტეგრაცია?",
+ "Are_you_sure_you_want_to_delete_this_record": "დარწმუნებული ხართ, რომ გსურთ ამ ჩანაწერის წაშლა?",
+ "Assets": "აქტივები",
+ "assign-admin-role": "ადმინის როლის მინიჭება",
+ "assign-admin-role_description": "ნებართვა, ადმინისტრატორის უფლების სხვა მომხმარებლებისთვის მისანიჭებლად",
+ "Assign_admin": "ადმინის მინიჭება",
+ "Assign_new_conversations_to_bot_agent": "ახალი საუბრების ბოტისთვის მინიჭება",
+ "Assign_new_conversations_to_bot_agent_description": "მარშრუტიზაციის სისტემა შეეცდება მოძებნოს ბოტი აახალი საუბრის ადამიანთან გადამისამართებამდე",
+ "assign-roles": "მიანიჭეთ როლები",
+ "at": "ზე",
+ "At_least_one_added_token_is_required_by_the_user": "მინიმუმ ერთი დამატებული ნიშანი უნდა იყოს მომხმარებლის მიერ",
+ "AtlassianCrowd": "ატლასის დაჯგუფება",
+ "Attachment_File_Uploaded": "ფაილი აიტვირთა",
+ "Attribute_handling": " ატრიბუტების დამუშავება",
+ "Audio": "აუდიო",
+ "Audios": "აუდიოები",
+ "Audio_message": "აუდიო შეტყობინება",
+ "Audio_Notification_Value_Description": "შეიძლება იყოს ნებისმიერი ხმოვანი სიგნალი: beep, chelle, ding, droplet, highbell",
"Audio_Notifications_Default_Alert": "აუდიო შეტყობინებების ზარი",
+ "Audio_Notifications_Value": "(default) აუდიო შეტყობინებების ზარი",
+ "Auth_Token": "ავთენტიფიკაციის ნიშანი",
+ "Authentication": "ავთენტიფიკაცია",
+ "Author": "ავტორი",
+ "Author_Information": "ინფორმაცია ავტორზე",
+ "Authorization_URL": "ავტორიზაციის ლინკი",
+ "Authorize": "ავტორიზაცია",
+ "auto-translate": "ავტომატური თარგმანი",
"AutoTranslate_Enabled": "ავტომატური თარგმანის ჩართვა",
"AutoTranslate_Google": "Google",
"AutoTranslate_ServiceProvider": "Მომსახურების მომწოდებელი",
@@ -319,6 +484,7 @@
"Blockstack_ButtonLabelText": "ღილაკის ტექსტი",
"Blockstack_Generate_Username": "მომხმარებლის სახელის შექმნა",
"CAS_enabled": "ჩართული",
+ "Chatpal_All_Results": "ყველა",
"Client_Secret": "კლიენტის კოდი",
"Custom": "მორგებული",
"Desktop_Notifications_Default_Alert": "სამაგიდო შეტყობინებების ზარი",
@@ -327,9 +493,12 @@
"Enable": "ჩართვა",
"Enabled": "ჩართული",
"Features_Enabled": "ჩართული ფუნქციები",
+ "importer_status_finishing": "თითქმის დასრულებულია",
+ "Integrations_Outgoing_Type_FileUploaded": "ფაილი აიტვირთა",
"LDAP_Authentication": "ჩართვა",
"LDAP_Enable": "ჩართვა",
"LDAP_User_Search_Scope": "სფერო",
+ "Livechat_Agents": "აგენტები",
"Livechat_registration_form": "სარეგისტრაციო ფორმა",
"Mobile_Notifications_Default_Alert": "მობილური შეტყობინებების ზარი",
"Public": "საჯარო",
@@ -345,4 +514,4 @@
"Your_server_link": "თქვენი სერვერის მისამართი",
"Your_temporary_password_is_password": "თქვენი დროებითი პაროლია არის [password]",
"Your_workspace_is_ready": "თქვენი სამუშაო გარემო მზად არის სამუშაოდ 🎉"
-}
\ No newline at end of file
+}
diff --git a/packages/rocketchat-i18n/i18n/km.i18n.json b/packages/rocketchat-i18n/i18n/km.i18n.json
index fa04232a815c..3c8f5e53d8b4 100644
--- a/packages/rocketchat-i18n/i18n/km.i18n.json
+++ b/packages/rocketchat-i18n/i18n/km.i18n.json
@@ -654,6 +654,7 @@
"Closing_chat": "ការជជែកបិទ",
"Cloud": "ពពក",
"Cloud_Register_manually": "ចុះឈ្មោះដោយដៃ",
+ "Cloud_click_here": "បន្ទាប់ពីចម្លងអត្ថបទសូមចូលទៅកាន់កុងសូលក្លោដ។ [ចុចទីនេះ](__cloudConsoleUrl__)",
"Cloud_register_success": "កន្លែងការងាររបស់អ្នកត្រូវបានចុះឈ្មោះដោយជោគជ័យ!",
"Cloud_connect_support": "ប្រសិនបើអ្នកនៅតែមិនទាន់បានទទួលអ៊ីមែលចុះឈ្មោះសូមប្រាកដថាអ៊ីមែលរបស់អ្នកត្រូវបានធ្វើបច្ចុប្បន្នភាពខាងលើ។ ប្រសិនបើអ្នកនៅតែមានបញ្ហាអ្នកអាចទាក់ទងការគាំទ្រ។",
"Cloud_console": "Cloud Console",
diff --git a/packages/rocketchat-i18n/i18n/ko.i18n.json b/packages/rocketchat-i18n/i18n/ko.i18n.json
index ef5ec22f7827..2d8b6e690f35 100644
--- a/packages/rocketchat-i18n/i18n/ko.i18n.json
+++ b/packages/rocketchat-i18n/i18n/ko.i18n.json
@@ -3161,4 +3161,4 @@
"Your_question": "귀하의 질문",
"Your_server_link": "서버 링크",
"Your_workspace_is_ready": "Rocket.Chat을 사용할 준비가 되었습니다."
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/nl.i18n.json b/packages/rocketchat-i18n/i18n/nl.i18n.json
index b63cd1f010db..db75d3a9e523 100644
--- a/packages/rocketchat-i18n/i18n/nl.i18n.json
+++ b/packages/rocketchat-i18n/i18n/nl.i18n.json
@@ -3052,4 +3052,4 @@
"Your_push_was_sent_to_s_devices": "Je push werd verzonden naar %s apparaten",
"Your_server_link": "Uw serverlink",
"Your_workspace_is_ready": "Uw werkruimte is klaar voor gebruik 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/pl.i18n.json b/packages/rocketchat-i18n/i18n/pl.i18n.json
index 150a6cbd64d4..4b8ad33d430f 100644
--- a/packages/rocketchat-i18n/i18n/pl.i18n.json
+++ b/packages/rocketchat-i18n/i18n/pl.i18n.json
@@ -193,6 +193,7 @@
"Accounts_RegistrationForm_Secret_URL": "Sekretny adres URL",
"Accounts_RegistrationForm_SecretURL": "Sekretny adres URL formularza rejestracyjnego",
"Accounts_RegistrationForm_SecretURL_Description": "Musisz podać losowy ciąg znaków, który zostanie dodany do adresu URL rejestracji. Przykład: https://open.rocket.chat/register/[secret_hash]",
+ "Accounts_Registration_InviteUrlType": "Typ URL zaproszenia",
"Accounts_Registration_InviteUrlType_Direct": "Bezpośrednio",
"Accounts_Registration_InviteUrlType_Proxy": "Proxy",
"Accounts_RequireNameForSignUp": "Wymagaj podana nazwy podczas rejestracji",
@@ -204,8 +205,10 @@
"Accounts_SetDefaultAvatar": "Ustaw domyślny Avatar",
"Accounts_SetDefaultAvatar_Description": "Próbuje ustalić domyślny awatar na podstawie konta OAuth lub Gravatar",
"Accounts_Set_Email_Of_External_Accounts_as_Verified": "Ustaw e-maile zewnętrznych kont jako zweryfikowane",
+ "Accounts_Set_Email_Of_External_Accounts_as_Verified_Description": "Konta utworzone przez zewnętrzne usługi takie jak LDAP, OAth itp będą miały zweryfikowane e-maile automatycznie.",
"Accounts_ShowFormLogin": "Pokaż domyślny formularz logowania",
"Accounts_TwoFactorAuthentication_By_Email_Enabled": "Włącz uwierzytelnienie dwuskładnikowe przez e-mail",
+ "Accounts_TwoFactorAuthentication_By_Email_Enabled_Description": "Użytkownicy z potwierdzonym adresem e-mail i włączoną opcją na stronie swojego profilu otrzymają wiadomość e-mail z tymczasowym kodem do autoryzacji akcji, takich jak logowanie, zapisywanie profilu, itp.",
"Accounts_TwoFactorAuthentication_By_Email_Auto_Opt_In_Description": "Nowi użytkownicy mają dwuskładnikowe urzierzytelnianie przez email domyślnie włączone. Mogą je wyłączyć na swojej stronie profilu.",
"Accounts_TwoFactorAuthentication_By_Email_Code_Expiration": "Czas wygaśnięcia kodu wysłanego przez email w sekundach",
"Accounts_TwoFactorAuthentication_Enabled": "Włącz uwierzytelnianie dwuetapowe",
@@ -229,6 +232,7 @@
"MAU_value": "MAU __value__",
"Activity": "Aktywność",
"Add": "Dodaj",
+ "Add_custom_emoji": "Dodaj niestandardowe emoji",
"add-oauth-service": "Dodaj usługę Oauth",
"add-oauth-service_description": "Zezwolenie na dodanie nowej usługi Oauth",
"add-user": "Dodaj użytkownika",
@@ -395,6 +399,7 @@
"Apps_Game_Center": "Centrum gier",
"Apps_Game_Center_Back": "Wróć do centrum gier",
"Apps_Game_Center_enabled": "Włącz centrum gier",
+ "Apps_Game_Center_Invite_Friends": "Zaproś swoich przyjaciół do dołączenia",
"Apps_Marketplace_Deactivate_App_Prompt": "Czy na pewno chcesz wyłączyć tę aplikację?",
"Apps_Marketplace_Modify_App_Subscription": "Zmień subskrypcję",
"Apps_Marketplace_Uninstall_App_Prompt": "Czy na pewno chcesz odinstalować tę aplikację?",
@@ -426,6 +431,7 @@
"assign-admin-role": "Przypisywanie roli administratora",
"assign-admin-role_description": "Zezwolenie na przydzielenie roli administratora innym użytkownikom",
"Assign_admin": "Przypisywanie admina",
+ "Assign_new_conversations_to_bot_agent": "Przypisz nowe rozmowy do agenta bota",
"assign-roles": "Przypisz role",
"at": "w",
"At_least_one_added_token_is_required_by_the_user": "Przynajmniej jeden dodany token jest wymagany przez użytkownika",
@@ -468,6 +474,7 @@
"AutoTranslate_Enabled": "Włącz automatyczne tłumaczenie",
"AutoTranslate_Enabled_Description": "Włączenie automatycznego tłumaczenia umożliwi osobom z automatycznym tłumaczeniem automatycznego tłumaczenia wszystkich wiadomości na wybrany przez nich język. Mogą obowiązywać opłaty.",
"AutoTranslate_Google": "Google",
+ "AutoTranslate_Microsoft": "Microsoft",
"AutoTranslate_ServiceProvider": "Dostawca usługi",
"Available": "Dostępny",
"Available_agents": "Dostępni agenci",
@@ -527,6 +534,8 @@
"Broadcasting_enabled": "Rozgłaszanie włączone",
"Broadcasting_media_server_url": "URL serwera rozgłaszającego",
"Browse_Files": "Przeglądaj pliki",
+ "Browser_does_not_support_audio_element": "Twoja przeglądarka nie obsługuje elementów audio.",
+ "Browser_does_not_support_video_element": "Twoja przeglądarka nie obsługuje elementów wideo.",
"Bugsnag_api_key": "Klucz API Bugsnag",
"Build_Environment": "Buduj środowisko",
"bulk-register-user": "Zbiorcze tworzenie kanałów",
@@ -644,6 +653,7 @@
"Chatpal_Welcome": "Życzymy miłego poszukiwania!",
"Chatpal_Window_Size": "Rozmiar okna indeksu",
"Chatpal_Window_Size_Description": "Rozmiar okien indeksu w godzinach (po bootowaniu)",
+ "Check_All": "Sprawdź wszystko",
"Check_Progress": "Sprawdzanie postępów",
"Choose_a_room": "Wybierz pokój",
"Choose_messages": "Wybierz wiadomości",
@@ -675,16 +685,26 @@
"close-others-livechat-room": "Zamknij pokój Livechat",
"Cloud_workspace_connected_without_account": "Twoja przestrzeń robocza jest teraz połączona z Chmurą Rocket.Chat. Jeśli chcesz, możesz zalogować się do Chmury Rocket.Chat i powiązać tą przestrzeń z Twoim kontem w chmurze.",
"close-others-livechat-room_description": "Zezwolenie na zamknięcie innych kanałów LiveChat",
+ "Close_room_description": "Masz zamiar zamknąć tę rozmowę. Jesteś pewien, że chcesz kontynuować?",
"Closed": "Zamknięte",
+ "Closed_At": "Zamknięty o",
"Closed_by_visitor": "Zamknięte przez odwiedzającego",
"Closing_chat": "Zamykanie czatu",
"Cloud": "Chmura",
+ "Cloud_Register_manually": "Zarejestruj się ręcznie",
+ "Cloud_click_here": "Po skopiowaniu tekstu, przejdź do konsoli chmury. [Kliknij tutaj]()",
+ "Cloud_register_offline_finish_helper": "Po zakończeniu rejestracji w Cloud Console pokaże się tekst. Wklej go tutaj aby zakończyć rejestrację.",
+ "Cloud_register_offline_helper": "Workspace może być zarejestrowany manualnie jeśli nie ma dostępu do sieci. Przekopiuj poniższy tekst i przejdź do Cloud Console aby zakończyć proces.",
+ "Cloud_register_success": "Twój workspace został pomyślnie zarejestrowany.",
+ "Cloud_register_error": "Nastąpił błąd przy próbie przetworzenia Twojego żądania. Proszę spróbować ponownie później.",
+ "Cloud_connect_support": "Jeśli nadal nie otrzymałeś e-maila rejestracyjnego, upewnij się, że Twój e-mail został zaktualizowany powyżej. Jeśli nadal masz problemy, możesz skontaktować się z pomocą techniczną pod adresem",
"Cloud_console": "Konsola w chmurze",
"Cloud_Info": "Chmura",
"Cloud_what_is_it": "Co to jest?",
"Cloud_what_is_it_description": "Połączenie z Chmurą Rocket.Chat pozwala Ci na złączenie Twojej lokalnej instancji Rocket.Chat z naszą chmurą. Pozwoli Ci to na zarządzanie swoimi licencjami, rachunkami oraz wsparciem w Chmurze Rocket.Chat.",
"Cloud_what_is_it_services_like": "Usługi takie jak:",
"Cloud_what_is_it_additional": "Ponadto będziesz mógł zarządzać licencjami, fakturami i wsparciem z konsoli Rocket.Chat Cloud.",
+ "Cloud_workspace_connected": "Twoja przestrzeń robocza jest połączona z Rocket.Chat Cloud. Logując się do swojego konta Rocket.Chat Cloud, będziesz mógł korzystać z niektórych usług, takich jak marketplace.",
"Cloud_workspace_support": "Jeśli masz problemy z usługą w chmurze, spróbuj najpierw zsynchronizować. Jeśli problem nie zostanie rozwiązany, utwórz zgłoszenie w systemie pomocy technicznej w konsoli Cloud.",
"Cloud_workspace_disconnect": "Jeśli nie chcesz już korzystać z usług w chmurze, możesz odłączyć swoją przestrzeń roboczą od Rocket.Chat Cloud.",
"Cloud_login_to_cloud": "Zaloguj się do Chmury Rocket.Chat",
@@ -698,6 +718,7 @@
"Cloud_registration_required_link_text": "Kliknij tutaj, aby zarejestrować swoją przestrzeń roboczą.",
"Cloud_error_in_authenticating": "Błąd podczas uwierzytelniania",
"Cloud_error_code": "Kod: __errorCode__",
+ "Cloud_status_page_description": "Jeśli dana usługa w chmurze ma problemy, można je sprawdzić na naszej stronie statusu pod adresem",
"Cloud_troubleshooting": "Rozwiązywanie problemów",
"Collaborative": "Współpracujący",
"Collapse_Embedded_Media_By_Default": "Zwiń media (obrazki itp.) domyślnie",
@@ -728,7 +749,11 @@
"Conversation": "Rozmowa",
"Conversations": "Konwersacje",
"Conversation_closed": "Rozmowa zamknięta: __comment__.",
+ "Conversation_closing_tags": "Znaczniki zamknięcia rozmowy",
+ "Conversation_closing_tags_description": "Tagi zamykające zostaną automatycznie przypisane do rozmów przy zamykaniu.",
+ "Conversation_finished": "Rozmowa zakończona",
"Conversation_finished_message": "Koniec ukończonej wiadomości",
+ "Conversation_finished_text": "Tekst zakończonej rozmowy",
"Conversations_per_day": "Konwersacje na dzień",
"conversation_with_s": "rozmowa z %s",
"Convert_Ascii_Emojis": "Konwertuj ASCII do Emoji",
@@ -986,6 +1011,8 @@
"create-c_description": "Zezwolenie na tworzenie kanałów publicznych",
"create-d": "Twórz bezpośrednie wiadomości",
"create-d_description": "Zezwolenie na uruchamianie bezpośrednich wiadomości",
+ "create-invite-links": "Tworzenie linków do zaproszeń",
+ "create-invite-links_description": "Zezwolenie na tworzenie linków zapraszających do kanałów",
"create-p": "Utwórz kanały prywatne",
"create-p_description": "Zezwolenie na tworzenie kanałów prywatnych",
"create-personal-access-tokens": "Utwórz osobiste tokeny dostępowe",
@@ -994,6 +1021,7 @@
"Create_A_New_Channel": "Tworzenie nowego kanału",
"Create_new": "Utwórz",
"Create_unique_rules_for_this_channel": "Twórz unikalne reguły dla tego kanału",
+ "Created": "Stworzony",
"Created_at": "Utworzono",
"Created_at_s_by_s": "Utworzono o %s przez %s",
"Created_at_s_by_s_triggered_by_s": "Utworzony w %s przez %s wywołany przez %s",
@@ -1231,6 +1259,8 @@
"email_style_label": "Styl e-mail",
"email_style_description": "Unikaj zagnieżdżonych selektorów",
"Email_verified": "E-mail zweryfikowany",
+ "email_plain_text_only": "Wysyłaj wiadomości e-mail zwykłym tekstem",
+ "Emails_sent_successfully!": "Wiadomości e-mail wysłane pomyślnie!",
"Emoji": "Emoji",
"Emoji_provided_by_JoyPixels": "Emoji dostarczane przez JoyPixels",
"EmojiCustomFilesystem": "System plików własnych emoji",
@@ -1240,6 +1270,7 @@
"Enable_Desktop_Notifications": "Włącz powiadomienia na pulpicie",
"Enable_Svg_Favicon": "Włącz favicon SVG",
"Enable_two-factor_authentication": "Włącz uwierzytelnianie dwuskładnikowe",
+ "Enable_two-factor_authentication_email": "Włącz uwierzytelnienie dwuskładnikowe przez e-mail",
"Enabled": "Włączone",
"Encrypted": "Szyfrowane",
"Encrypted_channel_Description": "Kanał zaszyfrowany od końca do końca. Wyszukiwanie nie działa z szyfrowanymi kanałami, a powiadomienia mogą nie wyświetlać treści wiadomości.",
@@ -1250,6 +1281,7 @@
"End_OTR": "Koniec OTR",
"Enter_a_name": "Podaj imię",
"Enter_a_regex": "Wprowadź regex",
+ "Enter_a_department_name": "Podaj nazwę działu",
"Enter_a_room_name": "Wpisz nazwę pokoju",
"Enter_a_username": "Nazwa użytkownika",
"Enter_a_tag": "Wpisz tag",
@@ -1266,10 +1298,12 @@
"Entertainment": "Rozrywka",
"Error": "Błąd",
"error-action-not-allowed": "__action__ jest niedozwolone",
+ "error-agent-offline": "Agent jest offline",
"error-application-not-found": "Aplikacja nie znaleziona",
"error-archived-duplicate-name": "Istnieje zarchiwizowany kanał o nazwie '__room_name__ '",
"error-avatar-invalid-url": "Nieprawidłowy awatar URL: __url__",
"error-avatar-url-handling": "Błąd podczas przenoszenia ustawienia awatara z URL (__url__) do użytkownika __username__",
+ "error-cannot-delete-app-user": "Usuwanie użytkownika aplikacyjnego jest niedozwolone, odinstaluj odpowiednią aplikację aby móc go usunąć.",
"error-cant-invite-for-direct-room": "Nie można zaprosić użytkownika do bezpośrednich pokoi",
"error-channels-setdefault-is-same": "Ustawienie domyślne kanału jest takie samo jak to, do którego zostanie zmienione.",
"error-channels-setdefault-missing-default-param": "Parametr bodyParam \"default\" jest wymagany",
@@ -1298,6 +1332,7 @@
"error-invalid-channel-start-with-chars": "Nieprawidłowy kanał. Rozpocznij z @ lub #",
"error-invalid-custom-field": "Nieprawidłowe pole",
"error-invalid-custom-field-name": "Nieprawidłowa nazwa pole niestandardowe. Używaj tylko litery, cyfry, łączniki i podkreślenia.",
+ "error-invalid-custom-field-value": "Nieprawidłowa wartość dla pola __field__",
"error-invalid-date": "Nieprawidłowa data.",
"error-invalid-description": "Nieprawidłowy opis",
"error-invalid-domain": "Nieprawidłowa domena",
@@ -1307,6 +1342,7 @@
"error-invalid-file-type": "Nieprawidłowy typ pliku",
"error-invalid-file-width": "Nieprawidłowa szerokość pliku",
"error-invalid-from-address": "Adres nadawcy jest nieprawidłowy",
+ "error-invalid-inquiry": "Nieprawidłowe zapytanie",
"error-invalid-integration": "Nieprawidłowy integracja",
"error-invalid-message": "Nieprawidłowa wiadomość",
"error-invalid-method": "Nieprawidłowa metoda",
@@ -1333,6 +1369,7 @@
"error-no-tokens-for-this-user": "Brak tokenu dla tego użytkownika",
"error-not-allowed": "Niedozwolone",
"error-not-authorized": "Nieautoryzowany",
+ "error-office-hours-are-closed": "Godziny pracy są zamknięte.",
"error-password-policy-not-met": "Hasło nie spełnia zasad serwera",
"error-password-policy-not-met-maxLength": "Hasło nie spełnia polityki serwera o maksymalnej długości (zbyt długie hasło)",
"error-password-policy-not-met-minLength": "Hasło nie spełnia polityki serwera o minimalnej długości (hasło jest zbyt krótkie)",
@@ -1341,8 +1378,12 @@
"error-password-policy-not-met-oneSpecial": "Hasło nie spełnia zasad serwera co najmniej jednego znaku specjalnego",
"error-password-policy-not-met-oneUppercase": "Hasło nie spełnia zasad serwera co najmniej jednego dużego znaku",
"error-password-policy-not-met-repeatingCharacters": "Hasło nie jest zgodne z polityką serwera dotyczącą zabronionych powtarzających się znaków (masz za dużo takich samych znaków obok siebie)",
+ "error-pinning-message": "Wiadomość nie może być przypięta",
+ "error-unpinning-message": "Wiadomość nie może być odpięta",
"error-push-disabled": "Push jest wyłączony",
"error-remove-last-owner": "To jest ostatni właściciel. Proszę ustawić nowego właściciela przed usunięciem tego.",
+ "error-returning-inquiry": "Błąd przy zwracaniu zapytania do kolejki",
+ "error-tags-must-be-assigned-before-closing-chat": "Tag(i) musi (muszą) być przypisane przed zamknięciem czatu",
"error-role-in-use": "Nie można usunąć roli, ponieważ jest w użyciu",
"error-role-name-required": "Nazwa roli jest wymagana",
"error-room-is-not-closed": "Pokój nie jest zamknięty",
@@ -1356,12 +1397,16 @@
"error-too-many-requests": "Błąd, zbyt wiele żądań. Proszę zwolnij. Musisz czekać __seconds__ sekund przed ponowną próbą.",
"error-user-has-no-roles": "Użytkownik nie ma ról",
"error-user-is-not-activated": "Użytkownik nie jest aktywny",
+ "error-user-is-not-agent": "Użytkownik nie jest agentem Omnichannel",
+ "error-user-is-offline": "Użytkownik, jeśli jest offline",
"error-user-limit-exceeded": "Liczba użytkowników, których próbujesz zaprosić na # nazwa kanału, przekracza limit ustawiony przez administratora",
"error-user-not-in-room": "Użytkownik nie jest w tym pokoju",
"error-logged-user-not-in-room": "Nie jesteś w pokoju `%s`",
"error-user-registration-disabled": "Rejestracja nowych użytkowników jest wyłączona",
"error-user-registration-secret": "Rejestracja nowego użytkownika jest możliwa tylko poprzez sekretny URL",
+ "error-validating-department-chat-closing-tags": "Przynajmniej jeden znacznik zamknięcia jest wymagany, gdy dział wymaga znacznika (znaczników) przy zamykaniu rozmów.",
"error-you-are-last-owner": "Jesteś ostatnim właścicielem. Proszę ustaw nowego przed opuszczeniem pokoju.",
+ "error-starring-message": "Wiadomość nie może być oznaczona gwiazdką",
"Error_404": "Błąd 404",
"Error_changing_password": "Błąd zmiany hasła",
"Error_loading_pages": "Wystąpił błąd podczas ładowania stron",
@@ -1390,14 +1435,26 @@
"except_pinned": "(z wyjątkiem tych, które są przypięte)",
"Execute_Synchronization_Now": "Uruchom teraz synchronizację",
"Exit_Full_Screen": "Wyjdź z trybu pełnoekranowego",
+ "Experimental_Feature_Alert": "To jest eksperymentalna funkcja! Proszę pamiętać, że może się ona zmienić, zepsuć, a nawet zostać usunięta w przyszłości bez uprzedzenia.",
+ "Expiration": "Wygaśnięcie",
+ "Expiration_(Days)": "Czas ważności w dniach",
"Export_My_Data": "Eksportuj moje dane",
"expression": "Wyrażenie",
"Extended": "Rozszerzone",
"External_Domains": "Domeny zewnętrzne",
+ "External_Users": "Użytkownicy zewnętrzni",
"External_Queue_Service_URL": "URL usługi kolejki zewnętrznej",
"External_Service": "Usługa zewnętrzna",
"Facebook_Page": "Strona na Facebooku",
"Failed": "Nieudane",
+ "Failed_to_activate_invite_token": "Nie udało się aktywować tokena zaproszenia",
+ "Failed_To_Download_Files": "Nie udało się pobrać plików",
+ "Failed_to_generate_invite_link": "Nie udało się wygenerować linku zapraszającego",
+ "Failed_To_Load_Import_Data": "Nie udało się załadować importowych danych",
+ "Failed_To_Load_Import_History": "Nie udało się załadować historii importu",
+ "Failed_To_Load_Import_Operation": "Nie udało się załadować operacji importu",
+ "Failed_To_Start_Import": "Nie udało się rozpocząć operacji importu",
+ "Failed_to_validate_invite_token": "Nie udało się zwalidować tokenu zaproszenia",
"False": "Nie",
"Favorite_Rooms": "Włącz ulubione pokoje",
"Favorite": "Ulubiony",
@@ -1405,20 +1462,30 @@
"Feature_Depends_on_Livechat_Visitor_navigation_as_a_message_to_be_enabled": "Ta funkcja zależy od włączenia \"Wyślij historię nawigacji użytkownika jako wiadomość\".",
"Features_Enabled": "Opis Włączone",
"FEDERATION_Domain": "Domena",
+ "FEDERATION_Domain_Description": "Dodaj domenę, z którą ten serwer powinien być połączony - na przykład: @rocket.chat.",
+ "FEDERATION_Domain_Alert": "Nie zmieniaj tego po włączeniu funkcji, nie obsługujemy jeszcze zmian w domenie.",
"FEDERATION_Hub_URL": "Hub URL",
+ "FEDERATION_Hub_URL_Description": "Ustawić adres URL hub'a, na przykład: https://hub.rocket.chat. Porty są również akceptowane.",
"FEDERATION_Public_Key": "Klucz publiczny",
"FEDERATION_Public_Key_Description": "To jest klucz, który musisz udostępnić swoim użytkownikom.",
"FEDERATION_Status": "Status",
"FEDERATION_Test_Setup": "Test ustawień",
+ "FEDERATION_Test_Setup_Error": "Nie można znaleźć twojego serwera używając twojej konfiguracji, proszę przejrzeć ustawienia.",
+ "FEDERATION_Test_Setup_Success": "Twoja konfiguracja Federation działa, a inne serwery mogą cię znaleźć!",
"FEDERATION_Unique_Id": "Unikalne ID",
+ "FEDERATION_Error_user_is_federated_on_rooms": "Nie można usuwać użytkowników federacji, którzy należą do pokoi",
"Field": "Pole",
"Field_removed": "Pole usunięte",
"Field_required": "Pole wymagane",
+ "File": "Plik",
+ "File_Downloads_Started": "Pobieranie plików rozpoczęte",
+ "Files": "Pliki",
"File_exceeds_allowed_size_of_bytes": "Plik przekracza dozwoloną wielkość __size__ bajtów",
"File_name_Placeholder": "Wyszukaj pliki ...",
"File_removed_by_automatic_prune": "Plik usunięty przez automatyczne przycinanie",
"File_not_allowed_direct_messages": "Udostępnianie plików jest niedozwolone w wiadomościach bezpośrednich.",
"File_removed_by_prune": "Plik usunięty przez przycięcie",
+ "File_Path": "Ścieżka pliku",
"File_type_is_not_accepted": "Typ pliku niedozwolony",
"File_uploaded": "Plik przesłany",
"FileUpload": "Przesyłanie plików",
@@ -1647,13 +1714,16 @@
"importer_status_importing_messages": "Importowanie wiadomości",
"importer_status_finishing": "Już prawie zrobione",
"importer_status_import_failed": "Błąd",
+ "importer_status_import_cancelled": "Anulowany",
"Importer_Upload_FileSize_Message": "Twoje ustawienia serwera pozwalają na przesyłanie plików o wielkości do __maxFileSize__.",
"Importer_Upload_Unlimited_FileSize": "Twoje ustawienia serwera pozwalają na przesyłanie plików dowolnej wielkości.",
"Importer_ExternalUrl_Description": "Możesz również użyć adresu URL dla pliku dostępnego publicznie:",
"Importing_channels": "Importowanie kanałów",
+ "Importing_Data": "Importowanie danych",
"Importing_messages": "Importowanie wiadomości",
"Importing_users": "Importowanie użytkowników",
"Inclusive": "Włącznie",
+ "In_progress": "W toku",
"Incoming_Livechats": "Przychodzący LIvechat",
"Incoming_WebHook": "Przychodzący WebHook",
"Industry": "Typ działalności",
@@ -1731,6 +1801,7 @@
"Invalid_Import_File_Type": "Nieprawidłowy typ pliku do zaimportowania.",
"Invalid_name": "Nazwa nie może być pusta",
"Invalid_notification_setting_s": "Nieprawidłowe ustawienie powiadamiania: %s",
+ "Invalid_or_expired_invite_token": "Nieważny lub wygasły token zaproszenia",
"Invalid_pass": "Hasło nie może być puste",
"Invalid_reason": "Powód dołączenia nie może być pusty",
"Invalid_room_name": "%s nie jest poprawną nazwą pokoju, dozwolone są tylko litery, cyfry i myślniki",
@@ -1743,6 +1814,7 @@
"Invitation_Email_Description": "Możesz użyć następujących symboli zastępczych:
[email] na e-mail odbiorcy.
[Site_Name] i [Site_URL] dla nazwy aplikacji i zawartości odpowiednio.
",
"Invitation_Subject": "Temat zaproszenia",
"Invitation_Subject_Default": "Zostałeś zaproszony do [Site_Name]",
+ "Invite_Link": "Link zaproszenia",
"Invite_user_to_join_channel": "Zaproś użytkownika by dołączył do kanału",
"Invite_user_to_join_channel_all_from": "Zaproś wszystkich użytkowników z [#channel], aby dołączyć do tego kanału",
"Invite_user_to_join_channel_all_to": "Zaproś wszystkich użytkowników tego kanału do przyłączenia się [kanał #]",
@@ -1773,14 +1845,25 @@
"IssueLinks_Incompatible": "Ostrzeżenie: nie włączaj jednocześnie tego i \"Podglądu koloru szesnastkowego\".",
"IssueLinks_LinkTemplate": "Szablon linków do odsyłaczy",
"IssueLinks_LinkTemplate_Description": "Szablon linków do odsyłaczy; %s zostanie zastąpiony numerem wydania.",
+ "Items_per_page:": "Elementów na stronę:",
"It_works": "To działa",
"italic": "Pochylona",
"italics": "kursywa",
+ "Mobex_sms_gateway_address": "Adres Mobex SMS Gateway",
+ "Mobex_sms_gateway_address_desc": "IP lub Host usługi Mobex z określonym portem. Np. `http://192.168.1.1:1401` lub `https://www.example.com:1401`",
"Mobex_sms_gateway_from_number": "Od",
+ "Mobex_sms_gateway_from_number_desc": "Adres źródłowy/numer telefonu podczas wysyłania nowego SMS-a do klienta Livechat",
+ "Mobex_sms_gateway_from_numbers_list": "Lista numerów do wysłania wiadomości SMS z",
+ "Mobex_sms_gateway_from_numbers_list_desc": "Lista oddzielonych przecinkami numerów do wykorzystania przy wysyłaniu nowych wiadomości, np. 123456789, 123456788, 123456888",
"Mobex_sms_gateway_password": "Hasło",
+ "Mobex_sms_gateway_restful_address": "Adres Mobex SMS REST API",
+ "Mobex_sms_gateway_restful_address_desc": "IP lub Host Twojego Mobex REST API. Np. `http://192.168.1.1:8080` lub `https://www.example.com:8080`",
"Mobex_sms_gateway_username": "Nazwa użytkownika",
+ "Most_popular_channels_top_5": "Najpoplarniejsze kanały (top 5)",
"Jitsi_Chrome_Extension": "Chrome Extension Id",
+ "Jitsi_Enabled_TokenAuth": "Włącz JWT auth",
"Jitsi_Enable_Channels": "Włącz w kanałach",
+ "Jitsi_Limit_Token_To_Room": "Ogranicz token do pokoju Jitsi",
"Job_Title": "Stanowisko",
"join": "Dołącz",
"join-without-join-code": "Dołącz bez kodu dołączania",
@@ -1792,6 +1875,7 @@
"Join_the_given_channel": "Dołącz do tego kanału",
"Join_video_call": "Dołącz do połączenia wideo",
"Joined": "Dołączył",
+ "Joined_at": "Dołączył o",
"Jump": "Skocz",
"Jump_to_first_unread": "Przejdź do pierwszej nieprzeczytanej",
"Jump_to_message": "Skocz do wiadomości",
@@ -1833,12 +1917,17 @@
"Language_Russian": "Rosyjski",
"Language_Spanish": "Hiszpański",
"Language_Version": "Wersja angielska",
+ "Last_active": "Ostation aktywny",
"Last_login": "Ostatnie logowanie",
"Last_Message_At": "Ostatnie wiadomości o",
"Last_seen": "Ostatnio dostępny",
"Last_token_part": "Ostatnia część tokena",
"Last_Message": "Ostatnia wiadomość",
+ "Last_Status": "Ostatni status",
"Last_Updated": "Ostatnio zaktualizowany",
+ "Last_7_days": "Ostatnie 7 dni",
+ "Last_30_days": "Ostatnie 30 dni",
+ "Last_90_days": "Ostatnie 90 dni",
"Launched_successfully": "Uruchomiony pomyślnie",
"Layout": "Wygląd i treść",
"Layout_Home_Body": "Treść strony głównej",
@@ -1918,6 +2007,7 @@
"manage-integrations_description": "Zezwolenie na zarządzanie integracjami serwerów",
"manage-own-integrations": "Zarządzaj własnymi integracjami",
"manage-own-integrations_description": "Zezwolenie na zezwolenie użytkownikom na tworzenie i edytowanie własnej integracji lub webhooków",
+ "LDAP_Sync_User_Data_Groups_AutoRemove": "Automatyczne usuwanie roli użytkownika",
"LDAP_Test_Connection": "Testuj połączenie",
"LDAP_Timeout": "Limit czasu (ms)",
"LDAP_Timeout_Description": "Ile milisekund czeka na wynik wyszukiwania, zanim zwróci błąd",
@@ -1935,6 +2025,7 @@
"leave-c": "Opuść kanały",
"leave-p": "Opuść grupy prywatne",
"Leave": "Opuść",
+ "Leave_a_comment": "Zostaw komentarz",
"Leave_Group_Warning": "Czy na pewno chcesz opuścić grupę \"%s\"?",
"Leave_Livechat_Warning": "Czy na pewno chcesz opuścić livechat za pomocą \"%s\"?",
"Leave_Private_Warning": "Czy na pewno chcesz opuścić dyskusję z \"%s\"?",
@@ -1949,6 +2040,7 @@
"Livechat_agents": "Agenci Livechat`a",
"Livechat_Agents": "Agenci",
"Livechat_AllowedDomainsList": "Livechat Allowed Domains",
+ "Livechat_Appearance": "Wygląd Livechat",
"Livechat_Dashboard": "Panel Livechat`a",
"Livechat_enabled": "Włącz Livechat",
"Livechat_Facebook_API_Key": "OmniChannel API Key",
@@ -1958,6 +2050,7 @@
"Livechat_forward_open_chats_timeout": "Limit czasu (w sekundach) w celu przekazania rozmowy",
"Livechat_guest_count": "Licznik gości",
"Livechat_Inquiry_Already_Taken": "Żądanie na Livechat już zajęte",
+ "Livechat_Installation": "Instalacja Livechat",
"Livechat_managers": "Menedżerzy Livechat`a",
"Livechat_Managers": "Menedżerowie",
"Livechat_offline": "Livechat offline",
@@ -2117,14 +2210,24 @@
"Message_GlobalSearch": "Wyszukiwanie globalne",
"Message_GroupingPeriod": "Czas grupowania wiadomości (w sekundach)",
"Message_GroupingPeriodDescription": "Wiadomości będą grupowane z poprzednimi, jeżeli obie zostały wysłane przez tego samego użytkownika i czas, który upłynął jest mniejszy od wartości podanej w sekundach.",
+ "Message_has_been_pinned": "Wiadomość została przypięta",
+ "Message_has_been_unpinned": "Wiadomość została odpięta",
+ "Message_has_been_starred": "Wiadomość została oznaczona gwiazdką",
+ "Message_has_been_unstarred": "Gwiazdka został usunięta z wiadomości",
"Message_HideType_au": "Ukryj wiadomości \"dodane przez użytkownika\"",
"Message_HideType_mute_unmute": "Ukryj komunikaty \"Wycisz / Ignoruj użytkownika\"",
"Message_HideType_ru": "Ukryj wiadomości \"usunięte przez użytkownika\"",
"Message_HideType_uj": "Ukryj wiadomości \"Dołącz do użytkownika\"",
"Message_HideType_ul": "Ukryj wiadomości \"zostawiaj użytkownika\"",
"Message_HideType_r": "Ukryj wiadomości \"Room Name Changed\"",
+ "Message_HideType_ut": "Ukryj wiadomość \"Użytkownik dołączył do konwersacji\"",
+ "Message_HideType_wm": "Ukryj wiadomość \"Witamy\"",
+ "Message_HideType_rm": "Ukryj wiadomość \"Wiadomość usunięta\"",
+ "Message_HideType_subscription_role_added": "Ukryj wiadomość \"Ustawiono rolę\"",
+ "Message_HideType_subscription_role_removed": "Ukryj wiadomość \"Rola już nie ma definicji\"",
"Message_HideType_room_archived": "Ukryj wiadomości \"Room Archived\"",
"Message_HideType_room_unarchived": "Ukryj wiadomości \"Room Unarchived\"",
+ "Hide_System_Messages": "Ukryj wiadomości systemowe",
"Message_Id": "ID wiadomości",
"Message_Ignored": "Ta wiadomość została zignorowana",
"Message_info": "Informacje o wiadomości",
@@ -2159,6 +2262,7 @@
"Message": "Wiadomość",
"messages": "Wiadomości",
"Messages": "Wiadomości",
+ "Messages_sent": "Wiadomości wysłane",
"Messages_that_are_sent_to_the_Incoming_WebHook_will_be_posted_here": "Wiadomości, które zostaną przesłane przez WebHook będą publikowane tutaj.",
"Meta": "Meta",
"Meta_custom": "Niestandardowe tagi meta",
@@ -2179,6 +2283,7 @@
"Min_length_is": "Minimalna długość to %s",
"Minimum": "Minimum",
"Minimum_balance": "Minimalne saldo",
+ "minute": "minuta",
"minutes": "minut",
"Mobile": "Powiadomnienia mobilne",
"Mobile_Notifications_Default_Alert": "Domyślne powiadomnienia mobilne",
@@ -2217,7 +2322,10 @@
"Name_optional": "Nazwa (opcjonalnie)",
"Name_Placeholder": "Proszę wpisać swoje imię...",
"Navigation_History": "Historia nawigacji",
+ "Never": "Nigdy",
+ "New_users": "Nowi użytkownicy",
"New_Application": "Nowa aplikacja",
+ "New_chat_in_queue": "Nowa rozmowa w kolejce",
"New_Custom_Field": "Nowe niestandardowe pole",
"New_Department": "Nowy oddział",
"New_discussion": "Nowa dyskusja",
@@ -2225,6 +2333,7 @@
"New_discussion_first_message": "Zazwyczaj dyskusja rozpoczyna się od pytania, np. \"Jak mogę przesłać obrazek?\"",
"New_integration": "Nowa integracja",
"New_line_message_compose_input": "`%s` - Nowa linia w komunikacie komponuj wejście",
+ "New_Livechat_offline_message_has_been_sent": "Została wysłana nowa wiadomość Livechat offline",
"New_logs": "Nowe logi",
"New_Message_Notification": "Powiadomienie o nowej wiadomości",
"New_messages": "Nowe wiadomości",
@@ -2241,12 +2350,14 @@
"New_visitor_navigation": "Nowa nawigacja: __history__",
"Newer_than": "Nowszy niż",
"Newer_than_may_not_exceed_Older_than": "\"Nowsze niż\" nie może przekraczać \"Starsze niż\"",
+ "No_Limit": "Brak limitu",
"No_available_agents_to_transfer": "Brak dostępnych agentów do przeniesienia",
"No_channel_with_name_%s_was_found": "Nie odnaleziono kanału o nazwie \"%s\"!",
"No_channels_yet": "Nie jesteś członkiem żadnego kanału.",
"No_direct_messages_yet": "Nie rozpocząłeś jeszcze żadnej rozmowy.",
"No_emojis_found": "Nie znaleziono emojis",
"No_Encryption": "Bez szyfrowania",
+ "No_files_left_to_download": "Brak plików do pobrania",
"No_group_with_name_%s_was_found": "Nie odnaleziono grupy o nazwie \"%s\"!",
"No_groups_yet": "Nie masz prywatnych grup.",
"No_integration_found": "Nie znaleziono integracji za pomocą podanego identyfikatora.",
@@ -2263,11 +2374,13 @@
"No_discussions_yet": "Brak dyskusji",
"No_Threads": "Nie znaleziono wątków",
"No_user_with_username_%s_was_found": "Nie odnaleziono użytkownika o nazwie \"%s\"!",
+ "No_data_found": "Nie znaleziono żadnych danych",
"Nobody_available": "Nikt nie dostępny",
"Node_version": "Wersja node'a",
"None": "Żaden",
"Nonprofit": "Niedochodowy",
"Normal": "Normalny",
+ "Not_enough_data": "Brak wystarczających danych",
"Not_authorized": "Brak autoryzacji",
"Not_Available": "Niedostępne",
"Not_found_or_not_allowed": "Nie znaleziono lub niedozwolone",
@@ -2309,6 +2422,8 @@
"Offline_form": "Formularz nieaktywny",
"Offline_form_unavailable_message": "Formularz niedostępny niedostępny wiadomość",
"Offline_Link_Message": "PRZEJDŹ DO KOMUNIKATU",
+ "Offline_Message": "Wiadomość offline",
+ "Offline_Message_Use_DeepLink": "Użyj formatu Deep Link URL",
"Offline_Mention_All_Email": "Wymień cały temat e-mail",
"Offline_Mention_Email": "[__site__] Zostałeś wspomniany przez __user__ w #__room__",
"Offline_message": "Wiadomość offline",
@@ -2317,12 +2432,17 @@
"Old Colors": "Stare kolory",
"Old Colors (minor)": "Stare kolory (podrzędne)",
"Older_than": "Starszy niż",
+ "Omnichannel_External_Frame": "Rama zewnętrzna",
+ "Omnichannel_External_Frame_Enabled": "Ramka zewnętrzna włączona",
+ "Omnichannel_External_Frame_URL": "Adres URL zewnętrznej ramki",
+ "Omnichannel_External_Frame_Encryption_JWK": "Klucz szyfrujący (JWK)",
"On": "Na",
"Online": "Online",
"online": "online",
"Only_authorized_users_can_write_new_messages": "Tylko autoryzowani użytkownicy mogą pisać nowe wiadomości",
"Only_from_users": "Usuwaj tylko zawartość tych użytkowników (pozostaw puste, aby wyczyścić zawartość wszystkich użytkowników)",
"Only_On_Desktop": "Tryb pulpitu (wysyła tylko przy użyciu klawisza Enter na pulpicie)",
+ "Only_works_with_chrome_version_greater_50": "Działa tylko z przeglądarkami Chrome w wersjach > 50",
"Only_you_can_see_this_message": "Tylko Ty widzisz tę wiadomość",
"Oops!": "Ups",
"Oops_page_not_found": "Ups, strona nie została znaleziona",
@@ -2367,6 +2487,8 @@
"Password": "Hasło",
"Password_Change_Disabled": "Administrator czatu wyłączył możliwość zmiany haseł",
"Password_Changed_Description": "Możesz użyć następujących symboli zastępczych:
[hasło] dla tymczasowego hasła.
[nazwa][fname], [lname] dla odpowiednio pełnej nazwy użytkownika, imienia lub nazwiska
[email] dla e-maila
[Nazwa witryny] i [Site_URL] dla nazwy aplikacji i adresu URL
",
+ "Password_Changed_Email_Subject": "[Site_Name] - Hasło zmienione",
+ "Password_changed_section": "Hasło zmienione",
"Password_changed_successfully": "Hasło zostało zmienione",
"Password_Policy": "Zasady haseł",
"Past_Chats": "Wcześniejsze czaty",
@@ -3400,4 +3522,4 @@
"Your_question": "Twoje pytanie",
"Your_server_link": "Twój link do serwera",
"Your_workspace_is_ready": "Twój obszar roboczy jest gotowy do użycia 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json
index fe136fe92dfd..81d4439d78a9 100644
--- a/packages/rocketchat-i18n/i18n/pt-BR.i18n.json
+++ b/packages/rocketchat-i18n/i18n/pt-BR.i18n.json
@@ -1975,8 +1975,8 @@
"Livechat_managers": "Gerentes do Omnichannel",
"Livechat_offline": "Omnichannel offline",
"Livechat_online": "Omnichannel on-line",
- "Livechat_offline_message_sent": "Mensagem offline do Livechat enviada",
"Livechat_OfflineMessageToChannel_enabled": "Envie mensagens offline do Livechat para um canal",
+ "Livechat_offline_message_sent": "Mensagem offline do Livechat enviada",
"Livechat_Queue": "Fila Omnichannel",
"Livechat_registration_form": "Formulário de Registro",
"Livechat_registration_form_message": "Mensagem do Formulário de Registro",
@@ -3430,4 +3430,4 @@
"Your_question": "A sua pergunta",
"Your_server_link": "O link do seu servidor",
"Your_workspace_is_ready": "O seu espaço de trabalho está pronto a usar 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/pt.i18n.json b/packages/rocketchat-i18n/i18n/pt.i18n.json
index dc4826591c71..6cce50aa8e08 100644
--- a/packages/rocketchat-i18n/i18n/pt.i18n.json
+++ b/packages/rocketchat-i18n/i18n/pt.i18n.json
@@ -3247,4 +3247,4 @@
"Your_question": "A sua pergunta",
"Your_server_link": "O link do seu servidor",
"Your_workspace_is_ready": "O seu espaço de trabalho está pronto a usar 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/ru.i18n.json b/packages/rocketchat-i18n/i18n/ru.i18n.json
index 04e057628a07..3375ec33ada1 100644
--- a/packages/rocketchat-i18n/i18n/ru.i18n.json
+++ b/packages/rocketchat-i18n/i18n/ru.i18n.json
@@ -662,6 +662,7 @@
"Closing_chat": "Закрыть чат",
"Cloud": "Облако",
"Cloud_Register_manually": "Зарегистрироваться вручную",
+ "Cloud_click_here": "После копирования текста перейдите на Cloud Console. [Щелкните здесь](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "После завершения процесса регистрации в Cloud Console вам должен быть представлен некоторый текст. Пожалуйста, вставьте его здесь, чтобы закончить регистрацию.",
"Cloud_register_offline_helper": "Рабочие места могут быть зарегистрированы вручную, если доступ в сеть ограничен. Скопируйте текст ниже и перейдите в нашу Cloud Console, чтобы завершить процесс.",
"Cloud_register_success": "Ваше рабочее место успешно зарегистрировано!",
diff --git a/packages/rocketchat-i18n/i18n/sr.i18n.json b/packages/rocketchat-i18n/i18n/sr.i18n.json
index b08f75b6b66c..313ff774a4d6 100644
--- a/packages/rocketchat-i18n/i18n/sr.i18n.json
+++ b/packages/rocketchat-i18n/i18n/sr.i18n.json
@@ -2553,4 +2553,4 @@
"Your_push_was_sent_to_s_devices": "Ваш притиском је послат на %s уређајима",
"Your_server_link": "Веза са сервером",
"Your_workspace_is_ready": "Ваш радни простор је спреман за кориштење 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/sv.i18n.json b/packages/rocketchat-i18n/i18n/sv.i18n.json
index 1cc153579053..d497b88a1487 100644
--- a/packages/rocketchat-i18n/i18n/sv.i18n.json
+++ b/packages/rocketchat-i18n/i18n/sv.i18n.json
@@ -2944,4 +2944,4 @@
"Your_push_was_sent_to_s_devices": "Din push skickades till %s enheter",
"Your_server_link": "Din serverlänk",
"Your_workspace_is_ready": "Din arbetsyta är redo att använda 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/tr.i18n.json b/packages/rocketchat-i18n/i18n/tr.i18n.json
index cfe4dab5ba2c..2b5ee0e0553a 100644
--- a/packages/rocketchat-i18n/i18n/tr.i18n.json
+++ b/packages/rocketchat-i18n/i18n/tr.i18n.json
@@ -3325,4 +3325,4 @@
"Your_question": "Sorunuz",
"Your_server_link": "Sunucu bağlantınız",
"Your_workspace_is_ready": "Çalışma alanınız kullanılmaya hazır 🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-i18n/i18n/uk.i18n.json b/packages/rocketchat-i18n/i18n/uk.i18n.json
index bde08843bb17..e925197b6c90 100644
--- a/packages/rocketchat-i18n/i18n/uk.i18n.json
+++ b/packages/rocketchat-i18n/i18n/uk.i18n.json
@@ -674,6 +674,7 @@
"Closing_chat": "закриття чату",
"Cloud": "Хмара",
"Cloud_Register_manually": "Реєстрація вручну",
+ "Cloud_click_here": "Після копіювання тексту перейдіть до хмарної консолі. [Натисніть тут](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "ПІсля завершення процедури реєстрації у Cloud Console ви маєте побачити текст. Вставте цей текст сюди, щоб закінчити реєстрацію.",
"Cloud_register_offline_helper": "Якщо ваш доступ до мережі обмежено або застосовується фізична ізоляція мережі, робочі простори можна зареєструвати вручну. Скопіюйте текст, що його наведено нижче, та перейдіть до нашої консолі Cloud Console, щоб завершити процес.",
"Cloud_register_success": "Ваша робоча область успішно зареєстрована!",
diff --git a/packages/rocketchat-i18n/i18n/zh-TW.i18n.json b/packages/rocketchat-i18n/i18n/zh-TW.i18n.json
index 6b28d5fc0789..a6ab2b1ddcf3 100644
--- a/packages/rocketchat-i18n/i18n/zh-TW.i18n.json
+++ b/packages/rocketchat-i18n/i18n/zh-TW.i18n.json
@@ -700,6 +700,7 @@
"Closing_chat": "關閉聊天中",
"Cloud": "雲端",
"Cloud_Register_manually": "手動註冊",
+ "Cloud_click_here": "在複製完文字後,到雲端控制介面。[點這裡](__cloudConsoleUrl__)",
"Cloud_register_offline_finish_helper": "在雲端控制介面完成註冊程序之後您應該會顯示一些文字。請貼到這裡來完成註冊。",
"Cloud_register_offline_helper": "如果存在間隙或網路存取受到限制,則可以手動註冊工作區。複製下面的文字,然後轉到我們的雲端控制介面以完成該過程。",
"Cloud_register_success": "您的工作區已成功註冊!",
@@ -1076,6 +1077,7 @@
"Custom_Translations": "自訂翻譯",
"Custom_Translations_Description": "應該是有效的JSON,其中鍵是包含鍵和翻譯字典的語言。例如: {\n“en”:{\n“頻道”:“房間”\n},\n“pt”:{\n“頻道”:“薩拉斯”\n}\n}",
"Custom_User_Status": "自訂使用者狀態",
+ "Custom_User_Status_Edit": "編輯自訂使用者狀態",
"Custom_User_Status_Add": "新增使用者狀態",
"Custom_User_Status_Added_Successfully": "自訂使用者狀態已新增成功",
"Custom_User_Status_Delete_Warning": "刪除自訂使用者狀態無法復原。",
@@ -1240,6 +1242,7 @@
"E2E_password_request_text": "存取您的加密私人群組和直接訊息,輸入您的加密密碼。 您需要輸入這個密碼來加密/解密您的訊息在每個您使用的客戶端,金鑰不會儲存在伺服器上。",
"E2E_Reset_Key_Explanation": "此選項將刪除您目前的 E2E 金鑰並登出您。 當再次登入時,Rocket.Chat 將為您產生一個新的金鑰並復原您對具有一個或多個線上成員的任何加密房間的存取權限。 由於E2E加密的性質,Rocket.Chat 將無法復原對沒有線上成員的任何加密房間的存取。",
"Edit": "編輯",
+ "Edit_User": "編輯使用者",
"Edit_Invite": "編輯邀請",
"Edit_Status": "編輯狀態",
"edit-message": "編輯訊息",
@@ -1290,6 +1293,7 @@
"email_style_description": "避免使用套版選擇器",
"Email_verified": "電子郵件已驗證",
"email_plain_text_only": "只寄送存文字郵件",
+ "Emails_sent_successfully!": "電子郵件送出成功!",
"Emoji": "表情符號",
"Emoji_provided_by_JoyPixels": "表情符號提供者為 JoyPixels",
"EmojiCustomFilesystem": "自訂表情符號文件系統",
@@ -1414,6 +1418,7 @@
"error-unpinning-message": "無法取消釘選訊息",
"error-push-disabled": "推播已停用",
"error-remove-last-owner": "這是最後的擁有者。請刪除此人之前設置一個新的擁有者。",
+ "error-returning-inquiry": "將查詢回到佇列時出錯",
"error-role-in-use": "無法刪除的角色,因為它在使用",
"error-role-name-required": "角色名是必需的",
"error-room-is-not-closed": "Room 沒有關閉",
@@ -1577,6 +1582,10 @@
"FileUpload_Webdav_Upload_Folder_Path_Description": "WebDAV 資料夾路徑,檔案應該上傳到哪裡",
"FileUpload_Webdav_Server_URL": "WebDAV 伺服器存取網址",
"Force_Disable_OpLog_For_Cache": "強制禁用 OpLog 作為快取",
+ "Force_Screen_Lock": "強制螢幕鎖定",
+ "Force_Screen_Lock_description": "當啟用時,您將強制使用者使用 PIN/BIOMETRY/FACEID 去解鎖應用程式。",
+ "Force_Screen_Lock_After": "強制螢幕鎖定後",
+ "Force_Screen_Lock_After_description": "最後 session 結束後再次請求密碼的時間(以秒為單位)。",
"FileUpload_Webdav_Username": "WebDAV 使用者名稱",
"Force_Disable_OpLog_For_Cache_Description": "即使可用,也不會使用 OpLog 來同步快取",
"FileUpload_Webdav_Password": "WebDAV 密碼",
@@ -2134,6 +2143,7 @@
"Livechat_AllowedDomainsList": "已允許的即時聊天網域",
"Livechat_Appearance": "即時通訊介面",
"Livechat_Dashboard": "即時聊天儀表板",
+ "Livechat_DepartmentOfflineMessageToChannel": "發送該部門的即時聊天離線訊息至頻道",
"Livechat_enabled": "即時聊天已啟用",
"Livechat_Facebook_API_Key": "Omni Channel API 金鑰",
"Livechat_Facebook_API_Secret": "Omni Channel API 加密",
@@ -2147,6 +2157,7 @@
"Livechat_Managers": "管理員",
"Livechat_offline": "即時聊天離線",
"Livechat_online": "即時聊天線上",
+ "Livechat_OfflineMessageToChannel_enabled": "將即時聊天離線消息傳送到頻道",
"Livechat_offline_message_sent": "即時聊天離線訊息傳送",
"Livechat_Queue": "即時通訊隊列",
"Livechat_registration_form": "註冊表單",
@@ -2213,6 +2224,7 @@
"Mail_Messages": "郵件訊息",
"Mail_Messages_Instructions": "通過點擊訊息選擇您要通過電子郵件發送哪些訊息",
"Room_uploaded_file_list": "檔案清單",
+ "Room_updated_successfully": "Room 上傳成功!",
"Mail_Messages_Subject": "這裡的 %s 訊息的選定部分",
"Mailer": "寄件人",
"Mailer_body_tags": "您必須使用[unsubscribe]的退訂連接。 您可以使用[name],[fname],[lname]為使用者的全名,名字或姓氏,分別。 您可以使用[email]為使用者的電子郵件。",
@@ -2442,6 +2454,7 @@
"Name_optional": "名稱(非必填)",
"Name_Placeholder": "請輸入你的名字...",
"Navigation_History": "瀏覽歷史記錄",
+ "Never": "從不",
"New_users": "新的使用者",
"New_Application": "新應用程式",
"New_chat_in_queue": "佇列中的新聊天",
@@ -2453,6 +2466,7 @@
"New_discussion_first_message": "通常,討論都是開始一個問題,像是 \"如何上傳一個圖片?\"",
"New_integration": "新的整合",
"New_line_message_compose_input": "`%s` - 在新行中編寫消息",
+ "New_Livechat_offline_message_has_been_sent": "新的即時聊天離線消息已發送",
"New_logs": "新日誌",
"New_Message_Notification": "新的訊息通知",
"New_messages": "新訊息",
@@ -2977,6 +2991,7 @@
"Scan_QR_code": "使用Google身份驗證器,Authy或Duo等身份驗證器應用掃描QR碼。它將顯示一個6位數的代碼,您需要在下面輸入。",
"Scan_QR_code_alternative_s": "如果您無法掃描QR碼,則可以手動輸入代碼:__code__",
"Scope": "範圍",
+ "Screen_Lock": "螢幕鎖定",
"Screen_Share": "螢幕分享",
"Script_Enabled": "腳本已啟用",
"Search": "搜尋",
@@ -2991,6 +3006,7 @@
"Search_Private_Groups": "搜尋私人群組",
"Search_Provider": "搜尋提供商",
"Search_Users": "搜尋使用者",
+ "Search_Rooms": "搜尋 Room",
"seconds": "秒",
"Secret_token": "加密 Token",
"Security": "安全",
@@ -3022,6 +3038,10 @@
"Send_me_the_code_again": "再次發送代碼給我",
"Send_request_on_agent_message": "發送代理訊息請求",
"Send_request_on_chat_close": "傳送聊天關閉請求",
+ "Send_request_on_chat_queued": "在聊天佇列中傳送請求",
+ "Send_request_on_chat_start": "在聊天開始時傳送請求",
+ "Send_request_on_chat_taken": "在聊天開始時傳送請求",
+ "Send_request_on_forwarding": "在轉送時傳送請求",
"Send_request_on_lead_capture": "發送潛在客戶請求",
"Send_request_on_offline_messages": "傳送離線消息的請求",
"Send_request_on_visitor_message": "在訪客訊息上發送請求",
@@ -3032,6 +3052,7 @@
"Send_your_JSON_payloads_to_this_URL": "傳送您的 JSON 載荷到這個網址。",
"Sending": "傳送中…",
"Sent_an_attachment": "發送附件",
+ "Sent_from": "來自",
"Served_By": "服務於",
"Server_File_Path": "伺服器檔案路徑",
"Server_Folder_Path": "伺服器資料夾路徑",
@@ -3123,6 +3144,7 @@
"Smarsh_MissingEmail_Email": "缺少電子郵件",
"Smarsh_MissingEmail_Email_Description": "電子郵件地址缺失時顯示給使用者帳號的電子郵件通常發生在機器人帳戶中。",
"Smarsh_Timezone": "Smarsh 時區",
+ "Timezone": "時區",
"Smileys_and_People": "表情與人",
"SMS_Default_Omnichannel_Department": "全通道部門(預設)",
"SMS_Default_Omnichannel_Department_Description": "如果設定,則此整合啟動的所有新傳入聊天都將路由到該部門。",
@@ -3491,7 +3513,9 @@
"Use_url_for_avatar": "使用網址上傳",
"Use_User_Preferences_or_Global_Settings": "使用使用者選項或全域設定",
"User": "使用者",
+ "Users_and_rooms": "使用者和 Room",
"User Search": "使用者搜尋",
+ "User_created_successfully!": "使用者建立成功!",
"User Search (Group Validation)": "使用者搜尋 (群組驗證)",
"user-generate-access-token": "使用者產生存取 Token",
"user-generate-access-token_description": "允許使用者產生存取 tokens",
@@ -3599,6 +3623,7 @@
"Verification_email_sent": "驗證郵件已發送",
"Verification_Email_Subject": "[Site_Name] - 驗證電子郵件",
"Verified": "已驗證",
+ "Not_verified": "未經審核的",
"Verify": "驗證",
"Verify_your_email": "驗證您的電子郵件",
"Verify_your_email_for_the_code_we_sent": "檢查您的電子郵件以取得我們發送的代碼",
@@ -3658,7 +3683,9 @@
"Visible": "可見",
"Visit_Site_Url_and_try_the_best_open_source_chat_solution_available_today": "檢視 __Site_URL__ 並試著在今天用最好的開源聊天解決方案!",
"Visitor": "訪客",
+ "Visitor_Email": "訪客電子郵件",
"Visitor_Info": "訪客資訊",
+ "Visitor_Name": "訪客姓名",
"Visitor_Navigation": "訪客導航",
"Visitor_page_URL": "訪客頁面網址",
"Visitor_time_on_site": "訪客網站停留時間",
diff --git a/packages/rocketchat-i18n/i18n/zh.i18n.json b/packages/rocketchat-i18n/i18n/zh.i18n.json
index e797495f2c6b..6b729b082d8f 100644
--- a/packages/rocketchat-i18n/i18n/zh.i18n.json
+++ b/packages/rocketchat-i18n/i18n/zh.i18n.json
@@ -660,6 +660,7 @@
"Closing_chat": "正在关闭聊天",
"Cloud": "Cloud ",
"Cloud_Register_manually": "手动注册",
+ "Cloud_click_here": "复制文字后,访问云端控制界面。[单击此处]()",
"Cloud_register_offline_finish_helper": "在Cloud Console中完成注册过程后,应该显示出一些文本。请粘贴到此处以完成注册。",
"Cloud_register_offline_helper": "如果网络访问受到限制,可以手动注册工作区。复制下面的文字并转到Cloud Console以完成本次操作。",
"Cloud_register_success": "您的工作区已成功注册!",
@@ -3544,4 +3545,4 @@
"Your_server_link": "您的服务器链接",
"Your_temporary_password_is_password": "您的暂时密码为 [password]。",
"Your_workspace_is_ready": "您的工作区已准备好使用🎉"
-}
+}
\ No newline at end of file
diff --git a/packages/rocketchat-mongo-config/server/index.js b/packages/rocketchat-mongo-config/server/index.js
index caf55c975234..ad711c61238a 100644
--- a/packages/rocketchat-mongo-config/server/index.js
+++ b/packages/rocketchat-mongo-config/server/index.js
@@ -11,11 +11,20 @@ import { Mongo } from 'meteor/mongo';
// This is fixed in Node 10, but this supports LTS versions
tls.DEFAULT_ECDH_CURVE = 'auto';
+const mongoConnectionOptions = {
+ // add retryWrites=false if not present in MONGO_URL
+ ...!process.env.MONGO_URL.includes('retryWrites') && { retryWrites: false },
+};
+
const mongoOptionStr = process.env.MONGO_OPTIONS;
if (typeof mongoOptionStr !== 'undefined') {
const mongoOptions = JSON.parse(mongoOptionStr);
- Mongo.setConnectionOptions(mongoOptions);
+ Object.assign(mongoConnectionOptions, mongoOptions);
+}
+
+if (Object.keys(mongoConnectionOptions).length > 0) {
+ Mongo.setConnectionOptions(mongoConnectionOptions);
}
process.env.HTTP_FORWARDED_COUNT = process.env.HTTP_FORWARDED_COUNT || '1';
diff --git a/server/methods/registerUser.js b/server/methods/registerUser.js
index 9ef019fab962..1dfac976dfc2 100644
--- a/server/methods/registerUser.js
+++ b/server/methods/registerUser.js
@@ -62,7 +62,7 @@ Meteor.methods({
};
// Check if user has already been imported and never logged in. If so, set password and let it through
- const importedUser = Users.findOneByEmailAddress(s.trim(formData.email.toLowerCase()));
+ const importedUser = Users.findOneByEmailAddress(formData.email);
let userId;
if (importedUser && importedUser.importIds && importedUser.importIds.length && !importedUser.lastLogin) {
Accounts.setPassword(importedUser._id, userData.password);