diff --git a/.docker/latest/Dockerfile b/.docker/latest/Dockerfile index e3c6ddab83ab..defdc0c2dc86 100644 --- a/.docker/latest/Dockerfile +++ b/.docker/latest/Dockerfile @@ -25,7 +25,6 @@ WORKDIR /app/bundle # needs a mongoinstance - defaults to container linking with alias 'mongo' ENV MONGO_URL=mongodb://mongo:27017/rocketchat \ - MONGO_OPLOG_URL=mongodb://mongo:27017/local \ HOME=/tmp \ PORT=3000 \ ROOT_URL=http://localhost:3000 \ diff --git a/.editorconfig b/.editorconfig index 23d04f8dd4e5..923a1d93ce60 100644 --- a/.editorconfig +++ b/.editorconfig @@ -11,5 +11,9 @@ insert_final_newline = true [*.{js,coffee,html,less,json}] indent_style = tab +[*.i18n.json] +indent_style = space +indent_size = 2 + [*.md] trim_trailing_whitespace = false diff --git a/.eslintignore b/.eslintignore index 87ef6e57f548..08bf97099578 100644 --- a/.eslintignore +++ b/.eslintignore @@ -9,10 +9,10 @@ packages/rocketchat-livechat/app/node_modules packages/rocketchat-livechat/assets/rocketchat-livechat.min.js packages/rocketchat-migrations/ packages/rocketchat-theme/client/minicolors/jquery.minicolors.js -packages/rocketchat-ui/lib/customEventPolyfill.js -packages/rocketchat-ui/lib/Modernizr.js -packages/rocketchat-ui/lib/recorderjs/recorder.js -packages/rocketchat-ui/lib/textarea-autogrow.js +packages/rocketchat-ui/client/lib/customEventPolyfill.js +packages/rocketchat-ui/client/lib/Modernizr.js +packages/rocketchat-ui/client/lib/recorderjs/recorder.js +packages/rocketchat-ui/client/lib/textarea-autogrow.js packages/rocketchat-videobridge/client/public/external_api.js packages/rocketchat-theme/client/vendor/ private/moment-locales/ diff --git a/.meteor/.finished-upgraders b/.meteor/.finished-upgraders index a541808f2b3d..a8020370920b 100644 --- a/.meteor/.finished-upgraders +++ b/.meteor/.finished-upgraders @@ -14,3 +14,4 @@ notices-for-facebook-graph-api-2 1.3.5-remove-old-dev-bundle-link 1.4.0-remove-old-dev-bundle-link 1.4.1-add-shell-server-package +1.4.3-split-account-service-packages diff --git a/.meteor/packages b/.meteor/packages index 43602babb6b8..4863b12e029e 100644 --- a/.meteor/packages +++ b/.meteor/packages @@ -4,45 +4,47 @@ # but you can also edit it by hand. rocketchat:cors -accounts-facebook -accounts-github -accounts-google -accounts-meteor-developer -accounts-password -accounts-twitter +accounts-facebook@1.1.0 +accounts-github@1.2.0 +accounts-google@1.1.0 +accounts-meteor-developer@1.2.0 +accounts-password@1.3.4 +accounts-twitter@1.2.0 blaze-html-templates -check -coffeescript -ddp-rate-limiter -ecmascript -ejson -email -fastclick -http -jquery -less -logging -meteor-base -mobile-experience -mongo -random -rate-limit -reactive-dict -reactive-var -reload -service-configuration -session -shell-server +check@1.2.4 +coffeescript@1.11.1_4 +ddp-rate-limiter@1.0.6 +ecmascript@0.6.3 +ejson@1.0.13 +email@1.1.18 +fastclick@1.0.13 +http@1.2.11 +jquery@1.11.10 +less@2.7.9 +logging@1.1.17 +meteor-base@1.0.4 +mobile-experience@1.0.4 +mongo@1.1.15 +random@1.0.10 +rate-limit@1.0.6 +reactive-dict@1.1.8 +reactive-var@1.0.11 +reload@1.1.11 +service-configuration@1.0.11 +session@1.1.7 +shell-server@0.2.2 spacebars -standard-minifier-css -standard-minifier-js -tracker +standard-minifier-css@1.3.3 +standard-minifier-js@1.2.2 +tracker@1.1.2 rocketchat:action-links +rocketchat:analytics rocketchat:api rocketchat:assets rocketchat:authorization rocketchat:autolinker +rocketchat:autotranslate rocketchat:bot-helpers rocketchat:cas rocketchat:channel-settings @@ -76,6 +78,7 @@ rocketchat:ldap rocketchat:lib rocketchat:livechat rocketchat:logger +rocketchat:login-token rocketchat:mailer rocketchat:mapview rocketchat:markdown @@ -89,7 +92,6 @@ rocketchat:migrations rocketchat:oauth2-server-config rocketchat:oembed rocketchat:otr -rocketchat:piwik rocketchat:push-notifications rocketchat:reactions rocketchat:sandstorm diff --git a/.meteor/release b/.meteor/release index b7694ea377ef..e6940fd82f24 100644 --- a/.meteor/release +++ b/.meteor/release @@ -1 +1 @@ -METEOR@1.4.2.6 +METEOR@1.4.3.1 diff --git a/.meteor/versions b/.meteor/versions index a412929b7690..cadf5a174380 100644 --- a/.meteor/versions +++ b/.meteor/versions @@ -8,7 +8,7 @@ accounts-password@1.3.4 accounts-twitter@1.2.0 aldeed:simple-schema@1.5.3 allow-deny@1.0.5 -autoupdate@1.2.11 +autoupdate@1.3.12 babel-compiler@6.14.1 babel-runtime@1.0.1 base64@1.0.10 @@ -21,8 +21,8 @@ caching-compiler@1.1.9 caching-html-compiler@1.1.0 callback-hook@1.0.10 cfs:http-methods@0.0.32 -check@1.2.4 -coffeescript@1.12.0_1 +check@1.2.5 +coffeescript@1.12.3_1 dandv:caret-position@2.1.1 ddp@1.2.5 ddp-client@1.3.3 @@ -50,7 +50,7 @@ html-tools@1.0.11 htmljs@1.0.11 http@1.2.11 id-map@1.0.9 -jalik:ufs@0.7.3 +jalik:ufs@0.7.4_1 jalik:ufs-gridfs@0.1.4 jalik:ufs-local@0.2.8 jparker:crypto-core@0.1.0 @@ -79,7 +79,7 @@ meteor-developer-oauth@1.2.0 meteorhacks:inject-initial@1.0.4 meteorspark:util@0.2.0 minifier-css@1.2.16 -minifier-js@1.2.17 +minifier-js@1.2.18 minimongo@1.0.20 mizzao:autocomplete@0.5.1 mizzao:timesync@0.3.4 @@ -120,10 +120,12 @@ reactive-var@1.0.11 reload@1.1.11 retry@1.0.9 rocketchat:action-links@0.0.1 +rocketchat:analytics@0.0.2 rocketchat:api@0.0.1 rocketchat:assets@0.0.1 rocketchat:authorization@0.0.1 rocketchat:autolinker@0.0.1 +rocketchat:autotranslate@0.0.1 rocketchat:bot-helpers@0.0.1 rocketchat:cas@1.0.0 rocketchat:channel-settings@0.0.1 @@ -160,6 +162,7 @@ rocketchat:ldapjs@1.0.0 rocketchat:lib@0.0.1 rocketchat:livechat@0.0.1 rocketchat:logger@0.0.1 +rocketchat:login-token@1.0.0 rocketchat:mailer@0.0.1 rocketchat:mapview@0.0.1 rocketchat:markdown@0.0.1 @@ -175,7 +178,6 @@ rocketchat:oauth2-server@2.0.0 rocketchat:oauth2-server-config@1.0.0 rocketchat:oembed@0.0.1 rocketchat:otr@0.0.1 -rocketchat:piwik@0.0.1 rocketchat:push-notifications@0.0.1 rocketchat:reactions@0.0.1 rocketchat:sandstorm@0.0.1 @@ -225,8 +227,8 @@ smoral:sweetalert@1.1.1 spacebars@1.0.13 spacebars-compiler@1.1.0 srp@1.0.10 -standard-minifier-css@1.3.3 -standard-minifier-js@1.2.2 +standard-minifier-css@1.3.4 +standard-minifier-js@1.2.3 steffo:meteor-accounts-saml@0.0.1 tap:i18n@1.8.2 templating@1.3.0 diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 5f54df0c1cb7..6988b2058433 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -19,9 +19,9 @@ const pkgdef :Spk.PackageDefinition = ( appTitle = (defaultText = "Rocket.Chat"), - appVersion = 57, # Increment this for every release. + appVersion = 58, # Increment this for every release. - appMarketingVersion = (defaultText = "0.53.0-develop"), + appMarketingVersion = (defaultText = "0.53.0"), # Human-readable representation of appVersion. Should match the way you # identify versions of your app in documentation and marketing. @@ -108,6 +108,7 @@ const myCommand :Spk.Manifest.Command = ( (key = "SANDSTORM", value = "1"), (key = "Statistics_reporting", value = "false"), (key = "Accounts_AllowUserAvatarChange", value = "false"), - (key = "Accounts_AllowUserProfileChange", value = "false") + (key = "Accounts_AllowUserProfileChange", value = "false"), + (key = "BABEL_CACHE_DIR", value = "/var/babel_cache") ] ); diff --git a/.snapcraft/edge/snapcraft.yaml b/.snapcraft/edge/snapcraft.yaml index 6cd4ef009e94..fc4a1cb9c7a2 100644 --- a/.snapcraft/edge/snapcraft.yaml +++ b/.snapcraft/edge/snapcraft.yaml @@ -7,7 +7,7 @@ # 5. `snapcraft snap` name: rocketchat-server -version: 0.53.0-develop +version: 0.53.0 summary: Rocket.Chat server description: Have your own Slack like online chat, built with Meteor. https://rocket.chat/ confinement: strict diff --git a/.snapcraft/stable/snapcraft.yaml b/.snapcraft/stable/snapcraft.yaml index 73584b54c1ed..18dcfedde35d 100644 --- a/.snapcraft/stable/snapcraft.yaml +++ b/.snapcraft/stable/snapcraft.yaml @@ -7,7 +7,7 @@ # 5. `snapcraft snap` name: rocketchat-server -version: 0.53.0-develop +version: 0.53.0 summary: Rocket.Chat server description: Have your own Slack like online chat, built with Meteor. https://rocket.chat/ confinement: strict diff --git a/.stylelintrc b/.stylelintrc index 376a8b29f50f..1015f7d91ee4 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -78,13 +78,10 @@ "number-no-trailing-zeros": true, "property-case": "lower", "property-no-unknown": true, - "rule-nested-empty-line-before": [ "always", { + "rule-empty-line-before": [ "always", { except: ["first-nested"], ignore: ["after-comment"], } ], - "rule-non-nested-empty-line-before": [ "always", { - ignore: ["after-comment"], - } ], "selector-attribute-brackets-space-inside": "never", "selector-attribute-operator-space-after": "never", "selector-attribute-operator-space-before": "never", diff --git a/HISTORY.md b/HISTORY.md index 8087ac493665..d7361f382772 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,37 @@ # History +## 0.53.0 - 2017-Mar-01 + +- Add 'Unread Messages' to i18n translation files +- Add CMD/Ctrl+k (#6034) +- Add default oauth role (#6028) +- Add getS3Url (#5410) +- Add livechat events (#6070) +- Add minified version of livechat widget code (#6071) +- Add new behavior to ESC on toolbar search (#6056) +- Add option to not overwrite livechat custom fields +- Add preference for Enter key (#6075) +- Add support for uploads to Google Cloud Storage (#6060) +- Add the admin missing settings sections to i18n translation files +- Add translate sweetalert buttons on send files and update password +- Add user preference to hide roles +- Fix codemiror css (#6058) +- Fix ctrl/alt/cmd+enter line break (#6057) +- Fix keydown when photoswipe is open +- Fix livechat appearance page by not saving settings directly from client (#6077) +- Fix livechat knowledge base by properly initiating it's model +- Fix livechat widget being displayed when offline +- Fix renamed template folder to `client` to allows faster hot-reloads +- Fix the directive conflicts for aws and google storage (#6084) +- Fix the edit message (#6086) +- Fix to remove error-color class when creating new channel +- Fix undefined exception in the channelSettings flex-tab +- Fix updating a message with @all by copying "u" property +- Improve outgoing webhooks and add history (#5823) +- Improve report abuse to pass the message id instead of message object +- Use highlight.js from npm +- Use katex from npm (#5962) + ## 0.52.0 - 2017-Fev-14 ### Meteor update to 1.4.2.6 diff --git a/client/methods/updateMessage.js b/client/methods/updateMessage.js index 2f5a5d87c055..5d65a86d415d 100644 --- a/client/methods/updateMessage.js +++ b/client/methods/updateMessage.js @@ -51,17 +51,17 @@ Meteor.methods({ }; message = RocketChat.callbacks.run('beforeSaveMessage', message); + var messageObject = {'editedAt': message.editedAt, 'editedBy': message.editedBy, msg: message.msg}; + if (originalMessage.attachments) { + if (originalMessage.attachments[0].description !== undefined) { + delete messageObject.$set.msg; + } + } ChatMessage.update({ _id: message._id, 'u._id': Meteor.userId() - }, { - $set: { - 'editedAt': message.editedAt, - 'editedBy': message.editedBy, - msg: message.msg - } - }); + }, {$set : messageObject}); }); } }); diff --git a/package.json b/package.json index db7c159aa948..73a3ab2e8b40 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "Rocket.Chat", "description": "The Ultimate Open Source WebChat Platform", - "version": "0.53.0-develop", + "version": "0.53.0", "author": { "name": "Rocket.Chat", "url": "https://rocket.chat/" @@ -55,14 +55,14 @@ }, "devDependencies": { "chimp": "^0.47.2", - "eslint": "^3.15.0", - "stylelint": "^7.8.0", + "eslint": "^3.17.0", + "stylelint": "^7.9.0", "supertest": "^3.0.0" }, "dependencies": { - "babel-runtime": "^6.22.0", + "babel-runtime": "^6.23.0", "bcrypt": "^1.0.2", - "codemirror": "^5.23.0", + "codemirror": "^5.24.2", "file-type": "^4.1.0", "highlight.js": "^9.9.0", "jquery": "^3.1.1", @@ -71,7 +71,7 @@ "moment": "^2.17.1", "moment-timezone": "^0.5.11", "photoswipe": "^4.1.1", - "prom-client": "^7.0.1", + "prom-client": "^7.1.0", "semver": "^5.3.0", "toastr": "^2.1.2" } diff --git a/packages/autoupdate/README.md b/packages/autoupdate/README.md index 87e435467642..f76824b62ab6 100644 --- a/packages/autoupdate/README.md +++ b/packages/autoupdate/README.md @@ -1,4 +1,6 @@ # autoupdate +[Source code of released version](https://github.com/meteor/meteor/tree/master/packages/autoupdate) | [Source code of development version](https://github.com/meteor/meteor/tree/devel/packages/autoupdate) +*** This package is the heart of Meteor's Hot Code Push functionality. It has a client component and a server component component. The client component uses a @@ -7,5 +9,5 @@ build of the app's client. When it sees that a new version is available, it uses the [reload](https://atmospherejs.com/meteor/reload) package (if included in the app) to gracefully save the app's state and reload it in place. -`autoupdate` is part of the [Webapp](https://www.meteor.com/webapp) +`autoupdate` is part of the [Webapp](https://github.com/meteor/meteor/tree/master/packages/webapp) project. diff --git a/packages/autoupdate/autoupdate_cordova.js b/packages/autoupdate/autoupdate_cordova.js index 5a0fa6334e23..dc2bdf0f3109 100644 --- a/packages/autoupdate/autoupdate_cordova.js +++ b/packages/autoupdate/autoupdate_cordova.js @@ -2,14 +2,12 @@ var DEBUG_TAG = 'METEOR CORDOVA DEBUG (autoupdate_cordova.js) '; var log = function (msg) { console.log(DEBUG_TAG + msg); }; - // This constant was picked by testing on iOS 7.1 // We limit the number of concurrent downloads because iOS gets angry on the // application when a certain limit is exceeded and starts timing-out the // connections in 1-2 minutes which makes the whole HCP really slow. var MAX_NUM_CONCURRENT_DOWNLOADS = 30; var MAX_RETRY_COUNT = 5; - var autoupdateVersionCordova = __meteor_runtime_config__.autoupdateVersionCordova || "unknown"; // The collection of acceptable client versions. @@ -24,169 +22,18 @@ Autoupdate.newClientAvailable = function () { }); }; -// var writeFile = function (directoryPath, fileName, content, cb) { -// var fail = function (err) { -// cb(new Error("Failed to write file: ", err), null); -// }; - -// window.resolveLocalFileSystemURL(directoryPath, function (dirEntry) { -// var success = function (fileEntry) { -// fileEntry.createWriter(function (writer) { -// writer.onwrite = function (evt) { -// var result = evt.target.result; -// cb(null, result); -// }; -// writer.onerror = fail; -// writer.write(content); -// }, fail); -// }; - -// dirEntry.getFile(fileName, { -// create: true, -// exclusive: false -// }, success, fail); -// }, fail); -// }; - -// var restartServer = function (location) { -// log('restartServer with location ' + location); -// var fail = function (err) { log("Unexpected error in restartServer: " + err.message) }; -// var httpd = cordova && cordova.plugins && cordova.plugins.CordovaUpdate; - -// if (! httpd) { -// fail(new Error('no httpd')); -// return; -// } - -// var startServer = function (cordovajsRoot) { -// httpd.startServer({ -// 'www_root' : location, -// 'cordovajs_root': cordovajsRoot -// }, function (url) { -// if (Package.reload) { -// Package.reload.Reload._reload(); -// } else { -// window.location.reload(); -// } -// }, fail); -// }; - -// httpd.getCordovajsRoot(function (cordovajsRoot) { -// startServer(cordovajsRoot); -// }, fail); -// }; - var hasCalledReload = false; var updating = false; var localPathPrefix = null; - -// var onNewVersion = function () { -// if (!window.FileTransfer) { -// return; -// } -// var ft = new FileTransfer(); -// var urlPrefix = Meteor.absoluteUrl() + '__cordova'; -// HTTP.get(urlPrefix + '/manifest.json', function (err, res) { -// if (err || ! res.data) { -// log('Failed to download the manifest ' + (err && err.message) + ' ' + (res && res.content)); -// return; -// } - -// updating = true; -// ensureLocalPathPrefix(_.bind(downloadNewVersion, null, res.data)); -// }); -// }; - -// var downloadNewVersion = function (program) { -// if (!window.FileTransfer) { -// return; -// } -// var urlPrefix = Meteor.absoluteUrl() + '__cordova'; -// var manifest = _.clone(program.manifest); -// var version = program.version; -// var ft = new FileTransfer(); - -// manifest.push({ url: '/index.html?' + Random.id() }); - -// var versionPrefix = localPathPrefix + version; - -// var queue = []; -// _.each(manifest, function (item) { -// if (! item.url) return; - -// var url = item.url; -// url = url.replace(/\?.+$/, ''); - -// queue.push(url); -// }); - -// var afterAllFilesDownloaded = _.after(queue.length, function () { -// var wroteManifest = function (err) { -// if (err) { -// log("Failed to write manifest.json: " + err); -// // XXX do something smarter? -// return; -// } - -// // success! downloaded all sources and saved the manifest -// // save the version string for atomicity -// writeFile(localPathPrefix, 'version', version, function (err) { -// if (err) { -// log("Failed to write version: " + err); -// return; -// } - -// // don't call reload twice! -// if (! hasCalledReload) { -// var location = uriToPath(localPathPrefix + version); -// restartServer(location); -// } -// }); -// }; - -// writeFile(versionPrefix, 'manifest.json', -// JSON.stringify(program, undefined, 2), wroteManifest); -// }); - -// var downloadUrl = function (url) { -// console.log(DEBUG_TAG + "start downloading " + url); -// // Add a cache buster to ensure that we don't cache an old asset. -// var uri = encodeURI(urlPrefix + url + '?' + Random.id()); - -// // Try to download the file a few times. -// var tries = 0; -// var tryDownload = function () { -// ft.download(uri, versionPrefix + encodeURI(url), function (entry) { -// if (entry) { -// console.log(DEBUG_TAG + "done downloading " + url); -// // start downloading next queued url -// if (queue.length) -// downloadUrl(queue.shift()); -// afterAllFilesDownloaded(); -// } -// }, function (err) { -// // It failed, try again if we have tried less than 5 times. -// if (tries++ < MAX_RETRY_COUNT) { -// log("Download error, will retry (#" + tries + "): " + uri); -// tryDownload(); -// } else { -// log('Download failed: ' + JSON.stringify(err) + ", source=" + err.source + ", target=" + err.target); -// } -// }); -// }; - -// tryDownload(); -// }; - -// _.times(Math.min(MAX_NUM_CONCURRENT_DOWNLOADS, queue.length), function () { -// var nextUrl = queue.shift(); -// // XXX defer the next download so iOS doesn't rate limit us on concurrent -// // downloads -// Meteor.setTimeout(downloadUrl.bind(null, nextUrl), 50); -// }); -// }; - var retry = new Retry({ + // Unlike the stream reconnect use of Retry, which we want to be instant + // in normal operation, this is a wacky failure. We don't want to retry + // right away, we can start slowly. + // + // A better way than timeconstants here might be to use the knowledge + // of when we reconnect to help trigger these retries. Typically, the + // server fixing code will result in a restart and reconnect, but + // potentially the subscription could have a transient error. minCount: 0, // don't do any immediate retries baseTimeout: 30*1000 // start with 30s }); @@ -228,98 +75,9 @@ Autoupdate._retrySubscription = function () { } }; -// Meteor.startup(function () { -// clearAutoupdateCache(autoupdateVersionCordova); -// }); Meteor.startup(Autoupdate._retrySubscription); -// A helper that removes old directories left from previous autoupdates -// var clearAutoupdateCache = function (currentVersion) { -// ensureLocalPathPrefix(function () { -// // Try to clean up our cache directory, make sure to scan the directory -// // *before* loading the actual app. This ordering will prevent race -// // conditions when the app code tries to download a new version before -// // the old-cache removal has scanned the cache folder. -// listDirectory(localPathPrefix, {dirsOnly: true}, function (err, names) { -// // Couldn't get the list of dirs or risking to get into a race with an -// // on-going update to disk. -// if (err || updating) { -// return; -// } - -// _.each(names, function (name) { -// // Skip the folder with the latest version -// if (name === currentVersion) -// return; - -// // remove everything else, as we don't want to keep too much cache -// // around on disk -// removeDirectory(localPathPrefix + name + '/', function (err) { -// if (err) { -// log('Failed to remove an old cache folder ' -// + name + ':' + err.message); -// } else { -// log('Successfully removed an old cache folder ' + name); -// } -// }); -// }); -// }); -// }) -// }; - -// Cordova File plugin helpers -// var listDirectory = function (url, options, cb) { -// if (typeof options === 'function') -// cb = options, options = {}; - -// var fail = function (err) { cb(err); }; -// window.resolveLocalFileSystemURL(url, function (entry) { -// var reader = entry.createReader(); -// reader.readEntries(function (entries) { -// var names = []; -// _.each(entries, function (entry) { -// if (! options.dirsOnly || entry.isDirectory) -// names.push(entry.name); -// }); -// cb(null, names); -// }, fail); -// }, fail); -// }; - -// var removeDirectory = function (url, cb) { -// var fail = function (err) { -// cb(err); -// }; -// window.resolveLocalFileSystemURL(url, function (entry) { -// entry.removeRecursively(function () { cb(); }, fail); -// }, fail); -// }; - -// var uriToPath = function (uri) { -// return decodeURI(uri).replace(/^file:\/\//g, ''); -// }; - -// var ensureLocalPathPrefix = function (cb) { -// if (! localPathPrefix) { -// if (! cordova.file.dataDirectory) { -// // Since ensureLocalPathPrefix function is always called on -// // Meteor.startup, all Cordova plugins should be ready. -// // XXX Experiments have shown that it is not always the case, even when -// // the cordova.file symbol is attached, properties like dataDirectory -// // still can be null. Poll until we are sure the property is attached. -// console.log(DEBUG_TAG + 'cordova.file.dataDirectory is null, retrying in 20ms'); -// // REMOVED to prevent loop in new app -// // Meteor.setTimeout(_.bind(ensureLocalPathPrefix, null, cb), 20); -// } else { -// localPathPrefix = cordova.file.dataDirectory + 'meteor/'; -// cb(); -// } -// } else { -// cb(); -// } -// }; - window.WebAppLocalServer = {}; WebAppLocalServer.startupDidComplete = function() {}; WebAppLocalServer.checkForUpdates = function() {}; diff --git a/packages/autoupdate/package.js b/packages/autoupdate/package.js index aea2c2e45b33..642f3c2c1c99 100644 --- a/packages/autoupdate/package.js +++ b/packages/autoupdate/package.js @@ -1,11 +1,6 @@ Package.describe({ summary: "Update the client when new client code is available", - version: '1.2.11' -}); - -Cordova.depends({ - 'cordova-plugin-file': '4.1.1', - 'cordova-plugin-file-transfer': '1.5.1' + version: '1.3.12' }); Package.onUse(function (api) { diff --git a/packages/rocketchat-piwik/README.md b/packages/rocketchat-analytics/README.md similarity index 84% rename from packages/rocketchat-piwik/README.md rename to packages/rocketchat-analytics/README.md index d1e6a965dc8a..4381e889f807 100644 --- a/packages/rocketchat-piwik/README.md +++ b/packages/rocketchat-analytics/README.md @@ -1,23 +1,29 @@ -# Piwik Analytics Tracking +# Analytics Tracking +## Google Analytics + +### Settings +* **Tracking ID**: Google Analytics tracking id found on analytics admin page - looks like UA-xxxxxxxx-x + +## Piwik Rocket.Chat supports adding Piwik url and site id to track the analytics of your server. Through this you will be able to see details analytics of per user, including how many messages a session they send via custom events in Piwik and how many channels they interact with. -## Piwik & Google Chrome +### Piwik & Google Chrome Google Chrome has a setting which sends a Do Not Track with each request and by default Piwik respects that and you have to manually disable that feature inside of Piwik. [Piwik has great documentation on how to disable this feature.](http://piwik.org/docs/privacy/#step-4-respect-donottrack-preference) -## Piwik Settings in Rocket.Chat -Settings -> Piwik - -### General +### Settings * **URL**: The url where your piwik is located. This is used for generating the tracking code and is required. Recommended format is: `//rocketchat.piwikpro.com/` * **Client ID**: The client id which this website is. This is a number without any decimals, example: `1` -### Features Enabled +## Settings in Rocket.Chat +Settings -> Analytics + +## Features Enabled * **Messages**: `true/false` determines whether to use custom events to track how many times a user does something with a message. This ranges from sending messages, editing messages, reacting to messages, pinning, starring, and etc. * **Rooms**: `true/false` determines whether to use custom events to track how many times a user does actions related to a room (channel, direct message, group). This ranges from creating, leaving, archiving, renaming, and etc. * **Users**: `true/false` determines whether to use custom events to track how many times a user does actions related to users. This ranges from resetting passwords, creating new users, updating profile pictures, etc. diff --git a/packages/rocketchat-analytics/client/loadScript.js b/packages/rocketchat-analytics/client/loadScript.js new file mode 100644 index 000000000000..a22e8afe317f --- /dev/null +++ b/packages/rocketchat-analytics/client/loadScript.js @@ -0,0 +1,44 @@ +Template.body.onRendered(() => { + Tracker.autorun((c) => { + const piwikUrl = RocketChat.settings.get('PiwikAnalytics_enabled') && RocketChat.settings.get('PiwikAnalytics_url'); + const piwikSiteId = piwikUrl && RocketChat.settings.get('PiwikAnalytics_siteId'); + const googleId = RocketChat.settings.get('GoogleAnalytics_enabled') && RocketChat.settings.get('GoogleAnalytics_ID'); + if (piwikSiteId || googleId) { + c.stop(); + + if (piwikSiteId) { + window._paq = window._paq || []; + if (Meteor.userId()) { + window._paq.push(['setUserId', Meteor.userId()]); + } + + window._paq.push(['trackPageView']); + window._paq.push(['enableLinkTracking']); + (() => { + window._paq.push(['setTrackerUrl', piwikUrl + 'piwik.php']); + window._paq.push(['setSiteId', Number.parseInt(piwikSiteId)]); + const d = document; + const g = d.createElement('script'); + const s = d.getElementsByTagName('script')[0]; + g.type = 'text/javascript'; + g.async = true; + g.defer = true; + g.src = piwikUrl + 'piwik.js'; + s.parentNode.insertBefore(g, s); + })(); + } + + if (googleId) { + /*eslint-disable */ + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); + + ga('create', googleId, 'auto'); + ga('send', 'pageview'); + /*eslint-enable */ + } + } + }); +}); diff --git a/packages/rocketchat-analytics/client/trackEvents.js b/packages/rocketchat-analytics/client/trackEvents.js new file mode 100644 index 000000000000..c672e8bb73d5 --- /dev/null +++ b/packages/rocketchat-analytics/client/trackEvents.js @@ -0,0 +1,137 @@ +function trackEvent(category, action, label) { + if (window._paq) { + window._paq.push(['trackEvent', category, action, label]); + } + if (window.ga) { + window.ga('send', 'event', category, action, label); + } +} + +if (!window._paq || window.ga) { + //Trigger the trackPageView manually as the page views don't seem to be tracked + FlowRouter.triggers.enter([(route) => { + if (window._paq) { + const http = location.protocol; + const slashes = http.concat('//'); + const host = slashes.concat(window.location.hostname); + window._paq.push(['setCustomUrl', host + route.path]); + window._paq.push(['trackPageView']); + } + if (window.ga) { + window.ga('send', 'pageview', route.path); + } + }]); + + //Login page has manual switches + RocketChat.callbacks.add('loginPageStateChange', (state) => { + trackEvent('Navigation', 'Login Page State Change', state); + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-login-state-change'); + + //Messsages + RocketChat.callbacks.add('afterSaveMessage', (message) => { + if ((window._paq || window.ga) && RocketChat.settings.get('Analytics_features_messages')) { + const room = ChatRoom.findOne({ _id: message.rid }); + trackEvent('Message', 'Send', room.name + ' (' + room._id + ')'); + } + }, 2000, 'trackEvents'); + + //Rooms + RocketChat.callbacks.add('afterCreateChannel', (owner, room) => { + if (RocketChat.settings.get('Analytics_features_rooms')) { + trackEvent('Room', 'Create', room.name + ' (' + room._id + ')'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-after-create-channel'); + + RocketChat.callbacks.add('roomNameChanged', (room) => { + if (RocketChat.settings.get('Analytics_features_rooms')) { + trackEvent('Room', 'Changed Name', room.name + ' (' + room._id + ')'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-room-name-changed'); + + RocketChat.callbacks.add('roomTopicChanged', (room) => { + if (RocketChat.settings.get('Analytics_features_rooms')) { + trackEvent('Room', 'Changed Topic', room.name + ' (' + room._id + ')'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-room-topic-changed'); + + RocketChat.callbacks.add('roomTypeChanged', (room) => { + if (RocketChat.settings.get('Analytics_features_rooms')) { + trackEvent('Room', 'Changed Room Type', room.name + ' (' + room._id + ')'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-room-type-changed'); + + RocketChat.callbacks.add('archiveRoom', (room) => { + if (RocketChat.settings.get('Analytics_features_rooms')) { + trackEvent('Room', 'Archived', room.name + ' (' + room._id + ')'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-archive-room'); + + RocketChat.callbacks.add('unarchiveRoom', (room) => { + if (RocketChat.settings.get('Analytics_features_rooms')) { + trackEvent('Room', 'Unarchived', room.name + ' (' + room._id + ')'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-unarchive-room'); + + //Users + //Track logins and associate user ids with piwik + (() => { + let oldUserId = null; + + Meteor.autorun(() => { + const newUserId = Meteor.userId(); + if (oldUserId === null && newUserId) { + if (window._paq && RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Login', newUserId); + window._paq.push(['setUserId', newUserId]); + } + } else if (newUserId === null && oldUserId) { + if (window._paq && RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Logout', oldUserId); + } + } + oldUserId = Meteor.userId(); + }); + })(); + + RocketChat.callbacks.add('userRegistered', () => { + if (RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Registered'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-resitered'); + + RocketChat.callbacks.add('usernameSet', () => { + if (RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Username Set'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'piweik-username-set'); + + RocketChat.callbacks.add('userPasswordReset', () => { + if (RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Reset Password'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-password-reset'); + + RocketChat.callbacks.add('userConfirmationEmailRequested', () => { + if (RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Confirmation Email Requested'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-confirmation-email-requested'); + + RocketChat.callbacks.add('userForgotPasswordEmailRequested', () => { + if (RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Forgot Password Email Requested'); + } + }, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-forgot-password-email-requested'); + + RocketChat.callbacks.add('userStatusManuallySet', (status) => { + if (RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Status Manually Changed', status); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-user-status-manually-set'); + + RocketChat.callbacks.add('userAvatarSet', (service) => { + if (RocketChat.settings.get('Analytics_features_users')) { + trackEvent('User', 'Avatar Changed', service); + } + }, RocketChat.callbacks.priority.MEDIUM, 'analytics-user-avatar-set'); +} diff --git a/packages/rocketchat-piwik/package.js b/packages/rocketchat-analytics/package.js similarity index 80% rename from packages/rocketchat-piwik/package.js rename to packages/rocketchat-analytics/package.js index 821e1f6e1d6e..913a11aa7480 100644 --- a/packages/rocketchat-piwik/package.js +++ b/packages/rocketchat-analytics/package.js @@ -1,7 +1,7 @@ Package.describe({ - name: 'rocketchat:piwik', - version: '0.0.1', - summary: 'Piwik integeration for Rocket.Chat', + name: 'rocketchat:analytics', + version: '0.0.2', + summary: 'Analytics integeration for Rocket.Chat', git: '' }); diff --git a/packages/rocketchat-analytics/server/settings.js b/packages/rocketchat-analytics/server/settings.js new file mode 100644 index 000000000000..e639cf8eafe3 --- /dev/null +++ b/packages/rocketchat-analytics/server/settings.js @@ -0,0 +1,59 @@ +RocketChat.settings.addGroup('Analytics', function addSettings() { + this.section('Piwik', function() { + const enableQuery = {_id: 'PiwikAnalytics_enabled', value: true}; + this.add('PiwikAnalytics_enabled', false, { + type: 'boolean', + public: true, + i18nLabel: 'Enable' + }); + this.add('PiwikAnalytics_url', '', { + type: 'string', + public: true, + i18nLabel: 'URL', + enableQuery + }); + this.add('PiwikAnalytics_siteId', '', { + type: 'string', + public: true, + i18nLabel: 'Client_ID', + enableQuery + }); + }); + + this.section('Analytics_Google', function() { + const enableQuery = {_id: 'GoogleAnalytics_enabled', value: true}; + this.add('GoogleAnalytics_enabled', false, { + type: 'boolean', + public: true, + i18nLabel: 'Enable' + }); + + this.add('GoogleAnalytics_ID', '', { + type: 'string', + public: true, + i18nLabel: 'Analytics_Google_id', + enableQuery + }); + }); + + this.section('Analytics_features_enabled', function addFeaturesEnabledSettings() { + this.add('Analytics_features_messages', true, { + type: 'boolean', + public: true, + i18nLabel: 'Messages', + i18nDescription: 'Analytics_features_messages_Description' + }); + this.add('Analytics_features_rooms', true, { + type: 'boolean', + public: true, + i18nLabel: 'Rooms', + i18nDescription: 'Analytics_features_rooms_Description' + }); + this.add('Analytics_features_users', true, { + type: 'boolean', + public: true, + i18nLabel: 'Users', + i18nDescription: 'Analytics_features_users_Description' + }); + }); +}); diff --git a/packages/rocketchat-autotranslate/README.md b/packages/rocketchat-autotranslate/README.md new file mode 100644 index 000000000000..41921fb0cd80 --- /dev/null +++ b/packages/rocketchat-autotranslate/README.md @@ -0,0 +1,5 @@ +# Rocket.Chat Auto Translate + +Rocket.Chat supports auto translate through Google Cloud Translation API +Through this you will be able to read messages in your native languages +regardless of language the message was written on. diff --git a/packages/rocketchat-autotranslate/client/lib/actionButton.js b/packages/rocketchat-autotranslate/client/lib/actionButton.js new file mode 100644 index 000000000000..3aada8c643e7 --- /dev/null +++ b/packages/rocketchat-autotranslate/client/lib/actionButton.js @@ -0,0 +1,37 @@ +Meteor.startup(function() { + Tracker.autorun(function() { + if (RocketChat.settings.get('AutoTranslate_Enabled') && RocketChat.authz.hasAtLeastOnePermission(['auto-translate'])) { + RocketChat.MessageAction.addButton({ + id: 'toggle-language', + icon: 'icon-language', + i18nLabel: 'Toggle_original_translated', + context: [ + 'message', + 'message-mobile' + ], + action() { + const message = this._arguments[1]; + const language = RocketChat.AutoTranslate.getLanguage(message.rid); + RocketChat.MessageAction.hideDropDown(); + if ((!message.translations || !message.translations[language])) { //} && !_.find(message.attachments, attachment => { return attachment.translations && attachment.translations[language]; })) { + RocketChat.AutoTranslate.messageIdsToWait[message._id] = true; + RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } }); + Meteor.call('autoTranslate.translateMessage', message, language); + } else if (message.autoTranslateShowInverse) { + RocketChat.models.Messages.update({ _id: message._id }, { $unset: { autoTranslateShowInverse: true } }); + } else { + RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateShowInverse: true } }); + } + }, + + validation(message) { + return message && message.u && message.u._id !== Meteor.userId(); + }, + + order: 90 + }); + } else { + RocketChat.MessageAction.removeButton('toggle-language'); + } + }); +}); diff --git a/packages/rocketchat-autotranslate/client/lib/autotranslate.js b/packages/rocketchat-autotranslate/client/lib/autotranslate.js new file mode 100644 index 000000000000..fed980278504 --- /dev/null +++ b/packages/rocketchat-autotranslate/client/lib/autotranslate.js @@ -0,0 +1,92 @@ +RocketChat.AutoTranslate = { + messageIdsToWait: {}, + supportedLanguages: [], + + getLanguage(rid) { + let subscription = {}; + if (rid) { + subscription = RocketChat.models.Subscriptions.findOne({ rid: rid }, { fields: { autoTranslateLanguage: 1 } }); + } + const language = subscription.autoTranslateLanguage || Meteor.user().language || window.defaultUserLanguage(); + if (language.indexOf('-') !== -1) { + if (!_.findWhere(this.supportedLanguages, { language })) { + return language.substr(0, 2); + } + } + return language; + }, + + translateAttachments(attachments, language) { + for (const attachment of attachments) { + if (attachment.author_name !== Meteor.user().username) { + if (attachment.text && attachment.translations && attachment.translations[language]) { + attachment.text = attachment.translations[language]; + } + + if (attachment.description && attachment.translations && attachment.translations[language]) { + attachment.description = attachment.translations[language]; + } + + if (attachment.attachments && attachment.attachments.length > 0) { + attachment.attachments = this.translateAttachments(attachment.attachments, language); + } + } + } + return attachments; + }, + + init() { + Meteor.call('autoTranslate.getSupportedLanguages', 'en', (err, languages) => { + this.supportedLanguages = languages || []; + }); + + Tracker.autorun(() => { + if (RocketChat.settings.get('AutoTranslate_Enabled') && RocketChat.authz.hasAtLeastOnePermission(['auto-translate'])) { + RocketChat.callbacks.add('renderMessage', (message) => { + const subscription = RocketChat.models.Subscriptions.findOne({ rid: message.rid }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1 } }); + const autoTranslateLanguage = this.getLanguage(message.rid); + if (message.u && message.u._id !== Meteor.userId()) { + if (!message.translations) { + message.translations = {}; + } + if (subscription && subscription.autoTranslate !== message.autoTranslateShowInverse) { + message.translations['original'] = message.html; + if (message.translations[autoTranslateLanguage]) { + message.html = message.translations[autoTranslateLanguage]; + } + + if (message.attachments && message.attachments.length > 0) { + message.attachments = this.translateAttachments(message.attachments, autoTranslateLanguage); + } + } + } else if (message.attachments && message.attachments.length > 0) { + message.attachments = this.translateAttachments(message.attachments, autoTranslateLanguage); + } + return message; + }, RocketChat.callbacks.priority.HIGH - 3, 'autotranslate'); + + RocketChat.callbacks.add('streamMessage', (message) => { + if (message.u && message.u._id !== Meteor.userId()) { + const subscription = RocketChat.models.Subscriptions.findOne({ rid: message.rid }, { fields: { autoTranslate: 1, autoTranslateLanguage: 1 } }); + const language = this.getLanguage(message.rid); + if (subscription && subscription.autoTranslate === true && ((message.msg && (!message.translations || !message.translations[language])))) { // || (message.attachments && !_.find(message.attachments, attachment => { return attachment.translations && attachment.translations[language]; })) + RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateFetching: true } }); + } else if (this.messageIdsToWait[message._id] !== undefined && subscription && subscription.autoTranslate !== true) { + RocketChat.models.Messages.update({ _id: message._id }, { $set: { autoTranslateShowInverse: true }, $unset: { autoTranslateFetching: true } }); + delete this.messageIdsToWait[message._id]; + } else if (message.autoTranslateFetching === true) { + RocketChat.models.Messages.update({ _id: message._id }, { $unset: { autoTranslateFetching: true } }); + } + } + }, RocketChat.callbacks.priority.HIGH - 3, 'autotranslate-stream'); + } else { + RocketChat.callbacks.remove('renderMessage', 'autotranslate'); + RocketChat.callbacks.remove('streamMessage', 'autotranslate-stream'); + } + }); + } +}; + +Meteor.startup(function() { + RocketChat.AutoTranslate.init(); +}); diff --git a/packages/rocketchat-autotranslate/client/lib/tabBar.js b/packages/rocketchat-autotranslate/client/lib/tabBar.js new file mode 100644 index 000000000000..53819c7f0001 --- /dev/null +++ b/packages/rocketchat-autotranslate/client/lib/tabBar.js @@ -0,0 +1,16 @@ +Meteor.startup(function() { + Tracker.autorun(function() { + if (RocketChat.settings.get('AutoTranslate_Enabled') && RocketChat.authz.hasAtLeastOnePermission(['auto-translate'])) { + RocketChat.TabBar.addButton({ + groups: ['channel', 'group', 'direct'], + id: 'autotranslate', + i18nTitle: 'Auto_Translate', + icon: 'icon-language', + template: 'autoTranslateFlexTab', + order: 20 + }); + } else { + RocketChat.TabBar.removeButton('autotranslate'); + } + }); +}); diff --git a/packages/rocketchat-autotranslate/client/stylesheets/autotranslate.less b/packages/rocketchat-autotranslate/client/stylesheets/autotranslate.less new file mode 100644 index 000000000000..9a1905ef0170 --- /dev/null +++ b/packages/rocketchat-autotranslate/client/stylesheets/autotranslate.less @@ -0,0 +1,56 @@ +.flex-tab { + .autotranslate { + ul { + li { + margin-bottom: 20px; + } + } + + form { + label { + display: block; + font-weight: bold; + margin-bottom: 5px; + } + + div span { + font-size: 14px; + + i.icon-pencil { + font-size: 12px; + margin-left: 3px; + } + } + } + + .submit { + margin-top: 30px; + text-align: center; + } + + [data-edit] { + cursor: pointer; + } + } +} + +.message { + .translated { + border-left: 1px dotted; + padding-left: 3px; + margin-left: 3px; + + i.icon-language.loading { + display: inline-block; + animation: spinh 2000ms infinite linear; + } + } + + &.sequential { + .translated { + border-left: 0; + position: absolute; + left: 5px; + } + } +} diff --git a/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.html b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.html new file mode 100644 index 000000000000..5e5d74daeaba --- /dev/null +++ b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.html @@ -0,0 +1,45 @@ + diff --git a/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.js b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.js new file mode 100644 index 000000000000..5a0b3e73014c --- /dev/null +++ b/packages/rocketchat-autotranslate/client/views/autoTranslateFlexTab.js @@ -0,0 +1,166 @@ +/* globals ChatSubscription */ +import toastr from 'toastr'; + +Template.autoTranslateFlexTab.helpers({ + autoTranslate() { + const sub = ChatSubscription.findOne({ + rid: Template.instance().rid + }, { + fields: { + autoTranslate: 1 + } + }); + return sub && sub.autoTranslate ? true : false; + }, + + autoTranslateValue() { + const sub = ChatSubscription.findOne({ + rid: Template.instance().rid + }, { + fields: { + autoTranslate: 1 + } + }); + return sub && sub.autoTranslate ? t('True') : t('False'); + }, + + autoTranslateLanguage() { + const sub = ChatSubscription.findOne({ + rid: Template.instance().rid + }, { + fields: { + autoTranslateLanguage: 1 + } + }); + const autoTranslateLanguage = sub && sub.autoTranslateLanguage || Meteor.user().language || window.defaultUserLanguage() || ''; + const supportedLanguages = Template.instance().supportedLanguages.get(); + let language = _.findWhere(supportedLanguages, { language: autoTranslateLanguage }); + if (language) { + return language.language; + } else if (autoTranslateLanguage.indexOf('-') !== -1) { + language = _.findWhere(supportedLanguages, { language: autoTranslateLanguage.substr(0, 2) }); + return language && language.language; + } + }, + + editing(field) { + return Template.instance().editing.get() === field; + }, + + supportedLanguages() { + return Template.instance().supportedLanguages.get(); + }, + + languageName(targetLanguage) { + if (targetLanguage) { + const supportedLanguages = Template.instance().supportedLanguages.get(); + let language = _.findWhere(supportedLanguages, { language: targetLanguage }); + if (language) { + return language.name; + } else if (targetLanguage.indexOf('-') !== -1) { + language = _.findWhere(supportedLanguages, { language: targetLanguage.substr(0, 2) }); + return language && language.name; + } + } + } +}); + +Template.autoTranslateFlexTab.onCreated(function() { + this.rid = Template.currentData().rid; + this.editing = new ReactiveVar(); + this.supportedLanguages = new ReactiveVar([]); + const userLanguage = Meteor.user().language || window.defaultUserLanguage(); + Meteor.call('autoTranslate.getSupportedLanguages', userLanguage, (err, languages) => { + this.supportedLanguages.set(languages || []); + }); + + this.validateSetting = (field) => { + let value; + switch (field) { + case 'autoTranslate': + return true; + case 'autoTranslateLanguage': + value = this.$('select[name='+ field +']').val(); + if (!_.findWhere(this.supportedLanguages.get(), { language: value })) { + toastr.error(t('Invalid_setting_s', value || '')); + return false; + } + return true; + } + }; + + this.saveSetting = () => { + const field = this.editing.get(); + const subscription = RocketChat.models.Subscriptions.findOne({ rid: this.rid, 'u._id': Meteor.userId() }); + const previousLanguage = subscription.autoTranslateLanguage; + let value; + switch (field) { + case 'autoTranslate': + value = this.$('input[name='+field+']').prop('checked') ? '1' : '0'; + break; + case 'autoTranslateLanguage': + value = this.$('select[name='+ field +']').val(); + break; + } + + if (this.validateSetting(field)) { + Meteor.call('autoTranslate.saveSettings', this.data.rid, field, value, { defaultLanguage: Meteor.user().language || window.defaultUserLanguage() }, (err/*, result*/) => { + if (err) { + return handleError(err); + } + + const query = { rid: this.data.rid, 'u._id': { $ne: Meteor.userId() } }; + if (field === 'autoTranslateLanguage') { + query.$or = [ { [`translations.${previousLanguage}`]: { $exists: 1 } }, { [`translations.${value}`]: { $exists: 1 } }, { [`attachments.translations.${previousLanguage}`]: { $exists: 1 } }, { [`attachments.translations.${value}`]: { $exists: 1 } } ]; + } else { + query.$or = [ { [`translations.${subscription.autoTranslateLanguage}`]: { $exists: 1 } }, { [`attachments.translations.${subscription.autoTranslateLanguage}`]: { $exists: 1 } } ]; + } + + if (field === 'autoTranslate' && value === '0') { + RocketChat.models.Messages.update(query, { $unset: { autoTranslateShowInverse: 1 } }, { multi: true }); + } + + const display = field === 'autoTranslate' ? true : subscription && subscription.autoTranslate; + if (display) { + query.autoTranslateShowInverse = { $ne: true }; + } else { + query.autoTranslateShowInverse = true; + } + + RocketChat.models.Messages.update(query, { $set: { random: Random.id() } }, { multi: true }); + + this.editing.set(); + }); + } + }; +}); + +Template.autoTranslateFlexTab.events({ + 'keydown input[type=text]'(e, instance) { + if (e.keyCode === 13) { + e.preventDefault(); + instance.saveSetting(); + } + }, + + 'click [data-edit]'(e, instance) { + e.preventDefault(); + instance.editing.set($(e.currentTarget).data('edit')); + setTimeout(function() { instance.$('input.editing').focus().select(); }, 100); + }, + + 'change [type=checkbox]'(e, instance) { + instance.editing.set($(e.currentTarget).attr('name')); + instance.saveSetting(); + }, + + 'click .cancel'(e, instance) { + e.preventDefault(); + instance.editing.set(); + }, + + 'click .save'(e, instance) { + e.preventDefault(); + instance.saveSetting(); + } +}); diff --git a/packages/rocketchat-autotranslate/package.js b/packages/rocketchat-autotranslate/package.js new file mode 100644 index 000000000000..24cac3d6431a --- /dev/null +++ b/packages/rocketchat-autotranslate/package.js @@ -0,0 +1,37 @@ +Package.describe({ + name: 'rocketchat:autotranslate', + version: '0.0.1', + summary: 'Rocket.Chat automatic translations', + git: '' +}); + +Package.onUse(function(api) { + api.use([ + 'ecmascript', + 'ddp-rate-limiter', + 'less', + 'rocketchat:lib' + ]); + + api.use('templating', 'client'); + + api.addFiles([ + 'client/stylesheets/autotranslate.less', + 'client/lib/autotranslate.js', + 'client/lib/actionButton.js', + 'client/lib/tabBar.js', + 'client/views/autoTranslateFlexTab.html', + 'client/views/autoTranslateFlexTab.js' + ], 'client'); + + api.addFiles([ + 'server/settings.js', + 'server/autotranslate.js', + 'server/permissions.js', + 'server/models/Messages.js', + 'server/models/Subscriptions.js', + 'server/methods/saveSettings.js', + 'server/methods/translateMessage.js', + 'server/methods/getSupportedLanguages.js' + ], 'server'); +}); diff --git a/packages/rocketchat-autotranslate/server/autotranslate.js b/packages/rocketchat-autotranslate/server/autotranslate.js new file mode 100644 index 000000000000..81be619f1409 --- /dev/null +++ b/packages/rocketchat-autotranslate/server/autotranslate.js @@ -0,0 +1,264 @@ +class AutoTranslate { + constructor() { + this.languages = []; + this.enabled = RocketChat.settings.get('AutoTranslate_Enabled'); + this.apiKey = RocketChat.settings.get('AutoTranslate_GoogleAPIKey'); + this.supportedLanguages = {}; + RocketChat.callbacks.add('afterSaveMessage', this.translateMessage.bind(this), RocketChat.callbacks.priority.MEDIUM, 'AutoTranslate'); + + RocketChat.settings.get('AutoTranslate_Enabled', (key, value) => { + this.enabled = value; + }); + RocketChat.settings.get('AutoTranslate_GoogleAPIKey', (key, value) => { + this.apiKey = value; + }); + } + + tokenize(message) { + message = this.tokenizeEmojis(message); + message = this.tokenizeCode(message); + message = this.tokenizeURLs(message); + message = this.tokenizeMentions(message); + return message; + } + + tokenizeEmojis(message) { + if (!message.tokens || !Array.isArray(message.tokens)) { + message.tokens = []; + } + let count = message.tokens.length; + message.msg = message.msg.replace(/:[+\w\d]+:/g, function(match) { + const token = `{${count++}}`; + message.tokens.push({ + token: token, + text: match + }); + return token; + }); + + return message; + } + + tokenizeURLs(message) { + if (!message.tokens || !Array.isArray(message.tokens)) { + message.tokens = []; + } + let count = message.tokens.length; + + const schemes = RocketChat.settings.get('Markdown_SupportSchemesForLink').split(',').join('|'); + + // Support ![alt text](http://image url) and [text](http://link) + message.msg = message.msg.replace(new RegExp(`(!?\\[)([^\\]]+)(\\]\\((?:${schemes}):\\/\\/[^\\)]+\\))`, 'gm'), function(match, pre, text, post) { + const pretoken = `{${count++}}`; + message.tokens.push({ + token: pretoken, + text: pre + }); + + const posttoken = `{${count++}}`; + message.tokens.push({ + token: posttoken, + text: post + }); + + return pretoken + text + posttoken; + }); + + // Support + message.msg = message.msg.replace(new RegExp(`((?:<|<)(?:${schemes}):\\/\\/[^\\|]+\\|)(.+?)(?=>|>)((?:>|>))`, 'gm'), function(match, pre, text, post) { + const pretoken = `{${count++}}`; + message.tokens.push({ + token: pretoken, + text: pre + }); + + const posttoken = `{${count++}}`; + message.tokens.push({ + token: posttoken, + text: post + }); + + return pretoken + text + posttoken; + }); + + return message; + } + + tokenizeCode(message) { + if (!message.tokens || !Array.isArray(message.tokens)) { + message.tokens = []; + } + let count = message.tokens.length; + + message.html = message.msg; + RocketChat.MarkdownCode.handle_codeblocks(message); + RocketChat.MarkdownCode.handle_inlinecode(message); + message.msg = message.html; + + for (const tokenIndex in message.tokens) { + if (message.tokens.hasOwnProperty(tokenIndex)) { + const token = message.tokens[tokenIndex].token; + if (token.indexOf('notranslate') === -1) { + const newToken = `{${count++}}`; + message.msg = message.msg.replace(token, newToken); + message.tokens[tokenIndex].token = newToken; + } + } + } + + return message; + } + + tokenizeMentions(message) { + if (!message.tokens || !Array.isArray(message.tokens)) { + message.tokens = []; + } + let count = message.tokens.length; + + if (message.mentions && message.mentions.length > 0) { + message.mentions.forEach(mention => { + message.msg = message.msg.replace(new RegExp(`(@${mention.username})`, 'gm'), match => { + const token = `{${count++}}`; + message.tokens.push({ + token: token, + text: match + }); + return token; + }); + }); + } + + if (message.channels && message.channels.length > 0) { + message.channels.forEach(channel => { + message.msg = message.msg.replace(new RegExp(`(#${channel.name})`, 'gm'), match => { + const token = `{${count++}}`; + message.tokens.push({ + token: token, + text: match + }); + return token; + }); + }); + } + + return message; + } + + deTokenize(message) { + if (message.tokens && message.tokens.length > 0) { + for (const {token, text, noHtml} of message.tokens) { + message.msg = message.msg.replace(token, () => noHtml ? noHtml : text); + } + } + return message.msg; + } + + translateMessage(message, room, targetLanguage) { + if (this.enabled && this.apiKey) { + let targetLanguages; + if (targetLanguage) { + targetLanguages = [ targetLanguage ]; + } else { + targetLanguages = RocketChat.models.Subscriptions.getAutoTranslateLanguagesByRoomAndNotUser(room._id, message.u && message.u._id); + } + if (message.msg) { + Meteor.defer(() => { + const translations = {}; + let targetMessage = Object.assign({}, message); + + targetMessage.html = s.escapeHTML(String(targetMessage.msg)); + targetMessage = this.tokenize(targetMessage); + + let msgs = targetMessage.msg.split('\n'); + msgs = msgs.map(msg => encodeURIComponent(msg)); + const query = `q=${msgs.join('&q=')}`; + + const supportedLanguages = this.getSupportedLanguages('en'); + targetLanguages.forEach(language => { + if (language.indexOf('-') !== -1 && !_.findWhere(supportedLanguages, { language })) { + language = language.substr(0, 2); + } + let result; + try { + result = HTTP.get('https://translation.googleapis.com/language/translate/v2', { params: { key: this.apiKey, target: language }, query: query }); + } catch (e) { + console.log('Error translating message', e); + return message; + } + if (result.statusCode === 200 && result.data && result.data.data && result.data.data.translations && Array.isArray(result.data.data.translations) && result.data.data.translations.length > 0) { + const txt = result.data.data.translations.map(translation => translation.translatedText).join('\n'); + translations[language] = this.deTokenize(Object.assign({}, targetMessage, { msg: txt })); + } + }); + if (!_.isEmpty(translations)) { + RocketChat.models.Messages.addTranslations(message._id, translations); + } + }); + } + + if (message.attachments && message.attachments.length > 0) { + Meteor.defer(() => { + for (const index in message.attachments) { + if (message.attachments.hasOwnProperty(index)) { + const attachment = message.attachments[index]; + const translations = {}; + if (attachment.description || attachment.text) { + const query = `q=${encodeURIComponent(attachment.description || attachment.text)}`; + const supportedLanguages = this.getSupportedLanguages('en'); + targetLanguages.forEach(language => { + if (language.indexOf('-') !== -1 && !_.findWhere(supportedLanguages, { language })) { + language = language.substr(0, 2); + } + const result = HTTP.get('https://translation.googleapis.com/language/translate/v2', { params: { key: this.apiKey, target: language }, query: query }); + if (result.statusCode === 200 && result.data && result.data.data && result.data.data.translations && Array.isArray(result.data.data.translations) && result.data.data.translations.length > 0) { + const txt = result.data.data.translations.map(translation => translation.translatedText).join('\n'); + translations[language] = txt; + } + }); + if (!_.isEmpty(translations)) { + RocketChat.models.Messages.addAttachmentTranslations(message._id, index, translations); + } + } + } + } + }); + } + } + return message; + } + + getSupportedLanguages(target) { + if (this.enabled && this.apiKey) { + if (this.supportedLanguages[target]) { + return this.supportedLanguages[target]; + } + + let result; + const params = { key: this.apiKey }; + if (target) { + params.target = target; + } + + try { + result = HTTP.get('https://translation.googleapis.com/language/translate/v2/languages', { params: params }); + } catch (e) { + if (e.response && e.response.statusCode === 400 && e.response.data && e.response.data.error && e.response.data.error.status === 'INVALID_ARGUMENT') { + params.target = 'en'; + target = 'en'; + if (!this.supportedLanguages[target]) { + result = HTTP.get('https://translation.googleapis.com/language/translate/v2/languages', { params: params }); + } + } + } finally { + if (this.supportedLanguages[target]) { + return this.supportedLanguages[target]; + } else { + this.supportedLanguages[target || 'en'] = result && result.data && result.data.data && result.data.data.languages; + return this.supportedLanguages[target || 'en']; + } + } + } + } +} + +RocketChat.AutoTranslate = new AutoTranslate; diff --git a/packages/rocketchat-autotranslate/server/methods/getSupportedLanguages.js b/packages/rocketchat-autotranslate/server/methods/getSupportedLanguages.js new file mode 100644 index 000000000000..841a30268f85 --- /dev/null +++ b/packages/rocketchat-autotranslate/server/methods/getSupportedLanguages.js @@ -0,0 +1,17 @@ +Meteor.methods({ + 'autoTranslate.getSupportedLanguages'(targetLanguage) { + if (!RocketChat.authz.hasPermission(Meteor.userId(), 'auto-translate')) { + throw new Meteor.Error('error-action-now-allowed', 'Auto-Translate is not allowed', { method: 'autoTranslate.saveSettings'}); + } + + return RocketChat.AutoTranslate.getSupportedLanguages(targetLanguage); + } +}); + +DDPRateLimiter.addRule({ + type: 'method', + name: 'autoTranslate.getSupportedLanguages', + userId(/*userId*/) { + return true; + } +}, 5, 60000); diff --git a/packages/rocketchat-autotranslate/server/methods/saveSettings.js b/packages/rocketchat-autotranslate/server/methods/saveSettings.js new file mode 100644 index 000000000000..142c9beeda00 --- /dev/null +++ b/packages/rocketchat-autotranslate/server/methods/saveSettings.js @@ -0,0 +1,38 @@ +Meteor.methods({ + 'autoTranslate.saveSettings': function(rid, field, value, options) { + if (!Meteor.userId()) { + throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'saveAutoTranslateSettings' }); + } + + if (!RocketChat.authz.hasPermission(Meteor.userId(), 'auto-translate')) { + throw new Meteor.Error('error-action-now-allowed', 'Auto-Translate is not allowed', { method: 'autoTranslate.saveSettings'}); + } + + check(rid, String); + check(field, String); + check(value, String); + + if (['autoTranslate', 'autoTranslateLanguage'].indexOf(field) === -1) { + throw new Meteor.Error('error-invalid-settings', 'Invalid settings field', { method: 'saveAutoTranslateSettings' }); + } + + const subscription = RocketChat.models.Subscriptions.findOneByRoomIdAndUserId(rid, Meteor.userId()); + if (!subscription) { + throw new Meteor.Error('error-invalid-subscription', 'Invalid subscription', { method: 'saveAutoTranslateSettings' }); + } + + switch (field) { + case 'autoTranslate': + RocketChat.models.Subscriptions.updateAutoTranslateById(subscription._id, value === '1' ? true : false); + if (!subscription.autoTranslateLanguage && options.defaultLanguage) { + RocketChat.models.Subscriptions.updateAutoTranslateLanguageById(subscription._id, options.defaultLanguage); + } + break; + case 'autoTranslateLanguage': + RocketChat.models.Subscriptions.updateAutoTranslateLanguageById(subscription._id, value); + break; + } + + return true; + } +}); diff --git a/packages/rocketchat-autotranslate/server/methods/translateMessage.js b/packages/rocketchat-autotranslate/server/methods/translateMessage.js new file mode 100644 index 000000000000..90d2e0761674 --- /dev/null +++ b/packages/rocketchat-autotranslate/server/methods/translateMessage.js @@ -0,0 +1,8 @@ +Meteor.methods({ + 'autoTranslate.translateMessage'(message, targetLanguage) { + const room = RocketChat.models.Rooms.findOneById(message && message.rid); + if (message && room && RocketChat.AutoTranslate) { + return RocketChat.AutoTranslate.translateMessage(message, room, targetLanguage); + } + } +}); diff --git a/packages/rocketchat-autotranslate/server/models/Messages.js b/packages/rocketchat-autotranslate/server/models/Messages.js new file mode 100644 index 000000000000..f8b1db60f258 --- /dev/null +++ b/packages/rocketchat-autotranslate/server/models/Messages.js @@ -0,0 +1,17 @@ +RocketChat.models.Messages.addTranslations = function(messageId, translations) { + const updateObj = {}; + Object.keys(translations).forEach((key) => { + const translation = translations[key]; + updateObj[`translations.${key}`] = translation; + }); + return this.update({ _id: messageId }, { $set: updateObj }); +}; + +RocketChat.models.Messages.addAttachmentTranslations = function(messageId, attachmentIndex, translations) { + const updateObj = {}; + Object.keys(translations).forEach((key) => { + const translation = translations[key]; + updateObj[`attachments.${attachmentIndex}.translations.${key}`] = translation; + }); + return this.update({ _id: messageId }, { $set: updateObj }); +}; diff --git a/packages/rocketchat-autotranslate/server/models/Subscriptions.js b/packages/rocketchat-autotranslate/server/models/Subscriptions.js new file mode 100644 index 000000000000..7af441dff900 --- /dev/null +++ b/packages/rocketchat-autotranslate/server/models/Subscriptions.js @@ -0,0 +1,47 @@ +RocketChat.models.Subscriptions.updateAutoTranslateById = function(_id, autoTranslate) { + const query = { + _id: _id + }; + + let update; + if (autoTranslate) { + update = { + $set: { + autoTranslate: autoTranslate + } + }; + } else { + update = { + $unset: { + autoTranslate: 1 + } + }; + } + + return this.update(query, update); +}; + +RocketChat.models.Subscriptions.updateAutoTranslateLanguageById = function(_id, autoTranslateLanguage) { + const query = { + _id: _id + }; + + const update = { + $set: { + autoTranslateLanguage: autoTranslateLanguage + } + }; + + return this.update(query, update); +}; + +RocketChat.models.Subscriptions.getAutoTranslateLanguagesByRoomAndNotUser = function(rid, userId) { + const subscriptionsRaw = RocketChat.models.Subscriptions.model.rawCollection(); + const distinct = Meteor.wrapAsync(subscriptionsRaw.distinct, subscriptionsRaw); + const query = { + rid: rid, + 'u._id': { $ne: userId }, + autoTranslate: true + }; + return distinct('autoTranslateLanguage', query); +}; diff --git a/packages/rocketchat-autotranslate/server/permissions.js b/packages/rocketchat-autotranslate/server/permissions.js new file mode 100644 index 000000000000..03c306e2e2ec --- /dev/null +++ b/packages/rocketchat-autotranslate/server/permissions.js @@ -0,0 +1,7 @@ +Meteor.startup(() => { + if (RocketChat.models && RocketChat.models.Permissions) { + if (!RocketChat.models.Permissions.findOne({ _id: 'auto-translate' })) { + RocketChat.models.Permissions.insert({ _id: 'auto-translate', roles: ['admin'] }); + } + } +}); diff --git a/packages/rocketchat-autotranslate/server/settings.js b/packages/rocketchat-autotranslate/server/settings.js new file mode 100644 index 000000000000..4eccb5f825a7 --- /dev/null +++ b/packages/rocketchat-autotranslate/server/settings.js @@ -0,0 +1,4 @@ +Meteor.startup(function() { + RocketChat.settings.add('AutoTranslate_Enabled', false, { type: 'boolean', group: 'Message', section: 'AutoTranslate', public: true }); + RocketChat.settings.add('AutoTranslate_GoogleAPIKey', '', { type: 'string', group: 'Message', section: 'AutoTranslate', enableQuery: { _id: 'AutoTranslate_Enabled', value: true } }); +}); diff --git a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee index 5d37e615521b..2c5cadd16619 100644 --- a/packages/rocketchat-channel-settings/client/views/channelSettings.coffee +++ b/packages/rocketchat-channel-settings/client/views/channelSettings.coffee @@ -238,7 +238,7 @@ Template.channelSettings.onCreated -> showConfirmButton: false RocketChat.callbacks.run action, room else - $(".channel-settings form [name='archived']").prop('checked', room.archived) + $(".channel-settings form [name='archived']").prop('checked', !!room.archived) joinCode: type: 'text' diff --git a/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js b/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js index b977cd08f708..28c096106cf9 100644 --- a/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js +++ b/packages/rocketchat-custom-sounds/client/lib/CustomSounds.js @@ -1,15 +1,19 @@ class CustomSounds { constructor() { this.list = new ReactiveVar({}); - this.add({ _id: 'beep', name: 'Beep', extension: 'mp3', src: '/sounds/beep.mp3' }); - this.add({ _id: 'chelle', name: 'Chelle', extension: 'mp3', src: '/sounds/chelle.mp3' }); - this.add({ _id: 'ding', name: 'Ding', extension: 'mp3', src: '/sounds/ding.mp3' }); - this.add({ _id: 'droplet', name: 'Droplet', extension: 'mp3', src: '/sounds/droplet.mp3' }); - this.add({ _id: 'highbell', name: 'Highbell', extension: 'mp3', src: '/sounds/highbell.mp3' }); - this.add({ _id: 'seasons', name: 'Seasons', extension: 'mp3', src: '/sounds/seasons.mp3' }); + this.add({ _id: 'beep', name: 'Beep', extension: 'mp3', src: 'sounds/beep.mp3' }); + this.add({ _id: 'chelle', name: 'Chelle', extension: 'mp3', src: 'sounds/chelle.mp3' }); + this.add({ _id: 'ding', name: 'Ding', extension: 'mp3', src: 'sounds/ding.mp3' }); + this.add({ _id: 'droplet', name: 'Droplet', extension: 'mp3', src: 'sounds/droplet.mp3' }); + this.add({ _id: 'highbell', name: 'Highbell', extension: 'mp3', src: 'sounds/highbell.mp3' }); + this.add({ _id: 'seasons', name: 'Seasons', extension: 'mp3', src: 'sounds/seasons.mp3' }); } add(sound) { + if (Meteor.isCordova) { + return; + } + if (!sound.src) { sound.src = this.getURL(sound); } diff --git a/packages/rocketchat-file-upload/lib/FileUploadBase.js b/packages/rocketchat-file-upload/lib/FileUploadBase.js index 9f8e4e6a1cf3..9aedd73197ab 100644 --- a/packages/rocketchat-file-upload/lib/FileUploadBase.js +++ b/packages/rocketchat-file-upload/lib/FileUploadBase.js @@ -6,7 +6,7 @@ UploadFS.config.defaultStorePermissions = new UploadFS.StorePermissions({ return userId; }, update: function(userId, doc) { - return userId === doc.userId; + return RocketChat.authz.hasPermission(Meteor.userId(), 'delete-message', doc.rid) || (RocketChat.settings.get('Message_AllowDeleting') && userId === doc.userId); }, remove: function(userId, doc) { return RocketChat.authz.hasPermission(Meteor.userId(), 'delete-message', doc.rid) || (RocketChat.settings.get('Message_AllowDeleting') && userId === doc.userId); diff --git a/packages/rocketchat-file-upload/server/lib/requests.js b/packages/rocketchat-file-upload/server/lib/requests.js index 45d6f77ab5c8..09f78695a410 100644 --- a/packages/rocketchat-file-upload/server/lib/requests.js +++ b/packages/rocketchat-file-upload/server/lib/requests.js @@ -40,6 +40,8 @@ WebApp.connectHandlers.use('/file-upload/', function(req, res, next) { } } + res.setHeader('Content-Security-Policy', 'default-src \'none\''); + return FileUpload.get(file, req, res, next); } } diff --git a/packages/rocketchat-i18n/i18n/ca.i18n.json b/packages/rocketchat-i18n/i18n/ca.i18n.json index f997916053b0..555b46acd05c 100644 --- a/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -99,6 +99,10 @@ "Accounts_OAuth_Wordpress_id": "Wordpress ID", "Accounts_OAuth_Wordpress_secret": "Wordpress Secret", "Accounts_PasswordReset": "Restablir contrasenya", + "Accounts_OAuth_Proxy_host": "Host del servidor intermediari (proxy)", + "Accounts_OAuth_Proxy_services": "Serveis del servidor intermediari (proxy)", + "Accounts_Registration_AuthenticationServices_Default_Roles": "Rols per defecte per als serveis d'autenticació", + "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Rols per defecte (separats per comes) que s'assignaran als usuaris quan es registrin a través dels serveis d'autenticació", "Accounts_Registration_AuthenticationServices_Enabled": "Registre mitjançant serveis d'autenticació", "Accounts_RegistrationForm": "Formulari de registre", "Accounts_RegistrationForm_Disabled": "Deshabilitat", @@ -152,6 +156,8 @@ "Analytics_features_messages_Description": "Monitoritza esdeveniments personalitzats relacionats amb accions que els usuaris fan als missatges.", "Analytics_features_rooms_Description": "Monitoritza esdeveniments personalitzats relacionats amb accions en un canal o grup (crear, abandonar, eliminar...).", "Analytics_features_users_Description": "Monitoritza esdeveniments personalitzats relacionats amb la gestió d'usuaris (reset de contrasenya, canvis d'avatar, etc.).", + "Analytics_Google": "Google Analytics", + "Analytics_Google_id": "Tracking ID", "and": "i", "And_more": "I __length__ més", "Animals_and_Nature": "Animals i natura", @@ -159,6 +165,7 @@ "API_Allow_Infinite_Count": "Permet obtenir tot", "API_Allow_Infinite_Count_Description": "Les peticions a la API REST haurien de permetre retornar-ho tot en una sola petició?", "API_Analytics": "Analítiques", + "API_CORS_Origin": "Origen CORS", "API_Default_Count": "Comptador per defecte", "API_Default_Count_Description": "El comptador per defecte per als resultats de les peticions API REST si el consumidor no n'ha especificat cap.", "API_Embed": "Incrusta (embed)", @@ -170,6 +177,7 @@ "API_EmbedIgnoredHosts_Description": "Llista de hosts o adreces CIDR separada per comes, per exemple: localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", "API_EmbedSafePorts": "Ports segurs", "API_EmbedSafePorts_Description": "Llista de ports permesos per a la vista prèvia, separada per comes.", + "API_Enable_CORS": "Activa CORS", "API_Enable_Direct_Message_History_EndPoint": "Activa la consulta de l'historial de missatges directes", "API_Enable_Direct_Message_History_EndPoint_Description": "Això activa el `/api/v1/im.history.others` que permet veure missatges directes enviats per altres usuaris tot i no formar-ne part.", "API_GitHub_Enterprise_URL": "URL del servidor", @@ -196,6 +204,7 @@ "at": "a", "AtlassianCrowd": "Atlassian Crowd", "Attachment_File_Uploaded": "Fitxer pujat", + "Attribute_handling": "Tractament d'atributs", "Auth_Token": "Auth Token", "Author": "Autor", "Authorization_URL": "URL d'autorització", @@ -210,6 +219,12 @@ "AutoLinker_Urls_TLD": "Auto-enllaça URL TLD", "AutoLinker_Urls_www": "Auto-enllaça URL 'www'", "AutoLinker_UrlsRegExp": "Auto-enllaça URL d'expressions regulars", + "Automatic_Translation": "Traducció automàtica", + "Auto_Translate": "Autotraducció", + "AutoTranslate_Enabled": "Activa autotraducció", + "AutoTranslate_Enabled_Description": "Activar l'autotraducció permetrà a qui tingui el permís auto-translate veure els missatges traduïts automàticament a l'idioma que seleccioni. Pot tenir càrrecs suplementaris, veure la Documentació de Google", + "AutoTranslate_Change_Language_Description": "Canviar l'idioma d'autotraducció no traduirà els missatges anteriors.", + "AutoTranslate_GoogleAPIKey": "API Key Google", "Available": "En línia", "Available_agents": "Agents disponibles", "Avatar": "Avatar", @@ -225,6 +240,7 @@ "Back": "Torna", "Back_to_applications": "Torna a les aplicacions", "Back_to_integrations": "Torna a les integracions", + "Back_to_integration_detail": "Tornar al detall de la integració", "Back_to_login": "Torna a identificar-me", "Back_to_permissions": "Torna a permisos", "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Característica Beta. Requereix que la videoconferència estigui activa.", @@ -243,6 +259,7 @@ "busy_male": "ocupat", "Busy_male": "Ocupat", "by": "per", + "Content": "Contingut", "cache_cleared": "Memòria cau esborrada", "Cancel": "Cancel·la", "Cancel_message_input": "Cancel·la", @@ -254,6 +271,7 @@ "CAS_button_label_color": "Color de text del botó d'inici de sessió", "CAS_button_label_text": "Etiqueta del botó d'inici de sessió", "CAS_enabled": "Actiu", + "CAS_Login_Layout": "Plantilla de la identificació CAS", "CAS_login_url": "Adreça URL d'inici de sessió SSO", "CAS_login_url_Description": "Adreça URL d'inici de sessió del servei extern SSO. Ex: https://sso.example.undef/sso/login", "CAS_popup_height": "Alçada de la finestra emergent d'inici de sessió", @@ -292,6 +310,7 @@ "Choose_the_username_that_this_integration_will_post_as": "Tria el nom d'usuari amb el qual aquesta integració publicarà.", "clear": "Esborra", "clear_cache_now": "Esborra la memòria cau ara", + "clear_history": "Esborra l'historial", "Clear_all_unreads_question": "Esborrar tots els missatges no llegits?", "Click_here": "Fes clic aquí", "Click_here_for_more_info": "Fes clic aquí per a més informació", @@ -323,7 +342,9 @@ "Create_new": "Crea nou", "Created_at": "Creat a", "Created_at_s_by_s": "Creat a %s per %s", + "Created_at_s_by_s_triggered_by_s": "Creat el %s per %s i disparat per %s", "CROWD_Reject_Unauthorized": "Rebutja no autoritzat", + "CRM_Integration": "Integració CRM", "Current_Chats": "Xats actuals", "Custom": "Personalitzat", "Custom_Emoji": "Emoticona personalitzada", @@ -338,10 +359,20 @@ "Custom_Fields": "Camps personalitzats", "Custom_oauth_helper": "Per configurar el proveïdor OAuth, heu d'establir un URL de retorn (callback). Useu
%s
.", "Custom_oauth_unique_name": "Nom únic de OAuth personalitzat", + "Custom_Scripts": "Scripts personalitzats", "Custom_Script_Logged_In": "Script personalitzat per als usuaris en identificar-se", "Custom_Script_Logged_Out": "Script personalitzat per als usuaris en sortir", + "Custom_Sounds": "Sons personalitzats", + "Custom_Sound_Add": "Afegir so personalitzat", + "Custom_Sound_Delete_Warning": "L'eliminació d'un so no es pot revertir.", + "Custom_Sound_Error_Invalid_Sound": "So invàlid", + "Custom_Sound_Error_Name_Already_In_Use": "El nom del so personalitzat ja està en ús.", + "Custom_Sound_Has_Been_Deleted": "El so personalitzat s'ha esborrat.", + "Custom_Sound_Info": "Informació del so personalitzat", + "Custom_Sound_Saved_Successfully": "So personalitzat guardat correctament", "Custom_Translations": "Traduccions personalitzades", - "Custom_Translations_Description": "Ha de ser un objecte JSON vàlid on les claus són el codi de l'idioma i contenen un diccionari de clau (key) i traduccions. Exemple:
{\n \"en\": {\n  \"key\": \"translation\"\n },\n \"ca\": {\n  \"key\": \"traducció\"\n }\n} ", + "Custom_Translations_Description": "Ha de ser un objecte JSON vàlid on les claus són el codi de l'idioma i contenen un diccionari de clau i traducció. Exemple:
{\n \"en\": {\n  \"Channels\": \"Rooms\"\n },\n \"ca\": {\n  \"Channels\": \"Sales\"\n }\n} ", + "CustomSoundsFilesystem": "Sistema d'arxius dels sons personalitzats", "Dashboard": "Tauler", "Date": "Data", "Date_From": "De", @@ -418,10 +449,14 @@ "Enable_Svg_Favicon": "Activa el favicon SVG", "Encrypted_message": "Missatge xifrat", "End_OTR": "Finalitza OTR", + "Enter_Alternative": "Mode alternatiu (envia amb Enter + Ctrl/Alt/Shift/CMD)", "Enter_a_regex": "Introdueix una RegExp", "Enter_a_room_name": "Introdueix un nom de sala", "Enter_a_username": "Introdueix un nom d'usuari", + "Enter_Behaviour": "Comportament de la tecla Enter", + "Enter_Behaviour_Description": "Canvia si la tecla Enter envia el missatge o fa un salt de línia", "Enter_name_here": "Introdueix el nom aquí", + "Enter_Normal": "Mode normal (envia amb Enter)", "Enter_to": "Entra a", "Error": "Error", "Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances": "Error: El Rocket.Chat requereix oplog tailing quan corre en múltiples instàncies", @@ -500,6 +535,8 @@ "error-you-are-last-owner": "Ets l'últim propietari. Si us plau, estableix un nou propietari abans de sortir de la sala.", "Error_changing_password": "Error en canviar la contrasenya", "Esc_to": "Esc a", + "Event_Trigger": "Disparador d'esdeveniments", + "Event_Trigger_Description": "Selecciona quin tipus d'esdeveniment desencadenarà aquesta integració WebHook de sortida", "every_30_minutes": "Cada 30 minuts", "every_hour": "Cada hora", "every_six_hours": "Cada 6 hores", @@ -516,12 +553,19 @@ "File_exceeds_allowed_size_of_bytes": "L'arxiu supera la mida màxima de __size__.", "File_not_allowed_direct_messages": "Compartició d'arxius no permesa als missatges directes.", "File_type_is_not_accepted": "El tipus de fitxer no s'accepta.", + "File_uploaded": "Fitxer pujat", "FileUpload": "Pujar arxius", "FileUpload_Enabled": "Habilita pujar arxius", "FileUpload_Disabled": "Les pujades de fitxers estan desactivades.", "FileUpload_Enabled_Direct": "Compartició d'arxius activa als missatges directes", "FileUpload_File_Empty": "Arxiu buit", "FileUpload_FileSystemPath": "Ruta dels arxius", + "FileUpload_GoogleStorage_AccessId": "Acces Id del Google Storage", + "FileUpload_GoogleStorage_AccessId_Description": "L'Acces Id generalment és en format de correu-e, per exemple: \"exemple-prova@exemple.iam.gserviceaccount.com\"", + "FileUpload_GoogleStorage_Bucket": "Nom del Bucket Google Storage", + "FileUpload_GoogleStorage_Bucket_Description": "El nom del bucket on els arxius s'haurien de pujar.", + "FileUpload_GoogleStorage_Secret": "Secret Google Storage", + "FileUpload_GoogleStorage_Secret_Description": "Si us plau, segueix aquestes instruccions i enganxa el resultat aquí.", "FileUpload_MaxFileSize": "Mida màxima de pujada (en bytes)", "FileUpload_MediaType_NotAccepted": "Tipus d'arxius no acceptats", "FileUpload_MediaTypeWhiteList": "Tipus d'arxius acceptats", @@ -542,6 +586,7 @@ "Follow_social_profiles": "Segueix els nostres perfils, fes-nos un fork a GitHub i comparteix la teva opinió sobre Rocket.Chat al nostre tauler de Trello.", "Food_and_Drink": "Menjar i beure", "Footer": "Peu de pàgina", + "Fonts": "Fonts", "For_your_security_you_must_enter_your_current_password_to_continue": "Per a la seva seguretat, ha de tornar a introduir la contrasenya per continuar", "Force_Disable_OpLog_For_Cache": "Força la inhabilitació de OpLog per la cache", "Force_Disable_OpLog_For_Cache_Description": "No s'utilitzarà OpLog per sincronitzar la cache tot i estar disponible", @@ -551,6 +596,7 @@ "Forgot_Password_Description": "És possible utilitzar els marcadors:
", "Forgot_Password_Email_Subject": "[Site_Name] - Recuperació de contrasenya", "Forgot_Password_Email": "Fes clic aquí per restablir la teva contrasenya.", + "Forgot_password_section": "No recordo la contrasenya", "Forward": "Remetre", "Forward_chat": "Remetre xat", "Forward_to_department": "Remetre al departament", @@ -565,10 +611,14 @@ "Give_a_unique_name_for_the_custom_oauth": "Estableix un nom únic per al OAuth personalitzat", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Bateja l'aplicació. El nom escollit serà visible als usuaris.", "Global": "Global", + "GoogleCloudStorage": "Emmagatzematge Google Cloud", "GoogleTagManager_id": "ID de Google Tag Manager", "Guest_Pool": "Llista de clients", "Hash": "Hash", "Header": "Encapçalament", + "Header_and_Footer": "Encapçalament i peu ", + "Helpers": "Ajuda", + "Hex_Color_Preview": "Previsualització del color", "Hidden": "Ocult", "Hide_Avatars": "Oculta avatars", "Hide_flextab": "Amaga la barra lateral dreta amb un clic", @@ -576,6 +626,7 @@ "Hide_Private_Warning": "Segur que voleu ocultar la discussió amb \"%s\"?", "Hide_room": "Oculta sala", "Hide_Room_Warning": "Segur que voleu ocultar la sala \"%s\"?", + "Hide_roles": "Amaga rols", "Hide_usernames": "Oculta els noms d'usuari", "Highlights": "Ressalta", "Highlights_How_To": "Per ser notificat quan algú esmenta una paraula o frase, afegeix-la aquí. Es poden separar les paraules o frases amb comes. No es distingeix entre majúscules i minúscules.", @@ -592,6 +643,7 @@ "How_to_handle_open_sessions_when_agent_goes_offline": "Què fer amb les sessions obertes quan l'agent es posa fora de línia", "If_you_are_sure_type_in_your_password": "Si n'està segur escrigui la contrasenya:", "If_you_are_sure_type_in_your_username": "Si n'està segur escrigui el seu nom d'usuari:", + "Iframe_Integration": "Integració Iframe", "Iframe_Integration_receive_enable": "Activa recepció", "Iframe_Integration_receive_enable_Description": "Permetre que la finestra pare enviï ordres a Rocket.Chat.", "Iframe_Integration_receive_origin": "Rebre orígens", @@ -634,11 +686,41 @@ "Instructions_to_your_visitor_fill_the_form_to_send_a_message": "Instruccions als visitants, ompliu el formulari per enviar un missatge", "Impersonate_user": "Suplantar usuari", "Impersonate_user_description": "Quan s'activa, la integració publica com a l'usuari que ha desencadenat la integració", + "Incoming_WebHook": "WebHook entrant", + "Integration_Advanced_Settings": "Configuració avançada", "Integration_added": "La integració s'ha afegit", + "Integration_History_Cleared": "L'historial d'integracions s'ha esborrat correctament", "Integration_Incoming_WebHook": "Integració WebHook d'entrada", "Integration_New": "Nova integració", + "Integrations_Outgoing_Type_FileUploaded": "Arxiu pujat", + "Integrations_Outgoing_Type_RoomArchived": "Sala arxivada", + "Integrations_Outgoing_Type_RoomCreated": "Sala creada (pública i privada)", + "Integrations_Outgoing_Type_RoomJoined": "L'usuari ha entrat a la sala", + "Integrations_Outgoing_Type_RoomLeft": "L'usuari ha sortit de la sala", + "Integrations_Outgoing_Type_SendMessage": "Missatge enviat", + "Integrations_Outgoing_Type_UserCreated": "Usuari creat", "Integration_Outgoing_WebHook": "Integració WebHook de sortida", - "Integration_updated": "La integració s'ha actualitzat", + "Integration_Outgoing_WebHook_History": "Historial d'integracions WebHook de sortida", + "Integration_Outgoing_WebHook_No_History": "Aquesta integració WebHook de sortida encara no té cap historial registrat.", + "Integration_Outgoing_WebHook_History_Time_Triggered": "Quan s'ha disparat la integració", + "Integration_Outgoing_WebHook_History_Time_Ended_Or_Error": "Quan ha acabat o emès un error", + "Integration_Outgoing_WebHook_History_Trigger_Step": "Darrer pas del disparador", + "Integration_Outgoing_WebHook_History_Messages_Sent_From_Prepare_Script": "Missatges enviats durant el pas de preparació", + "Integration_Outgoing_WebHook_History_Messages_Sent_From_Process_Script": "Missatges enviats durant el procés de la resposta", + "Integration_Outgoing_WebHook_History_Data_Passed_To_Trigger": "Dades passades a la integració", + "Integration_Outgoing_WebHook_History_Data_Passed_To_URL": "Dades passades a l'adreça URL", + "Integration_Outgoing_WebHook_History_Http_Response_Error": "Error HTTP de resposta", + "Integration_Outgoing_WebHook_History_Http_Response": "Resposta HTML", + "Integration_Outgoing_WebHook_History_Error_Stacktrace": "Error Stacktrace", + "Integration_Retry_Failed_Url_Calls": "Reintenta peticions d'URL fallades", + "Integration_Retry_Failed_Url_Calls_Description": "Si la petició a l'adreça URL falla, la integració ha d'esperar un temps raonable abans de reintentar-la?", + "Integration_Retry_Count": "Comptador de reintents", + "Integration_Retry_Count_Description": "Quantes vegades s'ha de reintentar la integració si la petició a l'adreça URL falla?", + "Integration_Retry_Delay": "Temps de reintent", + "Integration_Retry_Delay_Description": "Quin algorisme de retard de reintent s'ha d'utilitzar? 10^x o 2^x o x*2", + "Integration_Word_Trigger_Placement": "Posició indeterminada de paraula", + "Integration_Word_Trigger_Placement_Description": "S'hauria d'activar el disparador quan la paraula es troba en un lloc de la frase fora del començament?", + "Integration_updated": "La integració s'ha actualitzat.", "Integrations": "Integracions", "Integrations_for_all_channels": "Introdueix all_public_channels per escoltar a totes les sales públiques, all_private_groups per escoltar a tots els grups privats i all_direct_messages per escoltar tots els missatges directes.", "InternalHubot": "Hubot intern", @@ -654,8 +736,10 @@ "Invalid_pass": "La contrasenya no ha d'estar buida", "Invalid_room_name": "%s no és un nom de sala vàlid,
utilitza només lletres, números, guions i guions baixos", "Invalid_secret_URL_message": "L'adreça URL proporcionada no és vàlida.", + "Invalid_setting_s": "Opció invàlida: %s", "invisible": "invisible", "Invisible": "Invisible", + "Invitation": "Invitació", "Invitation_HTML": "HTML de la invitació", "Invitation_HTML_Default": "

Se us ha convidat a

[Site_Name]

Aneu a [Site_URL] i proveu la millor solució de col·laboració a distància de codi lliure!

", "Invitation_HTML_Description": "Podeu utilitzar els següents marcadors:
", @@ -742,7 +826,7 @@ "LDAP_Domain_Search_User_ID": "ID d'usuari del domini de cerca", "LDAP_Domain_Search_User_ID_Description": "L'atribut LDAP que identifica a l'usuari quan intenta l'inici de sessió. Aquest camp ha de ser `sAMAccountName` per a la majoria de les instal·lacions d'Active Directory, però pot ser `uid` per altres solucions LDAP, com OpenLDAP. Podeu fer servir `mail` per identificar els usuaris per correu electrònic o qualsevol altre atribut que vulgueu.
Es poden utilitzar diversos valors separats per comes per permetre als usuaris accedir utilitzant diversos identificadors com nom d'usuari o adreça de correu-e.", "LDAP_Enable": "Activa", - "LDAP_Enable_Description": "Intentar utilitzar LDAP com a mètode de s'autentiquen", + "LDAP_Enable_Description": "Intentar utilitzar LDAP com a mètode d'autenticació", "LDAP_Encryption": "Xifrat", "LDAP_Encryption_Description": "Mètode de xifrat utilitzat per a la comunicació segura cap al servidor LDAP. Alguns exemples 'sense xifrat', 'SSL / LDAPS (xifrat des de l'inici), i' StartTLS '(actualitzar a comunicacions xifrades una vegada connectat).", "LDAP_Host": "Amfitrió (host) ", @@ -792,7 +876,7 @@ "List_of_Channels": "Llista de canals", "List_of_Direct_Messages": "Llista de missatges directes", "Livechat_agents": "Agents de xat en viu", - "Livechat_AllowedDomainsList": "Dominis permesos al xat en directe", + "Livechat_AllowedDomainsList": "Dominis permesos al xat en viu", "Domains_allowed_to_embed_the_livechat_widget": "Llista separada per comes dels dominis on es permet incloure el xat en viu. Deixeu en blanc per permetre'ls tots.", "Livechat_Dashboard": "Tauler de xat en viu", "Livechat_enabled": "Xat en viu actiu", @@ -896,7 +980,9 @@ "Message_ShowFormattingTips": "Mostra suggeriments de formatació", "Message_starring": "Destacar missatges", "Message_TimeFormat": "Format d'hora", + "Message_TimeAndDateFormat": "Format de data i hora", "Message_TimeFormat_Description": "Veure: Moment.js", + "Message_TimeAndDateFormat_Description": "Veure també: Moment.js", "Message_too_long": "Missatge massa llarg", "Message_VideoRecorderEnabled": "Gravadora de vídeo activa", "Message_VideoRecorderEnabledDescription": "Requereix que els fitxers de tipus 'video/webm' siguin admesos a la configuració de 'Puja fitxers'.", @@ -950,6 +1036,7 @@ "No_Encryption": "Sense xifrat", "No_group_with_name_%s_was_found": "No s'ha trobat cap grup privat amb el nom \"%s\"!", "No_groups_yet": "Encara no tens cap grup privat.", + "No_integration_found": "No s'ha trobat cap integració amb l'id proporcionat.", "No_livechats": "No tens cap xat en viu.", "No_mentions_found": "Cap menció trobada", "No_pinned_messages": "Cap missatge fixat.", @@ -992,6 +1079,7 @@ "Offline_unavailable": "Fora de línia no disponible", "On": "Activa", "Online": "Connectat", + "Only_On_Desktop": "Mode ordinador d'escriptori (només envia amb Enter en ordinadors)", "Only_you_can_see_this_message": "Només tu pots veure aquest missatge", "Oops!": "Ui!", "Open": "Obre", @@ -1016,6 +1104,8 @@ "others": "altres", "OTR": "Off-the-record", "OTR_is_only_available_when_both_users_are_online": "La missatgeria OTR només està disponible quan els usuaris estan connectats simultàniament.", + "Outgoing_WebHook": "WebHook sortint", + "Outgoing_WebHook_Description": "Extreu dades de Rocket.Chat en temps real.", "Override_URL_to_which_files_are_uploaded_This_url_also_used_for_downloads_unless_a_CDN_is_given": "Sobreescriu l'adreça URL a la qual es pugen els arxius. Aquesta adreça també s'utilitza per a les descàrregues a menys que s'especifiqui un CDN", "Page_title": "Titol de la pàgina", "Page_URL": "Adreça URL de la pàgina", @@ -1103,7 +1193,10 @@ "Refresh_keys": "Refresca les claus", "Refresh_your_page_after_install_to_enable_screen_sharing": "Per poder compartir la pantalla refresqui la pàgina després de la instal·lació ", "Register": "Crea un compte nou", + "Registration": "Registre", "Registration_Succeeded": "Registre reeixit", + "Registration_via_Admin": "Registre via Admin", + "Regular_Expressions": "Expressions regulars", "Release": "Llançament", "Remove": "Esborrar", "Remove_Admin": "Treu admin", @@ -1115,6 +1208,7 @@ "Remove_someone_from_room": "Treu algú de la sala", "Removed": "Eliminat", "Reply": "Resposta", + "Reporting": "Informes", "Report_Abuse": "Informar d'un abús", "Report_exclamation_mark": "Informa!", "Report_sent": "Informe enviat", @@ -1148,6 +1242,7 @@ "Room_name_changed": "Nom de la sala canviat a: __room_name__ per __user_by__.", "Room_name_changed_successfully": "El nom de la sala s'ha canviat correctament", "Room_not_found": "Sala no trobada", + "Room_password_changed_successfully": "Contrasenya de la sala canviada correctament", "Room_topic_changed_successfully": "El tema de la sala s'ha canviat correctament", "Room_type_changed_successfully": "El tipus de sala s'ha canviat correctament", "Room_unarchived": "La sala s'ha desarxivat", @@ -1268,6 +1363,7 @@ "Snippet_Messages": "Retalls de missatges", "Snippeted_a_message": "S'ha creat un retall de missatge __snippetLink__", "Sound": "So", + "Sound_File_mp3": "Fitxer de so (mp3)", "SSL": "SSL", "Star_Message": "Destacar un missatge", "Starred_Messages": "Missatges destacats", @@ -1302,6 +1398,7 @@ "Stats_Total_Users": "Total d'usuaris", "Status": "Estat", "Stop_Recording": "Atura gravació", + "Stream_Cast": "Stream Cast", "Stream_Cast_Address": "Adreça Stream Cast", "Stream_Cast_Address_Description": "IP o host del Stream Cast del teu Rocket.Chat central. Exemple: `192.168.1.1:3000` o `localhost:4000`.", "strike": "strike", @@ -1318,6 +1415,8 @@ "System_messages": "Missatges del sistema", "Tag": "Etiqueta", "Take_it": "Agafa'l!", + "TargetRoom": "Sala de destí", + "TargetRoom_Description": "Sala que rebrà els missatges resultants de les execucions d'aquest esdeveniment. Només es permet una sala de destí i aquesta ha d'existir.", "Test_Connection": "Prova de connexió", "Test_Desktop_Notifications": "Prova de notificacions d'escriptori", "Thank_you_exclamation_mark": "Gràcies!", @@ -1380,12 +1479,15 @@ "To_install_RocketChat_Livechat_in_your_website_copy_paste_this_code_above_the_last_body_tag_on_your_site": "Per instal·lar el xat en viu (livechat) de Rocket.Chat al teu lloc web, còpia i enganxa aquest codi damunt la darrera etiqueta </body> del mateix.", "to_see_more_details_on_how_to_integrate": "per a veure més detalls sobre com fer la integració.", "To_users": "Per als usuaris", + "Toggle_original_translated": "Canvia original/traducció", "Topic": "Tema", "Travel_and_Places": "Viatges i llocs", "Transcript_Enabled": "Pregunta als visitants si volen rebre la transcripció del xat després de tancar-lo", "Transcript_message": "Missatge a mostrar per a la pregunta sobre la transcripció", "Transcript_of_your_livechat_conversation": "Transcripció de la conversa de xat en viu.", - "Trigger_removed": "Activació eliminada", + "Translated": "Traduït", + "Translations": "Traduccions", + "Trigger_removed": "Disparador eliminat", "Trigger_Words": "Paraules d'activació", "Triggers": "Activadors (triggers)", "True": "Sí", @@ -1405,6 +1507,7 @@ "Unnamed": "Sense nom", "Unpin_Message": "Desfixa el missatge", "Unread_Alert": "Alerta de no llegit", + "Unread_Messages": "Missatges no llegits", "Unread_Rooms": "Sales no llegides", "Unread_Rooms_Mode": "Mode de sales no llegides", "Unstar_Message": "Esborra el destacat", @@ -1438,6 +1541,7 @@ "User_has_been_muted_in_s": "L'usuari ha sigut silenciat a %s", "User_has_been_removed_from_s": "L'usuari s'ha eliminat de %s", "User_Info": "Informació de l'usuari", + "User_Interface": "Interfície d'usuari", "User_is_blocked": "L'usuari està bloquejat", "User_is_no_longer_an_admin": "L'usuari ja no és administrador", "User_is_now_an_admin": "L'usuari ara és administrador", @@ -1481,6 +1585,7 @@ "UTF8_Names_Validation": "Validació de noms UTF8", "UTF8_Names_Validation_Description": "RegExp que s'utilitzarà per validar noms d'usuari i de sala", "Validate_email_address": "Valida l'adreça de correu-e", + "Verification": "Verificació", "Verification_Description": "És possible utilitzar els marcadors:
", "Verification_email_sent": "Missatge de correu-e de verificació enviat", "Verification_Email_Subject": "[Site_Name] - Verifica el teu compte", @@ -1508,7 +1613,7 @@ "We_are_offline_Sorry_for_the_inconvenience": "Estem fora de línia. Disculpi les molèsties.", "We_have_sent_password_email": "T'hem enviat un missatge de correu electrònic amb les instruccions per reinicialitzar la contrasenya. Si no reps el missatge en breu, si us plau mira al correu brossa i/o torna i reintenta-ho.", "We_have_sent_registration_email": "T'hem enviat un missatge de correu electrònic per confirmar el registre. Si no reps el missatge en breu, si us plau mira al correu brossa i/o torna i reintenta-ho.", - "Webhook_URL": "URL Webhook", + "Webhook_URL": "Adreça URL WebHook", "Webhooks": "Webhooks", "WebRTC_Enable_Channel": "Activa per a canals públics", "WebRTC_Enable_Direct": "Activa per a missatges directes", diff --git a/packages/rocketchat-i18n/i18n/cs.i18n.json b/packages/rocketchat-i18n/i18n/cs.i18n.json index 68af84c8c267..e52dcb832f1d 100644 --- a/packages/rocketchat-i18n/i18n/cs.i18n.json +++ b/packages/rocketchat-i18n/i18n/cs.i18n.json @@ -343,7 +343,7 @@ "Custom_Script_Logged_In": "Vlastní skripty pro přihlášené uživatele", "Custom_Script_Logged_Out": "Vlastní skripty pro odhlášené uživatele", "Custom_Translations": "Vlastní překlady", - "Custom_Translations_Description": "Validní JSON obsahující slovník. Například
{\n \"en\": {\n  \"key\": \"translation\"\n },\n \"pt\": {\n  \"key\": \"tradução\"\n }\n}", + "Custom_Translations_Description": "Validní JSON obsahující slovník. Například
{\n \"en\": {\n  \"Channels\": \"Rooms\"\n },\n \"pt\": {\n  \"Channels\": \"Salas\"\n }\n}", "Dashboard": "Hlavní panel", "Date": "Datum", "Date_From": "Od", diff --git a/packages/rocketchat-i18n/i18n/de-AT.i18n.json b/packages/rocketchat-i18n/i18n/de-AT.i18n.json index d5e5f6368e34..249cdaa8ea4b 100644 --- a/packages/rocketchat-i18n/i18n/de-AT.i18n.json +++ b/packages/rocketchat-i18n/i18n/de-AT.i18n.json @@ -1,5 +1,5 @@ { - "#channel": "#Kanal", + "#channel": "#Raum", "0_Errors_Only": "0 - nur Fehler", "1_Errors_and_Information": "1 - Fehler und Informationen", "2_Erros_Information_and_Debug": "2 - Fehler, Informationen und Debug-Meldungen", @@ -141,7 +141,7 @@ "Analytics_features_enabled": "Analyse - Funktionen aktiviert", "Analytics_features_messages_Description": "Zeichnet benutzerdefinierte Ereignisse im Zusammenhang mit Aktionen eines Nutzer auf Nachrichten auf.", "Analytics_features_rooms_Description": "Tracks benutzerdefinierte Ereignisse im Zusammenhang mit Aktionen auf einem Kanal oder einer Gruppe (erstellen, verlassen, löschen).", - "Analytics_features_users_Description": "Tracks benutzerdefinierte Ereignisse im Zusammenhang mit Maßnahmen im Zusammenhang mit Benutzer (Passwort-Reset-Zeiten, Profilbild ändern, etc).", + "Analytics_features_users_Description": "Zeichnet benutzerdefinierte Ereignisse auf (Passwort-Reset-Zeiten, Profilbild ändern, etc).", "and": "und", "And_more": "Und __length__ mehr", "Animals_and_Nature": "Tiere & Natur", @@ -220,13 +220,13 @@ "CDN_PREFIX": "CDN-Präfix", "Certificates_and_Keys": "Zertifikate und Schlüssel", "Changing_email": "E-Mail-Adresse ändern", - "channel": "Kanal", - "Channel": "Kanal", - "Channel_already_exist": "Der Kanal '#%s' ist bereits vorhanden.", - "Channel_already_Unarchived": "Kanal mit dem Namen '#%s' ist bereits im unarchivierten Zustand", - "Channel_Archived": "Kanal mit dem Namen '#%s' wurde erfolgreich archiviert", - "Channel_doesnt_exist": "Der Kanal `#%s` existiert nicht.", - "Channel_Unarchived": "Kanal mit dem Namen '#%s' ist nicht länger archiviert", + "channel": "Raum", + "Channel": "Raum", + "Channel_already_exist": "Der Raum '#%s' ist bereits vorhanden.", + "Channel_already_Unarchived": "Raum mit dem Namen '#%s' ist bereits im unarchivierten Zustand", + "Channel_Archived": "Raum mit dem Namen '#%s' wurde erfolgreich archiviert", + "Channel_doesnt_exist": "Der Raum `#%s` existiert nicht.", + "Channel_Unarchived": "Raum mit dem Namen '#%s' ist nicht länger archiviert", "Channels": "Kanäle (für alle einsehbar)", "Channels_list": "Liste der Kanäle", "Chat_button": "Chatbutton", @@ -265,7 +265,7 @@ "Count": "Zähler", "Cozy": "Angenehm", "Create": "Erstellen", - "Create_A_New_Channel": "Neuen Kanal einrichten", + "Create_A_New_Channel": "Neuen Raum einrichten", "Create_new": "Neu erstellen", "Created_at": "Erstellt am", "Created_at_s_by_s": "Erstellt am %s von %s", @@ -317,7 +317,7 @@ "Drop_to_upload_file": "Ablegen, um Datei hochzuladen", "Dry_run": "Probelauf", "Dry_run_description": "Es wird nur eine E-Mail an die selbe Adresse wie im Feld Absender geschickt. Die E-Mailadresse muss einem gültigen Benutzer gehören.", - "Duplicate_archived_channel_name": "Ein archivierter Kanal mit dem Namen '%s' existiert bereits.", + "Duplicate_archived_channel_name": "Ein archivierter Raum mit dem Namen '%s' existiert bereits.", "Duplicate_archived_private_group_name": "Eine archivierte private Chatgruppe mit dem Namen '%s' existiert bereits.", "Duplicate_channel_name": "Ein Chat mit dem Namen '%s' existiert bereits", "Duplicate_private_group_name": "Eine private Chatgruppe mit dem Namen '%s' existiert bereits.", @@ -357,7 +357,7 @@ "Error": "Fehler", "error-action-not-allowed": "__action__ ist nicht erlaubt", "error-application-not-found": "Anwendung nicht gefunden", - "error-archived-duplicate-name": "Es gibt einen archivierten Kanal mit dem Namen '__room_name__'", + "error-archived-duplicate-name": "Es gibt einen archivierten Raum mit dem Namen '__room_name__'", "error-avatar-invalid-url": "Ungültige Avatar-URL: __url__", "error-avatar-url-handling": "Fehler beim Bearbeiten der Avatar-Einstellung von einer URL (__url__) für __username__", "error-cant-invite-for-direct-room": "Nutzer können nicht in private Chaträume eingeladen werden.", @@ -374,7 +374,7 @@ "error-input-is-not-a-valid-field": "__input__ ist kein gültiges __field__", "error-invalid-arguments": "Ungültige Argumente", "error-invalid-asset": "Ungültiger Wert", - "error-invalid-channel": "Ungültiger Kanal.", + "error-invalid-channel": "Ungültiger Raum.", "error-invalid-channel-start-with-chars": "Ungültiger Kanal. Beginnen Sie mit @ oder #", "error-invalid-custom-field": "Ungültiges benutzerdefiniertes Feld", "error-invalid-custom-field-name": "Unzulässiger Name für ein benutzerdefiniertes Feld. Benutze nur Buchstaben, Nummern, Binde- und Unterstriche.", @@ -383,6 +383,7 @@ "error-invalid-email": "Ungültige E-Mail-Adresse: __email__", "error-invalid-file-height": "Ungültige Dateihöhe", "error-invalid-file-type": "Ungültiges Dateiformat.", + "error-direct-message-file-upload-not-allowed": "Dateiaustausch ist in direkten Nachrichten nicht möglich.", "error-invalid-file-width": "Ungültige Dateibreite", "error-invalid-from-address": "Sie haben eine ungültige E-Mail-Adresse als Empfänger angegeben.", "error-invalid-integration": "Ungültige Integration", @@ -434,6 +435,7 @@ "File_type_is_not_accepted": "Feldtyp nicht akzeptiert.", "FileUpload": "Dateien hochladen", "FileUpload_Enabled": "Hochladen von Dateien aktivieren", + "FileUpload_Enabled_Direct": "Dateiaustausch ist in direkten Nachrichten möglich.", "FileUpload_File_Empty": "Datei ist leer", "FileUpload_FileSystemPath": "Systempfad", "FileUpload_MaxFileSize": "Max. Größe für hochgeladene Dateien (in Bytes)", @@ -521,6 +523,7 @@ "Integration_Incoming_WebHook": "Eingehende WebHook-Integration", "Integration_New": "Neue Integration", "Integration_Outgoing_WebHook": "Ausgehende WebHook-Integration", + "Integration_Word_Trigger_Placement_Description": "Soll das auslösende Wort irgendwo im Satz stehen und nicht nur am Anfang? ", "Integration_updated": "Die Integration wurde aktualisiert.\n", "Integrations": "Integrationen", "InternalHubot": "Interner Hubot", @@ -543,7 +546,7 @@ "Invitation_HTML_Description": "Sie können die folgenden Platzhalter verwenden:
", "Invitation_Subject": "Einladungsbetreff", "Invitation_Subject_Default": "Sie wurden zu [Site_Name] eingeladen", - "Invite_user_to_join_channel": "Benutzer in diesen Kanal einladen", + "Invite_user_to_join_channel": "Benutzer in diesen Raum einladen", "Invite_Users": "Benutzer einladen", "is_also_typing": "schreibt auch", "is_also_typing_female": "schreibt auch", @@ -558,7 +561,7 @@ "Join_audio_call": "Anruf beitreiten", "Join_default_channels": "Standardkanälen beitreten", "Join_the_Community": "Machen Sie mit!", - "Join_the_given_channel": "Angegebenen Kanal beitreten", + "Join_the_given_channel": "Diesem Kanal beitreten", "Join_video_call": "Videoanruf beitreten", "Joined": "Beigetreten", "Jump": "Springen", @@ -1064,7 +1067,7 @@ "Thank_you_exclamation_mark": "Vielen Dank!", "Thank_you_for_your_feedback": "Vielen Dank für Ihre Rückmeldung.", "The_application_name_is_required": "Es muss ein Name für diese Anwendung angegeben werden.", - "The_channel_name_is_required": "Ein Name für den Kanal muss angegeben werden.", + "The_channel_name_is_required": "Ein Name für den Raum muss angegeben werden.", "The_emails_are_being_sent": "Die E-Mails werden gesendet.", "The_field_is_required": "Das Feld %s ist erforderlich.", "The_image_resize_will_not_work_because_we_can_not_detect_ImageMagick_or_GraphicsMagick_installed_in_your_server": "Die automatische Skalierung der Bilder funktioniert nicht, da ImageMagick oder GraphicsMagick nicht auf dem Server installiert sind.", @@ -1156,9 +1159,9 @@ "User_Info": "Benutzerinformationen", "User_is_no_longer_an_admin": "Der Benutzer ist kein Admin mehr.", "User_is_now_an_admin": "Der Benutzer ist jetzt ein Admin.", - "User_joined_channel": "Ist dem Kanal beigetreten.", - "User_joined_channel_female": "Ist dem Kanal beigetreten.", - "User_joined_channel_male": "Ist dem Kanal beigetreten.", + "User_joined_channel": "Ist dem Raum beigetreten.", + "User_joined_channel_female": "Ist dem Raum beigetreten.", + "User_joined_channel_male": "Ist dem Raum beigetreten.", "User_left": "Benutzer.in __user_left__ hat den Kanal verlassen.", "User_left_female": "Der Benutzer __user_left__ hat den Kanal verlassen.", "User_left_male": "Der Benutzer __user_left__ hat den Kanal verlassen.", diff --git a/packages/rocketchat-i18n/i18n/de.i18n.json b/packages/rocketchat-i18n/i18n/de.i18n.json index d3933f999dd3..91c86bb08eda 100644 --- a/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/packages/rocketchat-i18n/i18n/de.i18n.json @@ -33,6 +33,7 @@ "Accounts_BlockedDomainsList_Description": "Kommata getrennte Liste von geblockten Domains", "Accounts_BlockedUsernameList": "Liste gesperrter Benutzernamen", "Accounts_BlockedUsernameList_Description": "Komma-getrennte Liste gesperrter Benutzernamen (case-insensitive)", + "Accounts_CustomFields_Description": "Valides JSON erwartet, in dem die Schlüssel die Feldnamen repräsentieren und ein Verzeichnis von Feldeinstellungen beinhalten. Beispiel:
\n{\n \"role\": {\n  \"type\": \"select\",\n  \"defaultValue\": \"student\",\n  \"options\": [\"teacher\", \"student\"],\n  \"required\": true,\n  \"modifyRecordField\": {\n   \"array\": true,\n   \"field\": \"roles\"\n  }\n },\n \"twitter\": {\n  \"type\": \"text\",\n  \"required\": true,\n  \"minLength\": 2,\n  \"maxLength\": 10\n }\n}", "Accounts_denyUnverifiedEmail": "Nicht verifizierte E-Mail-Adressen ablehnen", "Accounts_EmailVerification": "E-Mail-Verifizierung", "Accounts_EmailVerification_Description": "Um diese Funktion nutzen zu können, stellen Sie bitte sicher, dass ihre SMTP-Einstellungen korrekt sind.", @@ -45,7 +46,7 @@ "Accounts_Iframe_api_url": "API-URL", "Accounts_iframe_enabled": "aktiviert", "Accounts_iframe_url": "iFrame-URL", - "Accounts_LoginExpiration": "Ablauffrist der Anmeldung", + "Accounts_LoginExpiration": "Ablauffrist der Anmeldung in Tagen", "Accounts_ManuallyApproveNewUsers": "Neue Benutzer manuell aktivieren", "Accounts_OAuth_Custom_Authorize_Path": "Autorisierungspfad", "Accounts_OAuth_Custom_Button_Color": "Buttonfarbe", @@ -55,47 +56,51 @@ "Accounts_OAuth_Custom_id": "ID", "Accounts_OAuth_Custom_Identity_Path": "Identitätspfad", "Accounts_OAuth_Custom_Login_Style": "Anmeldungsart", + "Accounts_OAuth_Custom_Merge_Users": "Benutzer zusammenführen", "Accounts_OAuth_Custom_Scope": "Bereich", - "Accounts_OAuth_Custom_Secret": "Secret", + "Accounts_OAuth_Custom_Secret": "Geheimer Schlüssel", "Accounts_OAuth_Custom_Token_Path": "Pfad des Token", "Accounts_OAuth_Custom_Token_Sent_Via": "Token gesendet über", + "Accounts_OAuth_Custom_Username_Field": "Benutzernamen Feld", "Accounts_OAuth_Facebook": "Anmeldung über Facebook erlauben", "Accounts_OAuth_Facebook_callback_url": "Facebook-Callback-URL", "Accounts_OAuth_Facebook_id": "Facebook-App-ID", - "Accounts_OAuth_Facebook_secret": "Facebook-Secret", + "Accounts_OAuth_Facebook_secret": "Geheimer Facebook Schlüssel ", "Accounts_OAuth_Github": "OAuth aktivieren", "Accounts_OAuth_Github_callback_url": "GitHub-Callback-URL", "Accounts_OAuth_GitHub_Enterprise": "OAuth aktiviert", "Accounts_OAuth_GitHub_Enterprise_callback_url": "GitHub-Enterprise-Callback-URL", "Accounts_OAuth_GitHub_Enterprise_id": "Client-ID", - "Accounts_OAuth_GitHub_Enterprise_secret": "Client-Secret", + "Accounts_OAuth_GitHub_Enterprise_secret": "Geheimer Client Schlüssel", "Accounts_OAuth_Github_id": "Client-ID", - "Accounts_OAuth_Github_secret": "Client-Secret", + "Accounts_OAuth_Github_secret": "Geheimer Client Schlüssel", "Accounts_OAuth_Gitlab": "OAuth aktiviert", "Accounts_OAuth_Gitlab_callback_url": "GitLab-Callback-URL", "Accounts_OAuth_Gitlab_id": "GitLab-ID", - "Accounts_OAuth_Gitlab_secret": "Client-Secret", + "Accounts_OAuth_Gitlab_secret": "Geheimer Client Schlüssel", "Accounts_OAuth_Google": "Google-Anmeldung erlauben", "Accounts_OAuth_Google_callback_url": "Google-Callback-URL", "Accounts_OAuth_Google_id": "Google-ID", - "Accounts_OAuth_Google_secret": "Google-Secret", - "Accounts_OAuth_Linkedin": "Anmeldung über LinkedIn erlauben", + "Accounts_OAuth_Google_secret": "Geheimer Google Schlüssel", + "Accounts_OAuth_Linkedin": "LinkedIn-Anmeldung erlauben", "Accounts_OAuth_Linkedin_callback_url": "LinkedIn-Callback-URL", "Accounts_OAuth_Linkedin_id": "LinkedIn-ID", - "Accounts_OAuth_Linkedin_secret": "Linkeding-Secret", - "Accounts_OAuth_Meteor": "Anmeldung über Meteor erlauben", + "Accounts_OAuth_Linkedin_secret": "Geheimer LinkedIn Schlüssel", + "Accounts_OAuth_Meteor": "Meteor-Anmeldung erlauben", "Accounts_OAuth_Meteor_callback_url": "Meteor-Callback-URL", "Accounts_OAuth_Meteor_id": "Meteor-ID", - "Accounts_OAuth_Meteor_secret": "Meteor-Secret", + "Accounts_OAuth_Meteor_secret": "Geheimer Meteor Schlüssel", "Accounts_OAuth_Twitter": "Anmeldung über Twitter erlauben", "Accounts_OAuth_Twitter_callback_url": "Twitter-Callback-URL", "Accounts_OAuth_Twitter_id": "Twitter-ID", - "Accounts_OAuth_Twitter_secret": "Twitter-Secret", - "Accounts_OAuth_Wordpress": "Anmeldung über Wordpress", + "Accounts_OAuth_Twitter_secret": "Geheimer Twitter Schlüssel", + "Accounts_OAuth_Wordpress": "Wordpress-Anmeldung erlauben", "Accounts_OAuth_Wordpress_callback_url": "Wordpress-Callback-URL", "Accounts_OAuth_Wordpress_id": "WordPress-ID", - "Accounts_OAuth_Wordpress_secret": "Wordpress-Secret", + "Accounts_OAuth_Wordpress_secret": "Geheimer WordPress Schlüssel", "Accounts_PasswordReset": "Passwort zurücksetzen", + "Accounts_Registration_AuthenticationServices_Default_Roles": "Standardrolle für Authentifizierungsdienste", + "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Standardrollen die Benutzern zugewiesen werden, die sich über Authentifizierungsdienste registrieren", "Accounts_Registration_AuthenticationServices_Enabled": "Anmeldung mit Authentifizierungsdiensten", "Accounts_RegistrationForm": "Anmeldeformular", "Accounts_RegistrationForm_Disabled": "Deaktiviert", @@ -106,6 +111,8 @@ "Accounts_RegistrationForm_SecretURL_Description": "Sie müssen eine zufällige Zeichenfolge, die der Registrierungs-URL hinzugefügt wird, angeben. Beispiel: https://demo.rocket.chat/register/[secret_hash]", "Accounts_RequireNameForSignUp": "Namen für die Anmeldung verlangen", "Accounts_RequirePasswordConfirmation": "Passwortbestätigung erforderlich", + "Accounts_SetDefaultAvatar": "Standard Avatar setzen", + "Accounts_SetDefaultAvatar_Description": "Versuche Standardavatar über OAuth oder Gravatar zu bestimmen", "Accounts_ShowFormLogin": "Anmeldeformular zeigen", "Accounts_UseDefaultBlockedDomainsList": "Standardliste für blockierte Domains verwenden", "Accounts_UseDNSDomainCheck": "DNS-Domain-Check verwenden", @@ -117,6 +124,7 @@ "Add": "Hinzufügen", "Add_agent": "Agent hinzufügen", "Add_custom_oauth": "Benutzerdefiniertes OAuth-Konto hinzufügen", + "Add_Domain": "Domain hinzufügen", "Add_manager": "Manager hinzufügen", "Add_user": "Benutzer hinzufügen", "Add_User": "Benutzer hinzufügen", @@ -134,21 +142,26 @@ "Alias": "Alias", "Alias_Format": "Alias Format", "Alias_Format_Description": "Nachricht von Slack mit einem Alias importieren; %s wird mit dem Benutzernamen ersetzt. Wenn Feld leer bleibt, wird kein Alias benutzt.", + "Alias_Set": "Alias setzen", "All": "Alle", "All_channels": "Alle Kanäle", "All_logs": "Alle Protokolle", "All_messages": "Alle Nachrichten", "Allow_Invalid_SelfSigned_Certs": "Ungültige und selbstsignierte SSL-Zertifikate erlauben", "Allow_Invalid_SelfSigned_Certs_Description": "Ungültige und selbstsignierte SSL-Zertifikate für die Link-Validierung und die Vorschau zulassen.", - "Analytics_features_enabled": "Analyse - Funktionen aktiviert", + "Always_open_in_new_window": "Immer in neuem Fenster öffnen", + "Analytics_features_enabled": "Funktionen aktiviert", "Analytics_features_messages_Description": "Zeichnet benutzerdefinierte Ereignisse im Zusammenhang mit Aktionen eines Nutzer auf Nachrichten auf.", "Analytics_features_rooms_Description": "Zeichnet benutzerdefinierte Ereignisse im Zusammenhang mit Aktionen in einem Kanal oder einer Gruppe (erstellen, verlassen, löschen) auf.", - "Analytics_features_users_Description": "Zeichnet benutzerdefinierte Ereignisse im Zusammenhang mit Maßnahmen im Zusammenhang mit Benutzer (Passwort-Reset-Zeiten, Profilbild ändern, etc) auf.", + "Analytics_features_users_Description": "Zeichnet benutzerdefinierte Ereignisse (Passwort-Reset-Zeiten, Profilbild ändern, etc) auf.", "and": "und", "And_more": "Und __length__ mehr", "Animals_and_Nature": "Tiere & Natur", "API": "API", + "API_Allow_Infinite_Count_Description": "Erlaube Rückgabe von REST API Ergebnissen in einem einzigen Abruf", "API_Analytics": "Analytics", + "API_CORS_Origin": "CORS Origin", + "API_Default_Count": "Standard Anzahl", "API_Embed": "Einbetten", "API_EmbedDisabledFor": "Einbettungen für Benutzer deaktivieren", "API_EmbedDisabledFor_Description": "Durch Kommata getrennte Liste von Benutzernamen", @@ -162,13 +175,13 @@ "API_Token": "API-Token", "API_User_Limit": "User Limit für das Hinzufügen aller Benutzer auf Kanal", "API_Wordpress_URL": "Wordpress-URL", - "Apiai_Key": "Api.ai Key", - "Apiai_Language": "Api.ai Sprache", + "Apiai_Key": "Api.ai-Schlüssel", + "Apiai_Language": "Api.ai-Sprache", "Appearance": "Erscheinungsbild", "Application_added": "Die Anwendung wurde hinzugefügt.", "Application_Name": "Name der Anwendung", "Application_updated": "Die Anwendung wurde aktualisiert.", - "Apply_and_refresh_all_clients": "Alle Clients anwenden und aktualisieren", + "Apply_and_refresh_all_clients": "Anwenden und alle Clients aktualisieren", "Archive": "Archivieren", "are_also_typing": "schreiben auch", "are_typing": "schreiben", @@ -398,6 +411,7 @@ "error-invalid-email": "Ungültige E-Mail-Adresse: __email__", "error-invalid-file-height": "Ungültige Dateihöhe", "error-invalid-file-type": "Ungültiges Dateiformat", + "error-direct-message-file-upload-not-allowed": "Dateiaustausch ist in direkten Nachrichten nicht möglich.", "error-invalid-file-width": "Ungültige Dateibreite", "error-invalid-from-address": "Sie haben eine ungültige E-Mail-Adresse als Empfänger angegeben.", "error-invalid-integration": "Ungültige Integration", @@ -452,9 +466,11 @@ "Field_removed": "Feld entfernt", "Field_required": "Feld erforderlich", "File_exceeds_allowed_size_of_bytes": "Die Datei ist größer als das erlaubte Maximum von __size__ Bytes", + "File_not_allowed_direct_messages": "Dateiaustausch ist in direkten Nachrichten nicht möglich.", "File_type_is_not_accepted": "Feldtyp nicht akzeptiert.", "FileUpload": "Dateien hochladen", "FileUpload_Enabled": "Hochladen von Dateien aktivieren", + "FileUpload_Enabled_Direct": "Dateiaustausch ist in direkten Nachrichten möglich.", "FileUpload_File_Empty": "Datei ist leer", "FileUpload_FileSystemPath": "Systempfad", "FileUpload_MaxFileSize": "Max. Größe für hochgeladene Dateien (in Bytes)", @@ -555,6 +571,7 @@ "Integration_Incoming_WebHook": "Eingehende WebHook-Integration", "Integration_New": "Neue Integration", "Integration_Outgoing_WebHook": "Ausgehende WebHook-Integration", + "Integration_Word_Trigger_Placement_Description": "Soll das auslösende Wort irgendwo im Satz stehen und nicht nur am Anfang? ", "Integration_updated": "Die Integration wurde aktualisiert.\n", "Integrations": "Integrationen", "InternalHubot": "Interner Hubot", @@ -593,7 +610,7 @@ "Join_audio_call": "Anruf beitreiten", "Join_default_channels": "Standardkanälen beitreten", "Join_the_Community": "Trete der Community bei", - "Join_the_given_channel": "Angegebenen Kanal beitreten", + "Join_the_given_channel": "Diesem Kanal beitreten", "Join_video_call": "Videoanruf beitreten", "Joined": "Beigetreten", "Jump": "Springen", @@ -730,8 +747,8 @@ "Message_AllowEditing": "Die Bearbeitung von Nachrichten erlauben", "Message_AllowEditing_BlockEditInMinutes": "Bearbeiten von Nachrichten nach (in Minuten - 0 zum deaktivieren) blockieren ", "Message_AllowEditing_BlockEditInMinutesDescription": "Geben Sie eine 0 ein, um das Bearbeiten von Nachrichten jederzeit zu erlauben.", - "Message_AllowPinning": "Das Fixieren von Nachrichten erlauben", - "Message_AllowPinning_Description": "Benutzern das Fixieren von Nachrichten in Kanälen erlauben", + "Message_AllowPinning": "Das Anheften von Nachrichten erlauben", + "Message_AllowPinning_Description": "Benutzern das Anheften von Nachrichten in Kanälen erlauben", "Message_AllowStarring": "Erlaube es, Nachrichten zu markieren", "Message_AlwaysSearchRegExp": "Beim Suchen immer RegExp verwenden", "Message_AlwaysSearchRegExp_Description": "Wir empfehlen `True` zu benutzen, wenn ihre Sprache für die MongoDB-Textsuche nicht unterstützt wird.", @@ -880,7 +897,7 @@ "People": "Menschen", "Permalink": "Permalink", "Permissions": "Berechtigungen", - "Pin_Message": "Nachricht fixieren", + "Pin_Message": "Nachricht anheften", "Pinned_a_message": "hat eine Nachricht angeheftet:", "Pinned_Messages": "Fixierte Nachrichten", "PiwikAnalytics_siteId_Description": "Die Website-ID zur Identifizierung dieser Website. Beispiel: 17", @@ -1184,7 +1201,7 @@ "Unmute_someone_in_room": "Jemanden das Chatten in einem Raum wieder erlauben", "Unmute_user": "Benutzern das Chatten erlauben ", "Unnamed": "Unbenannt", - "Unpin_Message": "Nachicht nicht mehr fixieren", + "Unpin_Message": "Nachicht nicht mehr anheften", "Unread_Alert": "Über Ungelesenes benachrichtigen", "Unread_Rooms": "Ungelesene Räume", "Unread_Rooms_Mode": "Ungelesene Räume aufgelistet anzeigen ", diff --git a/packages/rocketchat-i18n/i18n/en.i18n.json b/packages/rocketchat-i18n/i18n/en.i18n.json index 84400e7440f9..e08f9931ad8c 100644 --- a/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/packages/rocketchat-i18n/i18n/en.i18n.json @@ -33,7 +33,7 @@ "Accounts_BlockedDomainsList_Description": "Comma-separated list of blocked domains", "Accounts_BlockedUsernameList": "Blocked Username List", "Accounts_BlockedUsernameList_Description": "Comma-separated list of blocked usernames (case-insensitive)", - "Accounts_CustomFields_Description": "Should be a valid JSON where keys are the field names containing a dictionary of field settings. Example:
{\n\t\"role\": {\n\t\t\"type\": \"select\",\n\t\t\"defaultValue\": \"student\",\n\t\t\"options\": [\"teacher\", \"student\"],\n\t\t\"required\": true,\n\t\t\"modifyRecordField\": {\n\t\t\t\"array\": true,\n\t\t\t\"field\": \"roles\"\n\t\t}\n\t},\n\t\"twitter\": {\n\t\t\"type\": \"text\",\n\t\t\"required\": true,\n\t\t\"minLength\": 2,\n\t\t\"maxLength\": 10\n\t}\n} ", + "Accounts_CustomFields_Description": "Should be a valid JSON where keys are the field names containing a dictionary of field settings. Example:
{\n \"role\": {\n  \"type\": \"select\",\n  \"defaultValue\": \"student\",\n  \"options\": [\"teacher\", \"student\"],\n  \"required\": true,\n  \"modifyRecordField\": {\n   \"array\": true,\n   \"field\": \"roles\"\n  }\n },\n \"twitter\": {\n  \"type\": \"text\",\n  \"required\": true,\n  \"minLength\": 2,\n  \"maxLength\": 10\n }\n} ", "Accounts_denyUnverifiedEmail": "Deny unverified email", "Accounts_EmailVerification": "Email Verification", "Accounts_EmailVerification_Description": "Make sure you have correct SMTP settings to use this feature", @@ -99,6 +99,8 @@ "Accounts_OAuth_Wordpress_id": "WordPress Id", "Accounts_OAuth_Wordpress_secret": "WordPress Secret", "Accounts_PasswordReset": "Password Reset", + "Accounts_OAuth_Proxy_host": "Proxy Host", + "Accounts_OAuth_Proxy_services": "Proxy Services", "Accounts_Registration_AuthenticationServices_Default_Roles": "Default Roles for Authentication Services", "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Default roles (comma-separated) users will be given when registering through authentication services", "Accounts_Registration_AuthenticationServices_Enabled": "Registration with Authentication Services", @@ -154,6 +156,8 @@ "Analytics_features_messages_Description": "Tracks custom events related to actions a user does on messages.", "Analytics_features_rooms_Description": "Tracks custom events related to actions on a channel or group (create, leave, delete).", "Analytics_features_users_Description": "Tracks custom events related to actions related to users (password reset times, profile picture change, etc).", + "Analytics_Google": "Google Analytics", + "Analytics_Google_id": "Tracking ID", "and": "and", "And_more": "And __length__ more", "Animals_and_Nature": "Animals & Nature", @@ -215,6 +219,12 @@ "AutoLinker_Urls_TLD": "AutoLinker TLD URLs", "AutoLinker_Urls_www": "AutoLinker 'www' URLs", "AutoLinker_UrlsRegExp": "AutoLinker URL Regular Expression", + "Automatic_Translation": "Automatic Translation", + "Auto_Translate": "Auto-Translate", + "AutoTranslate_Enabled": "Enable Auto-Translate", + "AutoTranslate_Enabled_Description": "Enabling auto-translation will allow people with the auto-translate permission to have all messages automatically translated into their selected language. Fees may apply, see Google's Documentation", + "AutoTranslate_Change_Language_Description": "Changing the auto-translate language does not translate previous messages.", + "AutoTranslate_GoogleAPIKey": "Google API Key", "Available": "Available", "Available_agents": "Available agents", "Avatar": "Avatar", @@ -361,7 +371,7 @@ "Custom_Sound_Info": "Custom Sound Info", "Custom_Sound_Saved_Successfully": "Custom sound saved successfully", "Custom_Translations": "Custom Translations", - "Custom_Translations_Description": "Should be a valid JSON where keys are languages containing a dictionary of key and translations. Example:
{\n\t\"en\": {\n\t\t\"key\": \"translation\"\n\t},\n\t\"pt\": {\n\t\t\"key\": \"tradução\"\n\t}\n} ", + "Custom_Translations_Description": "Should be a valid JSON where keys are languages containing a dictionary of key and translations. Example:
{\n \"en\": {\n  \"Channels\": \"Rooms\"\n },\n \"pt\": {\n  \"Channels\": \"Salas\"\n }\n} ", "CustomSoundsFilesystem": "Custom Sounds Filesystem", "Dashboard": "Dashboard", "Date": "Date", @@ -726,6 +736,7 @@ "Invalid_pass": "The password must not be empty", "Invalid_room_name": "%s is not a valid room name,
use only letters, numbers, hyphens and underscores", "Invalid_secret_URL_message": "The URL provided is invalid.", + "Invalid_setting_s": "Invalid setting: %s", "invisible": "invisible", "Invisible": "Invisible", "Invitation": "Invitation", @@ -1468,11 +1479,13 @@ "To_install_RocketChat_Livechat_in_your_website_copy_paste_this_code_above_the_last_body_tag_on_your_site": "To install Rocket.Chat Livechat in your website, copy & paste this code above the last </body> tag on your site.", "to_see_more_details_on_how_to_integrate": "to see more details on how to integrate.", "To_users": "To Users", + "Toggle_original_translated": "Toggle original/translated", "Topic": "Topic", "Travel_and_Places": "Travel & Places", "Transcript_Enabled": "Ask visitor if they would like a transcript after chat closed", "Transcript_message": "Message to show when asking about transcript", "Transcript_of_your_livechat_conversation": "Transcript of your livechat conversation.", + "Translated": "Translated", "Translations": "Translations", "Trigger_removed": "Trigger removed", "Trigger_Words": "Trigger Words", @@ -1655,4 +1668,4 @@ "your_message_optional": "your message (optional)", "Your_password_is_wrong": "Your password is wrong!", "Your_push_was_sent_to_s_devices": "Your push was sent to %s devices" -} +} \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/fr.i18n.json b/packages/rocketchat-i18n/i18n/fr.i18n.json index fa6f7648f514..c0d759d0c80a 100644 --- a/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -2,7 +2,7 @@ "#channel": "#canal", "0_Errors_Only": "0 - Erreurs seulement", "1_Errors_and_Information": "1 - Erreurs et informations", - "2_Erros_Information_and_Debug": "2 - Erreurs, informations et debug", + "2_Erros_Information_and_Debug": "2 - Erreurs, informations et débogage ", "403": "Interdit", "500": "Erreur interne au serveur", "@username": "@nomdutilisateur", @@ -57,7 +57,7 @@ "Accounts_OAuth_Custom_Identity_Path": "URL d'identification", "Accounts_OAuth_Custom_Login_Style": "Style de la page de connexion", "Accounts_OAuth_Custom_Merge_Users": "Fusionner les utilisateurs", - "Accounts_OAuth_Custom_Scope": "Scope", + "Accounts_OAuth_Custom_Scope": "Portée", "Accounts_OAuth_Custom_Secret": "Secret", "Accounts_OAuth_Custom_Token_Path": "URL de Token", "Accounts_OAuth_Custom_Token_Sent_Via": "Jeton envoyé via", @@ -83,19 +83,19 @@ "Accounts_OAuth_Google_id": "ID Google ", "Accounts_OAuth_Google_secret": "Secret Google", "Accounts_OAuth_Linkedin": "Connexion avec LinkedIn", - "Accounts_OAuth_Linkedin_callback_url": "URL de Callback LinkedIn ", + "Accounts_OAuth_Linkedin_callback_url": "LinkedIn URL de Callback", "Accounts_OAuth_Linkedin_id": "ID LinkedIn", "Accounts_OAuth_Linkedin_secret": "Secret LinkedIn ", "Accounts_OAuth_Meteor": "Connexion avec Meteor", - "Accounts_OAuth_Meteor_callback_url": "URL de Callback Meteor", + "Accounts_OAuth_Meteor_callback_url": "Meteor URL de Callback", "Accounts_OAuth_Meteor_id": "ID Meteor ", "Accounts_OAuth_Meteor_secret": "Meteor Secret", "Accounts_OAuth_Twitter": "Connexion avec Twitter", - "Accounts_OAuth_Twitter_callback_url": "URL de Callback Twitter ", + "Accounts_OAuth_Twitter_callback_url": "Twitter URL de Callback", "Accounts_OAuth_Twitter_id": "ID Twitter", "Accounts_OAuth_Twitter_secret": "Twitter Secret", "Accounts_OAuth_Wordpress": "Connexion avec WordPress", - "Accounts_OAuth_Wordpress_callback_url": "URL de Callback WordPress", + "Accounts_OAuth_Wordpress_callback_url": "Wordpress URL de Callback", "Accounts_OAuth_Wordpress_id": "ID WordPress", "Accounts_OAuth_Wordpress_secret": "Secret WordPress", "Accounts_PasswordReset": "Réinitialisation du mot de passe", @@ -130,7 +130,7 @@ "Adding_OAuth_Services": "Ajout de services OAuth", "Adding_permission": "Ajout une permission", "Adding_user": "Ajout d'un utilisateur", - "Additional_emails": "Adresses e-mail suplémentaires", + "Additional_emails": "Adresses e-mail supplémentaires", "Additional_Feedback": "Commentaires supplémentaires", "Administration": "Administration", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "Après l'authentification par OAuth2, les utilisateurs seront redirigés vers cette URL", @@ -169,6 +169,7 @@ "API_EmbedIgnoredHosts_Description": "Liste des hôtes ou des adresses CIDR, séparés par des virgules. Par exemple : localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", "API_EmbedSafePorts": "Ports approuvés", "API_EmbedSafePorts_Description": "Liste des ports autorisés pour la prévisualisation, séparés par des virgules.", + "API_Enable_CORS": "Activer CORS", "API_GitHub_Enterprise_URL": "URL du serveur", "API_GitHub_Enterprise_URL_Description": "Exemple: http://domain.com (sans slash final)", "API_Gitlab_URL": "URL GitLab", @@ -198,15 +199,15 @@ "Authorization_URL": "URL d’autorisation", "Authorize": "Autoriser", "Auto_Load_Images": "Charger automatiquement les images", - "AutoLinker_Email": "AutoLinker sur les adresses e-mail", - "AutoLinker_Phone": "AutoLinker sur les numéros de téléphone", + "AutoLinker_Email": "Lien automatique sur les adresses e-mail", + "AutoLinker_Phone": "Lien automatique sur les numéros de téléphone", "AutoLinker_Phone_Description": "Lier automatiquement les numéros de téléphone. par exemple `(123) 456-7890`", "AutoLinker_StripPrefix": "AutoLinker Strip Prefix", "AutoLinker_StripPrefix_Description": "Affichage court. e.g. https://rocket.chat => rocket.chat", - "AutoLinker_Urls_Scheme": "AutoLinker Scheme: // URLs", + "AutoLinker_Urls_Scheme": "Lien automatique sur le schéma : // URLs", "AutoLinker_Urls_TLD": "URL TLD de l'AutoLinker", - "AutoLinker_Urls_www": "URL 'www' de l'AutoLinker", - "AutoLinker_UrlsRegExp": "AutoLinker URL Expression régulière", + "AutoLinker_Urls_www": "Lien automatique si URL contenant 'www'", + "AutoLinker_UrlsRegExp": "Lien automatique si URL dans expression régulière", "Available": "Disponible", "Available_agents": "Assistants disponibles", "Avatar": "Modifier l'avatar", @@ -224,7 +225,7 @@ "Back_to_integrations": "Retour aux intégrations", "Back_to_login": "Retourner à l'écran de connexion", "Back_to_permissions": "Retour aux permissions", - "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Fonctionnalité Beta. Dépend de l'activation de la fonction Vidéo Conférence.", + "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Fonctionnalité en test. Dépend de l'activation de la fonction Vidéo Conférence.", "Block_User": "Bloquer utilisateur", "Body": "Corps", "bold": "gras", @@ -232,6 +233,7 @@ "BotHelpers_userFields": "Champs utilisateur", "BotHelpers_userFields_Description": "CSV des champs utilisateurs accessibles par les méthodes d'aide des bots", "Branch": "Branche", + "Bugsnag_api_key": "Clef d'API Bugsnag", "busy": "occupé", "Busy": "Occupé", "busy_female": "occupée", @@ -239,6 +241,7 @@ "busy_male": "occupé", "Busy_male": "Occupé", "by": "par", + "Content": "Contenu", "cache_cleared": "Effacer le cache", "Cancel": "Annuler", "Cancel_message_input": "Annuler", @@ -254,9 +257,11 @@ "CAS_login_url_Description": "URL de connexion pour votre service externe de connexion SSO, par exemple: http://sso.example.com/sso/", "CAS_popup_height": "Hauteur de la fenêtre popup de connexion", "CAS_popup_width": "Largeur de la fenêtre popup de connexion", - "CAS_Sync_User_Data_Enabled": "Toujours syncroniser les données utilisateur", + "CAS_Sync_User_Data_Enabled": "Toujours synchroniser les données utilisateur", + "CAS_Sync_User_Data_Enabled_Description": "Toujours synchroniser les données externes de l'utilisateur CAS vers les attributs disponibles après connexion. Note : dans tous les cas, les attributs sont toujours synchronisés après la création du compte.", "CAS_Sync_User_Data_FieldMap": "Attributs de carte", "CAS_version": "Version CAS", + "CAS_version_Description": "Utiliser seulement une version de CAS supportée par votre service CAS SSO", "CDN_PREFIX": "Préfixe CDN", "Certificates_and_Keys": "Certificats et clés", "Changing_email": "Modification des adresses e-mail", @@ -264,6 +269,7 @@ "channel": "canal", "Channel": "Canal", "Channel_already_exist": "Le canal '#% s' existe déjà.", + "Channel_created": "Canal `#%s` créé", "Channel_already_Unarchived": "Canal avec le nom `#% s` est déjà dans l'état Désarchivées", "Channel_Archived": "Canal avec le nom `#% s` a été archivé avec succès", "Channel_doesnt_exist": "Le canal `#%s` n'existe pas.", @@ -1345,11 +1351,16 @@ "Username_title": "Enregistrer un nom d'utilisateur", "Username_wants_to_start_otr_Do_you_want_to_accept": "__username__ veut démarrer une conversation chiffrée (OTR). Voulez-vous accepter ?", "Users": "Utilisateurs", + "Users_added": "Les utilisateurs ont été ajoutés", "Users_in_role": "Utilisateurs ayant ce rôle", "UTF8_Names_Slugify": "Utiliser un slug (texte court) pour les noms UTF-8", "UTF8_Names_Validation": "Validation UTF8 des Noms", "UTF8_Names_Validation_Description": "N’autorise pas les caractères spéciaux et les espaces. Vous pouvez utilisez - _ et . (tiret du milieu, tiret du bas et point) mais pas à la fin du nom", + "Validate_email_address": "Valider l'adresse email", + "Verification": "Vérification", "Verification_email_sent": "E-mail de vérification envoyé", + "Verification_Email_Subject": "[Nom_du_site] - Vérifiez votre compte", + "Verification_Email": "Cliquez ici pour vérifier votre compte.", "Verified": "Vérifié(e)", "Version": "Version", "Video_Chat_Window": "Video Chat", @@ -1383,6 +1394,8 @@ "will_be_able_to": "sera capable de", "Would_you_like_to_return_the_inquiry": "Voulez-vous retourner le dossier ?", "Yes": "Oui", + "Yes_archive_it": "Oui, archivez le !", + "Yes_unarchive_it": "Oui, désarchivez le !", "Yes_clear_all": "Oui, marquez tout comme lu !", "Yes_delete_it": "Oui, je confirme la suppression !", "Yes_hide_it": "Oui, je veux le cacher !", @@ -1396,8 +1409,8 @@ "You_can_change_a_different_avatar_too": "Vous pouvez ignorer l'avatar utilisé pour publier depuis cette intégration.", "You_can_search_using_RegExp_eg": "Vous pouvez rechercher en utilisant RegExp. par exemple", "You_can_use_an_emoji_as_avatar": "Vous pouvez également utiliser un emoji comme avatar.", - "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM": "Vous pouvez utiliser webhooks d'intégrer facilement livechat avec votre CRM.", - "You_cant_leave_a_livechat_room_Please_use_the_close_button": "Vous ne pouvez pas quitter une salle de livechat. S'il vous plaît, utilisez le bouton de fermeture.", + "You_can_use_webhooks_to_easily_integrate_livechat_with_your_CRM": "Vous pouvez utiliser les webhooks pour intégrer facilement une discussion en direct avec votre CRM.", + "You_cant_leave_a_livechat_room_Please_use_the_close_button": "Vous ne pouvez pas quitter une salle de discussion en direct. S'il vous plaît, utilisez le bouton de fermeture.", "You_have_been_muted": "Vous avez été rendu muet et ne pouvez donc pas parler dans ce salon", "You_have_not_verified_your_email": "Vous n'avez pas vérifié votre adresse e-mail.", "You_have_successfully_unsubscribed": "Vous êtes désabonné avec succès de notre liste de diffusion.", @@ -1418,6 +1431,8 @@ "Your_entry_has_been_deleted": "Ce message a été supprimé.", "Your_file_has_been_deleted": "Votre fichier a été supprimé.", "Your_mail_was_sent_to_s": "Votre e-mail a été envoyé à %s", + "your_message": "votre message", + "your_message_optional": "votre message (optionnel)", "Your_password_is_wrong": "Votre mot de passe est incorrect !", "Your_push_was_sent_to_s_devices": "Votre notification a été envoyée à %s appareils" } \ 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 36e241e06ed8..b1b887089de4 100644 --- a/packages/rocketchat-i18n/i18n/hr.i18n.json +++ b/packages/rocketchat-i18n/i18n/hr.i18n.json @@ -122,6 +122,7 @@ "Add": "Dodaj", "Add_agent": "Dodaj agenta", "Add_custom_oauth": "Dodaj prilagođeni OAuth", + "Add_Domain": "Dodaj domenu", "Add_manager": "Dodaj upravitelja", "Add_user": "Dodaj korisnika", "Add_User": "Dodaj korisnika", @@ -164,6 +165,7 @@ "API_EmbedIgnoredHosts_Description": "Odvojenih zarezom popis domaćini ili CIDR adresa, npr. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", "API_EmbedSafePorts": "Sigurni Ulazi", "API_EmbedSafePorts_Description": "Popis dopuštenih portova, odvojenih zarezom, za pretpregled", + "API_Enable_CORS": "Omogući CORS", "API_GitHub_Enterprise_URL": "GitHub Enterprise URL", "API_GitHub_Enterprise_URL_Description": "Na primjer: http://domain.com (isključujući kosu crtu na kraju)", "API_Gitlab_URL": "GitLab link", @@ -231,6 +233,7 @@ "busy_male": "zauzet", "Busy_male": "Zauzet", "by": "od", + "Content": "Sadržaj", "cache_cleared": "Predmemorija očišćena", "Cancel": "Otkaži", "Cancel_message_input": "Otkaži", @@ -242,6 +245,7 @@ "CDN_PREFIX": "CDN Prefiks", "Certificates_and_Keys": "Certifikati i ključevi", "Changing_email": "Promjena email", + "Change_Room_Type": "Mijenjam tip sobe", "channel": "soba", "Channel": "Soba", "Channel_already_exist": "Soba \"#% s' već postoji.", @@ -264,6 +268,7 @@ "Choose_the_username_that_this_integration_will_post_as": "Odaberite korisničko ime za koje će ova integracija objavljivati.", "clear": "Očisti", "clear_cache_now": "Očisti sada predmemoriju", + "clear_history": "Očisti Povijest", "Clear_all_unreads_question": "Očisti sve nepročitane?", "Click_here": "Kliknite ovdje", "Client_ID": "ID klijenta", @@ -294,6 +299,7 @@ "Created_at": "Stvoreno u", "Created_at_s_by_s": "%s je stvorio %s", "CROWD_Reject_Unauthorized": "Odbije neautorizirano", + "CRM_Integration": "CRM Integracija", "Current_Chats": "Trenutni Razgovori", "Custom": "Prilagođeno", "Custom_Emoji": "Posebni Emotikon", @@ -310,8 +316,9 @@ "Custom_oauth_unique_name": "Prilagođeno OAuth jedinstveno ime", "Custom_Script_Logged_In": "Prilagođena skripta za prijavljene korisnike", "Custom_Script_Logged_Out": "Prilagođena skripta za odjavljene korisnike", + "Custom_Sound_Error_Invalid_Sound": "Nevaljan zvuk", "Custom_Translations": "Prilagođeni prijevodi", - "Custom_Translations_Description": "Treba biti ispravan JSON gdje su ključevi jezici koji zadrže riječnik ključeva i prijevoda. Npr: \n {\n \"en\": {\n  \"key\": \"translation\"\n },\n \"pt\": {\n  \"key\": \"tradução\"\n }\n}", + "Custom_Translations_Description": "Treba biti ispravan JSON gdje su ključevi jezici koji zadrže riječnik ključeva i prijevoda. Npr: \n {\n \"en\": {\n  \"Channels\": \"Rooms\"\n },\n \"pt\": {\n  \"Channels\": \"Salas\"\n }\n}", "Dashboard": "Kontrolna ploča", "Date": "Datum", "Date_From": "Od", @@ -535,7 +542,7 @@ "Hide_Room_Warning": "Jeste li sigurni da želite sakriti sobu \"%s\"?", "Hide_usernames": "Sakrij korisnička imena", "Highlights": "Istaknuto", - "Highlights_How_To": "Kako bi bilo obaviješteni kada netko spomene neku riječ i li frazu, dodajte ju ovdje. Riječi i fraze odvojite zarezima. Ne ovisi kapitalizaciji.", + "Highlights_How_To": "Kako bi bili obaviješteni kada netko spomene neku riječ i li frazu, dodajte ju ovdje. Riječi i fraze odvojite zarezima. Ne ovisi kapitalizaciji.", "Highlights_List": "Označite riječi", "History": "Povijest", "Host": "Domaćin", @@ -587,6 +594,12 @@ "Integration_added": "Integracija je dodana", "Integration_Incoming_WebHook": "Dolazni WebHook integracija", "Integration_New": "Nova integracija", + "Integrations_Outgoing_Type_RoomArchived": "Soba je arhivirana", + "Integrations_Outgoing_Type_RoomCreated": "Soba je stvorena (javna i privatna)", + "Integrations_Outgoing_Type_RoomJoined": "Korisnik se pridružio sobi", + "Integrations_Outgoing_Type_RoomLeft": "Korisnik je napustio sobu", + "Integrations_Outgoing_Type_SendMessage": "Poruka je poslana", + "Integrations_Outgoing_Type_UserCreated": "Korisnik je stvoren", "Integration_Outgoing_WebHook": "Odlazna WebHook integracija", "Integration_updated": "Integracija je ažurirana", "Integrations": "Integracije", @@ -699,6 +712,7 @@ "LDAP_Use_Custom_Domain_Search_Description": "Napišite vlastiti filter za pretraživanje korisnika u LDAP poslužitelju.", "LDAP_Username_Field": "Polje za Korisničko ime", "LDAP_Username_Field_Description": "Koje polje će se koristiti kao *username* za nove korisnike. Ostavite prazno za korištenje korisničkog imena s prijave.
Možete koristiti oznake poput `#{givenName}.#{sn}`.
 Zadana vrijednost je `sAMAccountName`.", + "LDAP_Group_Filter_Group_Name": "Ime grupe", "Least_Amount": "Najmanja količina", "Leave_Group_Warning": "Jeste li sigurni da želite napustiti grupu \"%s\"?", "Leave_Private_Warning": "Jeste li sigurni da želite napustiti razgovor s \"%s\"?", @@ -789,6 +803,9 @@ "Message_editing": "Uređivanje poruke", "Message_GroupingPeriod": "Razdoblje grupiranja (u sekundama)", "Message_GroupingPeriodDescription": "Poruke će biti grupirane s prethodnim poruka ako su oboje od istog korisnika, a proteklo vrijeme je manje od zadanog u sekundama.", + "Message_HideType_ru": "Sakrij \"Korisnik je maknuo\" poruke", + "Message_HideType_uj": "Sakrij \"Korisnik se pridružio\" poruke", + "Message_HideType_ul": "Sakrij \"Korisnik je otišao\" poruke", "Message_KeepHistory": "Zadrži Povijest Poruka", "Message_MaxAll": "Maksimalna veličina sobe za SVE poruke", "Message_MaxAllowedSize": "Maksimalna dopuštena veličina poruke", @@ -801,6 +818,7 @@ "Message_ShowFormattingTips": "Prikaži Savjete za oblikovanje", "Message_starring": "Dodavanje zvjezdica na poruka", "Message_TimeFormat": "Format vremena", + "Message_TimeAndDateFormat": "Format Vremena i Datuma", "Message_TimeFormat_Description": "Vidi: Moment.js", "Message_too_long": "Poruka je preduga", "Message_VideoRecorderEnabled": "Video snimač omogućen", @@ -815,6 +833,7 @@ "Meta_robots": "Roboti", "Min_length_is": "Minimalna dužina je %s", "minutes": "minuta", + "Mobile": "Mobilno", "Monday": "Ponedjeljak", "Monitor_history_for_changes_on": "Prati povijest za promjena na", "More_channels": "Više kanala", @@ -844,6 +863,7 @@ "New_password": "Nova lozinka", "New_role": "Nova uloga", "New_Room_Notification": "Obavijest o novoj sobi", + "New_Trigger": "Novi Okidač", "No_available_agents_to_transfer": "Nema dostupnih agenata za prijenos", "No_channel_with_name_%s_was_found": "Soba s imenom \"%s\" nije nađena", "No_channels_yet": "Još nisi dio nijedne sobe.", @@ -860,6 +880,7 @@ "No_user_with_username_%s_was_found": "Korisnik sa korisničkim imenom \"%s\" nije nađen!", "Nobody_available": "Nema nikoga dostupnog", "Node_version": "Node verzija", + "None": "Ništa", "Normal": "Normalno", "Not_authorized": "Niste ovlašteni", "Not_Available": "Nije dostupno", @@ -869,6 +890,7 @@ "Notification_Duration": "Trajanje obavijesti", "Notifications": "Obavijesti", "Notify_all_in_this_room": "Obavijesti sve u ovoj sobi", + "Notify_active_in_this_room": "Obavijesti aktivne korisnike u ovoj sobi", "Num_Agents": "# agenata", "Number_of_messages": "Broj poruka", "OAuth_Application": "OAuth Aplikacija", @@ -896,6 +918,7 @@ "Open_days_of_the_week": "Otvoreni Dani u Tjednu", "Open_Livechats": "Otvori Livechat", "Opened": "Otvoreno", + "Opened_in_a_new_window": "Otvoren u novom prozoru.", "Opens_a_channel_group_or_direct_message": "Otvori sobu, grupu ili direktnu poruku", "optional": "neobavezno", "or": "ili", @@ -940,6 +963,7 @@ "Please_fill_a_name": "Molimo ispunite ime", "Please_fill_a_username": "Molimo Vas da ispunite korisničko ime", "Please_fill_name_and_email": "Molimo Vas da ispunite ime i e-mail", + "Please_select_an_user": "Molimo odaberite korisnika", "Please_select_enabled_yes_or_no": "Odaberite opciju za Omogućeno", "Please_wait": "Pričekajte", "Please_wait_activation": "Molimo pričekajte, ovo bi moglo potrajati neko vrijeme.", @@ -953,13 +977,13 @@ "Preferences": "Postavke", "Preferences_saved": "Postavke spremljene", "Privacy": "Privatnost", - "Private": "Privatno", + "Private": "Privatni", "Private_Group": "Privatna Grupa", "Private_Groups": "Privatne Grupe", "Private_Groups_list": "Popis privatnih grupa", "Profile": "Profil", "Profile_saved_successfully": "Profil je uspješno sačuvan", - "Public": "Javno", + "Public": "Javni", "Push": "Push obavijesti", "Push_apn_cert": "APN Cert", "Push_apn_dev_cert": "APN Dev Cert", @@ -994,7 +1018,9 @@ "Refresh_keys": "Osvježi ključeve", "Refresh_your_page_after_install_to_enable_screen_sharing": "Osvježi stranicu nakon instalacije kako bi se omogućilo dijeljenje zaslona", "Register": "Registriraj novi račun", + "Registration": "Registracija", "Registration_Succeeded": "Registracija je uspjela ", + "Regular_Expressions": "Regularni Izrazi", "Release": "Izdanje", "Remove": "Ukloni", "Remove_Admin": "Makni Administratora", @@ -1005,6 +1031,8 @@ "Remove_last_admin": "Ukloni zadnjeg administratora", "Remove_someone_from_room": "Uklonite nekoga iz sobe", "Removed": "Uklonjeno", + "Reply": "Odgovor", + "Reporting": "Prijava", "Report_Abuse": "Prijavi zlostavljanje", "Report_exclamation_mark": "Izvješće!", "Report_sent": "Izvješće je poslano", @@ -1028,12 +1056,16 @@ "room_changed_topic": "__user_by__ je promjenip temu sobe u __room_topic__", "Room_description_changed_successfully": "Opis sobe je uspješno promjenjen", "Room_has_been_deleted": "Soba je obrisana", + "Room_has_been_archived": "Soba je arhivirana", + "Room_has_been_unarchived": "Soba je vraćena iz arhive", "Room_Info": "Info Sobe", + "room_is_blocked": "Ova soba je blokirana", "room_is_read_only": "Ova soba je samo za čitanje", "room_name": "ime sobe", "Room_name_changed": "__user_by__ je promjenio ime sobe u: __room_name__", "Room_name_changed_successfully": "Ime sobe je uspješno izmijenjeno", "Room_not_found": "Soba nije nađena", + "Room_password_changed_successfully": "Lozinka sobe je uspješno promijenjena", "Room_topic_changed_successfully": "Tema sobe je uspješno promijenjena", "Room_type_changed_successfully": "Vrsta sobe je uspješno promijenjena", "Room_unarchived": "Soba je dearhivirana", @@ -1136,6 +1168,7 @@ "SMTP_Test_Button": "Testiraj SMTP postavke", "SMTP_Username": "SMTP korisničko ime", "Sound": "Zvuk", + "Sound_File_mp3": "Zvučni zapis (mp3)", "SSL": "SSL", "Star_Message": "Označi Poruku Zvjezdicom", "Starred_Messages": "Poruke sa zvjezdicom", @@ -1160,6 +1193,7 @@ "Stats_Total_Channels": "Ukupno kanala", "Stats_Total_Direct_Messages": "Ukupno Soba s Izravnim Porukama", "Stats_Total_Messages": "Ukupno poruka", + "Stats_Total_Messages_Channel": "Ukupno poruka u Kanalima", "Stats_Total_Private_Groups": "Ukupno Privatnih Grupa", "Stats_Total_Rooms": "Ukupno soba", "Stats_Total_Users": "Ukupno korisnika", @@ -1199,6 +1233,10 @@ "theme-color-primary-font-color": "Primarna boja slova", "theme-color-secondary-background-color": "Sekundarna boja pozadine", "theme-color-secondary-font-color": "Sekundarna boja slova", + "theme-color-component-color": "Boja komponente", + "theme-color-success-color": "Boja uspješnog", + "theme-color-error-color": "Boja greške", + "theme-color-selection-color": "Boja odabranog", "theme-color-tertiary-background-color": "Tercijarna boja pozadine", "theme-color-tertiary-font-color": "Tercijarna boja slova", "theme-color-link-font-color": "Boja slova poveznice", @@ -1231,6 +1269,10 @@ "To_users": "Korisnicima", "Topic": "Tema", "Travel_and_Places": "Putovanja & Mjesta", + "Transcript_Enabled": "Pitaj posjetitelja bi li htio transkript nakon što je chat zatvoren", + "Transcript_message": "Poruka koja će biti prikazana kad korisnik zatraži transkript", + "Transcript_of_your_livechat_conversation": "Transkript tvog razgovora", + "Translations": "Prijevodi", "Trigger_removed": "Okidač uklonjen", "Trigger_Words": "Riječi okidača", "Triggers": "Okidači", @@ -1243,7 +1285,9 @@ "Type_your_new_password": "Upišite novu lozinku", "UI_DisplayRoles": "Prikaži uloge", "UI_Merge_Channels_Groups": "Spoji privatne grupe s kanalima", + "UI_Use_Name_Avatar": "Koristi inicijale punog imena kako bi stvorio avatar", "Unarchive": "Dearhiviraj", + "Unblock_User": "Odblokiraj Korisnika", "Unmute_someone_in_room": "Uključi nekoga u sobi", "Unmute_user": "Uključi korisnika", "Unnamed": "Neimenovano", @@ -1252,18 +1296,21 @@ "Unread_Rooms": "Nepročitane Sobe", "Unread_Rooms_Mode": "Mod Nepročitanih Soba", "Unstar_Message": "Ukloni zvjezdicu", + "Upload_file_description": "Opis fajla", + "Upload_file_name": "Ime fajla", "Upload_file_question": "Prenesi datoteku?", "Uploading_file": "Prijenos datoteke ...", "Uptime": "Raspoloživost", "URL": "URL", + "URL_room_prefix": "URL prefix sobe", "Use_account_preference": "Koristite postavke računa", - "Use_Emojis": "Koristite Emotikone", + "Use_Emojis": "Koristi Emotikone", "Use_Global_Settings": "Koristite globalne postavke", "Use_initials_avatar": "Koristi inicijale svog korisničkog imena", "Use_service_avatar": "Koristi %s avatar", "Use_this_username": "Koristi ovo korisničko ime", "Use_uploaded_avatar": "Koristi prenijeti avatar", - "Use_url_for_avatar": "Koristite URL za avatar", + "Use_url_for_avatar": "Koristi URL za avatar", "Use_User_Preferences_or_Global_Settings": "Koristite korisnikove postavke ili globalne postavke", "User__username__is_now_a_moderator_of__room_name_": "Korisnik __username__ je sada moderator sobe __room_name__", "User__username__is_now_a_owner_of__room_name_": "Korisnik __username__ je sada vlasnik sobe __room_name__", @@ -1279,8 +1326,11 @@ "User_has_been_muted_in_s": "Korisnik je utišan u %s", "User_has_been_removed_from_s": "Korisnik je uklonjen iz %s", "User_Info": "Podaci o korisniku", + "User_Interface": "Korisničko sučelje", + "User_is_blocked": "Korisnik je blokiran", "User_is_no_longer_an_admin": "Korisnik više nije admin", "User_is_now_an_admin": "Korisnik je sada admin", + "User_is_unblocked": "Korisnik je odblokiran", "User_joined_channel": "Ušao u sobu.", "User_joined_channel_female": "Ušla u sobu.", "User_joined_channel_male": "Ušao u sobu.", @@ -1314,14 +1364,20 @@ "Username_title": "Registriraj korisničko ime", "Username_wants_to_start_otr_Do_you_want_to_accept": "__username__ želi započeti SP. Želite li prihvatiti?", "Users": "Korisnici", + "Users_added": "Korisnici su dodani", "Users_in_role": "Korisnici u ulozi", "UTF8_Names_Slugify": "UTF8 Imena Slugify", "UTF8_Names_Validation": "UTF8 Provjera Imena", "UTF8_Names_Validation_Description": "RegExp koji će biti korišten za provjeru korisničkih imena i imena soba", + "Validate_email_address": "Validiraj email adresu", + "Verification": "Verifikacija", "Verification_email_sent": "Provjera e-maila poslana", + "Verification_Email_Subject": "[Site_Name] - Potvrdi svoj račun", + "Verification_Email": "Klikni ovdje da bi potvrdio svoj račun.", "Verified": "Ovjeren", "Version": "Verzija", "Video_Chat_Window": "Video razgovor", + "Video_Conference": "Video Konferencija", "Videocall_declined": "Videopoziv odbijen", "Videocall_enabled": "Videopoziv omogućen", "View_All": "Prikaži Sve", @@ -1337,6 +1393,7 @@ "Visitor_page_URL": "URL stranice posjetitelja", "Visitor_time_on_site": "Vrijeme posjetitelja na stranici", "Wait_activation_warning": "Prije nego što se prijavite, vaš račun mora ručno aktivirati administrator.", + "Warnings": "Upozorenja", "We_are_offline_Sorry_for_the_inconvenience": "Mi smo izvan mreže. Oprostite na neugodnosti.", "We_have_sent_password_email": "Poslan ti je e-mail sa uputama za resetiranje lozinke. Provjeri i spam folder! Ako ga ne primiš uskoro, molimo te, vrati se i pokušaj opet.", "We_have_sent_registration_email": "Poslan ti je e-mail kako bi potvrdio svoju registraciju. Provjeri i spam folder! Ako ga ne primiš uskoro, molimo te vrati se i pokušaj opet.", @@ -1354,6 +1411,8 @@ "will_be_able_to": "će moći", "Would_you_like_to_return_the_inquiry": "Želite li vratiti upit?", "Yes": "Da", + "Yes_archive_it": "Da, arhiviraj!", + "Yes_unarchive_it": "Da, izvadi iz arhive!", "Yes_clear_all": "Da, makni sve!", "Yes_delete_it": "Da, obriši!", "Yes_hide_it": "Da, sakrij!", diff --git a/packages/rocketchat-i18n/i18n/hu.i18n.json b/packages/rocketchat-i18n/i18n/hu.i18n.json index 07cd90f947c1..d6694e976e27 100644 --- a/packages/rocketchat-i18n/i18n/hu.i18n.json +++ b/packages/rocketchat-i18n/i18n/hu.i18n.json @@ -40,6 +40,7 @@ "Accounts_Enrollment_Email_Default": "

Isten hozott a

[Site_Name]

Tovább a [Site_URL], és próbálja a legjobb nyílt forráskódú chat megoldást ma elérhető!

", "Accounts_Enrollment_Email_Description": "Lehet használni [name], [fname], [lname] a felhasználó teljes nevét, keresztnevét vagy vezetéknevét, ill.
Lehet használni [email] A felhasználó e-mail.", "Accounts_Enrollment_Email_Subject_Default": "Üdvözöljük a [Site_Name]", + "Accounts_ForgetUserSessionOnWindowClose": "Elfelejtett felhasználói munkamenet bezárása", "Accounts_Iframe_api_method": "Api módszer", "Accounts_Iframe_api_url": "API URL", "Accounts_iframe_enabled": "Engedélyezett", @@ -106,6 +107,7 @@ "Accounts_RegistrationForm_SecretURL": "Regisztrációs űrlap titkos URL", "Accounts_RegistrationForm_SecretURL_Description": "Meg kell adnia egy véletlenszerű karaktersorozat, amely hozzáadódik a regisztrációs URL-t. Példa: https://demo.rocket.chat/register/[secret_hash]", "Accounts_RequireNameForSignUp": "Igényel elnevezése Regisztráció", + "Accounts_RequirePasswordConfirmation": "Igényelt jelszó megerősítése", "Accounts_SetDefaultAvatar": "alapértelmezett Avatar beállítása", "Accounts_SetDefaultAvatar_Description": "alapértelmezett Avatar meghatározása az Oauth vagy a Gravatar alapján", "Accounts_ShowFormLogin": "Megmutatása űrlap alapú bejelentkezés", @@ -158,10 +160,13 @@ "API_EmbedIgnoredHosts_Description": "Vesszővel elválasztott listája hosts vagy CIDR címeket, pl. localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", "API_EmbedSafePorts": "biztonságos portok", "API_EmbedSafePorts_Description": "Vesszővel elválasztott listája portok engedélyezve előnézetét.", + "API_Enable_CORS": "CORS engedélyezése", + "API_Enable_Direct_Message_History_EndPoint": "Teljes közvetlen üzenetek történetének engedélyezése", "API_GitHub_Enterprise_URL": "szerver URL", "API_GitHub_Enterprise_URL_Description": "Példa: http://domain.com (kivéve záró perjel)", "API_Gitlab_URL": "GitLab URL", "API_Token": "API Token", + "API_Upper_Count_Limit": "maximális feljegyzés mennyisége", "API_User_Limit": "Használati Limit hozzátéve, hogy minden felhasználó csatornára", "API_Wordpress_URL": "WordPress URL", "Apiai_Key": "Api.ai Key", @@ -177,6 +182,7 @@ "Are_you_sure": "Biztos vagy benne?", "Are_you_sure_you_want_to_delete_your_account": "Biztos, hogy törli a fiókot?", "at": "nál nél", + "Attachment_File_Uploaded": "Fájl feltöltve", "Auth_Token": "Auth Token", "Author": "Szerző", "Authorization_URL": "engedélyezési URL", @@ -208,6 +214,7 @@ "Back_to_integrations": "Vissza az integrációk", "Back_to_login": "Vissza a bejelentkezéshez", "Back_to_permissions": "Vissza az engedélyeket", + "Block_User": "felhasználó blokkolása", "Body": "Test", "bold": "bátor", "Branch": "Ág", @@ -218,6 +225,7 @@ "busy_male": "elfoglalt", "Busy_male": "Elfoglalt", "by": "által", + "cache_cleared": "Cache törölve", "Cancel": "Mégse", "Cancel_message_input": "Mégse", "Cannot_invite_users_to_direct_rooms": "Nem lehet meghívni a felhasználók közvetlen szobák", @@ -225,14 +233,19 @@ "CAS_button_label_color": "Bejelentkezés gomb színe", "CAS_button_label_text": "Bejelentkezés gomb felirata", "CAS_enabled": "Engedélyezett", + "CAS_version": "CAS verzió", "CDN_PREFIX": "CDN előtag", "Certificates_and_Keys": "Bizonyítványok és kulcsok", "Changing_email": "változó email", + "Change_Room_Type": "Szoba típusának változtatása", + "channel": "csatorna", "Channel": "Csatorna", "Channel_already_exist": "A csatorna \"#% s 'már létezik.", + "Channel_created": "Csatorna `#%s` létre lett hozva.", "Channel_already_Unarchived": "Csatorna névvel `#% s` már archivált állapotban", "Channel_Archived": "Csatorna névvel `#% s` archiválva lett sikeres", "Channel_doesnt_exist": "A csatorna `# %s` nem létezik.", + "Channel_to_listen_on": "Csatorna figyelő", "Channel_Unarchived": "Csatorna névvel `#% s` már archivált sikeresen", "Channels": "Csatornák", "Channels_list": "Nyilvános csatornák listája", @@ -247,13 +260,18 @@ "Choose_messages": "üzenetek kiválasztása", "Choose_the_alias_that_will_appear_before_the_username_in_messages": "Válassza Alias ​​előtt jelenik meg a felhasználónevét üzeneteket.", "Choose_the_username_that_this_integration_will_post_as": "Válassza ki a felhasználónevét, hogy ez az integráció utáni mint.", + "clear": "Törlés", + "clear_cache_now": "Cache törlése ", "Clear_all_unreads_question": "Törölje az összes unreads?", "Click_here": "Kattints ide", + "Click_here_for_more_info": "Kattints ide a további információért", "Client_ID": "ügyfél-azonosító", "Client_Secret": "Client Secret", "Clients_will_refresh_in_a_few_seconds": "Az ügyfelek frissíteni néhány másodperc", "close": "bezár", + "Close": "Bezárás", "Closed": "Zárva", + "Closed_by_visitor": "Látogató által bezárva", "Closing_chat": "záró beszélgetés", "Collapse_Embedded_Media_By_Default": "Összecsukása beágyazott média alapértelmezés", "Color": "Szín", @@ -276,11 +294,25 @@ "Created_at_s_by_s": "Alkotó:% s% s", "Current_Chats": "jelenlegi beszélgetés", "Custom": "Szokás", + "Custom_Emoji_Add": "Új Emoji hozzáadása", + "Custom_Emoji_Has_Been_Deleted": "Az egyéni emoji törölve lett", + "Custom_Emoji_Info": "Info az egyéni Emojiról", + "Custom_Emoji_Updated_Successfully": "Az egyéni emoji feltöltése sikeres", "Custom_Fields": "egyéni mezők", "Custom_oauth_helper": "Amikor beállítja OAuth Szolgáltató, akkor tájékoztatni visszahívás URL. Használat
 %s 
.", "Custom_oauth_unique_name": "Egyedi OAuth egyedi nevet", + "Custom_Scripts": "Egyéni Srcipt", "Custom_Script_Logged_In": "Egyedi szkript bejelentkezett felhasználóknak", "Custom_Script_Logged_Out": "Egyedi szkript kijelentkezett felhasználó", + "Custom_Sounds": "Egyéni Hangok", + "Custom_Sound_Add": "Egyéni hang hozzáadása", + "Custom_Sound_Delete_Warning": "A hang törlése nem vonható vissza.", + "Custom_Sound_Error_Invalid_Sound": "Érvénytelen hang", + "Custom_Sound_Error_Name_Already_In_Use": "Ez az egyéni hang már használatban van.", + "Custom_Sound_Has_Been_Deleted": "Az egyéni hang törölve lett.", + "Custom_Sound_Info": "Egyéni hang infó", + "Custom_Sound_Saved_Successfully": "Az egyéni hang sikeresen mentve", + "Custom_Translations": "Egyéni fordítás", "Dashboard": "Műszerfal", "Date": "Dátum", "days": "napok", @@ -429,8 +461,11 @@ "Field": "Mező", "Field_removed": "Field eltávolított", "File_exceeds_allowed_size_of_bytes": "Fájl mérete meghaladja a megengedett méretet a __size__ bájt", + "File_uploaded": "Fájl feltöltve", "FileUpload": "Fájlfeltöltés", "FileUpload_Enabled": "Fájlfeltöltések Enabled", + "FileUpload_Disabled": "Fájl feltöltés nem lehetséges.", + "FileUpload_Enabled_Direct": "Fájl feltöltés engedélyezése a közvetlen üzeneteknél", "FileUpload_File_Empty": "Fájl üres", "FileUpload_FileSystemPath": "rendszer Path", "FileUpload_MaxFileSize": "Feltölthető legnagyobb fájlméret (bájtban)", @@ -455,7 +490,14 @@ "Force_SSL": "Force SSL", "Force_SSL_Description": "* Figyelem! * _Force SSL_ soha nem lehet fordított proxy. Ha van egy fordított proxy, meg kell tennie az átirányítást OTT. Ez a lehetőség fennáll telepítések mint Heroku, amely nem teszi lehetővé az átirányítás konfiguráció a fordított proxy.", "Forgot_password": "Elfelejtetted a jelszavad?", + "Forgot_Password_Email_Subject": "[Site_Name] - jelszó visszaállítva", + "Forgot_Password_Email": "Kattints ide a jelszó visszaállításához.", + "Forward": "Előre", + "Forward_chat": "Chat továbbítása", + "Forward_to_department": "Továbbítás a részlegnek", + "Forward_to_user": "Továbbítás a felhasználónak", "Frequently_Used": "gyakran használt", + "Friday": "Péntek", "From": "Ból ből", "From_Email": "az e-mailben", "From_email_warning": "Figyelmeztetés: A mező van kitéve az e-mail szerver beállításait.", @@ -464,10 +506,17 @@ "Give_a_unique_name_for_the_custom_oauth": "Adj egy egyedi nevet az egyéni OAuth", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Adjon az alkalmazás nevét. Ez látható lesz az Ön számára.", "Global": "Globális", + "GoogleCloudStorage": "Google Cloud Storage", "GoogleTagManager_id": "Google Címkekezelő Id", + "Guest_Pool": "Vendég medence", "Hash": "hash", "Header": "Fejléc", + "Header_and_Footer": "Fejléc és lábléc", + "Helpers": "Segítők", + "Hex_Color_Preview": "Hex színek elölnézet", "Hidden": "Rejtett", + "Hide_Avatars": "Avatar elrejtése", + "Hide_flextab": "Jobb oldali sáv elrejtése kattintással", "Hide_Group_Warning": "Biztosan el szeretné rejteni a csoport \" %s\"?", "Hide_Private_Warning": "Biztosan el szeretné rejteni a beszélgetés \" %s\"?", "Hide_room": "Szoba elrejtése", @@ -517,7 +566,7 @@ "Integration_Outgoing_WebHook": "Kimenő WebHook integráció", "Integration_updated": "Integration frissült", "Integrations": "Integráció", - "InternalHubot": "Internal Hubot", + "InternalHubot": "Belső Hubot", "InternalHubot_ScriptsToLoad": "Scripts betölteni", "InternalHubot_ScriptsToLoad_Description": "Kérjük, vesszővel elválasztott listáját szkriptek betölteni https://github.com/github/hubot-scripts/tree/master/src/scripts", "InternalHubot_Username_Description": "Ez kell, hogy legyen egy érvényes felhasználónevet egy bot van regisztrálva a szerveren.", diff --git a/packages/rocketchat-i18n/i18n/it.i18n.json b/packages/rocketchat-i18n/i18n/it.i18n.json index 9771a6653c97..3e7badef78b3 100644 --- a/packages/rocketchat-i18n/i18n/it.i18n.json +++ b/packages/rocketchat-i18n/i18n/it.i18n.json @@ -2,15 +2,16 @@ "#channel": "#canale", "0_Errors_Only": "0 - Solo errori", "1_Errors_and_Information": "1 - Errori e informazioni", - "2_Erros_Information_and_Debug": "2 - Errori, informazione e di debug", + "2_Erros_Information_and_Debug": "2 - Errori, informazioni e di debug", "403": "Proibito", "500": "Errore interno del server", "@username": "@username", "@username_message": "@username ", "__username__is_no_longer__role__defined_by__user_by_": "__username__ non è più __role__, da __user_by__", "__username__was_set__role__by__user_by_": "__username__ è stato fissato __role__ da __user_by__", - "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accetta richieste livechat in arrivo anche se non é c'é nessun operatore online", - "Accept_with_no_online_agents": "Accetta con nessun agente online", + "Accept": "Accetta", + "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accetta richieste livechat in arrivo anche se non è c'è nessun operatore online", + "Accept_with_no_online_agents": "Accetta con nessun operatore online", "Access_not_authorized": "Accesso autorizzato", "Access_Token_URL": "Token di accesso URL", "Accessing_permissions": "Permessi di Accesso", @@ -21,7 +22,7 @@ "Accounts_AllowedDomainsList_Description": "Elenco separato da virgole per i domini consentiti", "Accounts_AllowEmailChange": "Consenti cambio dell'e-mail", "Accounts_AllowPasswordChange": "Consenti cambio password", - "Accounts_AllowUserAvatarChange": "Consenti cambio avatar", + "Accounts_AllowUserAvatarChange": "Consenti cambio Avatar", "Accounts_AllowUsernameChange": "Consenti cambio nome utente", "Accounts_AllowUserProfileChange": "Consenti cambio profilo utente", "Accounts_AvatarResize": "Ridimensiona Avatar", @@ -38,8 +39,9 @@ "Accounts_EmailVerification_Description": "Assicurati di aver impostato SMTP in modo corretto per utilizzare questa funzione", "Accounts_Enrollment_Email": "Iscrizione e-mail", "Accounts_Enrollment_Email_Default": "

Benvenuto a

 [Site_Name]

 Vai a [Site_URL] per provare la chat open source migliore disponibile!

", - "Accounts_Enrollment_Email_Description": "Puoi utilizzare [name], [fname], [lname] per il nome completo dell'utente, nome o cognome, rispettivamente.
Utilizzare [email] per la e-mail dell'utente.", + "Accounts_Enrollment_Email_Description": "Puoi utilizzarei seguenti marcatori:
", "Accounts_Enrollment_Email_Subject_Default": "Benvenuti su [Site_Name]", + "Accounts_ForgetUserSessionOnWindowClose": "Dimentica la sessione utente alla chiusura della finestra", "Accounts_Iframe_api_method": "Api Method", "Accounts_Iframe_api_url": "Api URL", "Accounts_iframe_enabled": "Abilitato", @@ -54,10 +56,12 @@ "Accounts_OAuth_Custom_id": "Id", "Accounts_OAuth_Custom_Identity_Path": "Identity Path", "Accounts_OAuth_Custom_Login_Style": "Stile Login", + "Accounts_OAuth_Custom_Merge_Users": "Unisci utenti", "Accounts_OAuth_Custom_Scope": "Scope", "Accounts_OAuth_Custom_Secret": "Secret", "Accounts_OAuth_Custom_Token_Path": "Token Path", "Accounts_OAuth_Custom_Token_Sent_Via": "Token Inviato via", + "Accounts_OAuth_Custom_Username_Field": "Campo nome utente", "Accounts_OAuth_Facebook": "Facebook Login", "Accounts_OAuth_Facebook_callback_url": "URL Callback Facebook", "Accounts_OAuth_Facebook_id": "Facebook App Id", @@ -91,10 +95,12 @@ "Accounts_OAuth_Twitter_id": "Twitter Id", "Accounts_OAuth_Twitter_secret": "Twitter Secret", "Accounts_OAuth_Wordpress": "Accesso WordPress", - "Accounts_OAuth_Wordpress_callback_url": "URL Callback Wordpress", + "Accounts_OAuth_Wordpress_callback_url": "Wordpress URL Callback", "Accounts_OAuth_Wordpress_id": "ID WordPress", "Accounts_OAuth_Wordpress_secret": "WordPress Secret ", "Accounts_PasswordReset": "Reimpostare la password", + "Accounts_Registration_AuthenticationServices_Default_Roles": "Ruoli predefiniti per i Servizi di Autenticazione", + "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "Ruoli predefiniti (separati da virgola) per gli utenti che saranno registrati tramite servizi di autenticazione", "Accounts_Registration_AuthenticationServices_Enabled": "Registrazione tramite servizi di autenticazione", "Accounts_RegistrationForm": "Schermata di registrazione", "Accounts_RegistrationForm_Disabled": "Disabilitato", @@ -105,17 +111,20 @@ "Accounts_RegistrationForm_SecretURL_Description": "È necessario fornire una stringa casuale che verrà aggiunta alla URL di registrazione. Esempio: https://demo.rocket.chat/register/[secret_hash]", "Accounts_RequireNameForSignUp": "Richiedi il nome per l'iscrizione", "Accounts_RequirePasswordConfirmation": "Richiede conferma della password", + "Accounts_SetDefaultAvatar": "Imposta Avatar Predefinito", + "Accounts_SetDefaultAvatar_Description": "Prova a determinare l'avatar predefinito basato sull'account OAuth di Gravatar", "Accounts_ShowFormLogin": "Mostra il modulo d'accesso", "Accounts_UseDefaultBlockedDomainsList": "Utilizza la lista dei domini bloccati", "Accounts_UseDNSDomainCheck": "Utilizza la verifica del dominio DNS", - "Accounts_UserAddedEmail_Default": "

Benvenuto a

 [Site_Name]

 Vai a [Site_URL] e prova la chat open source migliore disponibile!

 Puoi effettuare il login usando la tua email: [email] e la password: [password]. Ti potrà essere richiesto di cambiarla dopo il primo accesso.

", - "Accounts_UserAddedEmail_Description": "È possibile utilizzare i seguenti segnaposti:
", + "Accounts_UserAddedEmail_Default": "

Benvenuto a

[Site_Name]

Vai a [Site_URL] e prova la chat open source migliore disponibile!

Puoi effettuare il login usando la tua email: [email] e la password: [password]. Ti potrà essere richiesto di cambiarla dopo il primo accesso.", + "Accounts_UserAddedEmail_Description": "È possibile utilizzare i seguenti marcatori:

", "Accounts_UserAddedEmailSubject_Default": "Sei stato aggiunto a [Site_Name]", "Activate": "Attivare", "Activity": "Attività", "Add": "Aggiungi", "Add_agent": "Aggiungi operatore", "Add_custom_oauth": "Aggiungere OAuth personalizzato", + "Add_Domain": "Aggiungi Dominio", "Add_manager": "Aggiungi gestore", "Add_user": "Aggiungi utente", "Add_User": "Aggiungi utente", @@ -140,6 +149,7 @@ "All_messages": "Tutti i messaggi", "Allow_Invalid_SelfSigned_Certs": "Consenti i Certificati SSL Self-Signed", "Allow_Invalid_SelfSigned_Certs_Description": "Consenti l'uso di certificati SSL non validi e self-signed per la validazione dei link e anteprime.", + "Always_open_in_new_window": "Apri sempre in una nuova finestra", "Analytics_features_enabled": "Funzioni abilitate", "Analytics_features_messages_Description": "Traccia eventi personalizzati relativi alle azioni che un utente fa sui messaggi.", "Analytics_features_rooms_Description": "Traccia eventi personalizzati relativi alle azioni su un canale od un canale privato (creazione, abbandono, cancellazione).", @@ -148,19 +158,30 @@ "And_more": "E altri __length __", "Animals_and_Nature": "Animali & Natura", "API": "API", + "API_Allow_Infinite_Count": "Permette di ottenere ogni dato", + "API_Allow_Infinite_Count_Description": "Dovrebbe chiamare la API REST per permettere il ritorno di ogni dato da una chiamata?", "API_Analytics": "Analytics", + "API_CORS_Origin": "CORS Origin", + "API_Default_Count": "Conteggio Predefinito", + "API_Default_Count_Description": "Il conteggio predefinito per i risultati della REST API se l'utente non fornisce niente.", "API_Embed": "Embed", "API_Embed_Description": "Anteprime link abilitate o meno quando un utente manda un link ad un sito.", + "API_EmbedCacheExpirationDays": "Giorni per la scadenza della cache degli embed", "API_EmbedDisabledFor": "Disattiva embedding per gli utenti", "API_EmbedDisabledFor_Description": "Elenco separato da virgole dei nomi utente", "API_EmbedIgnoredHosts": "Host Embed ignorati", "API_EmbedIgnoredHosts_Description": "Elenco di host o indirizzi CIDR separati da virgole, ad esempio: localhost, 127.0.0.1, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16", "API_EmbedSafePorts": "Porte sicure", "API_EmbedSafePorts_Description": "elenco delle porte consentite per l'anteprima separate da virgole.", + "API_Enable_CORS": "Abilita CORS", + "API_Enable_Direct_Message_History_EndPoint": "Abilita l'endpoint per lo storico dei messaggi diretti", + "API_Enable_Direct_Message_History_EndPoint_Description": "Questo abilita `/api/v1/im.history.others` che permette di vedere i messaggi diretti inviati dagli altri utenti di cui il chiamante non è parte.", "API_GitHub_Enterprise_URL": "URL del server", "API_GitHub_Enterprise_URL_Description": "Esempio: http://domain.com (escluso slash)", "API_Gitlab_URL": "URL GitLab", "API_Token": "API Token", + "API_Upper_Count_Limit": "Numero massimo del registro", + "API_Upper_Count_Limit_Description": "Qual è il numero massimo di record della REST API che può ritornare (quando non è illimitata)?", "API_User_Limit": "Limite utenti per aggiungerli tutti al canale", "API_Wordpress_URL": "WordPress URL", "Apiai_Key": "Api.ai Key", @@ -179,14 +200,15 @@ "at": "a", "AtlassianCrowd": "Atlassian Crowd", "Attachment_File_Uploaded": "File Caricato", - "Auth_Token": "Auth Token", + "Attribute_handling": "Gestione attributi", + "Auth_Token": "Token di Autenticazione", "Author": "Autore", "Authorization_URL": "URL Authorization", "Authorize": "Autorizza", "Auto_Load_Images": "Autocaricamento immagini", "AutoLinker_Email": "AutoLinker Email", "AutoLinker_Phone": "AutoLinker Phone", - "AutoLinker_Phone_Description": "Linka automaticamente i numeri di telefono. Ad esempio, `(123) 456-7890`", + "AutoLinker_Phone_Description": "Trasforma automaticamente i numeri di telefono in collegamenti. Ad esempio, `(123) 456-7890`", "AutoLinker_StripPrefix": "L'AutoLinker rimuove il prefisso", "AutoLinker_StripPrefix_Description": "Visualizzazione breve. ad es. https://rocket.chat => rocket.chat", "AutoLinker_Urls_Scheme": "AutoLinker Schema:// URL", @@ -208,8 +230,11 @@ "Back": "Indietro", "Back_to_applications": "Torna alle applicazioni", "Back_to_integrations": "Torna alle integrazioni", + "Back_to_integration_detail": "Torna ai dettagli della integrazione", "Back_to_login": "Torna al login", "Back_to_permissions": "Torna ai permessi", + "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "Funzionalità Beta. Dipende se la Video Conferenza è abilitata.", + "Block_User": "Blocca Utente", "Body": "Corpo", "bold": "grassetto", "bot_request": "Richiesta Bot", @@ -224,18 +249,41 @@ "busy_male": "occupato", "Busy_male": "Occupato", "by": "di", + "Content": "Contenuto", + "cache_cleared": "Svuota Cache", "Cancel": "Cancella", "Cancel_message_input": "Cancella", "Cannot_invite_users_to_direct_rooms": "Non è possibile invitare gli utenti in canali diretti", + "CAS_autoclose": "Chiudi automaticamente il popup di login", + "CAS_base_url": "SSO Base URL", + "CAS_base_url_Description": "La base URL del tuo servizio esterno SSO es: https://sso.example.undef/sso/", + "CAS_button_color": "Colore di sfondo del pulsante di login", + "CAS_button_label_color": "Colore del testo del pulsante di login", + "CAS_button_label_text": "Etichetta del pulsante di login", + "CAS_enabled": "Abilitato", + "CAS_Login_Layout": "CAS Login Layout", + "CAS_login_url": "SSO Login URL", + "CAS_login_url_Description": "La URL del login del tuo servizio esterno SSO es: https://sso.example.undef/sso/login", + "CAS_popup_height": "Altezza del popup di login", + "CAS_popup_width": "Larghezza del popup di login", + "CAS_Sync_User_Data_Enabled": "Sincronizza sempre i dati utente", + "CAS_Sync_User_Data_Enabled_Description": "Sincronizza sempre i dati utente CAS esterni per degli attributi disponibili dal login. Nota: Gli attributi sono sempre sincronizzati alla creazione dell'account.", + "CAS_Sync_User_Data_FieldMap": "Mappa attributi", + "CAS_Sync_User_Data_FieldMap_Description": "Usa questo JSON in input per costruire attributi (chiavi) interne da attributi (valori) esterni. Attributi nominativi esterni con '%' saranno interpretato come stringhe di valori.
Esempio, `{\"email\":\"%email%\", \"name\":\"%firstname%, %lastname%\"}`

La mappa degli attribbuti é sempre interpretata. In case 1.0 solo l'attributo `username` è disponibile. Attributi interni disponibili sono: username, name, email, rooms; rooms é una lista separata di stanze in cui entrare alla creazione utente es: {\"rooms\": \"%team%,%department%\"} permette agli utenti CAS alla creazione di entrare nel loro team canale di dipartimento.", + "CAS_version": "Versione CAS", + "CAS_version_Description": "Utilizza solo la versione CAS supportata dal tuo servizio CAS SSO.", "CDN_PREFIX": "Prefisso CDN", "Certificates_and_Keys": "Certificati e chiavi", "Changing_email": "Modifica e-mail", + "Change_Room_Type": "Cambia la tipologia di stanza", "channel": "canale", "Channel": "Canale", "Channel_already_exist": "Il canale `#%s` esiste già.", + "Channel_created": "Canale `#%s` creato.", "Channel_already_Unarchived": "Il canale con nome `#%s` è già in stato Non Archiviato", "Channel_Archived": "Il canale con nome `#%s` è stato archiviato con successo", "Channel_doesnt_exist": "Il canale `# %s` non esiste.", + "Channel_to_listen_on": "Canale da seguire su", "Channel_Unarchived": "Il canale con nome `#%s` è stato estratto dall'archivio con successo", "Channels": "Canali", "Channels_list": "Elenco dei canali pubblici", @@ -250,8 +298,12 @@ "Choose_messages": "Scegli i messaggi", "Choose_the_alias_that_will_appear_before_the_username_in_messages": "Scegli l'alias che verrà visualizzato prima del nome utente nei messaggi.", "Choose_the_username_that_this_integration_will_post_as": "Scegliere il nome utente che verrà usato da integrazione.", + "clear": "Pulisci", + "clear_cache_now": "Svuota la cache ora", + "clear_history": "Svuota lo storico", "Clear_all_unreads_question": "Marcare come letti tutti i messaggi non letti?", "Click_here": "Clicca qui", + "Click_here_for_more_info": "Clicca qui per altre informazioni", "Client_ID": "ID Client", "Client_Secret": "Client Secret", "Clients_will_refresh_in_a_few_seconds": "I client saranno aggiornati in pochi secondi", @@ -280,7 +332,9 @@ "Create_new": "Crea nuovo", "Created_at": "Creato a", "Created_at_s_by_s": "Creato a %s da %s", + "Created_at_s_by_s_triggered_by_s": "Creato alle %s da %s scatenato da %s", "CROWD_Reject_Unauthorized": "Rifiuta non autorizzati", + "CRM_Integration": "Integrazione CRM", "Current_Chats": "Chat attuali", "Custom": "Personalizzato", "Custom_Emoji": "Emoji personalizzate", @@ -295,16 +349,29 @@ "Custom_Fields": "Campi personalizzati", "Custom_oauth_helper": "Quando si imposta il provider di OAuth, dovrete impostare un URL Callback. Uso
 %S 
 .", "Custom_oauth_unique_name": "Nome univoco OAuth personalizzato", + "Custom_Scripts": "Script personalizzati", "Custom_Script_Logged_In": "Script personalizzato per gli utenti registrati", "Custom_Script_Logged_Out": "Script personalizzato per gli utenti registrati fuori", + "Custom_Sounds": "Suoni personalizzati", + "Custom_Sound_Add": "Aggiungi suono personalizzato", + "Custom_Sound_Delete_Warning": "La cancellazione di un suono non può essere annullata.", + "Custom_Sound_Error_Invalid_Sound": "Suono non valido", + "Custom_Sound_Error_Name_Already_In_Use": "Il nome del suono personalizzato è già in uso.", + "Custom_Sound_Has_Been_Deleted": "Il suono personalizzato è stato cancellato.", + "Custom_Sound_Info": "Informazioni Suono Personalizzato", + "Custom_Sound_Saved_Successfully": "Suono personalizzato salvato con successo", "Custom_Translations": "Traduzioni personalizzate", - "Custom_Translations_Description": "Dovrebbe essere un JSON valido dove le chiavi sono i campi che contengono il dizionario delle impostazioni del campo. Esempio:
{\n \"en\": {\n  \"key\": \"translation\"\n },\n \"pt\": {\n  \"key\": \"tradução\"\n }\n} ", + "Custom_Translations_Description": "Dovrebbe essere un JSON valido dove le chiavi sono i campi che contengono il dizionario delle impostazioni del campo. Esempio:
{\n \"en\": {\n  \"Channels\": \"Rooms\"\n },\n \"pt\": {\n  \"Channels\": \"Salas\"\n }\n} ", + "CustomSoundsFilesystem": "Filesystem suoni personalizzati", "Dashboard": "Dashboard", "Date": "Data", + "Date_From": "Da", + "Date_to": "A", "days": "giorni", "DB_Migration": "Migrazione Database", "DB_Migration_Date": "Ultimo aggiornamento migrazione Database", "Deactivate": "Disattiva", + "Decline": "Rifiuta", "Default": "Predefinito", "Delete": "Cancella", "Delete_message": "Elimina messaggio", @@ -330,7 +397,10 @@ "Displays_action_text": "Mostra il testo di azione", "Do_you_want_to_change_to_s_question": "Vuoi cambiare in %s?", "Domain": "Dominio", + "Domain_added": "Dominio aggiunto", + "Domain_removed": "Dominio rimosso", "Domains": "Domini", + "Download_Snippet": "Scarica", "Drop_to_upload_file": "Rilascia per caricare il file", "Dry_run": "Invio di prova", "Dry_run_description": "Verrà inviata solo una email, allo stesso indirizzo del Mittente. L'email deve appartenere ad un utente valido.", @@ -342,6 +412,7 @@ "Edit": "Modifica", "Edit_Custom_Field": "Modifica campo personalizzato", "Edit_Department": "Modifica Dipartimento", + "Edit_Trigger": "Modifica Trigger", "edited": "modificato", "Editing_room": "Stanza di modifica", "Editing_user": "Modifica utente", @@ -365,14 +436,21 @@ "Enable": "Attivo", "Enable_Desktop_Notifications": "Attiva notifiche per il desktop", "Enabled": "Abilitato", + "Enable_Svg_Favicon": "Abilita Favicon SVG", "Encrypted_message": "Messaggio cifrato", "End_OTR": "Fine OTR", + "Enter_Alternative": "Modalità alternativa (invio con Invio + Ctrl/Alt/Shift/CMD)", "Enter_a_regex": "Inserisci una regex", "Enter_a_room_name": "Inserire nome stanza", "Enter_a_username": "Inserisci un nome utente", + "Enter_Behaviour": "Comportamento Pulsante Invio", + "Enter_Behaviour_Description": "Questi cambiamenti se il pulsante invio invierà un messaggio o il cursore andrà accapo", "Enter_name_here": "Inserisci il nome qui", + "Enter_Normal": "Modalità normale (inviato con Invio)", "Enter_to": "Invio per", "Error": "Errore", + "Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances": "Errore: Rocket.Chat richiede la coda oplog quando in esecuzione su diverse instanze", + "Error_RocketChat_requires_oplog_tailing_when_running_in_multiple_instances_details": "Verifica che il tuo MongoDB è in modalità ReplicaSet e la variabile di sistema MONGO_OPLOG_URL è definita correttamente sul server dell'applicativo", "error-action-not-allowed": "__action__ non è permesso", "error-application-not-found": "Applicazione non trovata", "error-archived-duplicate-name": "C'è un canale archiviato con il nome '__room_name__'", @@ -398,11 +476,14 @@ "error-invalid-channel-start-with-chars": "Canale non valido. Inizia con @ o #", "error-invalid-custom-field": "Campo personalizzato non valido", "error-invalid-custom-field-name": "Nome non valido per il campo personalizzato. Utilizza solo lettere, numeri, trattini e underscore.", + "error-invalid-date": "Dati forniti non validi", "error-invalid-description": "Descrizione non valida", "error-invalid-domain": "Dominio non valido", "error-invalid-email": "L'email __email__ non é valida", + "error-invalid-email-address": "Indirizzo email non valido", "error-invalid-file-height": "Altezza del file non valida", "error-invalid-file-type": "Tipo di file non valido", + "error-direct-message-file-upload-not-allowed": "Condivisione dei file non permessa nei messaggi diretti", "error-invalid-file-width": "Larghezza file non valido", "error-invalid-from-address": "Hai specificato un indirizzo DA non valido.", "error-invalid-integration": "Integrazione non valida", @@ -428,7 +509,7 @@ "error-message-size-exceeded": "La dimensione del messaggio supera Message_MaxAllowedSize", "error-missing-unsubscribe-link": "È necessario fornire il link [unsubscribe].", "error-no-tokens-for-this-user": "Non ci sono token per questo utente", - "error-not-allowed": "Non autorizzato", + "error-not-allowed": "Non permesso", "error-not-authorized": "Non autorizzato", "error-push-disabled": "Push disattivato", "error-remove-last-owner": "Questo è l'ultimo proprietario. Imposta un nuovo proprietario prima di rimuoverlo.", @@ -439,10 +520,13 @@ "error-user-is-not-activated": "L'utente non è stato attivato", "error-user-not-in-room": "L'utente non è in questa stanza", "error-user-registration-disabled": "La registrazione utente è disattivata", + "error-user-limit-exceeded": "Il numero di utenti che stai provando ad invitare a #channel_name eccede il limite impostato dall'amministratore", "error-user-registration-secret": "La registrazione Utente è consentita solo tramite URL Segreto", "error-you-are-last-owner": "Tu sei l'ultimo proprietario. Imposta il nuovo proprietario prima di lasciare la stanza.", "Error_changing_password": "Errore nel cambio password", "Esc_to": "Esc per", + "Event_Trigger": "Evento scatenante", + "Event_Trigger_Description": "Selezione quale tipo di evento verrà scatenato con questa Integrazione WebHook in uscita", "every_30_minutes": "Una volta ogni 30 minuti", "every_hour": "Una volta ogni ora", "every_six_hours": "Una volta ogni 6 ore", @@ -457,12 +541,22 @@ "Field_removed": "Campo rimosso", "Field_required": "Campo richiesto", "File_exceeds_allowed_size_of_bytes": "Il file supera la dimensione consentita di __size__ byte", + "File_not_allowed_direct_messages": "Condivisione file non permessa nei messaggi diretti.", "File_type_is_not_accepted": "Il tipo di file non è accettato.", + "File_uploaded": "File caricato", "FileUpload": "Caricamento file", "FileUpload_Enabled": "Caricamento file abilitato", + "FileUpload_Disabled": "Caricamento file non permesso.", + "FileUpload_Enabled_Direct": "Caricamento file abilitato nei messaggi diretti", "FileUpload_File_Empty": "File vuoto", "FileUpload_FileSystemPath": "Percorso di sistema", - "FileUpload_MaxFileSize": "Dimensione massima file (in bytes)", + "FileUpload_GoogleStorage_AccessId": "Google Storage Access Id", + "FileUpload_GoogleStorage_AccessId_Description": "L'ID di accesso é generalmente in formato email, per esempio: \"example-test@example.iam.gserviceaccount.com\"", + "FileUpload_GoogleStorage_Bucket": "Google Storage Bucket Name", + "FileUpload_GoogleStorage_Bucket_Description": "Il nome del bucket dove i file saranno caricati.", + "FileUpload_GoogleStorage_Secret": "Google Storage Secret", + "FileUpload_GoogleStorage_Secret_Description": "Segui queste istruzioni e incolla qui i risultati.", + "FileUpload_MaxFileSize": "Dimensione massima file (in byte)", "FileUpload_MediaType_NotAccepted": "Tipi di file non accettati", "FileUpload_MediaTypeWhiteList": "Tipi di file permessi", "FileUpload_MediaTypeWhiteListDescription": "Elenco dei tipi di media separato da virgole. Lasciare vuoto per accettarli tutti.", @@ -479,15 +573,22 @@ "FileUpload_S3_URLExpiryTimeSpan_Description": "Il tempo dopo il quale le URL generate da Amazon S3 non é piú valido (in secondi). Se é impostato in meno di 5 secondi, questo campo sarà ignorato.", "FileUpload_Storage_Type": "Tipo di archiviazione", "Flags": "Bandiere", - "Follow_social_profiles": "Segui i nostri profili sociali, fai un fork su github e condividi i tuoi pensieri circa l'app rocket.chat nella nostra bacheca Trello.", + "Follow_social_profiles": "Segui i nostri profili sociali, fai un fork su github e condividi i tuoi pensieri su rocket.chat nella nostra bacheca Trello.", "Food_and_Drink": "Cibo & Bevanda", - "Footer": "Footer", + "Footer": "Piè di pagina", + "Fonts": "Caratteri", "For_your_security_you_must_enter_your_current_password_to_continue": "Per motivi di sicurezza, è necessario reinserire la password per continuare", + "Force_Disable_OpLog_For_Cache": "Forza la disabilitazione di OpLog per la Cache", + "Force_Disable_OpLog_For_Cache_Description": "Non usare OpLog per sincronizzare la cache quanto disponibile", "Force_SSL": "Forza SSL", "Force_SSL_Description": "* Attenzione * _Force SSL_ non dovrebbe mai essere usato con reverse proxy. Se si dispone di un reverse proxy, si dovrebbe fare il redirect QUI. Questa opzione esiste per ambienti come Heroku, che non permettono la configurazione per il reindirizzamento al reverse proxy.", "Forgot_password": "Ho dimenticato mia password", + "Forgot_Password_Description": "Puoi usare i seguenti segnaposti:
", + "Forgot_Password_Email_Subject": "[Site_Name] - Recupero Password", + "Forgot_Password_Email": "Clicca qui per resettare la tua password.", + "Forgot_password_section": "Password dimenticata", "Forward": "Inoltro", - "Forward_chat": "Chat di Inoltro", + "Forward_chat": "Inoltra Chat", "Forward_to_department": "Inoltra al dipartimento", "Forward_to_user": "Inoltra all'utente", "Frequently_Used": "Usato frequentemente", @@ -496,14 +597,18 @@ "From_Email": "Indirizzo mittente", "From_email_warning": "Attenzione: Il campo Da è soggetto alle impostazioni del server di posta.", "General": "Generale", - "github_no_public_email": "Non hai un email publicca sul tuo account GitHub", + "github_no_public_email": "Non hai un email publica sul tuo account GitHub", "Give_a_unique_name_for_the_custom_oauth": "Dai un nome univoco per OAuth personalizzato", "Give_the_application_a_name_This_will_be_seen_by_your_users": "Dai un nome all'applicazione. Sarà visibile agli utenti.", "Global": "Globale", + "GoogleCloudStorage": "Google Cloud Storage", "GoogleTagManager_id": "Google Tag Manager Id", "Guest_Pool": "Stanza ospiti", "Hash": "Hash", "Header": "Header", + "Header_and_Footer": "Testata e Piè di pagina", + "Helpers": "Helpers", + "Hex_Color_Preview": "Anteprima colore esadecimale", "Hidden": "Nascosto", "Hide_Avatars": "Nascondi gli Avatar", "Hide_flextab": "Nascondi la barra di destra con un click", @@ -511,6 +616,7 @@ "Hide_Private_Warning": "Sicuro di voler nascondere la discussione con \" %s\"?", "Hide_room": "Nascondi il canale", "Hide_Room_Warning": "Sicuro di voler nascondere la stanza \" %s\"?", + "Hide_roles": "Nascondi ruoli", "Hide_usernames": "Nascondi nomi utente", "Highlights": "In Evidenza", "Highlights_How_To": "Per ricevere una notifica quando qualcuno menziona una parola o frase, inserirla qui. È possibile separare parole o frasi con le virgole. Evidenzia Parole ignora maiuscole o minuscole.", @@ -519,14 +625,15 @@ "Host": "Server", "hours": "ore", "Hours": "Ore", - "How_friendly_was_the_chat_agent": "Quanto é stato intuitivo l'operatore chat?", - "How_knowledgeable_was_the_chat_agent": "Quanto é stato semplice l'operatore chat?", - "How_long_to_wait_after_agent_goes_offline": "Quanto attendere dopo che l'agente di è disconnesso", - "How_responsive_was_the_chat_agent": "Quanto é reattivo l'operatore chat?", + "How_friendly_was_the_chat_agent": "Quanto è stato intuitivo l'operatore chat?", + "How_knowledgeable_was_the_chat_agent": "Quanto è stato semplice l'operatore chat?", + "How_long_to_wait_after_agent_goes_offline": "Tempo di attesa dopo che l'operatore si è disconnesso", + "How_responsive_was_the_chat_agent": "Quanto è reattivo l'operatore chat?", "How_satisfied_were_you_with_this_chat": "Quanto sei soddisfatto di questa chat?", - "How_to_handle_open_sessions_when_agent_goes_offline": "Come gestire le sessioni attive quando l'agente si disconnette", + "How_to_handle_open_sessions_when_agent_goes_offline": "Come gestire le sessioni attive quando l'opreatore si disconnette", "If_you_are_sure_type_in_your_password": "Se sei sicuro inserisci la password:", "If_you_are_sure_type_in_your_username": "Se sei sicuro inserisci il tuo nome utente:", + "Iframe_Integration": "Integrazione Iframe", "Iframe_Integration_receive_enable": "Abilita Ricezione", "Iframe_Integration_receive_enable_Description": "Permetti alla finestra genitore di inviare comandi a Rocket.Chat.", "Iframe_Integration_receive_origin": "Ricevi le origini", @@ -534,8 +641,11 @@ "Iframe_Integration_send_enable": "Abilita Invio", "Iframe_Integration_send_enable_Description": "Invia eventi alla finestra genitore", "Iframe_Integration_send_target_origin": "Invia il target delle origini", - "Iframe_Integration_send_target_origin_Description": "Solo pagine con una origine certa potranno ascoltare gli eventi o '*' per tutte le origini. Example `http://localhost`", + "Iframe_Integration_send_target_origin_Description": "Solo pagine con una origine certa potranno ascoltare gli eventi o '*' per tutte le origini. Esempio `http://localhost`", "Importer_Archived": "Archiviato", + "Importer_CSV_Information": "L'importatore CSV richiede un formato specifico, leggi la documentazione per scoprire come organizzare il tuo file zip:", + "Importer_HipChatEnterprise_Information": "Il file caricato deve essere un file tar.gz decriptato, leggi la documentazione per altre informazioni:", + "Importer_HipChatEnterprise_BetaWarning": "Nota che questa importazione è in sviluppo, riporta ogni errori che può avvenire su GitHub:", "Importer_done": "Importazione completata!", "Importer_finishing": "Sto finendo l'importazione.", "Importer_From_Description": "Importa i dati da __from __ 's in Rocket.Chat.", @@ -546,12 +656,14 @@ "Importer_importing_started": "Avvio importazione.", "Importer_importing_users": "Importazione degli utenti.", "Importer_not_in_progress": "L'importatore non è in esecuzione.", + "Importer_not_setup": "L'importatore non è impostato in modo corretto, non ritorna nessun dato.", "Importer_Prepare_Restart_Import": "Ravvia Importazione", "Importer_Prepare_Start_Import": "Avviare l'importazione", "Importer_Prepare_Uncheck_Archived_Channels": "Deseleziona i Canali Archiviati", "Importer_Prepare_Uncheck_Deleted_Users": "Deseleziona utenti eliminati", "Importer_progress_error": "Impossibile ottenere lo stato di avanzamento per l'importazione.", "Importer_setup_error": "È avvenuto un errore durante l'impostazione dell'importatore.", + "Importer_Source_File": "Selezione dei file sorgente", "Incoming_Livechats": "LiveChat in arrivo", "inline_code": "inline_code", "Install_Extension": "Installa estensione", @@ -562,10 +674,42 @@ "Installation": "Installazione", "Installed_at": "Installato il", "Instructions_to_your_visitor_fill_the_form_to_send_a_message": "Istruzioni per il visitatore, compila il modulo per inviare un messaggio", + "Impersonate_user": "Impersona utente", + "Impersonate_user_description": "Quando abilitato i post integrati come l'utente che ha scatenato l'integrazione", + "Incoming_WebHook": "WebHook in Entrata", + "Integration_Advanced_Settings": "Impostazioni avanzate", "Integration_added": "L'integrazione è stata aggiunta", + "Integration_History_Cleared": "Integrazione Storico svuotata con successo", "Integration_Incoming_WebHook": "Integrazione WebHook In Arrivo", "Integration_New": "Nuova integrazione", + "Integrations_Outgoing_Type_FileUploaded": "File caricato", + "Integrations_Outgoing_Type_RoomArchived": "Stanza Archiviata", + "Integrations_Outgoing_Type_RoomCreated": "Stanza creata (pubblica e privata)", + "Integrations_Outgoing_Type_RoomJoined": "Utente è entrato nella stanza", + "Integrations_Outgoing_Type_RoomLeft": "Utente lascia la stanza", + "Integrations_Outgoing_Type_SendMessage": "Messaggio inviato", + "Integrations_Outgoing_Type_UserCreated": "Utente creato", "Integration_Outgoing_WebHook": "Integrazione WebHook in uscita", + "Integration_Outgoing_WebHook_History": "Storico Integrazioni Webhook in uscita", + "Integration_Outgoing_WebHook_No_History": "Questa integrazione webhook in uscita non ha ancora nessun elemento.", + "Integration_Outgoing_WebHook_History_Time_Triggered": "Tempo integrazione evento", + "Integration_Outgoing_WebHook_History_Time_Ended_Or_Error": "Tempo di conclusione o di errore", + "Integration_Outgoing_WebHook_History_Trigger_Step": "Ultimo evento", + "Integration_Outgoing_WebHook_History_Messages_Sent_From_Prepare_Script": "Messaggi inviato dal punto di preparazione", + "Integration_Outgoing_WebHook_History_Messages_Sent_From_Process_Script": "Messaggi inviato dal punto di risposta del processo", + "Integration_Outgoing_WebHook_History_Data_Passed_To_Trigger": "Dati passati alla integrazione", + "Integration_Outgoing_WebHook_History_Data_Passed_To_URL": "Dati passati alla URL", + "Integration_Outgoing_WebHook_History_Http_Response_Error": "Risposta errore HTTP", + "Integration_Outgoing_WebHook_History_Http_Response": "Risposta HTTP", + "Integration_Outgoing_WebHook_History_Error_Stacktrace": "Stacktrace errore", + "Integration_Retry_Failed_Url_Calls": "Riprova la chiamata URL fallita", + "Integration_Retry_Failed_Url_Calls_Description": "L'integrazione dovrebbe chiedere un tempo ragionale in caso di chiamata URL fallita?", + "Integration_Retry_Count": "Riprova conteggio", + "Integration_Retry_Count_Description": "Quante volte l'integrazione dovrebbe provare se la chiamata alla URL fallisce?", + "Integration_Retry_Delay": "Riprova ritardo", + "Integration_Retry_Delay_Description": "Quale algoritmo di ritardo per i tentativi si deve utilizzare? 10^x or 2^x or x*2", + "Integration_Word_Trigger_Placement": "Posizione parole ovunque", + "Integration_Word_Trigger_Placement_Description": "La parola dovrebbe essere scatenata quando posizionata ovunque nella frase oltre che all'inizio?", "Integration_updated": "L'integrazione è stata aggiornata", "Integrations": "Integrazioni", "InternalHubot": "Hubot interno", @@ -579,16 +723,19 @@ "Invalid_name": "Il nome non può essere vuoto", "Invalid_notification_setting_s": "impostazione di notifica non valida: %s", "Invalid_pass": "La password non deve essere vuota", - "Invalid_room_name": "%s il nome del canale non è corretto,
 usa solo lettere, numeri, trattini ed underscores", - "Invalid_secret_URL_message": "La URL fornito non è valida.", + "Invalid_room_name": "%s il nome del canale non è corretto,
usa solo lettere, numeri, trattini e underscore", + "Invalid_secret_URL_message": "La URL fornita non è valida.", "invisible": "invisibile", "Invisible": "Invisibile", + "Invitation": "Inviti", "Invitation_HTML": "invito HTML", "Invitation_HTML_Default": "

Sei stato invitato a

 [Site_Name]

 Vai a [Site_URL] per provare la migliore soluzione di chat open source oggi disponibile!

", "Invitation_HTML_Description": "È possibile utilizzare i seguenti segnaposti:
", "Invitation_Subject": "Oggetto invito", "Invitation_Subject_Default": "Sei stato invitato a [Site_Name]", "Invite_user_to_join_channel": "Invita un utente ad entrare in questo canale", + "Invite_user_to_join_channel_all_to": "Invita tutti gli utenti di questo canale a unirsi [#channel]", + "Invite_user_to_join_channel_all_from": "Invita tutti gli utenti da [#channell] per unirsi a questo canale", "Invite_Users": "Invita utenti", "is_also_typing": "sta digitando anche", "is_also_typing_female": "sta anche scrivendo", @@ -596,6 +743,9 @@ "is_typing": "sta digitando", "is_typing_female": "sta scrivendo", "is_typing_male": "sta scrivendo", + "IRC_Channel_Join": "Output del comando JOIN", + "IRC_Channel_Leave": "Output del comando PART", + "IRC_Quit": "Output alla uscita della sessione IRC.", "It_works": "Funziona", "italics": "corsivo", "Jitsi_Chrome_Extension": "Chrome Extension Id", @@ -614,7 +764,7 @@ "Katex_Dollar_Syntax": "Consenti la Sintassi Dollaro", "Katex_Dollar_Syntax_Description": "Consenti l'utilizzo di $$katex block$$ e sintassi $inline katex$", "Katex_Enabled": "Katex Abilitato", - "Katex_Enabled_Description": "Consenti l'utilizzodi Katex per la matematica nei messaggi", + "Katex_Enabled_Description": "Consenti l'utilizzo di Katex per la matematica nei messaggi", "Katex_Parenthesis_Syntax": "Consenti Sintassi parentesi", "Katex_Parenthesis_Syntax_Description": "Consenti l'utilizzo di sintassi \\[katex block\\] e \\(inline katex\\)", "Knowledge_Base": "Knowledge Base", @@ -629,11 +779,12 @@ "Layout_Home_Title": "Titolo pagina iniziale", "Layout_Login_Terms": "Condizioni d'accesso", "Layout_Privacy_Policy": "Privacy Policy", - "Layout_Sidenav_Footer": "Pié di Pagina Navigazione Laterale", - "Layout_Sidenav_Footer_description": "La dimensione del piè di pagina è di 260 x 70 px", + "Layout_Sidenav_Footer": "Piè di Pagina Navigazione Laterale", + "Layout_Sidenav_Footer_description": "La dimensione del piè di pagina è di 260 x 70px", "Layout_Terms_of_Service": "Termini di servizio", "LDAP": "LDAP", "LDAP_CA_Cert": "CA Cert", + "LDAP_Connect_Timeout": "Timeout Connessione (ms)", "LDAP_Custom_Domain_Search": "Ricerca dominio personalizzato", "LDAP_Custom_Domain_Search_Description": "Un pezzo di JSON che lega e collega informazioni di questo tipo:
{\"filter\": \"(&(objectCategory=person)(objectclass=user)(memberOf=CN=ROCKET_ACCESS,CN=Users,DC=domain,DC=com)(sAMAccountName=#{username}))\", \"scope\": \"sub\", \"userDN\": \"rocket.service@domain.com\", \"password\": \"urpass\"}", "LDAP_Default_Domain": "Dominio Predefinito", @@ -649,15 +800,16 @@ "LDAP_Domain_Search_Password": "Ricerca password nel dominio ", "LDAP_Domain_Search_Password_Description": "La password per l'utente del dominio di ricerca.", "LDAP_Domain_Search_User": "Ricerca utente nel dominio", - "LDAP_Domain_Search_User_Description": "L'utente che esegue ricerche LDAP per l'autenticazione degli utenti quando accedono.
Solitamente é un account di servizio creato appositamente per le integrazioni di terze parti. Utilizzare un nome completo, come `cn = Administrator, CN = Users, dc = example, dc = com`.", + "LDAP_Domain_Search_User_Description": "L'utente che esegue ricerche LDAP per l'autenticazione degli utenti quando accedono.
Solitamente é un account di servizio creato appositamente per le integrazioni di terze parti. Utilizzare un nome completo, come `cn=Administrator, CN=Users, dc=example, dc=com`.", "LDAP_Domain_Search_User_ID": "Ricerca User ID nel dominio", - "LDAP_Domain_Search_User_ID_Description": "L'attributo LDAP che identifica l'utente LDAP che tenta l'autenticazione. Questo campo deve essere `sAMAccountName` per la maggior parte di installazioni Active Directory, ma può essere `uid` per altre soluzioni LDAP, come OpenLDAP. È possibile utilizzare `mail` per identificare gli utenti via e-mail o tramite attributo.
È possibile utilizzare più valori separati da virgola per consentire agli utenti di accedere con più identificatori, come nome utente o e-mail.", + "LDAP_Domain_Search_User_ID_Description": "L'attributo LDAP che identifica l'utente LDAP che tenta l'autenticazione. Questo campo deve essere `sAMAccountName` per la maggior parte di installazioni Active Directory, ma può essere `uid` per altre soluzioni LDAP, come OpenLDAP. È possibile utilizzare `mail` per identificare gli utenti via e-mail o tramite attributo.
È possibile utilizzare più valori separati da virgola per consentire agli utenti di accedere con più identificatori, come nome utente o e-mail.", "LDAP_Enable": "Attivo", "LDAP_Enable_Description": "Tenta di utilizzare LDAP per l'autenticazione.", "LDAP_Encryption": "Crittografia", "LDAP_Encryption_Description": "Il metodo di cifratura utilizzato per proteggere le comunicazioni con il server LDAP. Gli esempi includono `plain` (senza crittografia),` SSL / LDAPS` (criptato dall'inizio), e `StartTLS` (passaggio ad una comunicazione criptata una volta connesso).", "LDAP_Host": "Host", "LDAP_Host_Description": "Host LDAP, ad esempio `ldap.example.com` o` 10.0.0.30`.", + "LDAP_Idle_Timeout": "Timeout attesa (ms)", "LDAP_Import_Users": "Importa utenti LDAP", "LDAP_Import_Users_Description": "Il processo true sync importerà tutti gli utenti LDAP
*Attenzione!* Specificare il filtro di ricerca per non importare gli utenti in eccesso.", "LDAP_Login_Fallback": "Login di Fallback", @@ -701,7 +853,9 @@ "line": "linea", "List_of_Channels": "Lista di Canali", "List_of_Direct_Messages": "Elenco dei messaggi privati", - "Livechat_agents": "Agenti livechat", + "Livechat_agents": "Operatori livechat", + "Livechat_AllowedDomainsList": "Domini permessi per Livechat", + "Domains_allowed_to_embed_the_livechat_widget": "Lista di domini permessi per l'embed del widget livechat. Lascia vuoto per permettere tutti i domini.", "Livechat_Dashboard": "Dashboard livechat", "Livechat_enabled": "Livechat abilitato", "Livechat_forward_open_chats": "Inoltra le chat aperte", @@ -711,6 +865,7 @@ "Livechat_managers": "Manager livechat", "Livechat_offline": "Livechat disconnessa", "Livechat_online": "Livechat connessa", + "Livechat_open_inquiery_show_connecting": "Mostra i messaggi di connessione invece dell'input quando gli ospiti non sono connessi all'operatore", "Livechat_Queue": "Coda Livechat", "Livechat_room_count": "Conteggio stanza livechat", "Livechat_Routing_Method": "Metodo di routing della Livechat", @@ -724,7 +879,7 @@ "Loading_suggestion": "Caricamento opzioni...", "Localization": "Localizzazione", "Log_Exceptions_to_Channel": "Riporta le eccezioni sul canale", - "Log_Exceptions_to_Channel_Description": "Un canale che riceverà tutte le eccezioni rilevate. Lasciare vuoto per ingnorare le eccezioni.", + "Log_Exceptions_to_Channel_Description": "Un canale che riceverà tutte le eccezioni rilevate. Lasciare vuoto per ignorare le eccezioni.", "Log_File": "Mostra File e Linea", "Log_Level": "Livello di log", "Log_Package": "Visualizza Pacchetto", @@ -771,6 +926,7 @@ "Message_AllowEditing_BlockEditInMinutesDescription": "Inserisci 0 per disattivare il blocco.", "Message_AllowPinning": "Permette di appuntare i messaggi", "Message_AllowPinning_Description": "Consenti di appuntare i messaggi su qualsiasi canale.", + "Message_AllowSnippeting": "Permetti Messaggi Snippet", "Message_AllowStarring": "Consenti evidenziazione messaggio", "Message_AllowUnrecognizedSlashCommand": "Permetti comandi Slash non riconosciuti", "Message_AlwaysSearchRegExp": "Cerca sempre utilizzando le espressioni regolari", @@ -783,12 +939,17 @@ "Message_DateFormat_Description": "Vedi anche: Moment.js", "Message_deleting_blocked": "Questo messaggio non può più essere eliminato", "Message_editing": "Modifica del messaggio", - "Message_GroupingPeriod": "Raggruppaperiodo (in secondi)", + "Message_GroupingPeriod": "Raggruppa periodo (in secondi)", "Message_GroupingPeriodDescription": "I messaggi saranno raggruppati con il messaggio precedente, se entrambi sono dallo stesso utente e il tempo trascorso è inferiore del tempo informato in secondi.", + "Message_HideType_au": "Nascondi messaggi \"Utente aggiunti\"", + "Message_HideType_mute_unmute": "Nascondi messaggi \"Utente muto/non muto\"", + "Message_HideType_ru": "Nascondi messaggi \"Utente rimosso\"", + "Message_HideType_uj": "Nascondi messaggi \"Utente entrato\"", + "Message_HideType_ul": "Nascondi messaggi \"Utente uscito\"", "Message_KeepHistory": "Mantieni la Cronologia messaggi", "Message_MaxAll": "La dimensione massima del canale per TUTTI i messaggi", "Message_MaxAllowedSize": "Dimensione massima del messaggio ammessa", - "Message_pinning": "Appunta Messaggio", + "Message_pinning": "Evidenzia Messaggio", "Message_removed": "Messaggio rimosso", "Message_SetNameToAliasEnabled": "Imposta un nome utente come alias nel messaggio", "Message_SetNameToAliasEnabled_Description": "Solo se non esiste imposta l'alias. L'alias del vecchio messaggio non sarà cambiato se l'utente ha cambiato il nome.", @@ -797,31 +958,35 @@ "Message_ShowFormattingTips": "Mostra suggerimenti di formattazione", "Message_starring": "Segnalibro Messaggio", "Message_TimeFormat": "Formato orario", + "Message_TimeAndDateFormat": "Formato data e ora", "Message_TimeFormat_Description": "Vedi anche: Moment.js", + "Message_TimeAndDateFormat_Description": "Vedi anche: Moment.js", "Message_too_long": "Messaggio troppo lungo", "Message_VideoRecorderEnabled": "Registrazione Video Abilitata", - "Message_VideoRecorderEnabledDescription": "Richiede che i file del tipo 'video/webm' siano fra gli accettati nella sezione 'Upload File'.", + "Message_VideoRecorderEnabledDescription": "Richiede che i file del tipo 'video/webm' siano fra gli accettati nella sezione 'Caricamento File'.", "Messages": "Messaggi", "Messages_that_are_sent_to_the_Incoming_WebHook_will_be_posted_here": "I messaggi inviati WebHook In Arrivo verranno pubblicati qui.", "Meta": "Meta", "Meta_fb_app_id": "Facebook App Id", + "Meta_custom": "Meta tag personalizzati", "Meta_google-site-verification": "Google Site Verification", "Meta_language": "Lingua", "Meta_msvalidate01": "MSValidate.01", "Meta_robots": "Robots", - "Min_length_is": "nghezza minima é %s", + "Min_length_is": "La lunghezza minima è %s", "minutes": "minuti", + "Mobile": "Mobile", "Monday": "Lunedì", "Monitor_history_for_changes_on": "Osserva lo storico per le modifiche su", - "More_channels": "Piu canali", + "More_channels": "Più canali", "More_direct_messages": "Altri messaggi diretti", "More_groups": "Altri canali privati", - "More_unreads": "Piú non letti", + "More_unreads": "Più non letti", "Msgs": "Msgs", "multi": "multi", "Mute_someone_in_room": "Silenzia qualcuno nel canale", "Mute_user": "Silenzia utente", - "Muted": "SIlenzioso", + "Muted": "Silenzioso", "My_Account": "Il mio account", "n_messages": "% messaggi", "N_new_messages": " %s nuovi messaggi", @@ -840,6 +1005,8 @@ "New_password": "Nuova password", "New_role": "Nuovo ruolo", "New_Room_Notification": "Notifica nuovo canale", + "New_videocall_request": "Nuova richiesta video", + "New_Trigger": "Nuovo trigger", "No_available_agents_to_transfer": "Nessun operatore disponibile da trasferire", "No_channel_with_name_%s_was_found": "Non è stato trovato nessun canale con nome \" %s\" !", "No_channels_yet": "Non fai ancora parte di nessun canale.", @@ -847,12 +1014,14 @@ "No_Encryption": "Senza crittografia", "No_group_with_name_%s_was_found": "Non è stato trovato nessun gruppo privato con nome \" %s\" !", "No_groups_yet": "Per ora non hai gruppi privati.", - "No_livechats": "Non hai livechats.", + "No_integration_found": "Nessuna integrazione trovata dal provider ID.", + "No_livechats": "Non hai livechat.", "No_mentions_found": "Nessuna menzione trovata", "No_pinned_messages": "Nessun messaggio in evidenza", "No_results_found": "Nessun risultato trovato", "No_starred_messages": "Nessun messaggio evidenziato", "No_such_command": "Nessun comando: `/__command__`", + "No_snippet_messages": "Nessun snippet", "No_user_with_username_%s_was_found": "Non è stato trovato nessun utente con nome \" %s\" !", "Nobody_available": "Nessuno disponibile", "Node_version": "Versione Node", @@ -866,7 +1035,8 @@ "Notification_Duration": "Durata notifica", "Notifications": "Notifiche", "Notify_all_in_this_room": "Notifica tutti in questa stanza", - "Num_Agents": "# Agenti", + "Notify_active_in_this_room": "Notifica utenti attivi in questa stanza", + "Num_Agents": "# Operatori", "Number_of_messages": "Numero di messaggi", "OAuth_Application": "Applicazione OAuth", "OAuth_Applications": "Applicazioni OAuth", @@ -887,14 +1057,17 @@ "Offline_unavailable": "Offline non disponibile", "On": "Accendi", "Online": "Online", + "Only_On_Desktop": "Modalità Desktop (invia solo con invio su desktop)", "Only_you_can_see_this_message": "Solo tu puoi vedere questo messaggio", "Oops!": "Spiacenti", "Open": "Aperto", "Open_days_of_the_week": "Giorni di apertura", "Open_Livechats": "Apri Livechat", "Opened": "Ha aperto", + "Opened_in_a_new_window": "Apri in una nuova finestra", "Opens_a_channel_group_or_direct_message": "Apre un canale, canale privato o messaggi diretto", "optional": "facoltativo", + "Use_minor_colors": "Usa la palette dei colori semplici (predefinito per i colori principali)", "or": "o", "Order": "Ordina", "OS_Arch": "Architettura", @@ -909,6 +1082,8 @@ "others": "altri", "OTR": "OTR", "OTR_is_only_available_when_both_users_are_online": "OTR è disponibile solo se entrambi gli utenti sono on-line", + "Outgoing_WebHook": "WebHook in uscita", + "Outgoing_WebHook_Description": "Ottieni i dati da Rocket.Chat in tempo reale.", "Override_URL_to_which_files_are_uploaded_This_url_also_used_for_downloads_unless_a_CDN_is_given": "URL sostitutiva in cui vengono caricati i file. Questo URL é utilizzato anche per i download a meno che una CDN sia impostata", "Page_title": "Titolo pagina", "Page_URL": "URL pagina", @@ -933,10 +1108,12 @@ "Please_enter_value_for_url": "Inserisci un valore per la URL del tuo avatar.", "Please_enter_your_new_password_below": "Digita la nuova password sotto:", "Please_enter_your_password": "Reinserisci la password", + "please_enter_valid_domain": "Inserisci un dominio valido", "Please_fill_a_label": "Compila una etichetta", "Please_fill_a_name": "Compila un nome", "Please_fill_a_username": "Compila un nome utente", "Please_fill_name_and_email": "Compila il nome ed e-mail", + "Please_select_an_user": "Seleziona un utente", "Please_select_enabled_yes_or_no": "Seleziona un'opzione per Abilitato", "Please_wait": "Attendere prego", "Please_wait_activation": "Attendere prego, questa operazione può richiedere tempo.", @@ -980,6 +1157,8 @@ "quote": "citazione", "Quote": "Citazione", "Random": "Casuale", + "React_when_read_only": "Permetti reazioni", + "React_when_read_only_changed_successfully": "Permetti reazioni quando la modalità sola lettura è cambiata con successo", "Reacted_with": "Reagito con", "Reactions": "Reazioni", "Read_only": "Sola lettura", @@ -988,13 +1167,17 @@ "Read_only_group": "Gruppo in sola lettura", "Record": "Registrazione", "Redirect_URI": "Redirect URI", + "Refresh_oauth_services": "Ricarica servizi OAuth", "Refresh_keys": "Aggiorna Chiavi", "Refresh_your_page_after_install_to_enable_screen_sharing": "Aggiornare la pagina dopo l'installazione per consentire la condivisione dello schermo", "Register": "Registra una nuovo account", + "Registration": "Registrazione", "Registration_Succeeded": "Registrazione avvenuta con successo", + "Registration_via_Admin": "Registrazione via amministrazione", + "Regular_Expressions": "Espressioni regolari", "Release": "Release", "Remove": "Rimuovi", - "Remove_Admin": "Rimuovi Admin", + "Remove_Admin": "Rimuovi Amministratore", "Remove_as_moderator": "Rimuovi come moderatore", "Remove_as_owner": "Rimuovi come proprietario", "Remove_custom_oauth": "Rimuovere OAuth personalizzato", @@ -1003,6 +1186,7 @@ "Remove_someone_from_room": "Rimuovi qualcuno dalla stanza", "Removed": "Rimosso", "Reply": "Rispondi", + "Reporting": "Resoconti", "Report_Abuse": "Segnala un abuso", "Report_exclamation_mark": "Rapporto!", "Report_sent": "Rapporto inviato", @@ -1010,6 +1194,7 @@ "Require_password_change": "Richiede la modifica della password", "Resend_verification_email": "Invia nuovamente email di verifica", "Reset": "Reset", + "Reset_section_settings": "Resetta le impostazioni della sezione", "Reset_password": "Resetta la tua password", "Restart": "Riavvia", "Restart_the_server": "Riavvia il server", @@ -1026,12 +1211,16 @@ "room_changed_topic": "Argomento del canale cambiato in: __room_topic__ da __user_by__", "Room_description_changed_successfully": "Descrizione del canale cambiata con successo", "Room_has_been_deleted": "Il canale è stato eliminato", + "Room_has_been_archived": "La stanza è stata archiviata", + "Room_has_been_unarchived": "La stanza è stata tolta dall'archivio", "Room_Info": "Informazioni canale", + "room_is_blocked": "La stanza è sbloccata", "room_is_read_only": "Questo canale è in sola lettura", "room_name": "nome canale", "Room_name_changed": "Il nome della stanza è stato cambiato in: __room_name__ da __user_by__", "Room_name_changed_successfully": "Nome del canale cambiato con successo", "Room_not_found": "Canale non trovato", + "Room_password_changed_successfully": "Password della stanza cambiata con successo", "Room_topic_changed_successfully": "Argomento stanza cambiato con successo", "Room_type_changed_successfully": "Tipo di stanza cambiata con successo", "Room_unarchived": "Stanza estratta dall'archivio", @@ -1044,8 +1233,11 @@ "SAML_Custom_Cert": "Certificato personalizzato", "SAML_Custom_Entry_point": "Custom Entry Point", "SAML_Custom_Generate_Username": "Genera Nome utente", + "SAML_Custom_IDP_SLO_Redirect_URL": "IDP SLO Redirect URL", "SAML_Custom_Issuer": "Custom Issuer", "SAML_Custom_Provider": "Custom Provider", + "SAML_Custom_Public_Cert": "Public cert contents", + "SAML_Custom_Private_Key": "Contenuto chiave privata", "Sandstorm_Powerbox_Share": "Condividi un Sandstorm grain", "Saturday": "Sabato", "Save": "Salva", @@ -1101,19 +1293,26 @@ "Show_all": "Mostra tutto", "Show_more": "Mostra di più", "show_offline_users": "mostra utenti offline", + "Show_on_registration_page": "Mostra sulla pagina di registrazione", "Show_only_online": "Mostra solo on-line", "Show_preregistration_form": "Mostra modulo di pre-registrazione", "Show_queue_list_to_all_agents": "Mostra coda a tutti gli operatori", "Showing_archived_results": "

Mostra %s risultati archiviati

", "Showing_online_users": "Visualizzati __total_showing__ su __total__users", - "Showing_results": "

Visualizzati %s resultati

", + "Showing_results": "

Visualizzati %s risultati

", "since_creation": "da %s", "Site_Name": "Nome del sito", "Site_Url": "indirizzo del sito", "Site_Url_Description": "Esempio: https://chat.domain.com/", "Skip": "Salta", "SlackBridge_error": "SlackBridge ha rilevato un errore durante l'importazione dei messaggi alle %s: %s", + "SlackBridge_Out_All": "SlackBridge Out All", + "SlackBridge_Out_All_Description": "Invia messaggi da tutti i canali che esistono in Slack e che il bot è entrato", + "SlackBridge_Out_Channels": "SlackBridge Out Canali", + "SlackBridge_Out_Channels_Description": "Scegli quale canale invierà i messaggi a Slack", "SlackBridge_finish": "SlackBridge ha finito di importare i messaggi alle %s. Ricarica per vedere tutti i messaggi.", + "SlackBridge_Out_Enabled": "SlackBridge Out Abilitato", + "SlackBridge_Out_Enabled_Description": "Scegli quale Slackbridge deve anche inviate i messaggi a Slack", "SlackBridge_start": "@%s ha avviato un import SlackBridge alle `#%s`. Ti faremo sapere quando verrà ultimato.", "Slash_Gimme_Description": "Mostra ༼ つ ◕_◕ ༽つ prima del messaggio", "Slash_LennyFace_Description": "Mostra ( ͡° ͜ʖ ͡°) dopo il messaggio", @@ -1138,16 +1337,20 @@ "SMTP_Port": "Porta SMTP", "SMTP_Test_Button": "Prova le impostazioni SMTP", "SMTP_Username": "Nome utente SMTP", + "Snippet_Added": "Creato su %s", + "Snippet_Messages": "Messaggi snippet", + "Snippeted_a_message": "Crea uno snippet __snippetLink__", "Sound": "Suoni", + "Sound_File_mp3": "File sonoro (mp3)", "SSL": "SSL", "Star_Message": "Evidenzia messaggio", - "Starred_Messages": "Messaggi speciali", + "Starred_Messages": "Messaggi evidenziati", "Start_audio_call": "Avvia chiamata audio", "Start_Chat": "Avvia chat", "Start_of_conversation": "Inizia una conversazione", "Start_OTR": "Inizio OTR", "Start_video_call": "Avvia chiamata video", - "Start_with_s_for_user_or_s_for_channel_Eg_s_or_s": "Inizia con", + "Start_with_s_for_user_or_s_for_channel_Eg_s_or_s": "Inizia con %s per gli utenti o %s peri canali. Es: %s o %s", "Started_At": "Avviato il", "Statistics": "Statistiche", "Statistics_reporting": "Invia statistiche a Rocket.Chat", @@ -1162,12 +1365,20 @@ "Stats_Online_Users": "Utenti in linea", "Stats_Total_Channels": "Canali Totali", "Stats_Total_Direct_Messages": "Totale canali diretti", + "Stats_Total_Livechat_Rooms": "Totale stanze Livechat", "Stats_Total_Messages": "Messaggi totali", + "Stats_Total_Messages_Channel": "Messaggi totali nei canali", + "Stats_Total_Messages_PrivateGroup": "Messaggi totali nei gruppi privati", + "Stats_Total_Messages_Direct": "Messaggi totali nei messaggi diretti", + "Stats_Total_Messages_Livechat": "Messaggi totali nelle livechat", "Stats_Total_Private_Groups": "Totale Gruppi Privati", "Stats_Total_Rooms": "Stanze Totali", "Stats_Total_Users": "Utenti Totali", "Status": "Stato", "Stop_Recording": "Interrompi registrazione", + "Stream_Cast": "Stream Cast", + "Stream_Cast_Address": "Stream Cast Address", + "Stream_Cast_Address_Description": "IP o Host della tua installazione centrale di Rocket.Chat per lo stream cast. Es: `92.168.1.1:3000` or `localhost:4000`", "strike": "barrato", "Subject": "Oggetto", "Submit": "Invia", @@ -1181,7 +1392,9 @@ "Sync_Users": "Sincronizza utenti", "System_messages": "Messaggi di sistema", "Tag": "Tag", - "Take_it": "Prendilo", + "Take_it": "Prendilo!", + "TargetRoom": "Stanza Target", + "TargetRoom_Description": "La stanza dove i messaggi saranno inviati quando i risultati di questi eventi saranno scatenati. Solo la stanza target è permessa e deve esistere.", "Test_Connection": "Verifica Connessione", "Test_Desktop_Notifications": "Verifica Notifiche Desktop", "Thank_you_exclamation_mark": "Grazie!", @@ -1193,17 +1406,29 @@ "The_image_resize_will_not_work_because_we_can_not_detect_ImageMagick_or_GraphicsMagick_installed_in_your_server": "Il ridimensionamento dell'immagine non funzionerà se non rileva ImageMagick or GraphicsMagick installato sul tuo server.", "The_redirectUri_is_required": "Il redirectUri é richiesto", "The_server_will_restart_in_s_seconds": "Il server si riavvierà in %s secondi", - "The_setting_s_is_configured_to_s_and_you_are_accessing_from_s": "L'impostazione%s é configurata su %s e stai accedendo da%s!", + "The_setting_s_is_configured_to_s_and_you_are_accessing_from_s": "L'impostazione%s è configurata su %s e stai accedendo da%s!", "The_user_will_be_removed_from_s": "L'utente sarà rimosso da %s", "The_user_wont_be_able_to_type_in_s": "L'utente non potrà più scrivere sul canale %s", "Theme": "Tema", + "theme-color-transparent-darker": "Trasparente molto scuro", + "theme-color-transparent-dark": "Trasparente scuro", + "theme-color-transparent-light": "Trasparente chiaro", + "theme-color-transparent-lighter": "Trasparente molto chiaro", + "theme-color-transparent-lightest": "Trasparente veramente molto chiaro", "theme-color-content-background-color": "Colore di Sfondo del contenuto", "theme-color-primary-background-color": "Colore di Sfondo Primario", "theme-color-primary-font-color": "Colore del Carattere Primario ", + "theme-color-primary-action-color": "Colore azione primario", "theme-color-secondary-background-color": "Colore di Sfondo Secondario", "theme-color-secondary-font-color": "Colore del Carattere Secondario", + "theme-color-secondary-action-color": "Colore azione secondario", + "theme-color-component-color": "Colore componente", + "theme-color-success-color": "Colore \"Successo\"", + "theme-color-pending-color": "Colore in attesa", + "theme-color-error-color": "Colore Errore", + "theme-color-selection-color": "Colore selezione", "theme-color-tertiary-background-color": "Colore di Sfondo Terziario", - "theme-color-tertiary-font-color": "Colore del CarattereTerzario", + "theme-color-tertiary-font-color": "Colore del Carattere Terzario", "theme-color-link-font-color": "Colore del Carattere dei Link", "theme-color-info-font-color": "Colore del Carattere delle Informazioni", "theme-color-custom-scrollbar-color": "Colore Personalizzato della Barra Scorrevole", @@ -1218,8 +1443,8 @@ "There_are_no_integrations": "Non esistono integrazioni", "There_are_no_users_in_this_role": "Non ci sono utenti in questo ruolo.", "This_conversation_is_already_closed": "Questa conversazione sarà chiusa.", - "This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password": "Questa email é stata già utilizzata e non é stata verificata. Cambia la tua password.", - "This_is_a_desktop_notification": "Questa é una notifica desktop", + "This_email_has_already_been_used_and_has_not_been_verified__Please_change_your_password": "Questa email è stata già utilizzata e non é stata verificata. Cambia la tua password.", + "This_is_a_desktop_notification": "Questa è una notifica desktop", "This_is_a_push_test_messsage": "Questa è una prova di notifica push", "This_room_has_been_archived_by__username_": "Questo canale è stato archiviato da __username__", "This_room_has_been_unarchived_by__username_": "Questo canale è stato estratto dall'archivio da __username__", @@ -1233,7 +1458,11 @@ "to_see_more_details_on_how_to_integrate": "per vedere altri dettagli su come integrarlo.", "To_users": "Agli Utenti", "Topic": "Argomento", - "Travel_and_Places": "Travel & Places", + "Travel_and_Places": "Viaggi & Luoghi", + "Transcript_Enabled": "Chiedi al visitatore se vuole una trascrizione dopo la chiusura della chat", + "Transcript_message": "Messaggio da mostrare quando si chiede la transcrizione", + "Transcript_of_your_livechat_conversation": "Transcrizione della tua conversazione livechat", + "Translations": "Traduzioni", "Trigger_removed": "Trigger rimosso", "Trigger_Words": "Parole Trigger", "Triggers": "Trigger", @@ -1246,7 +1475,9 @@ "Type_your_new_password": "Digita la nuova password", "UI_DisplayRoles": "Mostra Ruoli", "UI_Merge_Channels_Groups": "Unisci i gruppi privati con i canali", + "UI_Use_Name_Avatar": "Usa le iniziali del nome completo per generare l'avatar predefinito", "Unarchive": "Togli dall'archivio", + "Unblock_User": "Sblocca utente", "Unmute_someone_in_room": "Togli il muto a qualcuno nella stanza", "Unmute_user": "Togli il muto all'utente", "Unnamed": "Senza nome", @@ -1255,10 +1486,13 @@ "Unread_Rooms": "Stanze non letti", "Unread_Rooms_Mode": "Modalità Stanze Non Letta", "Unstar_Message": "Rimuovi segnalibro", + "Upload_file_description": "Descrizione file", + "Upload_file_name": "Nome file", "Upload_file_question": "Caricare il file?", "Uploading_file": "Caricamento del file ...", "Uptime": "Uptime", "URL": "URL", + "URL_room_prefix": "Prefisso URL stanza", "Use_account_preference": "Utilizzare preferenze account", "Use_Emojis": "Utilizzare Emojis", "Use_Global_Settings": "Usa Impostazioni Globali", @@ -1272,7 +1506,7 @@ "User__username__is_now_a_owner_of__room_name_": "L'Utente __username__é ora proprietario di __room_name__", "User__username__removed_from__room_name__moderators": "L'Utente __username__rimosso dai moderatori __room_name__", "User__username__removed_from__room_name__owners": "L'Utente __username__rimosso dai proprietari __room_name__", - "User_added": "Utente __user_added__ aggiunto.", + "User_added": "Utente __user_added__ aggiunto.", "User_added_by": "Utente __user_added__ aggiunto da __user_by__.", "User_added_successfully": "Utente aggiunto correttamente", "User_doesnt_exist": "Non esiste nessun utente con il nome `@%s`.", @@ -1282,12 +1516,15 @@ "User_has_been_muted_in_s": "L'utente è stato mutato in %s", "User_has_been_removed_from_s": "L'utente è stato rimosso da %s", "User_Info": "Info utente", + "User_Interface": "Interfaccia utente", + "User_is_blocked": "Utente è bloccato", "User_is_no_longer_an_admin": "L'utente non è più un amministratore", "User_is_now_an_admin": "L'utente è ora un amministratore", + "User_is_unblocked": "Utente è sbloccato", "User_joined_channel": "È entrato nel canale.", "User_joined_channel_female": "È entrata nel canale.", "User_joined_channel_male": "È entrato nel canale.", - "User_left": "__user_left__ ha lasciato il canale.", + "User_left": "Ha lasciato il canale.", "User_left_female": "Ha lasciato il canale.", "User_left_male": "Ha lasciato il canale.", "User_logged_out": "L'utente è disconnesso ", @@ -1317,14 +1554,23 @@ "Username_title": "Registra nome utente", "Username_wants_to_start_otr_Do_you_want_to_accept": "__username__ vuole iniziare OTR. Vuoi accettare?", "Users": "Utenti", + "Users_added": "L'utente è stato aggiunto", "Users_in_role": "Utenti nel ruolo", "UTF8_Names_Slugify": "UTF8 Names Slugify", "UTF8_Names_Validation": "Validazione dei Nomi UTF8", "UTF8_Names_Validation_Description": "Non permettere caratteri speciali e spazi. Puoi usare -_ e . na non alla fine del nome", + "Validate_email_address": "Verifica indirizzo email", + "Verification": "Verifica", + "Verification_Description": "Puoi usare i seguenti segnaposti:
", "Verification_email_sent": "Invio Verifica email", + "Verification_Email_Subject": "[Site_Name] - Verifica il tuo account", + "Verification_Email": "Clicca qui per verificare il tuo account", "Verified": "Verificata", "Version": "Versione", "Video_Chat_Window": "Chat Video", + "Video_Conference": "Video conferenza", + "Videocall_declined": "Chiamata video rifiutata", + "Videocall_enabled": "Chiamata video abilitata", "View_All": "Vedi tutto", "View_Logs": "Visualizza log", "View_mode": "Aspetto", @@ -1338,6 +1584,7 @@ "Visitor_page_URL": "URL Pagina Visitatori", "Visitor_time_on_site": "Tempo dei visitatori sul sito", "Wait_activation_warning": "Prima di poter effettuare il login, il tuo account deve essere attivato manualmente da un amministratore.", + "Warnings": "Avvisi", "We_are_offline_Sorry_for_the_inconvenience": "Non siamo in linea. Ci dispiace per l'inconveniente.", "We_have_sent_password_email": "Ti abbiamo inviato una email con le istruzioni per reimpostare la password. Se non la ricevi in breve tempo, torna e prova di nuovo.", "We_have_sent_registration_email": "Ti abbiamo inviato una email per confermare la registrazione. Se non la ricevi entro pochi minuti, torna e prova di nuovo.", @@ -1355,6 +1602,8 @@ "will_be_able_to": "potranno", "Would_you_like_to_return_the_inquiry": "Vuoi tornare alla richiesta", "Yes": "Sì", + "Yes_archive_it": "Si, archivialo!", + "Yes_unarchive_it": "Si, togli dall'archivio!", "Yes_clear_all": "Sì, svuota tutti!", "Yes_delete_it": "Sì, eliminalo!", "Yes_hide_it": "Sì, nascondilo!", @@ -1386,10 +1635,12 @@ "You_will_not_be_able_to_recover": "Non sarai in grado di recuperare questo messaggio!", "You_will_not_be_able_to_recover_file": "Non puoi recuperare questo file!", "You_wont_receive_email_notifications_because_you_have_not_verified_your_email": "Non riceverai notifiche via email, perché non hai verificato l'indirizzo.", - "Your_email_has_been_queued_for_sending": "La tua email é stata messa in coda per l'invio", - "Your_entry_has_been_deleted": "La tua immissione é stata cancellata.", + "Your_email_has_been_queued_for_sending": "La tua email è stata messa in coda per l'invio", + "Your_entry_has_been_deleted": "La tua immissione è stata cancellata.", "Your_file_has_been_deleted": "Il file è stato eliminato.", "Your_mail_was_sent_to_s": "La tua mail è stata inviata a %s", + "your_message": "il tuo messaggio", + "your_message_optional": "il tuo messaggio (opzionale)", "Your_password_is_wrong": "La password è sbagliata!", - "Your_push_was_sent_to_s_devices": "La tua richiesta é stata inviata ai %s dispositivi." + "Your_push_was_sent_to_s_devices": "La tua richiesta è stata inviata ai %s dispositivi." } \ No newline at end of file diff --git a/packages/rocketchat-i18n/i18n/ko.i18n.json b/packages/rocketchat-i18n/i18n/ko.i18n.json index a8349ea92fd3..b16692f959bb 100644 --- a/packages/rocketchat-i18n/i18n/ko.i18n.json +++ b/packages/rocketchat-i18n/i18n/ko.i18n.json @@ -28,7 +28,7 @@ "Accounts_AvatarSize": "아바타 크기", "Accounts_AvatarStorePath": "아바타 저장 경로", "Accounts_AvatarStoreType": "아바파 저장 타입", - "Accounts_BlockedDomainsList": "차단 된 도메인 목록", + "Accounts_BlockedDomainsList": "차단된 도메인 목록", "Accounts_BlockedDomainsList_Description": "차단 된 도메인의 쉼표로 구분 된 목록", "Accounts_BlockedUsernameList": "차단 된 사용자 이름 목록", "Accounts_BlockedUsernameList_Description": "차단 된 사용자 이름의 쉼표로 구분 된 목록 (대소 문자 구분)", @@ -43,7 +43,7 @@ "Accounts_Iframe_api_url": "API URL", "Accounts_iframe_enabled": "사용", "Accounts_iframe_url": "iframe URL", - "Accounts_LoginExpiration": "로그인 만료 일수", + "Accounts_LoginExpiration": "로그인 만료날짜", "Accounts_ManuallyApproveNewUsers": "수동으로 새로운 사용자 승인합니다", "Accounts_OAuth_Custom_Authorize_Path": "Authorize 경로", "Accounts_OAuth_Custom_Button_Color": "버튼 색", diff --git a/packages/rocketchat-i18n/i18n/ru.i18n.json b/packages/rocketchat-i18n/i18n/ru.i18n.json index 49e972736f12..37ecf89f65ff 100644 --- a/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -5,17 +5,20 @@ "2_Erros_Information_and_Debug": "2 - Ошибки, информация и отладка", "403": "Запрещено", "500": "Внутренняя ошибка сервера", + "@username": "@логин", "__username__is_no_longer__role__defined_by__user_by_": "__username__ больше не __role__, по решению __user_by__", "__username__was_set__role__by__user_by_": "__username__ был установлен __role__ по решению __user_by__", "Accept": "Принять", - "Access_not_authorized": "Доступ запрещён", + "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Принимать входящие запросы с livechat, даже если нет подключенных сотрудников", + "Accept_with_no_online_agents": "Принимать с не подключенными сотрудниками", + "Access_not_authorized": "Не авторизованный доступ", "Access_Token_URL": "Маркер доступа URL-адреса", "Accessing_permissions": "Права доступа", - "Account_SID": "Аккаунт SID", - "Accounts": "Аккаунты", + "Account_SID": "SID учетной записи", + "Accounts": "Учётные записи", "Accounts_AllowDeleteOwnAccount": "Разрешить пользователям удалять собственный аккаунт", "Accounts_AllowedDomainsList": "Список разрешенных доменов", - "Accounts_AllowedDomainsList_Description": "Разделенный запятыми список разрешенных доменов", + "Accounts_AllowedDomainsList_Description": "Список разрешенных доменов, разделенный запятыми ", "Accounts_AllowEmailChange": "Разрешить изменение email адреса", "Accounts_AllowPasswordChange": "Разрешить смену пароля", "Accounts_AllowUserAvatarChange": "Разрешить пользователю изменять аватар", @@ -23,12 +26,12 @@ "Accounts_AllowUserProfileChange": "Разрешить пользователю изменять настройки профиля", "Accounts_AvatarResize": "Изменение размера аватара", "Accounts_AvatarSize": "Размер аватара", - "Accounts_AvatarStorePath": "Путь к аватарам", + "Accounts_AvatarStorePath": "Путь к хранилищу аватаров", "Accounts_AvatarStoreType": "Тип хранилища аватаров", "Accounts_BlockedDomainsList": "Список запрещённых доменов", - "Accounts_BlockedDomainsList_Description": "Запрещённые домены через запятую", - "Accounts_BlockedUsernameList": "Заблокированные Список Имя пользователя", - "Accounts_BlockedUsernameList_Description": "Разделенных запятыми список заблокированных имен пользователей (без учета регистра)", + "Accounts_BlockedDomainsList_Description": "Список запрещённых доменов, разделенных запятой", + "Accounts_BlockedUsernameList": "Список заблокированных пользователей", + "Accounts_BlockedUsernameList_Description": "Список заблокированных имен пользователей (без учета регистра), разделенных запятой", "Accounts_denyUnverifiedEmail": "Запретить неподтверждённые email", "Accounts_EmailVerification": "Подтверждение email", "Accounts_EmailVerification_Description": "Убедитесь, что у вас верные настройки SMTP для использования этой функции", diff --git a/packages/rocketchat-i18n/i18n/sv.i18n.json b/packages/rocketchat-i18n/i18n/sv.i18n.json index 041582121865..92c5f703e5d6 100644 --- a/packages/rocketchat-i18n/i18n/sv.i18n.json +++ b/packages/rocketchat-i18n/i18n/sv.i18n.json @@ -1,65 +1,71 @@ { - "0_Errors_Only": "Endast fel - 0", + "#channel": "#kanal", + "0_Errors_Only": "0 - Fel endast", "1_Errors_and_Information": "1 - Fel och information", - "2_Erros_Information_and_Debug": "2 - erros, information och felsöknings", + "2_Erros_Information_and_Debug": "2 - Fel, information och felsökning", "403": "Förbjuden", - "500": "internt serverfel", + "500": "Internt serverfel", + "@username": "@användarnamn", + "@username_message": "@användarnamn ", "__username__is_no_longer__role__defined_by__user_by_": "__username__ är inte längre __role__, genom __user_by__", "__username__was_set__role__by__user_by_": "__username__ sattes __role__ genom __user_by__", "Accept": "Acceptera", - "Access_not_authorized": "Tillgång som inte godkänts", - "Access_Token_URL": "Tillgång Token URL", + "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Acceptera förfrågan om inkommande livechatt även om ingen agent är online", + "Accept_with_no_online_agents": "Acceptera utan agenter online", + "Access_not_authorized": "Tillträde är ej tillåtet", + "Access_Token_URL": "Tillgång till Token URL", "Accessing_permissions": "Åtkomstbehörigheter", - "Account_SID": "konto SID", + "Account_SID": "Konto SID", "Accounts": "Konton", "Accounts_AllowDeleteOwnAccount": "Tillåt användare att radera egna konton", - "Accounts_AllowedDomainsList": "Tillåtet Domäner Lista", - "Accounts_AllowedDomainsList_Description": "Kommaseparerad list över tillåtna domäner", + "Accounts_AllowedDomainsList": "Tillåten Domänlista", + "Accounts_AllowedDomainsList_Description": "Kommaseparerad lista över tillåtna domäner", "Accounts_AllowEmailChange": "Tillåt byte av e-postadress", "Accounts_AllowPasswordChange": "Tillåt byte av lösenord", - "Accounts_AllowUserAvatarChange": "Tillåt byte av användaravatar", - "Accounts_AllowUsernameChange": "Tillåt användarnamn byte", + "Accounts_AllowUserAvatarChange": "Tillåt byte av användarens avatar", + "Accounts_AllowUsernameChange": "Tillåt byte av användarnamn", "Accounts_AllowUserProfileChange": "Tillåt byte av användarprofil", "Accounts_AvatarResize": "Ändra storlek på avatarer", "Accounts_AvatarSize": "Storlek på avatar", - "Accounts_AvatarStorePath": "Avatar Storage Path", - "Accounts_AvatarStoreType": "Avatar Storage Type", - "Accounts_BlockedDomainsList": "Blockerade domäner Lista", + "Accounts_AvatarStorePath": "Sökväg till avatarförråd", + "Accounts_AvatarStoreType": "Typ av avatarförråd", + "Accounts_BlockedDomainsList": "Lista över blockerade domäner", "Accounts_BlockedDomainsList_Description": "Kommaseparerad lista över blockerade domäner", - "Accounts_BlockedUsernameList": "Blockerad Användarnamn Lista", + "Accounts_BlockedUsernameList": "Användarlista över blockerade", "Accounts_BlockedUsernameList_Description": "Kommaseparerad lista över blockerade användarnamn (skiftlägeskänsligt)", "Accounts_denyUnverifiedEmail": "Neka okontrollerade e-postadresser", "Accounts_EmailVerification": "E-postverifiering", "Accounts_EmailVerification_Description": "Se till att du har korrekta SMTP-inställningar för att använda denna funktion", - "Accounts_Enrollment_Email": "Inskrivning E-post", - "Accounts_Enrollment_Email_Default": "

Välkommen till

[Site_Name]

Gå till [Site_URL] och prova bäst öppen källkod chatt lösning som finns idag!

", - "Accounts_Enrollment_Email_Description": "Du kan använda [namn], [fname], [lname] för användarens fullständiga namn, förnamn eller efternamn, respektive.
Du kan använda [email] för användarens e-post.", + "Accounts_Enrollment_Email": "Skriv i e-post", + "Accounts_Enrollment_Email_Default": "

Välkommen till

[Site_Name]

Gå till [Site_URL] och prova bästa chatt lösning på öppen källkod som finns idag!

", + "Accounts_Enrollment_Email_Description": "Du kan använda [namn], [fname], [lname] för användarens fullständiga namn, förnamn eller efternamn, respektive.
Du kan använda [email] för användarens e-post.", "Accounts_Enrollment_Email_Subject_Default": "Välkommen till [Site_Name]", - "Accounts_Iframe_api_method": "api Metod", - "Accounts_Iframe_api_url": "api webbadress", + "Accounts_ForgetUserSessionOnWindowClose": "Glöm bort användarsession när fönstret stängs ner", + "Accounts_Iframe_api_method": "Api Metod", + "Accounts_Iframe_api_url": "API webbadress", "Accounts_iframe_enabled": "Aktiverad", "Accounts_iframe_url": "iframe Url", - "Accounts_LoginExpiration": "Logga Utgångs i dagar", + "Accounts_LoginExpiration": "Utgångsdagar för inloggning", "Accounts_ManuallyApproveNewUsers": "Godkänn nya användare manuellt", - "Accounts_OAuth_Custom_Authorize_Path": "tillåta Path", - "Accounts_OAuth_Custom_Button_Color": "knappfärg", - "Accounts_OAuth_Custom_Button_Label_Color": "Knapp Textfärg", - "Accounts_OAuth_Custom_Button_Label_Text": "Button Text", + "Accounts_OAuth_Custom_Authorize_Path": "Tillåt sökväg", + "Accounts_OAuth_Custom_Button_Color": "Knappfärg", + "Accounts_OAuth_Custom_Button_Label_Color": "Textfärg på knapp", + "Accounts_OAuth_Custom_Button_Label_Text": "Knapptext", "Accounts_OAuth_Custom_Enable": "Aktivera", "Accounts_OAuth_Custom_id": "ID", - "Accounts_OAuth_Custom_Identity_Path": "identitet Path", - "Accounts_OAuth_Custom_Login_Style": "Logga in Style", - "Accounts_OAuth_Custom_Secret": "Hemlighet", - "Accounts_OAuth_Custom_Token_Path": "token Path", - "Accounts_OAuth_Custom_Token_Sent_Via": "Token Sent Via", + "Accounts_OAuth_Custom_Identity_Path": "Sökväg identitet", + "Accounts_OAuth_Custom_Login_Style": "Stil på inloggning", + "Accounts_OAuth_Custom_Secret": "Hemlig", + "Accounts_OAuth_Custom_Token_Path": "Sökväg Token", + "Accounts_OAuth_Custom_Token_Sent_Via": "Token sänd via", "Accounts_OAuth_Facebook": "Facebook-inloggning", "Accounts_OAuth_Facebook_callback_url": "Facebook Callback URL", "Accounts_OAuth_Facebook_id": "Facebook App-ID", "Accounts_OAuth_Facebook_secret": "Facebook Secret", "Accounts_OAuth_Github": "OAuth Aktiverad", - "Accounts_OAuth_Github_callback_url": "Github återuppringning URL", - "Accounts_OAuth_GitHub_Enterprise": "OAuth Enabled", - "Accounts_OAuth_GitHub_Enterprise_callback_url": "GitHub Enterprise återuppringning URL", + "Accounts_OAuth_Github_callback_url": "Github Callback URL", + "Accounts_OAuth_GitHub_Enterprise": "OAuth Aktiverad", + "Accounts_OAuth_GitHub_Enterprise_callback_url": "GitHub Enterprise Callback URL", "Accounts_OAuth_GitHub_Enterprise_id": "klient-ID", "Accounts_OAuth_GitHub_Enterprise_secret": "klienthemligheten", "Accounts_OAuth_Github_id": "Klient-ID", @@ -163,6 +169,7 @@ "are_typing": "skriver", "Are_you_sure": "Är du säker?", "Are_you_sure_you_want_to_delete_your_account": "Är du säker att du vill radera ditt konto?", + "Assign_admin": "Tilldela administratör", "at": "på", "Attachment_File_Uploaded": "Uppladdad fil", "Auth_Token": "Auth Token", @@ -865,6 +872,7 @@ "Refresh_your_page_after_install_to_enable_screen_sharing": "Uppdatera sidan efter installationen för att aktivera skärmdelning", "Register": "Registrera ett nytt konto", "Registration_Succeeded": "Registreringen lyckades", + "Registration_via_Admin": "Registrering via en administratör", "Release": "Släpp", "Remove": "Ta bort", "Remove_Admin": "Ta bort administratör", @@ -872,6 +880,7 @@ "Remove_as_owner": "Ta bort som ägare", "Remove_custom_oauth": "Ta bort anpassade oauth", "Remove_from_room": "Ta bort från rum", + "Remove_last_admin": "Tar bort senaste administratör", "Remove_someone_from_room": "Ta bort någon från detta rum", "Removed": "Borttagen", "Report_Abuse": "Anmäl inlägg", @@ -1119,7 +1128,7 @@ "User_has_been_muted_in_s": "Användaren har stängts av i %s", "User_has_been_removed_from_s": "Användaren har blivit borttagen från %s", "User_Info": "Användarinfo", - "User_is_no_longer_an_admin": "Användaren är inte längre administratör", + "User_is_no_longer_an_admin": "Användaren är inte längre en administratör", "User_is_now_an_admin": "Användaren är nu administratör", "User_joined_channel": "Har anslutit sig till kanalen.", "User_joined_channel_female": "Har anslutit sig till kanalen.", diff --git a/packages/rocketchat-i18n/i18n/uk.i18n.json b/packages/rocketchat-i18n/i18n/uk.i18n.json index 68d793420078..63aac491b843 100644 --- a/packages/rocketchat-i18n/i18n/uk.i18n.json +++ b/packages/rocketchat-i18n/i18n/uk.i18n.json @@ -8,30 +8,32 @@ "__username__is_no_longer__role__defined_by__user_by_": "__username__ більше не __role__, за рішенням __user_by__", "__username__was_set__role__by__user_by_": "__username__ був встановлений __role__ за рішенням __user_by__", "Accept": "Погоджуюсь", - "Access_not_authorized": "Доступ не дозволяється", + "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Приймати запити із livechat, навіть коли немає підключених співробітників", + "Accept_with_no_online_agents": "Приймати із не підключенними співробітниками", + "Access_not_authorized": "Не авторизований доступ", "Access_Token_URL": "URL Токен доступу", "Accessing_permissions": "доступ дозволів", - "Account_SID": "рахунок SID", - "Accounts": "рахунки", + "Account_SID": "SID облікового запису", + "Accounts": "Облікові записи", "Accounts_AllowDeleteOwnAccount": "Дозволити користувачам видаляти власний обліковий запис", "Accounts_AllowedDomainsList": "Список дозволених доменів", - "Accounts_AllowedDomainsList_Description": "Розділених комами список дозволених доменів", - "Accounts_AllowEmailChange": "Дозволити E-mail Змінити", + "Accounts_AllowedDomainsList_Description": "Перелік дозволених доменів, розділених комами ", + "Accounts_AllowEmailChange": "Дозволити зміну email адреси", "Accounts_AllowPasswordChange": "Дозволити зміну пароля", - "Accounts_AllowUserAvatarChange": "Дозволити Аватар користувача Зміна", - "Accounts_AllowUsernameChange": "Дозволити Ім'я користувача Зміна", - "Accounts_AllowUserProfileChange": "Дозволити Профіль користувача Зміна", - "Accounts_AvatarResize": "Зміна розміру аватари", - "Accounts_AvatarSize": "Аватар Розмір", - "Accounts_AvatarStorePath": "Шлях до аватарам", - "Accounts_AvatarStoreType": "Аватар для зберігання Тип", - "Accounts_BlockedDomainsList": "Заблоковані Список доменів", - "Accounts_BlockedDomainsList_Description": "Розділених комами список заблокованих доменів", - "Accounts_BlockedUsernameList": "Заблоковані Список Ім'я користувача", - "Accounts_BlockedUsernameList_Description": "Розділених комами список заблокованих імен користувачів (без урахування регістру)", + "Accounts_AllowUserAvatarChange": "Дозволити користувачеві змінювати аватар", + "Accounts_AllowUsernameChange": "Дозволити зміну імені користувача", + "Accounts_AllowUserProfileChange": "Дозволити користувачеві змінювати налаштування профілю", + "Accounts_AvatarResize": "Змінити розмір аватару", + "Accounts_AvatarSize": "Розмір аватару", + "Accounts_AvatarStorePath": "Шлях до сховища з аватарами", + "Accounts_AvatarStoreType": "Тип сховища с аватарами", + "Accounts_BlockedDomainsList": "Перелік заблокованих доменів", + "Accounts_BlockedDomainsList_Description": "Перелік заблокованих доменів, розділених комою", + "Accounts_BlockedUsernameList": "Перелік заблокованих користувачів", + "Accounts_BlockedUsernameList_Description": "Перелік заблокованих імен користувачів (без урахування регістру), розділених комами ", "Accounts_denyUnverifiedEmail": "Заборонити неперевірену електронну пошту", - "Accounts_EmailVerification": "Електронна пошта Перевірка", - "Accounts_EmailVerification_Description": "Переконайтеся, що у вас є правильні настройки SMTP, щоб використовувати цю функцію", + "Accounts_EmailVerification": "Підтвердження електронної пошти", + "Accounts_EmailVerification_Description": "Переконайтеся, що у вас є правильні налаштування SMTP, щоб використовувати цю функцію", "Accounts_Enrollment_Email": "Зарахування Електронна пошта", "Accounts_Enrollment_Email_Default": "

Ласкаво просимо до

[Site_Name]

Перейти до [Site_URL] і спробувати краще рішення чат з відкритим вихідним кодом на сьогоднішній день!

", "Accounts_Enrollment_Email_Description": "Ви можете використовувати [name], [fname], [lname] повне ім'я користувача, ім'я або прізвище, відповідно.
Ви можете використовувати [email] для електронної пошти користувача.", diff --git a/packages/rocketchat-i18n/i18n/zh.i18n.json b/packages/rocketchat-i18n/i18n/zh.i18n.json index 145471928d18..9412b3e79c8d 100644 --- a/packages/rocketchat-i18n/i18n/zh.i18n.json +++ b/packages/rocketchat-i18n/i18n/zh.i18n.json @@ -1,22 +1,28 @@ { + "#channel": "#频道", "0_Errors_Only": "0 - 仅错误 ", "1_Errors_and_Information": "1 - 错误和信息", "2_Erros_Information_and_Debug": "2 - 错误、信息和调试信息", "403": "已被禁止", "500": "内部服务器错误", + "@username": "@用户名", + "@username_message": "@用户名 ", "__username__is_no_longer__role__defined_by__user_by_": "__user_by__ 移除了 __username__ 的 __role__ 角色", "__username__was_set__role__by__user_by_": "__user_by__ 赋予了 __username__ __role__ 角色", + "Accept": "接受", + "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "接受入站在线聊天请求即使没有客服在线", + "Accept_with_no_online_agents": "接受无在线客服", "Access_not_authorized": "访问未授权", - "Access_Token_URL": "访问令牌地址", + "Access_Token_URL": "访问 Token URL", "Accessing_permissions": "访问权限", - "Account_SID": "帐户SID", + "Account_SID": "帐户 SID", "Accounts": "帐户", - "Accounts_AllowDeleteOwnAccount": "允许用户删除自己的帐号", + "Accounts_AllowDeleteOwnAccount": "允许用户销毁自己的帐号", "Accounts_AllowedDomainsList": "允许的域名列表", - "Accounts_AllowedDomainsList_Description": "以逗号分隔的合法域名列表", - "Accounts_AllowEmailChange": "允许修改电子邮箱地址", + "Accounts_AllowedDomainsList_Description": "以逗号分隔的允许的域名列表", + "Accounts_AllowEmailChange": "允许修改Email", "Accounts_AllowPasswordChange": "允许修改密码", - "Accounts_AllowUserAvatarChange": "允许修改用户头像", + "Accounts_AllowUserAvatarChange": "允许修改头像", "Accounts_AllowUsernameChange": "允许修改用户名", "Accounts_AllowUserProfileChange": "允许修改个人资料", "Accounts_AvatarResize": "调整头像大小", @@ -24,38 +30,43 @@ "Accounts_AvatarStorePath": "头像存储路径", "Accounts_AvatarStoreType": "头像存储类型", "Accounts_BlockedDomainsList": "已屏蔽域名列表", - "Accounts_BlockedDomainsList_Description": "以逗号分割的屏蔽域名列表", - "Accounts_BlockedUsernameList": "已禁止的用户名列表", - "Accounts_BlockedUsernameList_Description": "以逗号分割的禁止用户名列表(不区分大小写)", + "Accounts_BlockedDomainsList_Description": "以逗号分隔的屏蔽的域名列表", + "Accounts_BlockedUsernameList": "已屏蔽的用户名列表", + "Accounts_BlockedUsernameList_Description": "以逗号分隔的已屏蔽用户名列表(不区分大小写)", + "Accounts_CustomFields_Description": "应该为 JSON 格式,键为字段名,值为该字段的设置项。例如:
\n{\n \"role\": {\n  \"type\": \"select\",\n  \"defaultValue\": \"student\",\n  \"options\": [\"teacher\", \"student\"],\n  \"required\": true,\n  \"modifyRecordField\": {\n   \"array\": true,\n   \"field\": \"roles\"\n  }\n },\n \"twitter\": {\n  \"type\": \"text\",\n  \"required\": true,\n  \"minLength\": 2,\n  \"maxLength\": 10\n }\n}", "Accounts_denyUnverifiedEmail": "拒绝未经验证的电子邮件地址", - "Accounts_EmailVerification": "电子邮件验证", + "Accounts_EmailVerification": "Email 验证", "Accounts_EmailVerification_Description": "要使用该功能,请确保 SMTP 设置正确", "Accounts_Enrollment_Email": "注册邮件", "Accounts_Enrollment_Email_Default": "

欢迎来到

[Site_Name]

转到 [Site_URL] 并尝试当今最先进的开源聊天解决方案!

", "Accounts_Enrollment_Email_Description": "你可以使用以下占位符:
  • 姓名[name]、名字[fname]或者姓氏 [lname]。
  • 邮箱[email]。
  • 网站名称[Site_Name]和网站地址[Site_URL]。
", "Accounts_Enrollment_Email_Subject_Default": "欢迎访问 [Site_Name]", + "Accounts_ForgetUserSessionOnWindowClose": "关闭窗口后忘记用户会话", "Accounts_Iframe_api_method": "API 方法", "Accounts_Iframe_api_url": "API URL", "Accounts_iframe_enabled": "已启用", - "Accounts_iframe_url": "框架地址", - "Accounts_LoginExpiration": "登录失效天数", + "Accounts_iframe_url": "Iframe Url", + "Accounts_LoginExpiration": "登录保持的天数", "Accounts_ManuallyApproveNewUsers": "手动审核新用户", - "Accounts_OAuth_Custom_Authorize_Path": "自定义 OAuth 的认证地址 ", - "Accounts_OAuth_Custom_Button_Color": "底部颜色", - "Accounts_OAuth_Custom_Button_Label_Color": "底部文字颜色", - "Accounts_OAuth_Custom_Button_Label_Text": "底部文字", + "Accounts_OAuth_Custom_Authorize_Path": "授权路径", + "Accounts_OAuth_Custom_Button_Color": "按钮颜色", + "Accounts_OAuth_Custom_Button_Label_Color": "按钮文字颜色", + "Accounts_OAuth_Custom_Button_Label_Text": "按钮文字", "Accounts_OAuth_Custom_Enable": "启用", - "Accounts_OAuth_Custom_id": "客户端 ID", + "Accounts_OAuth_Custom_id": "ID", "Accounts_OAuth_Custom_Identity_Path": "身份路径", "Accounts_OAuth_Custom_Login_Style": "登录样式", - "Accounts_OAuth_Custom_Secret": "密钥", - "Accounts_OAuth_Custom_Token_Path": "Token 地址", - "Accounts_OAuth_Custom_Token_Sent_Via": "令牌发生通过", - "Accounts_OAuth_Facebook": "Facebook 登录", + "Accounts_OAuth_Custom_Merge_Users": "合并用户", + "Accounts_OAuth_Custom_Scope": "范围", + "Accounts_OAuth_Custom_Secret": "Secret", + "Accounts_OAuth_Custom_Token_Path": "Token 路径", + "Accounts_OAuth_Custom_Token_Sent_Via": "Token 发送通过", + "Accounts_OAuth_Custom_Username_Field": "用户名 字段", + "Accounts_OAuth_Facebook": "Facebook 账户登录", "Accounts_OAuth_Facebook_callback_url": "Facebook 回调地址", - "Accounts_OAuth_Facebook_id": "Facebook 应用程序 ID", + "Accounts_OAuth_Facebook_id": "Facebook APP ID", "Accounts_OAuth_Facebook_secret": "Facebook Secret", - "Accounts_OAuth_Github": "启用 OAuth 登录", + "Accounts_OAuth_Github": "OAuth 已启用", "Accounts_OAuth_Github_callback_url": "Github 回调地址", "Accounts_OAuth_GitHub_Enterprise": "OAuth 已启用", "Accounts_OAuth_GitHub_Enterprise_callback_url": "GitHub 企业版回调地址", @@ -67,90 +78,116 @@ "Accounts_OAuth_Gitlab_callback_url": "GitLab 回调地址", "Accounts_OAuth_Gitlab_id": "GitLab ID", "Accounts_OAuth_Gitlab_secret": "客户端 Secret", - "Accounts_OAuth_Google": "使用 Google 帐号登录", + "Accounts_OAuth_Google": "Google 账户登录", "Accounts_OAuth_Google_callback_url": "Google 回调地址", "Accounts_OAuth_Google_id": "Google ID", "Accounts_OAuth_Google_secret": "Google 密钥", - "Accounts_OAuth_Linkedin": "LinkedIn 帐号登录", - "Accounts_OAuth_Linkedin_callback_url": "Linkedin 回调地址", + "Accounts_OAuth_Linkedin": "LinkedIn 账户登录", + "Accounts_OAuth_Linkedin_callback_url": "LinkedIn 回调地址", "Accounts_OAuth_Linkedin_id": "LinkedIn ID", - "Accounts_OAuth_Linkedin_secret": "LinkedIn 密钥", - "Accounts_OAuth_Meteor": "Meteor 帐号登录", + "Accounts_OAuth_Linkedin_secret": "LinkedIn Secret", + "Accounts_OAuth_Meteor": "Meteor 账户登录", "Accounts_OAuth_Meteor_callback_url": "Meteor 回调地址", "Accounts_OAuth_Meteor_id": "Meteor ID", - "Accounts_OAuth_Meteor_secret": "Meteor 密钥", - "Accounts_OAuth_Twitter": "Twitter 帐号登录", + "Accounts_OAuth_Meteor_secret": "Meteor Secret", + "Accounts_OAuth_Twitter": "Twitter 账户登录", "Accounts_OAuth_Twitter_callback_url": "Twitter 回调地址", "Accounts_OAuth_Twitter_id": "Twitter ID", - "Accounts_OAuth_Twitter_secret": "Twitter 密钥", - "Accounts_OAuth_Wordpress": "WordPress 登录", + "Accounts_OAuth_Twitter_secret": "Twitter Secret", + "Accounts_OAuth_Wordpress": "WordPress 账户登录", "Accounts_OAuth_Wordpress_callback_url": "Wordpress 回调地址", - "Accounts_OAuth_Wordpress_id": "WordPress 应用 ID", - "Accounts_OAuth_Wordpress_secret": "WordPress 应用密钥", + "Accounts_OAuth_Wordpress_id": "WordPress ID", + "Accounts_OAuth_Wordpress_secret": "WordPress Secret", "Accounts_PasswordReset": "重置密码", + "Accounts_OAuth_Proxy_host": "代理主机", + "Accounts_OAuth_Proxy_services": "代理服务", + "Accounts_Registration_AuthenticationServices_Default_Roles": "认证服务的默认角色", + "Accounts_Registration_AuthenticationServices_Default_Roles_Description": "当通过认证服务注册时被授予默认角色的用户(用逗号分隔)", "Accounts_Registration_AuthenticationServices_Enabled": "使用认证服务注册", "Accounts_RegistrationForm": "注册表单", "Accounts_RegistrationForm_Disabled": "已禁用", "Accounts_RegistrationForm_LinkReplacementText": "注册表单链接的替代文本", "Accounts_RegistrationForm_Public": "公开", - "Accounts_RegistrationForm_Secret_URL": "私密地址", - "Accounts_RegistrationForm_SecretURL": "私密注册表单 ", + "Accounts_RegistrationForm_Secret_URL": "Secret URL", + "Accounts_RegistrationForm_SecretURL": "注册表单 Secret URL", "Accounts_RegistrationForm_SecretURL_Description": "您必须提供一个随机字符串,该字符串将被添加到您的注册地址中。例如:https://demo.rocket.chat/register/[secret_hash]", - "Accounts_RequireNameForSignUp": "需要填写姓名才能注册", + "Accounts_RequireNameForSignUp": "姓名必须填写", + "Accounts_RequirePasswordConfirmation": "请再次确认密码", + "Accounts_SetDefaultAvatar": "设置默认头像", + "Accounts_SetDefaultAvatar_Description": "尝试从 OAuth 账户或 Gravatar 检查默认头像", "Accounts_ShowFormLogin": "显示基于表单的登录界面", "Accounts_UseDefaultBlockedDomainsList": "使用默认的屏蔽域名列表", - "Accounts_UseDNSDomainCheck": "使用 DNS 域名验证", + "Accounts_UseDNSDomainCheck": "使用 DNS 域名检查", "Accounts_UserAddedEmail_Default": "

欢迎访问

[Site_Name]

转到 [Site_URL] 并尝试当今最先进的开源聊天解决方案!

您可以使用您的电子邮件地址:[email] 和密码:[password] 进行登陆。您可能需要在您首次登录后更改密码。

", - "Accounts_UserAddedEmail_Description": "您可以使用以下占位符:
  • [name], [fname], [lname] 分别作为用户的全名、名字或姓氏。
  • [email] 作为用户的电子邮件。
  • [password] 作为用户的密码。
  • [Site_Name] 和 [Site_URL] 分别作为网站名称和网站地址。
", + "Accounts_UserAddedEmail_Description": "您可以使用以下占位符:
  • 全名 [name],名字 [fname],姓氏 [lname]。
  • [email] 为用户的email。
  • [password] 为用户的密码。
  • [Site_Name] 和 [Site_URL] 分别作为网站名称和网站地址。
", "Accounts_UserAddedEmailSubject_Default": "您已被添加到 [Site_Name]", "Activate": "激活", "Activity": "活动", "Add": "添加", "Add_agent": "添加客服", "Add_custom_oauth": "添加自定义 OAuth ", + "Add_Domain": "添加域名", "Add_manager": "添加管理员", - "Add_user": "新增用户", + "Add_user": "添加用户", "Add_User": "添加用户", "Add_users": "添加用户", "Adding_OAuth_Services": "添加 OAuth 服务", "Adding_permission": "正在添加权限", "Adding_user": "正在添加用户", - "Additional_emails": "其它电子邮箱地址", - "Additional_Feedback": "额外反馈", + "Additional_emails": "其他 Email", + "Additional_Feedback": "其他反馈", "Administration": "管理", "After_OAuth2_authentication_users_will_be_redirected_to_this_URL": "通过 OAuth2 认证后,用户将被重定向至此地址", + "Agent": "客服", "Agent_added": "客服已添加", "Agent_removed": "客服已删除", "Alias": "别名", "Alias_Format": "别名格式", + "Alias_Format_Description": "从 Slack 导入信息;%s 会被用户的用户名替代。如果留空则不使用别名。", + "Alias_Set": "别名设置", "All": "全部", "All_channels": "所有频道", "All_logs": "所有日志", - "All_messages": "所有信息", + "All_messages": "所有消息", "Allow_Invalid_SelfSigned_Certs": "允许无效的自签名 SSL 证书", "Allow_Invalid_SelfSigned_Certs_Description": "允许无效的自签名 SSL 证书用于验证和预览链接。", + "Always_open_in_new_window": "总是在新窗口中打开", "Analytics_features_enabled": "功能已启用", - "Analytics_features_messages_Description": "跟踪与用户在消息中做的操作相关的自定义事件。", - "Analytics_features_rooms_Description": "跟踪与频道或分组操作相关的自定义事件(创建,离开,删除)。", + "Analytics_features_messages_Description": "跟踪与用户对消息的操作相关的自定义事件。", + "Analytics_features_rooms_Description": "跟踪与频道或分组操作相关的自定义事件(创建、离开、删除)。", "Analytics_features_users_Description": "跟踪与用户操作相关的自定义事件(密码重置次数、个人资料图片变化等)。", + "Analytics_Google": "Google 统计", + "Analytics_Google_id": "跟踪 ID", "and": "和", "And_more": "以及其它 __length__ 条", "Animals_and_Nature": "动物与自然", "API": "API", + "API_Allow_Infinite_Count": "允许获取一切", + "API_Allow_Infinite_Count_Description": "是否允许在一次 REST API 调用中返回所有内容?", "API_Analytics": "分析", - "API_Embed": "嵌入", - "API_EmbedDisabledFor": "禁止用户使用嵌入", - "API_EmbedDisabledFor_Description": "以逗号分隔的用户名列表", + "API_CORS_Origin": "CORS 源", + "API_Default_Count": "默认计数", + "API_Default_Count_Description": "消费者未提供时 REST API 结果的默认计数", + "API_Embed": "嵌入链接预览", + "API_Embed_Description": "当用户发布一个网站链接时,是否启用嵌入链接预览。", + "API_EmbedCacheExpirationDays": "嵌入缓存有效天数", + "API_EmbedDisabledFor": "禁用嵌入的用户", + "API_EmbedDisabledFor_Description": "禁止使用嵌入链接预览功能的用户(以逗号分隔的用户名)", "API_EmbedIgnoredHosts": "嵌入忽略的主机", "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_GitHub_Enterprise_URL": "服务地址", - "API_GitHub_Enterprise_URL_Description": "例如:http://domain.com (不需要结尾的斜线)", + "API_Enable_CORS": "启用 CORS", + "API_Enable_Direct_Message_History_EndPoint": "启用 Direct Message History Endpoint", + "API_Enable_Direct_Message_History_EndPoint_Description": "这会启用 `/api/v1/im.history.others`,它允许查看其他用户发送的私信。", + "API_GitHub_Enterprise_URL": "服务器 URL", + "API_GitHub_Enterprise_URL_Description": "例如:http://domain.com (末尾无斜线)", "API_Gitlab_URL": "GitLab URL", - "API_Token": "API 令牌", - "API_User_Limit": "用户限制添加所有用户通道", - "API_Wordpress_URL": "WordPress 网址", + "API_Token": "API Token", + "API_Upper_Count_Limit": "最大记录量", + "API_Upper_Count_Limit_Description": "REST API 应返回的最大记录数量(在没有限制的条件下)?", + "API_User_Limit": "添加所有用户到频道的用户限制", + "API_Wordpress_URL": "WordPress URL", "Apiai_Key": "Api.ai Key", "Apiai_Language": "Api.ai 语言", "Appearance": "外观", @@ -163,13 +200,15 @@ "are_typing": "正在输入", "Are_you_sure": "你确定吗?", "Are_you_sure_you_want_to_delete_your_account": "您确定要删除您的帐号吗?", + "Assign_admin": "分配管理员", "at": "在", - "Auth_Token": "身份验证 Token", + "Attachment_File_Uploaded": "文件已上传", + "Attribute_handling": "属性处理", + "Auth_Token": "Auth Token", "Author": "作者", - "Authorization_URL": "授权地址", + "Authorization_URL": "授权 URL", "Authorize": "授权", "Auto_Load_Images": "自动载入图片", - "AutoLinker_Email": "自动链接电子邮件地址", "AutoLinker_Phone": "自动链接电话号码", "AutoLinker_Phone_Description": "自动为电话号码添加链接。例如:`(123)456-7890`", "AutoLinker_StripPrefix": "自动链接显示链接前缀", @@ -178,6 +217,12 @@ "AutoLinker_Urls_TLD": "自动链接顶级域名的网址", "AutoLinker_Urls_www": "自动链接以“www”开头的网址", "AutoLinker_UrlsRegExp": "自动链接网址正则表达式", + "Automatic_Translation": "自动翻译", + "Auto_Translate": "自动翻译", + "AutoTranslate_Enabled": "启用自动翻译", + "AutoTranslate_Enabled_Description": "开启自动翻译功能将允许用户获得自动翻译权限,所有消息都将被自动翻译成用户选择的语言。这可需要付费,请查阅 Google 文档", + "AutoTranslate_Change_Language_Description": "修改自动翻译的语言不会翻译之前的消息。", + "AutoTranslate_GoogleAPIKey": "Google API Key", "Available": "可用", "Available_agents": "空闲客服", "Avatar": "更改头像", @@ -193,11 +238,18 @@ "Back": "返回", "Back_to_applications": "返回应用列表", "Back_to_integrations": "返回集成页", + "Back_to_integration_detail": "返回查看集成的详细信息", "Back_to_login": "返回登录界面", "Back_to_permissions": "返回权限页", + "Beta_feature_Depends_on_Video_Conference_to_be_enabled": "测试功能。需要启用视频会议功能。", + "Block_User": "阻止用户", "Body": "主体", "bold": "粗体", + "bot_request": "Bot 请求", + "BotHelpers_userFields": "用户字段", + "BotHelpers_userFields_Description": "用户字段中的 CSV 是可以被 bot 帮助器方法访问的。", "Branch": "分支", + "Bugsnag_api_key": "Bugsnag API Key", "busy": "忙", "Busy": "忙", "busy_female": "忙碌", @@ -205,17 +257,38 @@ "busy_male": "忙碌", "Busy_male": "忙碌", "by": "通过", + "Content": "内容", + "cache_cleared": "缓存已清理", "Cancel": "取消", "Cancel_message_input": "取消", "Cannot_invite_users_to_direct_rooms": "不能邀请用户加入私聊房间", + "CAS_autoclose": "自动关闭登录窗口", + "CAS_base_url": "SSO 基本 URL", + "CAS_base_url_Description": "外部 SSO 服务的基本 URL,例如:https://sso.example.undef/sso/", + "CAS_button_color": "登录按钮背景颜色", + "CAS_button_label_color": "登录按钮文字颜色", + "CAS_button_label_text": "登录按钮标签", + "CAS_enabled": "已启用", + "CAS_Login_Layout": "CAS 登录布局", + "CAS_login_url": "SSO 登录 URL", + "CAS_login_url_Description": "外部 SSO 服务的登录 URL,例如:https://sso.example.undef/sso/login", + "CAS_popup_height": "登录框高度", + "CAS_popup_width": "登录框宽度", + "CAS_Sync_User_Data_Enabled": "始终同步用户数据", + "CAS_Sync_User_Data_FieldMap": "属性映射", + "CAS_version": "CAS 版本", "CDN_PREFIX": "CDN 前缀", "Certificates_and_Keys": "证书和密钥", "Changing_email": "正在更改电子邮件", + "Change_Room_Type": "正在修改房间类型", + "channel": "频道", "Channel": "频道", "Channel_already_exist": "通道'#%s“已存在。", + "Channel_created": "`#%s` 频道已创建。", "Channel_already_Unarchived": "与名`#%s`通道已经处于未封存状态", "Channel_Archived": "与名`#%s`通道已成功存档", "Channel_doesnt_exist": "不存在 `#%s` 频道。", + "Channel_to_listen_on": "监听频道", "Channel_Unarchived": "与名`#%s`通道已取消封存成功", "Channels": "频道", "Channels_list": "公共频道列表", @@ -230,8 +303,12 @@ "Choose_messages": "选择信息", "Choose_the_alias_that_will_appear_before_the_username_in_messages": "选择将在消息中的用户名前出现的别名。", "Choose_the_username_that_this_integration_will_post_as": "选择该集成以什么用户名身份发布信息", + "clear": "清理", + "clear_cache_now": "立即清理缓存", + "clear_history": "清理历史记录", "Clear_all_unreads_question": "清除所有未读标记?", "Click_here": "点击这里", + "Click_here_for_more_info": "点此查看更多信息", "Client_ID": "客户端 ID", "Client_Secret": "客户端 Secret", "Clients_will_refresh_in_a_few_seconds": "客户端将在几秒钟内刷新", @@ -243,6 +320,7 @@ "Collapse_Embedded_Media_By_Default": "关闭默认的嵌入式媒体", "Color": "颜色", "Commands": "指令", + "Comment_to_leave_on_closing_session": "为关闭的会话留下评论", "Compact": "紧凑", "Confirm_password": "确认密码", "Conversation": "谈话", @@ -259,19 +337,46 @@ "Create_new": "新建", "Created_at": "创建于", "Created_at_s_by_s": "由 %s 创建于 %s", + "Created_at_s_by_s_triggered_by_s": "由 %s 创建于 %s%s 触发", + "CROWD_Reject_Unauthorized": "拒绝未经授权的", + "CRM_Integration": "CRM 集成", "Current_Chats": "当前聊天", "Custom": "自定义", + "Custom_Emoji": "自定义表情", + "Custom_Emoji_Add": "添加新表情", + "Custom_Emoji_Added_Successfully": "自定义表情添加成功", + "Custom_Emoji_Delete_Warning": "表情删除操作无法撤销。", + "Custom_Emoji_Error_Invalid_Emoji": "无效的表情", + "Custom_Emoji_Error_Name_Or_Alias_Already_In_Use": "自定义表情或别名已经被占用。", + "Custom_Emoji_Has_Been_Deleted": "自定义表情已经被删除。", + "Custom_Emoji_Info": "自定义表情信息", + "Custom_Emoji_Updated_Successfully": "自定义表情更新成功", "Custom_Fields": "自定义字段", "Custom_oauth_helper": "设置完 OAuth 提供者之后,你还需要设置回调 URL。请使用
%s
。", "Custom_oauth_unique_name": "自定义 OAuth 唯一名称 ", + "Custom_Scripts": "自定义脚本", "Custom_Script_Logged_In": "为已登录用户准备的自定义脚本", "Custom_Script_Logged_Out": "为已登出用户准备的自定义脚本", + "Custom_Sounds": "自定义声音", + "Custom_Sound_Add": "添加自定义声音", + "Custom_Sound_Delete_Warning": "声音删除操作无法撤销。", + "Custom_Sound_Error_Invalid_Sound": "无效的声音", + "Custom_Sound_Error_Name_Already_In_Use": "自定义声音的名称已被占用。", + "Custom_Sound_Has_Been_Deleted": "自定义声音已删除。", + "Custom_Sound_Info": "自定义声音信息", + "Custom_Sound_Saved_Successfully": "自定义声音保存成功", + "Custom_Translations": "自定义翻译", + "Custom_Translations_Description": "应使用 JSON 文件格式,键为语言,值为翻译。例如:
{\n \"en\": {\n  \"Channels\": \"Rooms\"\n },\n \"pt\": {\n  \"Channels\": \"Salas\"\n }\n} ", + "CustomSoundsFilesystem": "自定义声音文件系统", "Dashboard": "控制面板", "Date": "日期", + "Date_From": "从", + "Date_to": "到", "days": "天", "DB_Migration": "数据库迁移", "DB_Migration_Date": "数据库迁移日期", "Deactivate": "禁用", + "Decline": "下降", "Default": "默认", "Delete": "删除", "Delete_message": "删除消息", @@ -292,12 +397,15 @@ "Desktop_Notifications_Duration_Description": "多少秒显示桌面通知。这可能会影响OS X通知中心。输入0可使用默认浏览器设置,并不会影响OS X通知中心。", "Desktop_Notifications_Enabled": "桌面通知已启用", "Direct_message_someone": "直接给某人发送消息", - "Direct_Messages": "直接发送消息", + "Direct_Messages": "私信", "Display_offline_form": "显示离线表单", "Displays_action_text": "显示动作文字", "Do_you_want_to_change_to_s_question": "您是否想修改为 %s?", "Domain": "域名", + "Domain_added": "域名已添加", + "Domain_removed": "域名已移除", "Domains": "域名", + "Download_Snippet": "下载", "Drop_to_upload_file": "拖放上传", "Dry_run": "发送测试", "Dry_run_description": "表单中的 E-mail 都只会收到一封邮件。邮件必须对应有效用户。", @@ -309,6 +417,7 @@ "Edit": "编辑", "Edit_Custom_Field": "编辑自定义字段", "Edit_Department": "编辑部门", + "Edit_Trigger": "编辑触发器", "edited": "已编辑", "Editing_room": "正在编辑聊天室", "Editing_user": "正在编辑用户", @@ -327,16 +436,22 @@ "Email_subject": "标题", "Email_verified": "邮箱已验证", "Emoji": "表情符号", + "EmojiCustomFilesystem": "自定义表情文件系统", "Empty_title": "空标题", "Enable": "启用", "Enable_Desktop_Notifications": "启用桌面通知", "Enabled": "已启用", + "Enable_Svg_Favicon": "启用 SVG 图标", "Encrypted_message": "加密消息", "End_OTR": "结束无记录对话", + "Enter_Alternative": "替代模式(Enter + Ctrl/Alt/Shift/CMD 发送消息)", "Enter_a_regex": "输入正则表达式", "Enter_a_room_name": "在这里输入房间名", "Enter_a_username": "输入用户名", + "Enter_Behaviour": "回车键", + "Enter_Behaviour_Description": "此项用来设置回车键发送消息还是换行", "Enter_name_here": "在这里输入名字", + "Enter_Normal": "常规模式(Enter 发送消息)", "Enter_to": "进入", "Error": "错误", "error-action-not-allowed": "__action__ 不允许", @@ -352,6 +467,7 @@ "error-department-not-found": "找不到该部门", "error-duplicate-channel-name": "频道 '__channel_name__' 已存在", "error-email-domain-blacklisted": "电子邮箱域名被列入黑名单", + "error-email-send-failed": "尝试发送邮件出错:__message__", "error-field-unavailable": "__field__ 已被使用 :(", "error-file-too-large": "文件太大", "error-importer-not-defined": "导入所用帐号错误,未指定导入class。", @@ -363,11 +479,14 @@ "error-invalid-channel-start-with-chars": "无效的频道。应该以 @ 或 # 开头", "error-invalid-custom-field": "无效的自定义字段", "error-invalid-custom-field-name": "无效的自定义字段名称。只能使用字母、数字、连字符和下划线。", + "error-invalid-date": "日期无效。", "error-invalid-description": "无效的说明", "error-invalid-domain": "域名无效", "error-invalid-email": "无效的电子邮件地址 __email__", + "error-invalid-email-address": "邮件地址无效", "error-invalid-file-height": "无效的文件高度", "error-invalid-file-type": "无效的文件类型", + "error-direct-message-file-upload-not-allowed": "私信中不允许文件共享", "error-invalid-file-width": "无效的文件宽度", "error-invalid-from-address": "您的 FROM 地址无效。", "error-invalid-integration": "无效的集成", @@ -404,10 +523,16 @@ "error-user-is-not-activated": "用户未激活", "error-user-not-in-room": "用户不是在这个房间里", "error-user-registration-disabled": "用户注册被禁用", + "error-user-limit-exceeded": "你邀请加入 #channel_name 的用户数量超出了管理员设置的最大值限制", "error-user-registration-secret": "用户注册只能通过私密地址", "error-you-are-last-owner": "你是房间当前的拥有者。请先重设拥有者再离开房间。", "Error_changing_password": "密码更改失败", "Esc_to": "退出", + "Event_Trigger": "事件触发", + "Event_Trigger_Description": "选择将触发此外发 WebHook 集成的事件类型", + "every_30_minutes": "每30分钟一次", + "every_hour": "每小时一次", + "every_six_hours": "每6小时一次", "Example_s": "例如:%s", "Exclude_Botnames": "排除机器人", "False": "否", @@ -416,11 +541,18 @@ "Features_Enabled": "功能已启用", "Field": "字段", "Field_removed": "字段已删除", + "Field_required": "字段必须填写", "File_exceeds_allowed_size_of_bytes": "文件大小超过允许的 __size__ 字节", + "File_not_allowed_direct_messages": "私信中不允许文件共享。", + "File_type_is_not_accepted": "文件类型不被系统接受。", + "File_uploaded": "文件已上传", "FileUpload": "文件上传", "FileUpload_Enabled": "文件上传已启用", + "FileUpload_Disabled": "已禁用文件上传。", + "FileUpload_Enabled_Direct": "私信已启用文件上传", "FileUpload_File_Empty": "文件为空", "FileUpload_FileSystemPath": "系统路径", + "FileUpload_GoogleStorage_AccessId": "Google 存储 Access ID", "FileUpload_MaxFileSize": "文件上传大小限制(以字节为单位)", "FileUpload_MediaType_NotAccepted": "不支持该类型媒体文件", "FileUpload_MediaTypeWhiteList": "支持的媒体类型", @@ -505,12 +637,15 @@ "Installation": "安装", "Installed_at": "安装在", "Instructions_to_your_visitor_fill_the_form_to_send_a_message": "给你访问者的说明,指导它们填写表格来发送一条消息", + "Integration_Advanced_Settings": "高级设置", "Integration_added": "集成已添加", + "Integration_History_Cleared": "已成功清理集成历史记录", "Integration_Incoming_WebHook": "Incoming WebHook 集成", "Integration_New": "新的集成", "Integration_Outgoing_WebHook": "Outgoing WebHook 集成", "Integration_updated": "集成已更新", "Integrations": "集成", + "Integrations_for_all_channels": "输入 all_public_channels 监听所有公共频道,all_private_groups 监听所有私有组,all_direct_messages 监听所有私信。", "InternalHubot": "内部Hubot", "InternalHubot_ScriptsToLoad": "需要加载的脚本", "InternalHubot_ScriptsToLoad_Description": "请输入一个逗号分隔的脚本列表从https://github.com/github/hubot-scripts/tree/master/src/scripts加载", @@ -623,7 +758,7 @@ "Leave_Room_Warning": "您确定要离开房间“%s”吗?", "line": "行", "List_of_Channels": "频道列表", - "List_of_Direct_Messages": "直接对话列表", + "List_of_Direct_Messages": "私信列表", "Livechat_agents": "在线客服", "Livechat_Dashboard": "在线聊天控制面板", "Livechat_enabled": "即时聊天启用", @@ -720,7 +855,7 @@ "Meta_robots": "机器人", "minutes": "分钟", "More_channels": "更多频道", - "More_direct_messages": "更多对话", + "More_direct_messages": "更多私信", "More_groups": "更多私有组", "More_unreads": "更多未阅读", "Msgs": "消息", @@ -1039,6 +1174,7 @@ "Stats_Total_Channels": "频道总数", "Stats_Total_Direct_Messages": "点对点发送消息房间数", "Stats_Total_Messages": "消息总数", + "Stats_Total_Messages_Direct": "私信总数", "Stats_Total_Private_Groups": "私有组数", "Stats_Total_Rooms": "房间总数", "Stats_Total_Users": "用户总数", diff --git a/packages/rocketchat-ldap/server/sync.js b/packages/rocketchat-ldap/server/sync.js index 24456f7ac9ae..8e75229e584a 100644 --- a/packages/rocketchat-ldap/server/sync.js +++ b/packages/rocketchat-ldap/server/sync.js @@ -74,7 +74,7 @@ getDataToSyncUserData = function getDataToSyncUserData(ldapUser, user) { switch (userField) { case 'email': - if (_.isObject(ldapUser.object[ldapField] === 'object')) { + if (_.isObject(ldapUser.object[ldapField])) { _.map(ldapUser.object[ldapField], function(item) { emailList.push({ address: item, verified: true }); }); diff --git a/packages/rocketchat-lib/client/OAuthProxy.js b/packages/rocketchat-lib/client/OAuthProxy.js new file mode 100644 index 000000000000..6683dddc29be --- /dev/null +++ b/packages/rocketchat-lib/client/OAuthProxy.js @@ -0,0 +1,13 @@ +/* globals OAuth */ + +OAuth.launchLogin = _.wrap(OAuth.launchLogin, function(func, options) { + const proxy = RocketChat.settings.get('Accounts_OAuth_Proxy_services').replace(/\s/g, '').split(','); + if (proxy.includes(options.loginService)) { + const redirect_uri = options.loginUrl.match(/(&redirect_uri=)([^&]+|$)/)[2]; + options.loginUrl = options.loginUrl.replace(/(&redirect_uri=)([^&]+|$)/, `$1${encodeURIComponent(RocketChat.settings.get('Accounts_OAuth_Proxy_host'))}/oauth_redirect`); + options.loginUrl = options.loginUrl.replace(/(&state=)([^&]+|$)/, `$1${redirect_uri}!$2`); + options.loginUrl = RocketChat.settings.get('Accounts_OAuth_Proxy_host')+'/redirect/'+encodeURIComponent(options.loginUrl); + } + + return func(options); +}); diff --git a/packages/rocketchat-lib/package.js b/packages/rocketchat-lib/package.js index 652f2de2b5c3..03e88cded081 100644 --- a/packages/rocketchat-lib/package.js +++ b/packages/rocketchat-lib/package.js @@ -29,6 +29,7 @@ Package.onUse(function(api) { api.use('ddp-rate-limiter'); api.use('underscore'); api.use('mongo'); + api.use('oauth'); api.use('underscorestring:underscore.string@3.3.4'); api.use('matb33:collection-hooks'); api.use('service-configuration'); @@ -110,6 +111,10 @@ Package.onUse(function(api) { api.addFiles('server/models/Uploads.coffee', 'server'); api.addFiles('server/models/Users.coffee', 'server'); + api.addFiles('server/oauth/oauth.js', 'server'); + api.addFiles('server/oauth/google.js', 'server'); + api.addFiles('server/oauth/proxy.js', 'server'); + api.addFiles('server/startup/statsTracker.js', 'server'); // CACHE @@ -168,6 +173,7 @@ Package.onUse(function(api) { // CLIENT LIB api.addFiles('client/Notifications.coffee', 'client'); + api.addFiles('client/OAuthProxy.js', 'client'); api.addFiles('client/lib/TabBar.js', 'client'); api.addFiles('client/lib/RocketChatTabBar.js', 'client'); api.addFiles('client/lib/cachedCollection.js', 'client'); diff --git a/packages/rocketchat-lib/rocketchat.info b/packages/rocketchat-lib/rocketchat.info index ebdf1b99ed4c..b27c3096db5d 100644 --- a/packages/rocketchat-lib/rocketchat.info +++ b/packages/rocketchat-lib/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "0.53.0-develop" + "version": "0.53.0" } diff --git a/packages/rocketchat-lib/server/methods/restartServer.js b/packages/rocketchat-lib/server/methods/restartServer.js index f6e72b8c6410..100cf528155f 100644 --- a/packages/rocketchat-lib/server/methods/restartServer.js +++ b/packages/rocketchat-lib/server/methods/restartServer.js @@ -8,8 +8,15 @@ Meteor.methods({ throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'restart_server' }); } - Meteor.setTimeout(() => process.exit(1) - , 2000); + Meteor.setTimeout(() => { + Meteor.setTimeout(() => { + console.warn('Call to process.exit() timed out, aborting.'); + process.abort(); + } + , 1000); + process.exit(1); + } + , 1000); return { message: 'The_server_will_restart_in_s_seconds', diff --git a/packages/rocketchat-lib/server/methods/updateMessage.js b/packages/rocketchat-lib/server/methods/updateMessage.js index 4687b0dbfd60..93eccd430b3a 100644 --- a/packages/rocketchat-lib/server/methods/updateMessage.js +++ b/packages/rocketchat-lib/server/methods/updateMessage.js @@ -33,6 +33,14 @@ Meteor.methods({ } } + if (originalMessage.attachments) { + if (originalMessage.attachments[0].description !== undefined) { + message.attachments = originalMessage.attachments; + message.attachments[0].description = message.msg; + message.msg = originalMessage.msg; + } + } + message.u = originalMessage.u; return RocketChat.updateMessage(message, Meteor.user()); diff --git a/packages/rocketchat-lib/server/models/Subscriptions.coffee b/packages/rocketchat-lib/server/models/Subscriptions.coffee index f0c9f6ba36f8..4ae7500ffef5 100644 --- a/packages/rocketchat-lib/server/models/Subscriptions.coffee +++ b/packages/rocketchat-lib/server/models/Subscriptions.coffee @@ -16,6 +16,8 @@ class ModelSubscriptions extends RocketChat.models._Base @tryEnsureIndex { 'desktopNotifications': 1 }, { sparse: 1 } @tryEnsureIndex { 'mobilePushNotifications': 1 }, { sparse: 1 } @tryEnsureIndex { 'emailNotifications': 1 }, { sparse: 1 } + @tryEnsureIndex { 'autoTranslate': 1 }, { sparse: 1 } + @tryEnsureIndex { 'autoTranslateLanguage': 1 }, { sparse: 1 } this.cache.ensureIndex('rid', 'array') this.cache.ensureIndex('u._id', 'array') diff --git a/packages/rocketchat-lib/server/oauth/google.js b/packages/rocketchat-lib/server/oauth/google.js new file mode 100644 index 000000000000..b1e3cb87d748 --- /dev/null +++ b/packages/rocketchat-lib/server/oauth/google.js @@ -0,0 +1,60 @@ +/* globals Google */ + +function getIdentity(accessToken) { + try { + return HTTP.get( + 'https://www.googleapis.com/oauth2/v1/userinfo', + {params: {access_token: accessToken}}).data; + } catch (err) { + throw _.extend(new Error('Failed to fetch identity from Google. ' + err.message), {response: err.response}); + } +} + +function getScopes(accessToken) { + try { + return HTTP.get( + 'https://www.googleapis.com/oauth2/v1/tokeninfo', + {params: {access_token: accessToken}}).data.scope.split(' '); + } catch (err) { + throw _.extend(new Error('Failed to fetch tokeninfo from Google. ' + err.message), {response: err.response}); + } +} + + +RocketChat.registerAccessTokenService('google', function(options) { + check(options, Match.ObjectIncluding({ + accessToken: String, + idToken: String, + expiresIn: Match.Integer, + scope: Match.Maybe(String), + identity: Match.Maybe(Object) + })); + + const identity = options.identity || getIdentity(options.accessToken); + + const serviceData = { + accessToken: options.accessToken, + idToken: options.idToken, + expiresAt: (+new Date) + (1000 * parseInt(options.expiresIn, 10)), + scope: options.scopes || getScopes(options.accessToken) + }; + + const fields = _.pick(identity, Google.whitelistedFields); + _.extend(serviceData, fields); + + // only set the token in serviceData if it's there. this ensures + // that we don't lose old ones (since we only get this on the first + // log in attempt) + if (options.refreshToken) { + serviceData.refreshToken = options.refreshToken; + } + + return { + serviceData: serviceData, + options: { + profile: { + name: identity.name + } + } + }; +}); diff --git a/packages/rocketchat-lib/server/oauth/oauth.js b/packages/rocketchat-lib/server/oauth/oauth.js new file mode 100644 index 000000000000..df041e5aa818 --- /dev/null +++ b/packages/rocketchat-lib/server/oauth/oauth.js @@ -0,0 +1,52 @@ +const AccessTokenServices = {}; + +RocketChat.registerAccessTokenService = function(serviceName, handleAccessTokenRequest) { + AccessTokenServices[serviceName] = { + serviceName: serviceName, + handleAccessTokenRequest: handleAccessTokenRequest + }; +}; + +// Listen to calls to `login` with an oauth option set. This is where +// users actually get logged in to meteor via oauth. +Accounts.registerLoginHandler(function(options) { + if (!options.accessToken) { + return undefined; // don't handle + } + + check(options, Match.ObjectIncluding({ + serviceName: String + })); + + const service = AccessTokenServices[options.serviceName]; + + // Skip everything if there's no service set by the oauth middleware + if (!service) { + throw new Error(`Unexpected AccessToken service ${options.serviceName}`); + } + + // Make sure we're configured + if (!ServiceConfiguration.configurations.findOne({service: service.serviceName})) { + throw new ServiceConfiguration.ConfigError(); + } + + if (!_.contains(Accounts.oauth.serviceNames(), service.serviceName)) { + // serviceName was not found in the registered services list. + // This could happen because the service never registered itself or + // unregisterService was called on it. + return { + type: 'oauth', + error: new Meteor.Error( + Accounts.LoginCancelledError.numericError, + `No registered oauth service found for: ${service.serviceName}` + ) + }; + } + + const oauthResult = service.handleAccessTokenRequest(options); + + return Accounts.updateOrCreateUserFromExternalService(service.serviceName, oauthResult.serviceData, oauthResult.options); +}); + + + diff --git a/packages/rocketchat-lib/server/oauth/proxy.js b/packages/rocketchat-lib/server/oauth/proxy.js new file mode 100644 index 000000000000..320f0dfbf170 --- /dev/null +++ b/packages/rocketchat-lib/server/oauth/proxy.js @@ -0,0 +1,11 @@ +/* globals OAuth */ + +OAuth._redirectUri = _.wrap(OAuth._redirectUri, function(func, serviceName, ...args) { + const proxy = RocketChat.settings.get('Accounts_OAuth_Proxy_services').replace(/\s/g, '').split(','); + if (proxy.includes(serviceName)) { + return RocketChat.settings.get('Accounts_OAuth_Proxy_host')+'/oauth_redirect'; + } else { + return func(serviceName, ...args); + } + +}); diff --git a/packages/rocketchat-lib/server/startup/settings.coffee b/packages/rocketchat-lib/server/startup/settings.coffee index 9690a669d0d0..76d858f7b4a7 100644 --- a/packages/rocketchat-lib/server/startup/settings.coffee +++ b/packages/rocketchat-lib/server/startup/settings.coffee @@ -88,6 +88,9 @@ RocketChat.settings.addGroup 'OAuth', -> @add 'Accounts_OAuth_Twitter_secret', '', { type: 'string', enableQuery: enableQuery } @add 'Accounts_OAuth_Twitter_callback_url', '_oauth/twitter', { type: 'relativeUrl', readonly: true, force: true, enableQuery: enableQuery } + @section 'Proxy', -> + @add 'Accounts_OAuth_Proxy_host', 'https://oauth-proxy.rocket.chat', { type: 'string', public: true } + @add 'Accounts_OAuth_Proxy_services', '', { type: 'string', public: true } RocketChat.settings.addGroup 'General', -> @@ -250,7 +253,7 @@ RocketChat.settings.addGroup 'Layout', -> @add 'Layout_Terms_of_Service', 'Terms of Service
Go to APP SETTINGS -> Layout to customize this page.', { type: 'code', code: 'text/html', multiline: true, public: true } @add 'Layout_Login_Terms', 'By proceeding you are agreeing to our Terms of Service and Privacy Policy.', { type: 'string', multiline: true, public: true } @add 'Layout_Privacy_Policy', 'Privacy Policy
Go to APP SETTINGS -> Layout to customize this page.', { type: 'code', code: 'text/html', multiline: true, public: true } - @add 'Layout_Sidenav_Footer', '', { type: 'code', code: 'text/html', public: true, i18nDescription: 'Layout_Sidenav_Footer_description' } + @add 'Layout_Sidenav_Footer', '', { type: 'code', code: 'text/html', public: true, i18nDescription: 'Layout_Sidenav_Footer_description' } @section 'Custom_Scripts', -> @add 'Custom_Script_Logged_Out', '//Add your script', { type: 'code', multiline: true, public: true } diff --git a/packages/rocketchat-livechat/app/.meteor/.finished-upgraders b/packages/rocketchat-livechat/app/.meteor/.finished-upgraders index a541808f2b3d..a8020370920b 100644 --- a/packages/rocketchat-livechat/app/.meteor/.finished-upgraders +++ b/packages/rocketchat-livechat/app/.meteor/.finished-upgraders @@ -14,3 +14,4 @@ notices-for-facebook-graph-api-2 1.3.5-remove-old-dev-bundle-link 1.4.0-remove-old-dev-bundle-link 1.4.1-add-shell-server-package +1.4.3-split-account-service-packages diff --git a/packages/rocketchat-livechat/app/.meteor/packages b/packages/rocketchat-livechat/app/.meteor/packages index 3e687b437b30..7cd0da141638 100644 --- a/packages/rocketchat-livechat/app/.meteor/packages +++ b/packages/rocketchat-livechat/app/.meteor/packages @@ -4,39 +4,39 @@ # 'meteor add' and 'meteor remove' will edit this file for you, # but you can also edit it by hand. -meteor -webapp -logging -tracker -deps -session -ddp -livedata -mongo +meteor@1.6.1 +webapp@1.3.13 +logging@1.1.17 +tracker@1.1.2 +deps@1.0.12 +session@1.1.7 +ddp@1.2.5 +livedata@1.0.18 +mongo@1.1.15 blaze ui spacebars templating -check -underscore -jquery -random -ejson +check@1.2.4 +underscore@1.0.10 +jquery@1.11.10 +random@1.0.10 +ejson@1.0.13 coffeescript rocketchat:streamer kadira:flow-router kadira:blaze-layout konecty:nrr -less +less@2.7.9 underscorestring:underscore.string momentjs:moment mizzao:timesync -reactive-var -accounts-password +reactive-var@1.0.11 +accounts-password@1.3.4 tap:i18n smoral:sweetalert -ecmascript -es5-shim -standard-minifier-css -standard-minifier-js -shell-server +ecmascript@0.6.3 +es5-shim@4.6.15 +standard-minifier-css@1.3.3 +standard-minifier-js@1.2.2 +shell-server@0.2.2 diff --git a/packages/rocketchat-livechat/app/.meteor/release b/packages/rocketchat-livechat/app/.meteor/release index b7694ea377ef..e6940fd82f24 100644 --- a/packages/rocketchat-livechat/app/.meteor/release +++ b/packages/rocketchat-livechat/app/.meteor/release @@ -1 +1 @@ -METEOR@1.4.2.6 +METEOR@1.4.3.1 diff --git a/packages/rocketchat-livechat/app/.meteor/versions b/packages/rocketchat-livechat/app/.meteor/versions index 0b4d18e5e122..e69abb2200bd 100644 --- a/packages/rocketchat-livechat/app/.meteor/versions +++ b/packages/rocketchat-livechat/app/.meteor/versions @@ -13,8 +13,8 @@ caching-compiler@1.1.9 caching-html-compiler@1.1.0 callback-hook@1.0.10 cfs:http-methods@0.0.32 -check@1.2.4 -coffeescript@1.12.0_1 +check@1.2.5 +coffeescript@1.12.3_1 ddp@1.2.5 ddp-client@1.3.3 ddp-common@1.2.8 @@ -44,7 +44,7 @@ mdg:validation-error@0.5.1 meteor@1.6.1 meteorspark:util@0.2.0 minifier-css@1.2.16 -minifier-js@1.2.17 +minifier-js@1.2.18 minimongo@1.0.20 mizzao:timesync@0.4.0 modules@0.7.9 @@ -73,8 +73,8 @@ smoral:sweetalert@1.1.1 spacebars@1.0.13 spacebars-compiler@1.1.0 srp@1.0.10 -standard-minifier-css@1.3.3 -standard-minifier-js@1.2.2 +standard-minifier-css@1.3.4 +standard-minifier-js@1.2.3 tap:i18n@1.8.2 templating@1.3.0 templating-compiler@1.3.0 diff --git a/packages/rocketchat-livechat/app/i18n/de.i18n.json b/packages/rocketchat-livechat/app/i18n/de.i18n.json index 645e8cf8808b..9519e0d50b35 100644 --- a/packages/rocketchat-livechat/app/i18n/de.i18n.json +++ b/packages/rocketchat-livechat/app/i18n/de.i18n.json @@ -18,7 +18,7 @@ "Please_answer_survey": "Bitte nehmen Sie sich einen Moment Zeit, um kurz einige Fragen zu dem Gespräch zu beantworten.", "Please_fill_name_and_email": "Bitte geben Sie einen Namen und eine E-Mail-Adresse ein.", "Powered_by": "Unterstützt von", - "Request_video_chat": "Video Chat anfragen", + "Request_video_chat": "Video-Chat anfragen", "Select_a_department": "Abteilung auswählen", "Send": "Senden", "Skip": "Überspringen", diff --git a/packages/rocketchat-livechat/app/i18n/it.i18n.json b/packages/rocketchat-livechat/app/i18n/it.i18n.json index 1cb1fb120959..330e89f9a3d5 100644 --- a/packages/rocketchat-livechat/app/i18n/it.i18n.json +++ b/packages/rocketchat-livechat/app/i18n/it.i18n.json @@ -18,6 +18,7 @@ "Please_answer_survey": "Hai un momento per rispondere a un rapido sondaggio su questa chat?", "Please_fill_name_and_email": "Compila nome e indirizzo e-mail", "Powered_by": "Powered by", + "Request_video_chat": "Richiedi video chat", "Select_a_department": "Seleziona un reparto", "Send": "Invia", "Skip": "Salta", @@ -26,6 +27,7 @@ "Survey_instructions": "Vota ogni domanda secondo la tua soddisfazione, 1 significa che sei completamente insoddisfatto e 5 significa che sei completamente soddisfatto.", "Thank_you_for_your_feedback": "Grazie per il tuo feedback", "Thanks_We_ll_get_back_to_you_soon": "Grazie! Torneremo al più presto.", + "transcript_sent": "Invio trascrizione", "Type_your_email": "Inserisci la tua e-mail", "Type_your_message": "Inserisci il tuo messaggio", "Type_your_name": "Scrivi il tuo nome", diff --git a/packages/rocketchat-livechat/app/i18n/ru.i18n.json b/packages/rocketchat-livechat/app/i18n/ru.i18n.json index f984033f3b22..1e3ece962134 100644 --- a/packages/rocketchat-livechat/app/i18n/ru.i18n.json +++ b/packages/rocketchat-livechat/app/i18n/ru.i18n.json @@ -15,7 +15,7 @@ "New_messages": "Новые сообщения", "No": "Нет", "Options": "Параметры", - "Please_answer_survey": "Пожалуйста, уделите минуту для того, чтобы ответить на несколько вопросов об этом чате", + "Please_answer_survey": "Пожалуйста, уделите время, чтобы ответить на несколько вопросов об этом чате", "Please_fill_name_and_email": "Введите имя и электронный адрес", "Powered_by": "Представлен", "Request_video_chat": "Запрос чата с видео", @@ -27,11 +27,14 @@ "Survey_instructions": "Оцените каждый вопрос по 5-балльной шкале, где 1 означает, что Вы совсем недовольны, и 5 - полностью довольны.", "Thank_you_for_your_feedback": "Спасибо за Ваш отзыв", "Thanks_We_ll_get_back_to_you_soon": "Спасибо! Мы свяжемся с вами в ближайшее время.", + "transcript_sent": "Расшифровка отправлена", "Type_your_email": "Введите адрес электронной почты", "Type_your_message": "Текст сообщения", "Type_your_name": "Введите свое имя", "User_joined": "Пользователь присоединился", - "User_left": "слева Пользователь", + "User_left": "Пользователь вышел", "We_are_offline_Sorry_for_the_inconvenience": "Мы не в сети. Извините за доставленные неудобства.", + "Yes": "Да", + "You": "Вы", "You_must_complete_all_fields": "Вы должны заполнить все поля" } \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/i18n/sv.i18n.json b/packages/rocketchat-livechat/app/i18n/sv.i18n.json index e1aacc1dfac4..e3e2365c21a7 100644 --- a/packages/rocketchat-livechat/app/i18n/sv.i18n.json +++ b/packages/rocketchat-livechat/app/i18n/sv.i18n.json @@ -1,33 +1,40 @@ { "Additional_Feedback": "Ytterligare feedback", "Appearance": "Utseende", + "Are_you_sure_do_you_want_end_this_chat": "Är du säker på att du vill avsluta denna chatt?", "Cancel": "Avbryt", + "Chat_ended": "Chatten avslutad!", "Close_menu": "Stäng meny", - "Conversation_finished": "konversation klar", + "Conversation_finished": "Konversation avslutad", "End_chat": "Avsluta chatt", - "How_friendly_was_the_chat_agent": "Hur vänlig var chattagenten?", + "How_friendly_was_the_chat_agent": "Hur användarvänlig var chattagenten?", "How_knowledgeable_was_the_chat_agent": "Hur kunnig var chattagenten?", - "How_responsive_was_the_chat_agent": "Hur reagerar var chattagenten?", - "How_satisfied_were_you_with_this_chat": "Hur nöjd var du med chatten?", + "How_responsive_was_the_chat_agent": "Hur mottaglig var chattagenten?", + "How_satisfied_were_you_with_this_chat": "Hur nöjd blev du med denna chatt?", "Installation": "Installation", "New_messages": "Nya meddelanden", "No": "Nej", + "Options": "Inställningar", "Please_answer_survey": "Vänligen ta en stund för att svara på en snabb enkät om chatten.", "Please_fill_name_and_email": "Vänligen fyll i namn och e-postadress", - "Powered_by": "powered by", + "Powered_by": "Drivs med hjälp av", + "Request_video_chat": "Begärd videochat", "Select_a_department": "Välj en avdelning", "Send": "Skicka", "Skip": "Hoppa över", "Start_Chat": "Starta chatt", "Survey": "Enkät", - "Survey_instructions": "Betygsätt varje fråga efter hur nöjd du är, 1 betyder att du inte alls är nöjd och 5 betyder att du är helt nöjd.\n", + "Survey_instructions": "Betygsätt varje fråga efter hur nöjd du är med svaret, 1 betyder att du inte alls är nöjd och 5 betyder att du är helt nöjd.\n", "Thank_you_for_your_feedback": "Tack för din feedback", - "Thanks_We_ll_get_back_to_you_soon": "Tack! Vi återkommer till dig snart.", + "Thanks_We_ll_get_back_to_you_soon": "Tack! Vi återkommer till dig så snart vi kan.", + "transcript_sent": "Kopia är skickad", "Type_your_email": "Skriv din e-post", "Type_your_message": "Skriv in ditt meddelande", "Type_your_name": "Skriv in ditt namn", - "User_joined": "user gick", - "User_left": "användaren vänster", - "We_are_offline_Sorry_for_the_inconvenience": "Vi är offline. Vi beklagar olägenheten. ", + "User_joined": "Användare ansluter", + "User_left": "Användare lämnade", + "We_are_offline_Sorry_for_the_inconvenience": "Vi är offline. Vi beklagar olägenheten.", + "Yes": "Ja", + "You": "Du", "You_must_complete_all_fields": "Du måste fylla i alla fält" } \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/i18n/uk.i18n.json b/packages/rocketchat-livechat/app/i18n/uk.i18n.json index 4b38c69a6663..b6a37e53980a 100644 --- a/packages/rocketchat-livechat/app/i18n/uk.i18n.json +++ b/packages/rocketchat-livechat/app/i18n/uk.i18n.json @@ -15,23 +15,26 @@ "New_messages": "Нові повідомлення", "No": "Ні", "Options": "Параметри", - "Please_answer_survey": "Будь ласка, знайдіть час, щоб відповісти на швидкий огляд про це чаті", + "Please_answer_survey": "Будь ласка, знайдіть час, щоб відповісти на декілька питань щодо цього чату", "Please_fill_name_and_email": "Заповніть, будь ласка, ім'я та адресу електронної пошти", - "Powered_by": "працює на", + "Powered_by": "За підтримки", "Request_video_chat": "Запит чату з відео", "Select_a_department": "Виберіть відділ", - "Send": "послати", - "Skip": "скакати", - "Start_Chat": "Почати Чат", - "Survey": "обстеження", + "Send": "Надіслати", + "Skip": "Пропустити", + "Start_Chat": "Розпочати чат", + "Survey": "Опитування", "Survey_instructions": "Оцінити кожне питання відповідно до ваших задоволення, 1 означає, що ви повністю незадоволеним і 5 означає, що ви повністю задоволені.", "Thank_you_for_your_feedback": "Спасибі за ваш відгук", "Thanks_We_ll_get_back_to_you_soon": "Дякую! Ми зв'яжемося з вами найближчим часом.", + "transcript_sent": "Транскрипцію відправлено", "Type_your_email": "Введіть адресу електронної пошти", "Type_your_message": "текст повідомлення", "Type_your_name": "Введіть ваше ім'я", "User_joined": "Користувач приєднався", - "User_left": "зліва Користувач", + "User_left": "Користувач вийшов", "We_are_offline_Sorry_for_the_inconvenience": "Ми в автономному режимі. Вибачте за незручності.", + "Yes": "Так", + "You": "Ви", "You_must_complete_all_fields": "Ви повинні заповнити всі поля" } \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/i18n/zh.i18n.json b/packages/rocketchat-livechat/app/i18n/zh.i18n.json index 72e63ec92346..1dd1d52b3833 100644 --- a/packages/rocketchat-livechat/app/i18n/zh.i18n.json +++ b/packages/rocketchat-livechat/app/i18n/zh.i18n.json @@ -18,6 +18,7 @@ "Please_answer_survey": "请花几分钟来反馈这次交谈的体验", "Please_fill_name_and_email": "请填写姓名和电子邮箱地址", "Powered_by": "提供:", + "Request_video_chat": "请求视频聊天", "Select_a_department": "请选择一个部门", "Send": "发送", "Skip": "跳过", @@ -26,6 +27,7 @@ "Survey_instructions": "请根据您的满意程度给每个问题打分,1 代表非常不满意,5 代表非常满意。", "Thank_you_for_your_feedback": "感谢您的反馈", "Thanks_We_ll_get_back_to_you_soon": "谢谢!我们会尽快回复您。", + "transcript_sent": "录音发送", "Type_your_email": "输入您的电子邮箱地址", "Type_your_message": "输入您的留言", "Type_your_name": "输入您的姓名", @@ -33,5 +35,6 @@ "User_left": "用户已离开", "We_are_offline_Sorry_for_the_inconvenience": "我们正处在离线状态。带来不便请您谅解。", "Yes": "是", + "You": "你", "You_must_complete_all_fields": "您必须填写所有字段" } \ No newline at end of file diff --git a/packages/rocketchat-livechat/app/package.json b/packages/rocketchat-livechat/app/package.json index 5a10e8c08dad..de148775e586 100644 --- a/packages/rocketchat-livechat/app/package.json +++ b/packages/rocketchat-livechat/app/package.json @@ -20,9 +20,9 @@ "email": "support@rocket.chat" }, "dependencies": { - "autolinker": "^1.4.0", + "autolinker": "^1.4.2", "jquery": "^3.1.1", - "babel-runtime": "^6.22.0", + "babel-runtime": "^6.23.0", "bcrypt": "^1.0.2", "moment": "^2.17.1", "toastr": "^2.1.2" diff --git a/packages/rocketchat-markdown/markdown.coffee b/packages/rocketchat-markdown/markdown.coffee index 66930593ccad..f4911d3f528c 100644 --- a/packages/rocketchat-markdown/markdown.coffee +++ b/packages/rocketchat-markdown/markdown.coffee @@ -18,17 +18,17 @@ class Markdown # Support ![alt text](http://image url) msg = msg.replace new RegExp("!\\[([^\\]]+)\\]\\(((?:#{schemes}):\\/\\/[^\\)]+)\\)", 'gm'), (match, title, url) -> target = if url.indexOf(Meteor.absoluteUrl()) is 0 then '' else '_blank' - return '
' + return '
' # Support [Text](http://link) msg = msg.replace new RegExp("\\[([^\\]]+)\\]\\(((?:#{schemes}):\\/\\/[^\\)]+)\\)", 'gm'), (match, title, url) -> target = if url.indexOf(Meteor.absoluteUrl()) is 0 then '' else '_blank' - return '' + title + '' + return '' + _.escapeHTML(title) + '' # Support msg = msg.replace new RegExp("(?:<|<)((?:#{schemes}):\\/\\/[^\\|]+)\\|(.+?)(?=>|>)(?:>|>)", 'gm'), (match, url, title) -> target = if url.indexOf(Meteor.absoluteUrl()) is 0 then '' else '_blank' - return '' + title + '' + return '' + _.escapeHTML(title) + '' if RocketChat.settings.get('Markdown_Headers') # Support # Text for h1 diff --git a/packages/rocketchat-markdown/markdowncode.coffee b/packages/rocketchat-markdown/markdowncode.coffee index d1b906b71e32..d1a9dc124b9f 100644 --- a/packages/rocketchat-markdown/markdowncode.coffee +++ b/packages/rocketchat-markdown/markdowncode.coffee @@ -25,6 +25,7 @@ class MarkdownCode message.tokens.push token: token text: "#{p1}`#{p2}`#{p3}" + noHtml: match return token @@ -41,7 +42,7 @@ class MarkdownCode message.msg = message.msg + "\n```" # Separate text in code blocks and non code blocks - msgParts = message.html.split(/^\s*(```(?:[a-zA-Z]+)?(?:(?:.|\n)*?)```)(?:\n)?$/gm) + msgParts = message.html.split(/(^.*)(```(?:[a-zA-Z]+)?(?:(?:.|\n)*?)```)(.*\n?)$/gm) for part, index in msgParts # Verify if this part is code @@ -72,6 +73,7 @@ class MarkdownCode highlight: true token: token text: "
```
" + result.value + "
```
" + noHtml: "```\n#{s.stripTags(result.value)}\n```" msgParts[index] = token else diff --git a/packages/rocketchat-message-attachments/client/messageAttachment.coffee b/packages/rocketchat-message-attachments/client/messageAttachment.coffee index 91f6211f680c..ce2997784c80 100644 --- a/packages/rocketchat-message-attachments/client/messageAttachment.coffee +++ b/packages/rocketchat-message-attachments/client/messageAttachment.coffee @@ -1,24 +1,26 @@ import moment from 'moment' -Template.messageAttachment.helpers - fixCordova: (url) -> - if url?.indexOf('data:image') is 0 - return url +fixCordova = (url) -> + if url?.indexOf('data:image') is 0 + return url - if Meteor.isCordova and url?[0] is '/' - url = Meteor.absoluteUrl().replace(/\/$/, '') + url - query = "rc_uid=#{Meteor.userId()}&rc_token=#{Meteor._localStorage.getItem('Meteor.loginToken')}" - if url.indexOf('?') is -1 - url = url + '?' + query - else - url = url + '&' + query - - if Meteor.settings.public.sandstorm or url.match /^(https?:)?\/\//i - return url - else if navigator.userAgent.indexOf('Electron') > -1 - return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url + if Meteor.isCordova and url?[0] is '/' + url = Meteor.absoluteUrl().replace(/\/$/, '') + url + query = "rc_uid=#{Meteor.userId()}&rc_token=#{Meteor._localStorage.getItem('Meteor.loginToken')}" + if url.indexOf('?') is -1 + url = url + '?' + query else - return Meteor.absoluteUrl().replace(/\/$/, '') + __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url + url = url + '&' + query + + if Meteor.settings.public.sandstorm or url.match /^(https?:)?\/\//i + return url + else if navigator.userAgent.indexOf('Electron') > -1 + return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url + else + return Meteor.absoluteUrl().replace(/\/$/, '') + __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + url + +Template.messageAttachment.helpers + fixCordova: fixCordova parsedText: -> renderMessageBody { msg: this.text } @@ -59,3 +61,18 @@ Template.messageAttachment.helpers injectIndex: (data, previousIndex, index) -> data.index = previousIndex + '.attachments.' + index return + + safeLoadImageAttachment: (url) -> + host = '' + url = fixCordova(url) + if url.indexOf("://") > -1 + host = url.split('/')[2] + else + host = url.split('/')[0] + + host = host.split(':')[0] + + if host != window.location.hostname + return '' + else + return url diff --git a/packages/rocketchat-message-attachments/client/messageAttachment.html b/packages/rocketchat-message-attachments/client/messageAttachment.html index 3e736f25e143..8951623c53d4 100644 --- a/packages/rocketchat-message-attachments/client/messageAttachment.html +++ b/packages/rocketchat-message-attachments/client/messageAttachment.html @@ -66,8 +66,8 @@
{{#if loadImage}}
-
- +
+
{{#if description}}
{{description}}
@@ -87,7 +87,7 @@ {{#unless collapsed}}
@@ -98,7 +98,7 @@ {{#unless collapsed}}
@@ -128,6 +128,12 @@ {{/unless}} {{/if}} + {{#unless image_url}} + {{#if description}} +
{{description}}
+ {{/if}} + {{/unless}} + {{#each attachments}} {{injectIndex . ../index @index}} {{> messageAttachment}} {{/each}} diff --git a/packages/rocketchat-oembed/server/jumpToMessage.js b/packages/rocketchat-oembed/server/jumpToMessage.js index f91854a2df40..0f674e461bfa 100644 --- a/packages/rocketchat-oembed/server/jumpToMessage.js +++ b/packages/rocketchat-oembed/server/jumpToMessage.js @@ -16,6 +16,7 @@ RocketChat.callbacks.add('beforeSaveMessage', (msg) => { msg.attachments = msg.attachments || []; msg.attachments.push({ 'text' : jumpToMessage.msg, + 'translations': jumpToMessage.translations, 'author_name' : jumpToMessage.u.username, 'author_icon' : getAvatarUrlFromUsername(jumpToMessage.u.username), 'message_link' : item.url, diff --git a/packages/rocketchat-piwik/client/loadScript.js b/packages/rocketchat-piwik/client/loadScript.js deleted file mode 100644 index 5c39be4e24bc..000000000000 --- a/packages/rocketchat-piwik/client/loadScript.js +++ /dev/null @@ -1,29 +0,0 @@ -Template.body.onRendered(() => { - Tracker.autorun((c) => { - const url = RocketChat.settings.get('PiwikAnalytics_url'); - const siteId = RocketChat.settings.get('PiwikAnalytics_siteId'); - - if (Match.test(url, String) && url.trim() !== '' && Match.test(siteId, String) && siteId.trim() !== '') { - c.stop(); - window._paq = window._paq || []; - if (Meteor.userId()) { - window._paq.push(['setUserId', Meteor.userId()]); - } - - window._paq.push(['trackPageView']); - window._paq.push(['enableLinkTracking']); - (() => { - window._paq.push(['setTrackerUrl', url + 'piwik.php']); - window._paq.push(['setSiteId', Number.parseInt(siteId)]); - const d = document; - const g = d.createElement('script'); - const s = d.getElementsByTagName('script')[0]; - g.type = 'text/javascript'; - g.async = true; - g.defer = true; - g.src = url + 'piwik.js'; - s.parentNode.insertBefore(g, s); - })(); - } - }); -}); diff --git a/packages/rocketchat-piwik/client/trackEvents.js b/packages/rocketchat-piwik/client/trackEvents.js deleted file mode 100644 index cd66c66251c1..000000000000 --- a/packages/rocketchat-piwik/client/trackEvents.js +++ /dev/null @@ -1,126 +0,0 @@ -//Trigger the trackPageView manually as the page views don't seem to be tracked -FlowRouter.triggers.enter([(route) => { - if (window._paq) { - const http = location.protocol; - const slashes = http.concat('//'); - const host = slashes.concat(window.location.hostname); - - window._paq.push(['setCustomUrl', host + route.path]); - window._paq.push(['trackPageView']); - } -}]); - -//Login page has manual switches -RocketChat.callbacks.add('loginPageStateChange', (state) => { - if (window._paq) { - window._paq.push(['trackEvent', 'Navigation', 'Login Page State Change', state]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-login-state-change'); - -//Messsages -RocketChat.callbacks.add('afterSaveMessage', (message) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_messages')) { - const room = ChatRoom.findOne({ _id: message.rid }); - window._paq.push(['trackEvent', 'Message', 'Send', room.name + ' (' + room._id + ')' ]); - } -}, 2000, 'trackEvents'); - -//Rooms -RocketChat.callbacks.add('afterCreateChannel', (owner, room) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { - window._paq.push(['trackEvent', 'Room', 'Create', room.name + ' (' + room._id + ')' ]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-after-create-channel'); - -RocketChat.callbacks.add('roomNameChanged', (room) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { - window._paq.push(['trackEvent', 'Room', 'Changed Name', room.name + ' (' + room._id + ')' ]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-room-name-changed'); - -RocketChat.callbacks.add('roomTopicChanged', (room) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { - window._paq.push(['trackEvent', 'Room', 'Changed Topic', room.name + ' (' + room._id + ')' ]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-room-topic-changed'); - -RocketChat.callbacks.add('roomTypeChanged', (room) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { - window._paq.push(['trackEvent', 'Room', 'Changed Room Type', room.name + ' (' + room._id + ')' ]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-room-type-changed'); - -RocketChat.callbacks.add('archiveRoom', (room) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { - window._paq.push(['trackEvent', 'Room', 'Archived', room.name + ' (' + room._id + ')' ]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-archive-room'); - -RocketChat.callbacks.add('unarchiveRoom', (room) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_rooms')) { - window._paq.push(['trackEvent', 'Room', 'Unarchived', room.name + ' (' + room._id + ')' ]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-unarchive-room'); - -//Users -//Track logins and associate user ids with piwik -(() => { - let oldUserId = null; - - Meteor.autorun(() => { - const newUserId = Meteor.userId(); - if (oldUserId === null && newUserId) { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Login', newUserId ]); - window._paq.push(['setUserId', newUserId]); - } - } else if (newUserId === null && oldUserId) { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Logout', oldUserId ]); - } - } - oldUserId = Meteor.userId(); - }); -})(); - -RocketChat.callbacks.add('userRegistered', () => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Registered']); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-resitered'); - -RocketChat.callbacks.add('usernameSet', () => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Username Set']); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piweik-username-set'); - -RocketChat.callbacks.add('userPasswordReset', () => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Reset Password']); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-password-reset'); - -RocketChat.callbacks.add('userConfirmationEmailRequested', () => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Confirmation Email Requested']); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-confirmation-email-requested'); - -RocketChat.callbacks.add('userForgotPasswordEmailRequested', () => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Forgot Password Email Requested']); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-forgot-password-email-requested'); - -RocketChat.callbacks.add('userStatusManuallySet', (status) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Status Manually Changed', status]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-status-manually-set'); - -RocketChat.callbacks.add('userAvatarSet', (service) => { - if (window._paq && RocketChat.settings.get('PiwikAnalytics_features_users')) { - window._paq.push(['trackEvent', 'User', 'Avatar Changed', service]); - } -}, RocketChat.callbacks.priority.MEDIUM, 'piwik-user-avatar-set'); diff --git a/packages/rocketchat-piwik/server/settings.js b/packages/rocketchat-piwik/server/settings.js deleted file mode 100644 index eb6e96f9655d..000000000000 --- a/packages/rocketchat-piwik/server/settings.js +++ /dev/null @@ -1,33 +0,0 @@ -RocketChat.settings.addGroup('Piwik', function addSettings() { - this.add('PiwikAnalytics_url', '', { - type: 'string', - public: true, - i18nLabel: 'URL' - }); - this.add('PiwikAnalytics_siteId', '', { - type: 'string', - public: true, - i18nLabel: 'Client_ID' - }); - - this.section('Analytics_features_enabled', function addFeaturesEnabledSettings() { - this.add('PiwikAnalytics_features_messages', true, { - type: 'boolean', - public: true, - i18nLabel: 'Messages', - i18nDescription: 'Analytics_features_messages_Description' - }); - this.add('PiwikAnalytics_features_rooms', true, { - type: 'boolean', - public: true, - i18nLabel: 'Rooms', - i18nDescription: 'Analytics_features_rooms_Description' - }); - this.add('PiwikAnalytics_features_users', true, { - type: 'boolean', - public: true, - i18nLabel: 'Users', - i18nDescription: 'Analytics_features_users_Description' - }); - }); -}); diff --git a/packages/rocketchat-slashcommands-open/client.js b/packages/rocketchat-slashcommands-open/client.js index 10d74e9b2f0e..35f116b70f7e 100644 --- a/packages/rocketchat-slashcommands-open/client.js +++ b/packages/rocketchat-slashcommands-open/client.js @@ -1,29 +1,45 @@ -function Open(command, params/*, item*/) { +function Open(command, params /*, item*/) { + const dict = { + '#': ['c', 'p'], + '@': ['d'] + }; var room, subscription, type; + if (command !== 'open' || !Match.test(params, String)) { return; } + room = params.trim(); - if (room.indexOf('#') !== -1) { - type = 'c'; - } - if (room.indexOf('@') !== -1) { - type = 'd'; - } - room = room.replace('#', ''); - room = room.replace('@', ''); + type = dict[room[0]]; + room = room.replace(/#|@/, ''); var query = { name: room }; + if (type) { - query['t'] = type; + query['t'] = { + $in: type + }; } + subscription = ChatSubscription.findOne(query); if (subscription) { RocketChat.roomTypes.openRouteLink(subscription.t, subscription, FlowRouter.current().queryParams); } + + if (type && type.indexOf('d') === -1) { + return; + } + return Meteor.call('createDirectMessage', room, function(err) { + if (err) { + return; + } + subscription = RocketChat.models.Subscriptions.findOne(query); + RocketChat.roomTypes.openRouteLink(subscription.t, subscription, FlowRouter.current().queryParams); + }); + } RocketChat.slashCommands.add('open', Open, { diff --git a/packages/rocketchat-theme/client/imports/base.less b/packages/rocketchat-theme/client/imports/base.less index 3f8245affb48..43c592daf016 100644 --- a/packages/rocketchat-theme/client/imports/base.less +++ b/packages/rocketchat-theme/client/imports/base.less @@ -491,6 +491,46 @@ blockquote { } } +@-ms-keyframes spinh { + from { + -ms-transform: rotateY(0deg); + } + + to { + -ms-transform: rotateY(360deg); + } +} + +@-moz-keyframes spinh { + from { + -moz-transform: rotateY(0deg); + } + + to { + -moz-transform: rotateY(360deg); + } +} + +@-webkit-keyframes spinh { + from { + -webkit-transform: rotateY(0deg); + } + + to { + -webkit-transform: rotateY(360deg); + } +} + +@keyframes spinh { + from { + transform: rotateY(0deg); + } + + to { + transform: rotateY(360deg); + } +} + .rocket-h2 { font-weight: 300; text-transform: uppercase; @@ -528,6 +568,7 @@ body { height: 100%; width: 100%; -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; line-height: 1rem; padding: 0; overflow: visible; @@ -1634,6 +1675,7 @@ label.required::after { right: 0; opacity: 0; transition: opacity 0.3s; + cursor: pointer; } .toolbar-search__input { diff --git a/packages/rocketchat-theme/client/vendor/fontello/fontello.json b/packages/rocketchat-theme/client/vendor/fontello/config.json old mode 100644 new mode 100755 similarity index 99% rename from packages/rocketchat-theme/client/vendor/fontello/fontello.json rename to packages/rocketchat-theme/client/vendor/fontello/config.json index a4a8cd6b4f0d..028546a2db7c --- a/packages/rocketchat-theme/client/vendor/fontello/fontello.json +++ b/packages/rocketchat-theme/client/vendor/fontello/config.json @@ -3364,6 +3364,12 @@ "code": 59662, "src": "elusive" }, + { + "uid": "ddecf5ad7935e3fb1b70dac6ed00d06a", + "css": "language", + "code": 59485, + "src": "entypo" + }, { "uid": "f432b9f55739671544012445f7c5b715", "css": "bug-1", @@ -5297,4 +5303,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/packages/rocketchat-theme/client/vendor/fontello/css/fontello.css b/packages/rocketchat-theme/client/vendor/fontello/css/fontello.css index 3da0e897da43..0caceef9127f 100755 --- a/packages/rocketchat-theme/client/vendor/fontello/css/fontello.css +++ b/packages/rocketchat-theme/client/vendor/fontello/css/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?90843248'); - src: url('../font/fontello.eot?90843248#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?90843248') format('woff2'), - url('../font/fontello.woff?90843248') format('woff'), - url('../font/fontello.ttf?90843248') format('truetype'), - url('../font/fontello.svg?90843248#fontello') format('svg'); + src: url('../font/fontello.eot?9377982'); + src: url('../font/fontello.eot?9377982#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?9377982') format('woff2'), + url('../font/fontello.woff?9377982') format('woff'), + url('../font/fontello.ttf?9377982') format('truetype'), + url('../font/fontello.svg?9377982#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,46 +15,46 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?90843248#fontello') format('svg'); + src: url('../font/fontello.svg?9377982#fontello') format('svg'); } } */ - + [class^="icon-"]:before, [class*=" icon-"]:before { font-family: "fontello"; font-style: normal; font-weight: normal; speak: none; - + display: inline-block; text-decoration: inherit; width: 1em; margin-right: .2em; text-align: center; /* opacity: .8; */ - + /* For safety - reset parent styles, that can break glyph codes*/ font-variant: normal; text-transform: none; - + /* fix buttons height, for twitter bootstrap */ line-height: 1em; - + /* Animation center compensation - margins should be symmetric */ /* remove if not needed */ margin-left: .2em; - + /* you can be more comfortable with increased icons size */ /* font-size: 120%; */ - + /* Font smoothing. That was taken from TWBS */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - + /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } - + .icon-parking:before { content: '\21'; } /* '!' */ .icon-bedroom:before { content: '\22'; } /* '"' */ .icon-elevator:before { content: '\23'; } /* '#' */ @@ -256,6 +256,7 @@ .icon-download:before { content: '\e85a'; } /* '' */ .icon-angle-up:before { content: '\e85b'; } /* '' */ .icon-angle-down:before { content: '\e85c'; } /* '' */ +.icon-language:before { content: '\e85d'; } /* '' */ .icon-angle-circled-up:before { content: '\e85f'; } /* '' */ .icon-angle-circled-down:before { content: '\e860'; } /* '' */ .icon-angle-double-up:before { content: '\e863'; } /* '' */ @@ -539,4 +540,4 @@ .icon-markdown:before { content: '\e98c'; } /* '' */ .icon-no-newline:before { content: '\e98d'; } /* '' */ .icon-tools:before { content: '\e98e'; } /* '' */ -.icon-tape:before { content: '\e98f'; } /* '' */ +.icon-tape:before { content: '\e98f'; } /* '' */ \ No newline at end of file diff --git a/packages/rocketchat-theme/client/vendor/fontello/demo.html b/packages/rocketchat-theme/client/vendor/fontello/demo.html old mode 100644 new mode 100755 index 1247bdf23e33..8632c76fc332 --- a/packages/rocketchat-theme/client/vendor/fontello/demo.html +++ b/packages/rocketchat-theme/client/vendor/fontello/demo.html @@ -229,50 +229,51 @@ } @font-face { font-family: 'fontello'; - src: url('./font/fontello.eot?87518418'); - src: url('./font/fontello.eot?87518418#iefix') format('embedded-opentype'), - url('./font/fontello.woff?87518418') format('woff'), - url('./font/fontello.ttf?87518418') format('truetype'); + src: url('./font/fontello.eot?94898178'); + src: url('./font/fontello.eot?94898178#iefix') format('embedded-opentype'), + url('./font/fontello.woff?94898178') format('woff'), + url('./font/fontello.ttf?94898178') format('truetype'), + url('./font/fontello.svg?94898178#fontello') format('svg'); font-weight: normal; font-style: normal; } .rtl .demo-icon { direction: rtl; } - - + + .demo-icon { font-family: "fontello"; font-style: normal; font-weight: normal; speak: none; - + display: inline-block; text-decoration: inherit; width: 1em; margin-right: .2em; text-align: center; /* opacity: .8; */ - + /* For safety - reset parent styles, that can break glyph codes*/ font-variant: normal; text-transform: none; - + /* fix buttons height, for twitter bootstrap */ line-height: 1em; - + /* Animation center compensation - margins should be symmetric */ /* remove if not needed */ margin-left: .2em; - + /* You can be more comfortable with increased icons size */ /* font-size: 120%; */ - + /* Font smoothing. That was taken from TWBS */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - + /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } @@ -281,14 +282,14 @@