diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 34cd366029d..31559300b18 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -10,6 +10,11 @@ on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
+ inputs:
+ custom_tag:
+ description: 'Custom Docker tag (optional)'
+ required: false
+ default: ''
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
@@ -74,7 +79,7 @@ jobs:
- 27017:27017
container:
- image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }}
+ image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }}
env:
COUNTLY_CONFIG__MONGODB_HOST: mongodb
COUNTLY_CONFIG_API_PREVENT_JOBS: true
@@ -131,7 +136,7 @@ jobs:
- 27017:27017
container:
- image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }}
+ image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }}
env:
COUNTLY_CONFIG__MONGODB_HOST: mongodb
COUNTLY_CONFIG_API_PREVENT_JOBS: true
@@ -178,7 +183,7 @@ jobs:
- 27017:27017
container:
- image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }}
+ image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }}
env:
COUNTLY_CONFIG__MONGODB_HOST: mongodb
COUNTLY_CONFIG_API_PREVENT_JOBS: true
@@ -231,7 +236,7 @@ jobs:
- 27017:27017
container:
- image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }}
+ image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }}
env:
COUNTLY_CONFIG__MONGODB_HOST: mongodb
COUNTLY_CONFIG_API_PREVENT_JOBS: true
@@ -281,7 +286,8 @@ jobs:
/sbin/my_init &
cd ui-tests
npm install
- npm run cy:run:dashboard
+ xvfb-run --auto-servernum --server-args="-screen 0 1280x1024x24" \
+ npm run cy:run:dashboard --headless --no-sandbox --disable-gpu --disable-dev-shm-usage
- name: Upload UI tests artifacts
if: ${{ failure() }}
@@ -308,7 +314,7 @@ jobs:
- 27017:27017
container:
- image: countly/countly-core:pipelines-${{ github.base_ref || github.ref_name }}
+ image: countly/countly-core:pipelines-${{ inputs.custom_tag || github.base_ref || github.ref_name }}
env:
COUNTLY_CONFIG__MONGODB_HOST: mongodb
COUNTLY_CONFIG_API_PREVENT_JOBS: true
@@ -354,7 +360,8 @@ jobs:
/sbin/my_init &
cd ui-tests
npm install
- npm run cy:run:onboarding
+ xvfb-run --auto-servernum --server-args="-screen 0 1280x1024x24" \
+ npm run cy:run:onboarding --headless --no-sandbox --disable-gpu --disable-dev-shm-usage
- name: Upload UI tests artifacts
if: ${{ failure() }}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 36dcdeee31c..1fdd164de52 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,41 @@
+## Version 24.05.XX
+Fixes:
+- [script] Fixing bug with "delete_old_members" script that led to malformed requests
+
+## Version 24.05.17
+Fixes:
+- [push] Improved ability to observe push related errors
+
+Enterprise fixes:
+- [cohorts] Fixed issues with nightly cleanup
+- [data-manager] Fixed UI bug where rules were not visible when editing "Merge by regex" transformations
+- [drill] Fixed wrong pie chart label tooltip in dashboard widget
+- [flows] Fixed bug in case of null data in schema
+- [nps] Fixed bug in the editor where the "internal name" field was not mandatory
+- [ratings] Fixed UI bug where "Internal name" was not a mandatory field
+
+Security:
+- Fixing minor vulnerability that would allow for unauthorized file upload
+
+Enterprise Features:
+- [block] Added a way to filter crashes by their error (stacktrace)
+
+## Version 24.05.16
+Fixes:
+- [core] Replaced "Users" with "Sessions" label on technology home widgets
+- [push] Replaced push plugin with an earlier version of the plugin
+
+Enterprise fixes:
+- [license] Fixed bug with MAU type of licenses that would prevent the server from starting
+- [nps] Fixed bug where it was possible to submit empty nps surveys
+- [ratings] Fixed bug with user consent
+
+Security:
+- Bumped cookie-parser from 1.4.6 to 1.4.7
+- Bumped express-rate-limit from 7.4.0 to 7.4.1
+- Bumped moment-timezone from 0.5.45 to 0.5.46
+- Bumped sass from 1.79.3 to 1.79.4
+
## Version 24.05.15
Enterprise fixes:
- [nps] Fixed UI issues in the widget editor related to the "user consent" section
diff --git a/bin/scripts/expire-data/delete_custom_events_regex.js b/bin/scripts/expire-data/delete_custom_events_regex.js
index 569d19f1a1b..097ccfcea70 100755
--- a/bin/scripts/expire-data/delete_custom_events_regex.js
+++ b/bin/scripts/expire-data/delete_custom_events_regex.js
@@ -6,7 +6,6 @@
*/
-const { ObjectId } = require('mongodb');
const pluginManager = require('../../../plugins/pluginManager.js');
const common = require('../../../api/utils/common.js');
const drillCommon = require('../../../plugins/drill/api/common.js');
@@ -25,7 +24,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
//GET APP
try {
- const app = await countlyDb.collection("apps").findOne({_id: ObjectId(APP_ID)}, {_id: 1, name: 1});
+ const app = await countlyDb.collection("apps").findOne({_id: countlyDb.ObjectID(APP_ID)}, {_id: 1, name: 1});
console.log("App:", app.name);
//GET EVENTS
var events = [];
@@ -51,6 +50,27 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
}
]).toArray();
events = events.length ? events[0].list : [];
+ const metaEvents = await drillDb.collection("drill_meta").aggregate([
+ {
+ $match: {
+ 'app_id': app._id + "",
+ "type": "e",
+ "e": { $regex: regex, $options: CASE_INSENSITIVE ? "i" : "", $nin: events }
+ }
+ },
+ {
+ $group: {
+ _id: "$e"
+ }
+ },
+ {
+ $project: {
+ _id: 0,
+ e: "$_id"
+ }
+ }
+ ]).toArray();
+ events = events.concat(metaEvents.map(e => e.e));
}
catch (err) {
close("Invalid regex");
@@ -86,6 +106,7 @@ Promise.all([pluginManager.dbConnection("countly"), pluginManager.dbConnection("
close(err);
}
+
async function deleteDrillEvents(appId, events) {
for (let i = 0; i < events.length; i++) {
var collectionName = drillCommon.getCollectionName(events[i], appId);
diff --git a/bin/scripts/member-managament/delete_old_members.js b/bin/scripts/member-managament/delete_old_members.js
index 6dee1d7624d..a52639e79f9 100644
--- a/bin/scripts/member-managament/delete_old_members.js
+++ b/bin/scripts/member-managament/delete_old_members.js
@@ -44,7 +44,7 @@ Promise.all([pluginManager.dbConnection("countly")]).spread(function(countlyDb)
Url: SERVER_URL + "/i/users/delete",
body: {
api_key: API_KEY,
- args: JSON.stringify({user_ids: [(data._id + "")]})
+ args: {user_ids: [data._id + ""]}
}
}, function(data) {
if (data.err) {
@@ -99,8 +99,7 @@ function sendRequest(params, callback) {
const options = {
uri: url.href,
method: params.requestType,
- json: true,
- body: body,
+ json: body,
strictSSL: false
};
diff --git a/frontend/express/app.js b/frontend/express/app.js
index 06f9b736362..110daa7830a 100644
--- a/frontend/express/app.js
+++ b/frontend/express/app.js
@@ -603,6 +603,10 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_
app.use(function(req, res, next) {
var contentType = req.headers['content-type'];
if (req.method.toLowerCase() === 'post' && contentType && contentType.indexOf('multipart/form-data') >= 0) {
+ if (!req.session?.uid || Date.now() > req.session?.expires) {
+ res.status(401).send('Unauthorized');
+ return;
+ }
var form = new formidable.IncomingForm();
form.uploadDir = __dirname + '/uploads';
form.parse(req, function(err, fields, files) {
diff --git a/frontend/express/public/core/device-and-type/templates/technologyHomeWidget.html b/frontend/express/public/core/device-and-type/templates/technologyHomeWidget.html
index b13a501176d..5d382fa24be 100644
--- a/frontend/express/public/core/device-and-type/templates/technologyHomeWidget.html
+++ b/frontend/express/public/core/device-and-type/templates/technologyHomeWidget.html
@@ -12,7 +12,7 @@
{{item2.name}}
-
{{formatNumber(item2.value)}} {{item2.value > 1 ? 'Users' : 'User'}} | {{item2.percent}}%
+
{{formatNumber(item2.value)}} {{item2.value > 1 ? i18n('common.sessions') : i18n('common.session')}} | {{item2.percent}}%
diff --git a/frontend/express/public/localization/dashboard/dashboard.properties b/frontend/express/public/localization/dashboard/dashboard.properties
index 0e01ef0f2e8..e883c6e7d59 100644
--- a/frontend/express/public/localization/dashboard/dashboard.properties
+++ b/frontend/express/public/localization/dashboard/dashboard.properties
@@ -255,6 +255,8 @@ common.selected-with-count ={0} Selected
common.selected = Selected
common.select-all-with-count = Select all {0}
common.deselect = Deselect
+common.session = Session
+common.sessions = Sessions
#vue
common.undo = Undo
diff --git a/package-lock.json b/package-lock.json
index 4d244dc4777..e6e2992e34f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,7 +17,7 @@
"bunyan": "1.8.15",
"colors": "1.4.0",
"connect-flash": "0.1.1",
- "cookie-parser": "1.4.6",
+ "cookie-parser": "1.4.7",
"countly-request": "file:api/utils/countly-request",
"countly-root": "file:api/utils/countly-root",
"countly-sdk-nodejs": "*",
@@ -27,7 +27,7 @@
"ejs": "3.1.10",
"errorhandler": "1.5.1",
"express": "4.21.0",
- "express-rate-limit": "7.4.0",
+ "express-rate-limit": "7.4.1",
"express-session": "1.18.0",
"form-data": "^4.0.0",
"formidable": "2.1.1",
@@ -52,7 +52,7 @@
"mcc-mnc-list": "1.1.11",
"method-override": "3.0.0",
"moment": "2.30.1",
- "moment-timezone": "0.5.45",
+ "moment-timezone": "0.5.46",
"mongodb": "4.9.1",
"nginx-conf": "2.1.0",
"nodemailer": "6.9.15",
@@ -60,7 +60,7 @@
"offline-geocoder": "git+https://github.com/Countly/offline-geocoder.git",
"properties-parser": "0.6.0",
"puppeteer": "17.1.3",
- "sass": "1.79.3",
+ "sass": "1.79.4",
"tslib": "^2.6.3",
"uglify-js": "3.19.3",
"underscore": "1.13.7",
@@ -3554,21 +3554,19 @@
"license": "MIT"
},
"node_modules/cookie": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
- "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
- "license": "MIT",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-parser": {
- "version": "1.4.6",
- "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
- "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
- "license": "MIT",
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
+ "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
"dependencies": {
- "cookie": "0.4.1",
+ "cookie": "0.7.2",
"cookie-signature": "1.0.6"
},
"engines": {
@@ -4759,10 +4757,9 @@
}
},
"node_modules/express-rate-limit": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.4.0.tgz",
- "integrity": "sha512-v1204w3cXu5gCDmAvgvzI6qjzZzoMWKnyVDk3ACgfswTQLYiGen+r8w0VnXnGMmzEN/g8fwIQ4JrFFd4ZP6ssg==",
- "license": "MIT",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.4.1.tgz",
+ "integrity": "sha512-KS3efpnpIDVIXopMc65EMbWbUht7qvTCdtCR2dD/IZmi9MIkopYESwyRqLgv8Pfu589+KqDqOdzJWW7AHoACeg==",
"engines": {
"node": ">= 16"
},
@@ -8739,10 +8736,9 @@
}
},
"node_modules/moment-timezone": {
- "version": "0.5.45",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz",
- "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==",
- "license": "MIT",
+ "version": "0.5.46",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz",
+ "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==",
"dependencies": {
"moment": "^2.29.4"
},
@@ -10758,9 +10754,9 @@
}
},
"node_modules/sass": {
- "version": "1.79.3",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.3.tgz",
- "integrity": "sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==",
+ "version": "1.79.4",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz",
+ "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==",
"dependencies": {
"chokidar": "^4.0.0",
"immutable": "^4.0.0",
diff --git a/package.json b/package.json
index c39b17645c3..fc64d85e593 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
"bunyan": "1.8.15",
"colors": "1.4.0",
"connect-flash": "0.1.1",
- "cookie-parser": "1.4.6",
+ "cookie-parser": "1.4.7",
"countly-request": "file:api/utils/countly-request",
"countly-root": "file:api/utils/countly-root",
"countly-sdk-nodejs": "*",
@@ -50,7 +50,7 @@
"ejs": "3.1.10",
"errorhandler": "1.5.1",
"express": "4.21.0",
- "express-rate-limit": "7.4.0",
+ "express-rate-limit": "7.4.1",
"express-session": "1.18.0",
"form-data": "^4.0.0",
"formidable": "2.1.1",
@@ -75,7 +75,7 @@
"mcc-mnc-list": "1.1.11",
"method-override": "3.0.0",
"moment": "2.30.1",
- "moment-timezone": "0.5.45",
+ "moment-timezone": "0.5.46",
"mongodb": "4.9.1",
"nginx-conf": "2.1.0",
"nodemailer": "6.9.15",
@@ -83,7 +83,7 @@
"offline-geocoder": "git+https://github.com/Countly/offline-geocoder.git",
"properties-parser": "0.6.0",
"puppeteer": "17.1.3",
- "sass": "1.79.3",
+ "sass": "1.79.4",
"tslib": "^2.6.3",
"uglify-js": "3.19.3",
"underscore": "1.13.7",
diff --git a/plugins/data-manager/frontend/public/javascripts/countly.views.js b/plugins/data-manager/frontend/public/javascripts/countly.views.js
index fff2cd5f1c3..ef5f22390e2 100644
--- a/plugins/data-manager/frontend/public/javascripts/countly.views.js
+++ b/plugins/data-manager/frontend/public/javascripts/countly.views.js
@@ -1131,11 +1131,12 @@
}
if (doc.actionType === 'EVENT_MERGE' && doc.isRegexMerge === true) {
doc.actionType = 'merge-regex';
+ doc.eventTransformTargetRegex = doc.transformTarget[0];
}
else {
doc.actionType = doc.actionType.split('_')[1].toLowerCase();
}
- doc.isExistingEvent = 'true';
+ doc.isExistingEvent = doc.isExistingEvent ? 'true' : 'false';
// doc.tab;
// delete doc.transformType;
doc.name = countlyCommon.unescapeHtml(doc.name);
diff --git a/plugins/push/README.md b/plugins/push/README.md
new file mode 100644
index 00000000000..de8cb512cc7
--- /dev/null
+++ b/plugins/push/README.md
@@ -0,0 +1,12 @@
+# Countly Push Plugin
+
+These URLs need to be accessible by the Countly instance:
+
+- for Android:
+ - fcm.googleapis.com
+ - accounts.google.com
+- for IOS:
+ - api.development.push.apple.com
+ - api.push.apple.com
+- for Huawei
+ - push-api.cloud.huawei.com
diff --git a/plugins/push/api/api-drill.js b/plugins/push/api/api-drill.js
index 67d5b5db4ca..1dd8f27e279 100644
--- a/plugins/push/api/api-drill.js
+++ b/plugins/push/api/api-drill.js
@@ -1,7 +1,6 @@
const common = require('../../../api/utils/common'),
countlyCommon = require('../../../api/lib/countly.common.js'),
- log = common.log('push:api:drill'),
- { FIELDS_TITLES } = require('./send/platforms');
+ log = common.log('push:api:drill');
module.exports.drillAddPushEvents = ({uid, params, events, event}) => {
return new Promise((res, rej) => {
@@ -95,190 +94,59 @@ function messageQuery(message) {
}
}
-/**
- * Find messages using particular query and return ids
- *
- * @param {object} q message collection query
- * @returns {String[]} array of message ids
- */
-async function find(q) {
- let ids = await common.db.collection('messages').find(q, {projection: {_id: 1}}).toArray();
- ids = (ids || []).map(id => id._id.toString());
- return ids.length ? ids : ['nope'];
-}
-
-const toIdsMappers = {
- 'message.name': (query, app_id) => find({app: common.db.ObjectID(app_id), 'info.title': query}),
- 'message.title': (query, app_id) => find({app: common.db.ObjectID(app_id), 'contents.title': query}),
- 'message.message': (query, app_id) => find({app: common.db.ObjectID(app_id), 'contents.message': query}),
-};
-
-module.exports.drillPreprocessQuery = async function({query, params}) {
- if (query && params && params.qstring && params.qstring.event === '[CLY]_push_action') {
- if (query.$or) {
- for (let i = 0; i < query.$or.length; i++) {
- let q = query.$or[i];
- for (let k in q) {
- if (toIdsMappers[k]) {
- let ids = await toIdsMappers[k](q[k], params.app_id);
- log.d(`replaced query.$or[${i}] (%j) with %j`, query.$or[i], {'sg.i': {$in: ids}});
- query.$or[i] = {
- 'sg.i': {$in: ids}
- };
- }
- }
+module.exports.drillPreprocessQuery = ({query, params}) => {
+ if (query) {
+ if (query.push) {
+ if (query.push.$nin) {
+ query.$and = query.push.$nin.map(tk => {
+ return {$or: [{[tk]: false}, {[tk]: {$exists: false}}]};
+ });
}
- }
- for (let k in query) {
- if (toIdsMappers[k]) {
- let ids = await toIdsMappers[k](query[k], params.app_id);
- if (query['sg.i'] && query['sg.i'].$in) {
- query['sg.i'].$in = query['sg.i'].$in.filter(id => ids.includes(id));
- }
- else if (query['sg.i']) {
- query['sg.i'].$in = ids;
- }
- else {
- query['sg.i'] = {$in: ids};
- }
- log.d(`replaced query[${k}] (%j) with %j`, query[k], query['sg.i']);
- delete query[k];
+ if (query.push.$in) {
+ let q = query.push.$in.map(tk => {
+ return {[tk]: true};
+ });
+ query.$or = q;
}
+ delete query.push;
}
- if (query['sg.i'] && query['sg.i'].$in && !query['sg.i'].$in.length) {
- query['sg.i'].$in = ['nope'];
- }
- // if (query.push) {
- // if (query.push.$nin) {
- // query.$and = query.push.$nin.map(tk => {
- // return {$or: [{[tk]: false}, {[tk]: {$exists: false}}]};
- // });
- // }
- // if (query.push.$in) {
- // let q = query.push.$in.map(tk => {
- // return {[tk]: true};
- // });
- // query.$or = q;
- // }
- // delete query.push;
- // }
- }
- else if (query && params) {
+
if (query.message) {
let q = messageQuery(query.message);
if (!q) {
- return;
+ return Promise.resolve();
}
log.d(`removing message ${JSON.stringify(query.message)} from queryObject`);
delete query.message;
- try {
- let ids = await common.db.collection(`push_${params.app_id}`).find(q, {projection: {_id: 1}}).toArray();
- ids = (ids || []).map(id => id._id);
- query.uid = {$in: ids};
- log.d(`filtered by message: uids out of ${ids.length}`);
- }
- catch (e) {
- log.e(e);
- }
- }
- }
-
- if (query.push) {
- let q;
- if (query.push.$nin) {
- q = {
- $and: query.push.$nin.map(tk => {
- return {[tk]: {$exists: false}};
- })
- };
- }
- if (query.push.$in) {
- q = {
- $or: query.push.$in.map(tk => {
- return {[tk]: {$exists: true}};
- })
- };
- }
- if (query.push.$regex) {
- q = Object.keys(FIELDS_TITLES).filter(k => query.push.$regex.test(FIELDS_TITLES[k])).map(tk => {
- return {[tk]: {$exists: true}};
- });
- }
-
- delete query.push;
-
- if (q) {
- if (query.$or) {
- query.$and = [query.$or, q];
- }
- else if (query.$and) {
- query.$and = [query.$and, q];
- }
- else {
- for (let k in q) {
- query[k] = q[k];
+ return new Promise((res, rej) => {
+ try {
+ common.db.collection(`push_${params.app_id}`).find(q, {projection: {_id: 1}}).toArray((err, ids) => {
+ if (err) {
+ rej(err);
+ }
+ else {
+ ids = (ids || []).map(id => id._id);
+ query.uid = {$in: ids};
+ log.d(`filtered by message: uids out of ${ids.length}`);
+ res();
+ }
+ });
}
- }
+ catch (e) {
+ log.e(e);
+ rej(e);
+ }
+ });
}
}
};
-// module.exports.drillPreprocessQuery = ({query, params}) => {
-// if (query) {
-// if (query.push) {
-// if (query.push.$nin) {
-// query.$and = query.push.$nin.map(tk => {
-// return {$or: [{[tk]: false}, {[tk]: {$exists: false}}]};
-// });
-// }
-// if (query.push.$in) {
-// let q = query.push.$in.map(tk => {
-// return {[tk]: true};
-// });
-// query.$or = q;
-// }
-// delete query.push;
-// }
-
-// if (query.message) {
-// let q = messageQuery(query.message);
-
-// if (!q) {
-// return;
-// }
-
-// log.d(`removing message ${JSON.stringify(query.message)} from queryObject`);
-// delete query.message;
-
-// return new Promise((res, rej) => {
-// try {
-// common.db.collection(`push_${params.app_id}`).find(q, {projection: {_id: 1}}).toArray((err, ids) => {
-// if (err) {
-// rej(err);
-// }
-// else {
-// ids = (ids || []).map(id => id._id);
-// query.uid = {$in: ids};
-// log.d(`filtered by message: uids out of ${ids.length}`);
-// res();
-// }
-// });
-// }
-// catch (e) {
-// log.e(e);
-// rej(e);
-// }
-// });
-// }
-// }
-// };
-
module.exports.drillPostprocessUids = ({uids, params}) => new Promise((res, rej) => {
- let message = params && params.initialQueryObject && params.initialQueryObject.message;
- if (uids && uids.length && message) {
+ let message = params.initialQueryObject && params.initialQueryObject.message;
+ if (uids.length && message) {
log.d(`filtering ${uids.length} uids by message`);
let q = messageQuery(message);
diff --git a/plugins/push/api/api-message.js b/plugins/push/api/api-message.js
index d143006c3ef..b20fe996ae5 100644
--- a/plugins/push/api/api-message.js
+++ b/plugins/push/api/api-message.js
@@ -1,13 +1,10 @@
-const { Message, Result, Creds, State, Status, platforms, Audience, ValidationError, TriggerKind, PlainTrigger, MEDIA_MIME_ALL, Filter, Trigger, Content, Info, PLATFORMS_TITLES, Template, PLATFORM } = require('./send'),
- crypto = require("crypto"),
- { DEFAULTS, RecurringType } = require('./send/data/const'),
+const { Message, Result, Creds, State, Status, platforms, Audience, ValidationError, TriggerKind, PlainTrigger, MEDIA_MIME_ALL, Filter, Trigger, Content, Info, PLATFORMS_TITLES } = require('./send'),
+ { DEFAULTS } = require('./send/data/const'),
common = require('../../../api/utils/common'),
log = common.log('push:api:message'),
moment = require('moment-timezone'),
- { request } = require('./proxy'),
- {ObjectId} = require("mongodb");
+ { request } = require('./proxy');
-const countlyFetch = require("../../../api/parts/data/fetch.js");
/**
* Validate data & construct message out of it, throw in case of error
@@ -32,7 +29,6 @@ async function validate(args, draft = false) {
},
triggers: {
type: Trigger.scheme,
- discriminator: Trigger.discriminator.bind(Trigger),
array: true,
'min-length': 1
},
@@ -65,15 +61,6 @@ async function validate(args, draft = false) {
}
}
- for (let trigger of msg.triggers) {
- if (trigger.kind === TriggerKind.Plain && trigger._data.tz === false && typeof trigger._data.sctz === 'number') {
- throw new ValidationError('Please remove tz parameter from trigger definition');
- }
- if (trigger.kind === TriggerKind.Recurring && (trigger.bucket === RecurringType.Monthly || trigger.bucket === RecurringType.Weekly) && !trigger.on) {
- throw new ValidationError('"on" is required for monthly and weekly recurring triggers');
- }
- }
-
let app = await common.db.collection('apps').findOne(msg.app);
if (app) {
msg.info.appName = app.name;
@@ -85,13 +72,8 @@ async function validate(args, draft = false) {
throw new ValidationError(`No push credentials for ${PLATFORMS_TITLES[p]} platform`);
}
}
- let creds = await common.db.collection(Creds.collection).find({
- _id: {
- $in: msg.platforms
- .map(p => common.dot(app, `plugins.push.${p}._id`))
- .map(oid => ObjectId(oid.toString())) // cast to ObjectId (it gets broken after an update in app settings page)
- }
- }).toArray();
+
+ let creds = await common.db.collection(Creds.collection).find({_id: {$in: msg.platforms.map(p => common.dot(app, `plugins.push.${p}._id`))}}).toArray();
if (creds.length !== msg.platforms.length) {
throw new ValidationError('No push credentials in db');
}
@@ -151,7 +133,7 @@ async function validate(args, draft = false) {
* @param {object} params params object
*
* @api {POST} i/push/message/test Message / test
- * @apiName message test
+ * @apiName message/test
* @apiDescription Send push notification to test users specified in application plugin configuration
* @apiGroup Push Notifications
*
@@ -258,7 +240,7 @@ module.exports.test = async params => {
* @param {object} params params object
*
* @api {POST} i/push/message/create Message / create
- * @apiName message create
+ * @apiName message/create
* @apiDescription Create push notification.
* Set status to "draft" to create a draft, leave it unspecified otherwise.
* @apiGroup Push Notifications
@@ -276,9 +258,9 @@ module.exports.create = async params => {
msg.info.created = msg.info.updated = new Date();
msg.info.createdBy = msg.info.updatedBy = params.member._id;
msg.info.createdByName = msg.info.updatedByName = params.member.full_name;
+
if (demo) {
msg.info.demo = true;
- msg.info.title = params.qstring.args && params.qstring.args.info && params.qstring.args.info.title ? params.qstring.args.info.title : "";
}
if (params.qstring.status === Status.Draft) {
@@ -297,6 +279,7 @@ module.exports.create = async params => {
log.i('Created message %s: %j / %j / %j', msg.id, msg.state, msg.status, msg.result.json);
common.plugins.dispatch('/systemlogs', {params: params, action: 'push_message_created', data: msg.json});
}
+
if (demo && demo !== 'no-data') {
await generateDemoData(msg, demo);
}
@@ -310,7 +293,7 @@ module.exports.create = async params => {
* @param {object} params params object
*
* @api {POST} i/push/message/update Message / update
- * @apiName message update
+ * @apiName message/update
* @apiDescription Update push notification
* @apiGroup Push Notifications
*
@@ -367,7 +350,7 @@ module.exports.update = async params => {
}
else {
await msg.save();
- if (!params.qstring.demo && msg.triggerPlain() && (msg.is(State.Paused) || msg.is(State.Streaming) || msg.is(State.Streamable) || msg.is(State.Created))) {
+ if (!params.qstring.demo && msg.triggerPlain() && (msg.is(State.Paused) || msg.is(State.Streaming) || msg.is(State.Streamable))) {
await msg.schedule(log, params);
}
common.plugins.dispatch('/systemlogs', {params: params, action: 'push_message_updated', data: msg.json});
@@ -385,7 +368,7 @@ module.exports.update = async params => {
* @param {object} params params object
*
* @api {POST} i/push/message/remove Message / remove
- * @apiName message remove
+ * @apiName message/remove
* @apiDescription Remove message by marking it as deleted (it stays in the database for consistency)
* @apiGroup Push Notifications
*
@@ -443,7 +426,7 @@ module.exports.remove = async params => {
* @param {object} params params object
*
* @api {POST} i/push/message/toggle Message / API or Automated / toggle
- * @apiName message toggle
+ * @apiName message/toggle
* @apiDescription Stop active or start inactive API or automated message
* @apiGroup Push Notifications
*
@@ -496,8 +479,8 @@ module.exports.toggle = async params => {
return true;
}
- if (!msg.triggerAutoOrApi() && !msg.triggerRescheduleable()) {
- throw new ValidationError(`The message doesn't have Cohort, Event, Multi or Recurring trigger`);
+ if (!msg.triggerAutoOrApi()) {
+ throw new ValidationError(`The message doesn't have Cohort or Event trigger`);
}
if (data.active && msg.is(State.Streamable)) {
@@ -527,7 +510,7 @@ module.exports.toggle = async params => {
* @param {object} params params object
*
* @api {POST} o/push/message/estimate Message / estimate audience
- * @apiName message estimate
+ * @apiName message/estimate
* @apiDescription Estimate message audience
* @apiGroup Push Notifications
*
@@ -570,6 +553,7 @@ module.exports.estimate = async params => {
required: false
}
}, true);
+
if (data.result) {
data = data.obj;
if (!data.filter) {
@@ -626,7 +610,7 @@ module.exports.estimate = async params => {
* @param {object} params params object
*
* @api {GET} o/push/message/mime Message / attachment MIME
- * @apiName message mime
+ * @apiName message/mime
* @apiDescription Get MIME information of the URL specified by sending HEAD request and then GET if HEAD doesn't work. Respects proxy setting, follows redirects and returns end URL along with content type & length.
* @apiGroup Push Notifications
*
@@ -693,7 +677,7 @@ module.exports.mime = async params => {
* @param {object} params params object
*
* @api {GET} o/push/message/GET Message / GET
- * @apiName message
+ * @apiName message/GET
* @apiDescription Get message by ID
* @apiGroup Push Notifications
*
@@ -731,114 +715,6 @@ module.exports.one = async params => {
return true;
};
-/**
- * Get periodic message stats
- * @param {object} params params object
- *
- * @api {GET} o/push/message/stats Get periodic message stats
- * @apiName message-stats
- * @apiDescription Get sent and actioned event counts for a single message
- * @apiGroup Push Notifications
- *
- * @apiQuery {ObjectID} _id Message ID
- * @apiQuery {String} period Period of the stats. Possible values are: 30days, 24weeks, 12months
- *
- * @apiSuccess {Object} Event type indexed periodical event counts
- * @apiSuccessExample {json} Success-Response
- * HTTP/1.1 200 Success
- * {
- * "sent": [
- * [ "2024-03-04T21:00:00.000Z", 23 ],
- * [ "2024-03-05T21:00:00.000Z", 41 ],
- * [ "2024-03-06T21:00:00.000Z", 8 ],
- * [ "2024-03-07T21:00:00.000Z", 142 ],
- * [ "2024-03-08T21:00:00.000Z", 12 ],
- * [ "2024-03-09T21:00:00.000Z", 412 ]
- * ],
- * "action": [
- * [ "2024-03-04T21:00:00.000Z", 23 ],
- * [ "2024-03-05T21:00:00.000Z", 41 ],
- * [ "2024-03-06T21:00:00.000Z", 8 ],
- * [ "2024-03-07T21:00:00.000Z", 142 ],
- * [ "2024-03-08T21:00:00.000Z", 12 ],
- * [ "2024-03-09T21:00:00.000Z", 412 ]
- * ]
- * }
- */
-module.exports.periodicStats = async params => {
- const dateDeltaMap = {
- "30days": [30, "day"],
- "24weeks": [24, "week"],
- "12months": [12, "month"]
- };
- const validation = common.validateArgs(params.qstring, {
- _id: { type: "ObjectID", required: true },
- period: { type: 'String', required: false, in: Object.keys(dateDeltaMap) },
- }, true);
- if (!validation?.result) {
- const errors = validation?.errors || ["Invalid parameters"];
- common.returnMessage(params, 400, { errors }, null, true);
- return true;
- }
- const { _id: messageId, period } = validation.obj;
- const delta = dateDeltaMap[period];
- const message = await common.db.collection("messages").findOne({ _id: ObjectId(messageId) });
- const app = await common.db.collection("apps").findOne({ _id: message?.app });
- if (!message || !app || !delta) {
- common.returnMessage(params, 400, { errors: ["Invalid or missing parameters"] }, null, true);
- return true;
- }
- const app_id = message.app.toString();
- const cols = {
- sent: 'events' + crypto.createHash('sha1').update(common.fixEventKey('[CLY]_push_sent') + app_id).digest('hex'),
- action: 'events' + crypto.createHash('sha1').update(common.fixEventKey('[CLY]_push_action') + app_id).digest('hex')
- };
- const endDate = moment().tz(app.timezone).toDate();
- const startDate = moment(endDate).subtract(...delta);
- const dateRange = periodicDateRange(startDate, endDate, app.timezone, delta[1]);
- const ob = { app_id, appTimezone: app.timezone, qstring: { period, segmentation: "i" } };
- const results = {};
- for (const colName in cols) {
- results[colName] = await new Promise(res => {
- countlyFetch.getTimeObjForEvents(cols[colName], ob, (doc) => {
- const result = [];
- if (delta[1] === "week") {
- for (const startDayOfTheWeek of dateRange) {
- const daysOfTheWeek = periodicDateRange(
- startDayOfTheWeek,
- moment(startDayOfTheWeek).tz(app.timezone).endOf("isoWeek").toDate(),
- app.timezone,
- "day"
- );
- let weekValue = 0;
- for (const date of daysOfTheWeek) {
- const { months, date: days, years } = moment(date).tz(app.timezone).toObject();
- const value = doc?.[years]?.[months + 1]?.[days]?.[messageId]?.c;
- if (value) {
- weekValue += value;
- }
- }
- result.push([startDayOfTheWeek, weekValue]);
- }
- }
- else {
- for (const date of dateRange) {
- const { months, date: days, years } = moment(date).tz(app.timezone).toObject();
- let context = doc?.[years]?.[months + 1];
- if (delta[1] === "day") {
- context = context?.[days];
- }
- result.push([date, context?.[messageId]?.c || 0]);
- }
- }
- res(result.map(([ date, value]) => ([ date.toISOString(), value ])));
- });
- });
- }
- common.returnOutput(params, results);
- return true;
-};
-
/**
* Get notifications sent to a particular user
*
@@ -859,7 +735,6 @@ module.exports.periodicStats = async params => {
* @apiSuccess {Object} [notifications] Map of notification ID to array of epochs this message was sent to the user
* @apiSuccess {Object[]} [messages] Array of messages, returned if "messages" param is set to "true"
*
- * @apiDeprecated use now (#Push_Notifications:notifications)
* @apiUse PushValidationError
* @apiError NotFound Message Not Found
* @apiErrorExample {json} NotFound
@@ -924,213 +799,6 @@ module.exports.user = async params => {
return true;
};
-/**
- * Get notifications sent to a particular user
- *
- * @param {object} params params
- * @returns {Promise} resolves to true
- *
- * @api {GET} o/push/notifications Sent notifications
- * @apiName notifications
- * @apiDescription Get notifications sent to a particular user.
- * Makes a look up either by user id (uid) or did (device id). Returns notifications sent to a user if any.
- * @apiGroup Push Notifications
- *
- * @apiQuery {String} app_id, Application ID
- * @apiQuery {String} [id] User ID (uid). Either id or did must be specified.
- * @apiQuery {String} [did] User device ID (did). Either id or did must be specified.
- * @apiQuery {Boolean} full Return full messages along with simplified notifications. Note that true here will limit number of returned notifications to 10.
- * @apiQuery {String} platform Platform for notifications to return
- * @apiQuery {Integer} skip Pagination skip
- * @apiQuery {Integer} limit Pagination limit, must be in 1..50 range
- *
- * @apiSuccess {Object[]} notifications Array of simplified notifications objects with _id, title, message and date properties representing a notification sent to a user at a particular date.
- * Please note that returned title & message might not be accurate for cases when notification content was overridden in a message/push call as Countly doesn't keep this data after sending notifications. Default title & message will be returned in such cases.
- * Also note that current user profile properties are used for message content personalization when it's set.
- * @apiSuccess {String} notifications._id Noficiation message id
- * @apiSuccess {String} notifications.date ISO date when notification was sent to this user, +- few seconds
- * @apiSuccess {String} [notifications.title] Noficiation title string, if any
- * @apiSuccess {String} [notifications.message] Noficiation message string, if any
- *
- * @apiUse PushValidationError
- * @apiError NotFound Message Not Found
- * @apiErrorExample {json} NotFound
- * HTTP/1.1 404 Not Found
- * {
- * "errors": ["User with the did specified is not found"]
- * }
- * @apiSuccessExample {json} Success-Response
- * HTTP/1.1 200 Success
- * {
- * "notifications": [
- * {
- * "_id": "6480d8a03f9ea25502c816ce",
- * "title": "Offers!",
- * "message": "Hi James, check out your personal limited offer",
- * "date": "2023-06-07T19:26:08.683Z"
- * },
- * {
- * "_id": "6465fede1276bf50b2662765",
- * "title": "Balance",
- * "message": "James, your balance is reaching 0",
- * "date": "2023-06-08T19:00:08.683Z"
- * }
- * ]
- * }
- *
- * @apiSuccessExample {json} Success-Response-full=true
- * HTTP/1.1 200 Success
- * {
- * "notifications": [
- * {
- * "_id": "6480d8a03f9ea25502c816ce",
- * "title": "Offers!",
- * "message": "Hi James, check out your personal limited offer",
- * "date": "2023-06-07T19:26:08.683Z"
- * },
- * {
- * "_id": "6465fede1276bf50b2662765",
- * "title": "Balance",
- * "message": "James, your balance is reaching 0",
- * "date": "2023-06-08T19:00:08.683Z"
- * }
- * ],
- * "messages": [
- * {
- * "_id": "6480d8a03f9ea25502c816ce",
- * "app": "5fbb72974e19c6614411d95f",
- * "contents": [
- * {
- * "title": "Offers!",
- * "message": "Hi James, check out your personal limited offer",
- * "expiration": 604800000
- * },
- * {
- * "p": "a",
- * "sound": "default"
- * },
- * {
- * "p": "i",
- * "sound": "default"
- * }
- * ],
- * "filter": {},
- * "other message fields": "..."
- * },
- * {
- * "_id": "6465fede1276bf50b2662765",
- * "app": "5fbb72974e19c6614411d95f",
- * "contents": [
- * {
- * "title": "Balance",
- * "message": "James, your balance is reaching 0",
- * "expiration": 604800000
- * },
- * {
- * "p": "a",
- * "sound": "default"
- * },
- * {
- * "p": "i",
- * "sound": "default"
- * }
- * ],
- * "filter": {},
- * "other message fields": "..."
- * }
- * ]
- * }
- */
-module.exports.notificationsForUser = async params => {
- let data = common.validateArgs(params.qstring, {
- id: {type: 'String', required: false},
- did: {type: 'String', required: false},
- app_id: {type: 'String', required: true},
- platform: {type: 'String', in: platforms, required: true},
- full: {type: 'BooleanString', required: true},
- limit: {type: 'IntegerString', required: true, min: 1, max: 50},
- skip: {type: 'IntegerString', required: true, min: 0},
- }, true);
- if (data.result) {
- data = data.obj;
- }
- else {
- common.returnMessage(params, 400, {errors: data.errors}, null, true);
- return true;
- }
-
- if (!data.did && !data.id) {
- common.returnMessage(params, 400, {errors: ['One of id & did parameters is required']}, null, true);
- return true;
- }
-
- if (data.full) {
- data.limit = Math.min(data.limit, 10);
- }
-
- let uid = data.id,
- app_user;
- if (!uid && data.did) {
- app_user = await common.db.collection(`app_users${data.app_id}`).findOne({did: data.did});
- if (!app_user) {
- common.returnMessage(params, 404, {errors: ['User with the did specified is not found']}, null, true);
- return true;
- }
- uid = app_user.uid;
- }
- else {
- app_user = await common.db.collection(`app_users${data.app_id}`).findOne({uid: uid});
- if (!app_user) {
- common.returnMessage(params, 404, {errors: ['User with the uid specified is not found']}, null, true);
- return true;
- }
- }
-
- let push = await common.db.collection(`push_${data.app_id}`).findOne({_id: uid});
- if (!push) {
- common.returnOutput(params, {notifications: []});
- return true;
- }
-
- let id_dates = Object.keys(push.msgs || {}).map(id => push.msgs[id].map(date => [id, date])).flat();
- if (!id_dates.length) {
- common.returnOutput(params, {notifications: []});
- return true;
- }
-
- id_dates.sort(([, date1], [, date2]) => date1 > date2 ? -1 : 1);
- id_dates = id_dates.slice(data.skip, data.skip + data.limit);
-
- let ids = Array.from(new Set(id_dates.map(idd => idd[0]))).map(common.dbext.oid),
- messages = await common.db.collection('messages').find({_id: {$in: ids}}).toArray();
-
- let notifications = id_dates.map(([id, date]) => {
- let m = messages.find(msg => msg._id.toString() === id.toString());
- if (m) {
- m = new Message(m);
- }
- else {
- return [];
- }
- if (!m.platforms.includes(data.platform)) {
- return [];
- }
-
- let o = new Template(m, PLATFORM[data.platform]).guess_compile({m: m._id, h: 0, pr: app_user});
- o.date = new Date(date);
- return o;
- }).flat();
-
- let ret = {notifications};
-
- if (data.full) {
- ret.messages = messages;
- }
-
- common.returnOutput(params, ret, true);
-
- return true;
-};
/**
* Get messages
*
@@ -1138,16 +806,15 @@ module.exports.notificationsForUser = async params => {
* @returns {Promise} resolves to true
*
* @api {GET} o/push/message/all Message / find
- * @apiName message all
+ * @apiName message/all
* @apiDescription Get messages
* Returns one of three groups: one time messages (neither auto, nor api params set or set to false), automated messages (auto = "true"), API messages (api = "true")
* @apiGroup Push Notifications
*
* @apiQuery {String} app_id Application ID
- * @apiQuery {Boolean} auto *Deprecated.* Whether to return only automated messages
- * @apiQuery {Boolean} api *Deprecated.* Whether to return only API messages
- * @apiQuery {String[]} kind Required. Array of message kinds (Trigger kinds) to return, overrides *auto* & *api* if set.
- * @apiQuery {Boolean} removed Whether to return removed messages (set it to true to return removed messages)
+ * @apiQuery {Boolean} auto Whether to return only automated messages
+ * @apiQuery {Boolean} api Whether to return only API messages
+ * @apiQuery {Boolean} removed Whether to return removed messages (set to true to return removed messages)
* @apiQuery {String} [sSearch] A search term to look for in title or message of content objects
* @apiQuery {Number} [iDisplayStart] Skip this much messages
* @apiQuery {Number} [iDisplayLength] Return this much messages at most
@@ -1163,15 +830,10 @@ module.exports.notificationsForUser = async params => {
* @apiUse PushValidationError
*/
module.exports.all = async params => {
- const platformTypes = require('./send/platforms').platforms;
let data = common.validateArgs(params.qstring, {
app_id: {type: 'ObjectID', required: true},
- platform: {type: 'String', required: false, in: () => platformTypes},
auto: {type: 'BooleanString', required: false},
api: {type: 'BooleanString', required: false},
- multi: {type: 'BooleanString', required: false},
- rec: {type: 'BooleanString', required: false},
- kind: {type: 'String[]', required: false, in: Object.values(TriggerKind)}, // not required for backwards compatibility only
removed: {type: 'BooleanString', required: false},
sSearch: {type: 'RegExp', required: false, mods: 'gi'},
iDisplayStart: {type: 'IntegerString', required: false},
@@ -1181,26 +843,6 @@ module.exports.all = async params => {
sEcho: {type: 'String', required: false},
status: {type: 'String', required: false}
}, true);
- // backwards compatibility
- if (!data.kind) {
- data.kind = [];
- if (data.api) {
- data.kind.push(TriggerKind.API);
- }
- else if (data.auto) {
- data.kind.push(TriggerKind.Event);
- data.kind.push(TriggerKind.Cohort);
- }
- else if (data.multi) {
- data.kind.push(TriggerKind.Multi);
- }
- else if (data.rec) {
- data.kind.push(TriggerKind.Recurring);
- }
- else {
- data.kind = Object.values(TriggerKind);
- }
- }
if (data.result) {
data = data.obj;
@@ -1208,17 +850,22 @@ module.exports.all = async params => {
let query = {
app: data.app_id,
state: {$bitsAllClear: State.Deleted},
- 'triggers.kind': {$in: data.kind}
};
- if (data.platform && data.platform.length) {
- query.platforms = data.platform; //{$in: [data.platforms]};
- }
-
if (data.removed) {
delete query.state;
}
+ if (data.auto) {
+ query['triggers.kind'] = {$in: [TriggerKind.Event, TriggerKind.Cohort]};
+ }
+ else if (data.api) {
+ query['triggers.kind'] = TriggerKind.API;
+ }
+ else {
+ query['triggers.kind'] = TriggerKind.Plain;
+ }
+
if (data.sSearch) {
query.$or = [
{'contents.message': data.sSearch},
@@ -1256,14 +903,8 @@ module.exports.all = async params => {
else if (data.api) {
dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.API]}, as: "item"}}}}});
}
- else if (data.multi) {
- dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.Multi]}, as: "item"}}}}});
- }
- else if (data.rec) {
- dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.Recurring]}, as: "item"}}}}});
- }
else {
- dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$in": ["$$item.kind", Object.values(TriggerKind)]}, as: "item"}}}}});
+ dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.Plain]}, as: "item"}}}}});
}
dataPipeline.push({"$addFields": {"info.lastDate": {"$ifNull": ["$info.finished", "$triggerObject.start"]}, "info.isDraft": {"$cond": [{"$eq": ["$status", "draft"]}, 1, 0]}}});
@@ -1293,61 +934,39 @@ module.exports.all = async params => {
else if (data.api) {
dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.API]}, as: "item"}}}}});
}
- else if (data.multi) {
- dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.Multi]}, as: "item"}}}}});
- }
- else if (data.rec) {
- dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.Recurring]}, as: "item"}}}}});
- }
else {
- dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$in": ["$$item.kind", Object.values(TriggerKind)]}, as: "item"}}}}});
+ dataPipeline.push({"$addFields": {"triggerObject": {"$first": {"$filter": {"input": "$triggers", "cond": {"$eq": ["$$item.kind", TriggerKind.Plain]}, as: "item"}}}}});
}
dataPipeline.push({"$addFields": {"info.lastDate": {"$ifNull": ["$info.finished", "$triggerObject.start"]}}});
}
pipeline.push({"$facet": {"total": totalPipeline, "data": dataPipeline}});
+ common.db.collection(Message.collection).aggregate(pipeline, function(err, res) {
+ res = res || [];
+ res = res[0] || {};
+
+ var items = res.data || [];
+ var total = 0;
+ if (res.total && res.total[0] && res.total[0].cn) {
+ total = res.total[0].cn;
+ }
+ common.returnOutput(params, {
+ sEcho: data.sEcho,
+ iTotalRecords: total || items.length,
+ iTotalDisplayRecords: total || items.length,
+ aaData: items || []
+ }, true);
+
+ });
- let res = (await common.db.collection(Message.collection).aggregate(pipeline).toArray() || [])[0] || {},
- items = res.data || [],
- total = res.total && res.total[0] && res.total[0].cn || 0;
- common.returnOutput(params, {
- sEcho: data.sEcho,
- iTotalRecords: total || items.length,
- iTotalDisplayRecords: total || items.length,
- aaData: items
- }, true);
}
else {
common.returnMessage(params, 400, {errors: data.errors}, null, true);
+ return true;
}
-
- return true;
};
-/**
- * Returns the starting days of the given period between the given start and end dates.
- * @param {Date} start Start date
- * @param {Date} end End date
- * @param {String} timezone End date
- * @param {String} period Period interval: day|month|week|year
- * @returns {Date[]} Array of dates in between start and end (both start and end included)
- */
-function periodicDateRange(start, end, timezone, period = "day") {
- const startFrom = period === "week" ? "isoWeek" : period;
- const startObj = moment(start).tz(timezone).startOf("day").startOf(startFrom);
- const endObj = moment(end).tz(timezone).startOf("day").startOf(startFrom);
- const result = [];
- if (startObj.isAfter(endObj)) {
- return [];
- }
- while (startObj.isSameOrBefore(endObj, period)) {
- result.push(startObj.toDate());
- startObj.add(1, period);
- }
- return result;
-}
-
/**
* Generate demo data for populator
*
@@ -1562,7 +1181,7 @@ function mimeInfo(url, method = 'HEAD') {
return new Promise((resolve, reject) => {
let req = request(url.toString(), method, conf);
- req.on('response', res => {
+ req.once('response', res => {
let status = res.statusCode,
headers = res.headers,
data = 0;
diff --git a/plugins/push/api/api-push.js b/plugins/push/api/api-push.js
index 3647f57815c..2e584c14ca7 100644
--- a/plugins/push/api/api-push.js
+++ b/plugins/push/api/api-push.js
@@ -1,163 +1,72 @@
-/* eslint-disable no-inner-declarations */
-const { CentralMaster, CentralWorker } = require('../../../api/parts/jobs/ipc');
-
const common = require('../../../api/utils/common'),
log = common.log('push:api:push'),
Sender = require('./send/sender'),
{ extract, field, allAppUserFields, platforms, PLATFORM, ValidationError, Creds, DBMAP } = require('./send');
-const CMD_PUSH_TOKEN_SESSION = 'push_token_session',
- queue = {};
-let queue_size = 0,
- timeouts_size = 0,
- queue_print = Date.now(),
- ipc;
-
-if (require('cluster').isMaster) {
- ipc = new CentralMaster(CMD_PUSH_TOKEN_SESSION, function(msg) {
- let id = msg.app_id + msg.uid + msg.p + msg.f;
- if (queue[id]) {
- if (queue[id].token !== msg.token) {
- // ensure token reset or token chanage is processed (processing for this user might be already running)
- queue[id + Math.random()] = msg;
- queue_size++;
- }
- else {
- // duplicate token is ignored
- }
- }
- else {
- queue[id] = msg;
- queue_size++;
- }
- });
-
- /**
- * Take next token from queue and process it
- */
- function next() {
- try {
- if (Date.now() - queue_print > 60000) {
- log.d('token_session queue size is %d (%d setTimeouts)', queue_size, timeouts_size);
- queue_print = Date.now();
- }
- let arr = [],
- take = 0;
- if (queue_size < 100) {
- take = 1;
- }
- else if (queue_size < 300) {
- take = 5;
- log.d('setting batch size for token_session to %d', take);
- }
- else {
- take = 100;
- log.w('setting batch size for token_session to %d', take);
- }
-
- for (const k in queue) {
- arr.push(k);
- if (arr.length >= take) {
- break;
+module.exports.onTokenSession = async(dbAppUser, params) => {
+ let stuff = extract(params.qstring);
+ if (stuff) {
+ let [p, f, token, hash] = stuff,
+ appusersField = field(p, f, true),
+ pushField = field(p, f, false),
+ pushCollection = common.db.collection(`push_${params.app_id}`),
+ appusersCollection = common.db.collection(`app_users${params.app_id}`);
+
+ log.d('push token: %s/%s/%s', p, f, token);
+
+ let push = await pushCollection.findOne({_id: dbAppUser.uid});
+ if (token && (!push || common.dot(push, pushField) !== token)) {
+ appusersCollection.updateOne({_id: params.app_user_id}, {$set: {[appusersField]: hash}}, () => {}); // don't wait
+ pushCollection.updateOne({_id: params.app_user.uid}, {$set: {[pushField]: token}}, {upsert: true}, () => {});
+
+ appusersCollection.find({[appusersField]: hash, _id: {$ne: dbAppUser._id}}, {uid: 1}).toArray(function(err, docs) {
+ if (err) {
+ log.e('Failed to look for same tokens', err);
}
- }
- if (arr.length) {
- Promise.all(arr.map(async k => {
- try {
- await processTokenSession(queue[k]);
- }
- catch (e) {
- log.e('Error in processTokenSession for %j', queue[k], e);
- }
- delete queue[k];
- queue_size--;
- })).catch(() => {}).then(() => next());
- return;
- }
- }
- catch (e) {
- log.e('Error in processTokenSession/next', e);
- }
+ else if (docs && docs.length) {
+ log.d('Found %d hash duplicates for token %s', docs.length, token);
+ // the hash is 32 bit, not enough randomness for strict decision to unset tokens, comparing actual token strings
+ pushCollection.find({_id: {$in: docs.map(d => d.uid)}}, {[`tk.${p + f}`]: 1}).toArray(function(err2, pushes) {
+ if (err2) {
+ log.e('Failed to look for same tokens', err2);
+ }
+ else if (pushes && pushes.length) {
+ pushes = pushes.filter(user => user._id !== dbAppUser.uid && user.tk[p + f] === token);
+ if (pushes.length) {
+ log.d('Unsetting same tokens (%s) for users %j', token, pushes.map(x => x._id));
- setTimeout(next, 1000);
- }
+ appusersCollection.updateMany({uid: {$in: pushes.map(x => x._id)}}, {$unset: {[appusersField]: 1}}, () => {});
+ pushCollection.updateOne({_id: {$in: pushes.map(x => x._id)}}, {$unset: {[pushField]: 1}}, () => {});
+ }
+ }
+ });
+ }
+ });
- next();
-}
-else {
- ipc = new CentralWorker(CMD_PUSH_TOKEN_SESSION, () => {});
-}
-ipc.attach();
-
-/**
- * Process token session request
- *
- * @param {Object} msg IPC message
- */
-async function processTokenSession(msg) {
- let {p, f, token, hash, app_id, uid, app_user_id} = msg,
- appusersField = field(p, f, true),
- pushField = field(p, f, false),
- pushCollection = common.db.collection(`push_${app_id}`),
- appusersCollection = common.db.collection(`app_users${app_id}`);
-
- log.d('push token: %s/%s/%s', p, f, token);
-
- let push = await pushCollection.findOne({_id: uid});
- if (token && (!push || common.dot(push, pushField) !== token)) {
- appusersCollection.updateOne({_id: app_user_id}, {$set: {[appusersField]: hash}}, () => {}); // don't wait
- pushCollection.updateOne({_id: uid}, {$set: {[pushField]: token}}, {upsert: true}, () => {});
-
- appusersCollection.find({[appusersField]: hash, _id: {$ne: app_user_id}}, {uid: 1}).toArray(function(err, docs) {
- if (err) {
- log.e('Failed to look for same tokens', err);
- }
- else if (docs && docs.length) {
- log.d('Found %d hash duplicates for token %s', docs.length, token);
- // the hash is 32 bit, not enough randomness for strict decision to unset tokens, comparing actual token strings
- pushCollection.find({_id: {$in: docs.map(d => d.uid)}}, {[`tk.${p + f}`]: 1}).toArray(function(err2, pushes) {
- if (err2) {
- log.e('Failed to look for same tokens', err2);
+ setTimeout(() => {
+ common.db.collection(`app_users${params.app_id}`).findOne({_id: dbAppUser._id}, (er, user) => {
+ if (er) {
+ log.e('Error while loading user', er);
}
- else if (pushes && pushes.length) {
- pushes = pushes.filter(user => user._id !== uid && user.tk[p + f] === token);
- if (pushes.length) {
- log.d('Unsetting same tokens (%s) for users %j', token, pushes.map(x => x._id));
-
- appusersCollection.updateMany({uid: {$in: pushes.map(x => x._id)}}, {$unset: {[appusersField]: 1}}, () => {});
- pushCollection.updateOne({_id: {$in: pushes.map(x => x._id)}}, {$unset: {[pushField]: 1}}, () => {});
- }
+ else if (!user) {
+ log.w('Removing stale push_%s record for user %s/%s', params.app_id, dbAppUser._id, dbAppUser.uid);
+ common.db.collection(`push_${params.app_id}`).deleteOne({_id: dbAppUser.uid}, () => {});
}
});
- }
- });
-
- timeouts_size++;
- setTimeout(() => {
- common.db.collection(`app_users${app_id}`).findOne({_id: app_user_id}, {projection: {_id: 1}}, (er, user) => {
- if (er) {
- log.e('Error while loading user', er);
- }
- else if (!user) {
- log.w('Removing stale push_%s record for user %s/%s', app_id, app_user_id, uid);
- common.db.collection(`push_${app_id}`).deleteOne({_id: uid}, () => {});
- }
- timeouts_size--;
- });
- }, 10000);
+ }, 10000);
+ }
+ // else {
+ // appusersCollection.updateOne({_id: params.app_user_id}, {$unset: {[appusersField]: 1}}, function() {});
+ // pushCollection.updateOne({_id: params.app_user.uid}, {$unset: {[pushField]: 1}}, function() {});
+ // }
}
- // else {
- // appusersCollection.updateOne({_id: app_user_id}, {$unset: {[appusersField]: 1}}, function() {});
- // pushCollection.updateOne({_id: uid}, {$unset: {[pushField]: 1}}, function() {});
- // }
-}
-
-module.exports.onTokenSession = async(dbAppUser, params) => {
- let stuff = extract(params.qstring);
- if (stuff) {
- let [p, f, token, hash] = stuff;
- ipc.send({to: 0, cmd: CMD_PUSH_TOKEN_SESSION, p, f, token, hash, uid: dbAppUser.uid, app_id: params.app_id, app_user_id: params.app_user_id});
+ else {
+ log.d('no push token in token_session:', params.qstring);
}
+ // else if (params.qstring.locale) {
+ // common.db.collection(`app_users${params.app_id}`).updateOne({_id: params.app_user_id}, {$set: {[common.dbUserMap.locale]: params.qstring.locale}}, function() {});
+ // dbAppUser[common.dbUserMap.locale] = params.qstring.locale;
+ // }
};
module.exports.onSessionUser = ({params, dbAppUser}) => {
@@ -375,93 +284,80 @@ module.exports.onMerge = ({app_id, oldUser, newUser}) => {
nuid = newUser.uid;
if (ouid && nuid) {
- return new Promise(function(resolve, reject) {
- log.d(`Merging push data of ${ouid} into ${nuid}`);
- common.db.collection(`push_${app_id}`).find({_id: {$in: [ouid, nuid]}}).toArray((err, users) => {
- if (err || !users) {
- log.e('Couldn\'t load users to merge', err);
- reject();
- return;
- }
-
- let ou = users.filter(u => u._id === ouid)[0],
- nu = users.filter(u => u._id === nuid)[0],
- update = {},
- opts = {};
-
- if (ou && nu) {
- log.d('Merging %j into %j', ou, nu);
- if (ou.tk && Object.keys(ou.tk).length) {
- update.$set = {};
- for (let k in ou.tk) {
- update.$set['tk.' + k] = ou.tk[k];
- newUser['tk' + k] = oldUser['tk' + k];
- }
- }
- if (ou.msgs && ou.msgs.length) {
- let ids = nu.msgs && nu.msgs.map(m => m[0].toString()) || [],
- msgs = [];
+ log.d(`Merging push data of ${ouid} into ${nuid}`);
+ common.db.collection(`push_${app_id}`).find({_id: {$in: [ouid, nuid]}}).toArray((err, users) => {
+ if (err || !users) {
+ log.e('Couldn\'t load users to merge', err);
+ return;
+ }
- ou.msgs.forEach(m => {
- if (ids.indexOf(m[0].toString()) === -1) {
- msgs.push(m);
- }
- });
+ let ou = users.filter(u => u._id === ouid)[0],
+ nu = users.filter(u => u._id === nuid)[0],
+ update = {},
+ opts = {};
- if (msgs.length) {
- update.$push = {msgs: {$each: msgs}};
- }
- }
- }
- else if (ou && Object.keys(ou).length > 1 && !nu) {
- log.d('No new uid, setting old');
- update.$set = ou;
- opts.upsert = true;
- delete update.$set._id;
+ if (ou && nu) {
+ log.d('Merging %j into %j', ou, nu);
+ if (ou.tk && Object.keys(ou.tk).length) {
+ update.$set = {};
for (let k in ou.tk) {
+ update.$set['tk.' + k] = ou.tk[k];
newUser['tk' + k] = oldUser['tk' + k];
}
}
- else if (ou && Object.keys(ou).length === 1 && !nu) {
- log.d('Empty old uid, nothing to merge');
- }
- else if (!ou && nu) {
- log.d('No old uid, nothing to merge');
- }
- else {
- log.d('Nothing to merge at all');
+ if (ou.msgs && ou.msgs.length) {
+ let ids = nu.msgs && nu.msgs.map(m => m[0].toString()) || [],
+ msgs = [];
+
+ ou.msgs.forEach(m => {
+ if (ids.indexOf(m[0].toString()) === -1) {
+ msgs.push(m);
+ }
+ });
+
+ if (msgs.length) {
+ update.$push = {msgs: {$each: msgs}};
+ }
}
- if (ou) {
- log.d('Removing old push data for %s', ouid);
- common.db.collection(`push_${app_id}`).deleteOne({_id: ouid}, e => e && log.e('Error while deleting old uid push data', e));
+ }
+ else if (ou && Object.keys(ou).length > 1 && !nu) {
+ log.d('No new uid, setting old');
+ update.$set = ou;
+ opts.upsert = true;
+ delete update.$set._id;
+ for (let k in ou.tk) {
+ newUser['tk' + k] = oldUser['tk' + k];
}
- if (Object.keys(update).length) {
- log.d('Updating push data for %s: %j', nuid, update);
- common.db.collection(`push_${app_id}`).updateOne({_id: nuid}, update, opts, function(ee) {
- if (ee) {
- log.e('Error while updating new uid with push data', ee);
- reject();
+ }
+ else if (ou && Object.keys(ou).length === 1 && !nu) {
+ log.d('Empty old uid, nothing to merge');
+ }
+ else if (!ou && nu) {
+ log.d('No old uid, nothing to merge');
+ }
+ else {
+ log.d('Nothing to merge at all');
+ }
+
+ if (ou) {
+ log.d('Removing old push data for %s', ouid);
+ common.db.collection(`push_${app_id}`).deleteOne({_id: ouid}, e => e && log.e('Error while deleting old uid push data', e));
+ }
+ if (Object.keys(update).length) {
+ log.d('Updating push data for %s: %j', nuid, update);
+ common.db.collection(`push_${app_id}`).updateOne({_id: nuid}, update, opts, e => e && log.e('Error while updating new uid with push data', e));
+ setTimeout(() => {
+ common.db.collection(`app_users${app_id}`).findOne({_id: newUser._id}, (er, user) => {
+ if (er) {
+ log.e('Error while loading user', er);
}
- else {
- resolve();
- setTimeout(() => {
- common.db.collection(`app_users${app_id}`).findOne({_id: newUser._id}, (er, user) => {
- if (er) {
- log.e('Error while loading user', er);
- }
- else if (!user) {
- log.w('Removing stale push_%s record for user %s/%s', app_id, newUser._id, nuid);
- common.db.collection(`push_${app_id}`).deleteOne({_id: nuid}, () => {});
- }
- });
- }, 10000);
+ else if (!user) {
+ log.w('Removing stale push_%s record for user %s/%s', app_id, newUser._id, nuid);
+ common.db.collection(`push_${app_id}`).deleteOne({_id: nuid}, () => {});
}
});
- }
- else {
- resolve();
- }
- });
+ }, 10000);
+ }
});
}
};
\ No newline at end of file
diff --git a/plugins/push/api/api-tx.js b/plugins/push/api/api-tx.js
index c866ccd4d8d..687299608cd 100644
--- a/plugins/push/api/api-tx.js
+++ b/plugins/push/api/api-tx.js
@@ -72,7 +72,7 @@ async function check(params, push) {
* @param {object} params params object
*
* @api {POST} i/push/message/push Message / API / add users
- * @apiName message push
+ * @apiName message/push
* @apiDescription Add notifications to previously created message with API trigger
* @apiGroup Push Notifications
*
@@ -115,7 +115,7 @@ module.exports.apiPush = async params => {
* @param {object} params params object
*
* @api {POST} i/push/message/pop Message / API / remove users
- * @apiName message pop
+ * @apiName message/pop
* @apiDescription Remove notifications from previously created message with API trigger
* @apiGroup Push Notifications
*
diff --git a/plugins/push/api/api.js b/plugins/push/api/api.js
index 61048ce3a5d..28bf498060e 100644
--- a/plugins/push/api/api.js
+++ b/plugins/push/api/api.js
@@ -7,7 +7,7 @@ const plugins = require('../../pluginManager'),
{ autoOnCohort, autoOnCohortDeletion, autoOnEvent } = require('./api-auto'),
{ apiPop, apiPush } = require('./api-tx'),
{ drillAddPushEvents, drillPostprocessUids, drillPreprocessQuery } = require('./api-drill'),
- { estimate, test, create, update, toggle, remove, all, one, mime, user, notificationsForUser, periodicStats } = require('./api-message'),
+ { estimate, test, create, update, toggle, remove, all, one, mime, user } = require('./api-message'),
{ dashboard } = require('./api-dashboard'),
{ clear, reset, removeUsers } = require('./api-reset'),
{ legacyApis } = require('./legacy'),
@@ -25,10 +25,8 @@ const plugins = require('../../pluginManager'),
estimate: [validateRead, estimate],
all: [validateRead, all],
GET: [validateRead, one, '_id'],
- stats: [validateRead, periodicStats],
},
user: [validateRead, user],
- notifications: [validateRead, notificationsForUser],
},
i: {
message: {
@@ -59,7 +57,6 @@ plugins.setConfigs(FEATURE_NAME, {
rate: '',
period: ''
},
- deduplicate: false,
sendahead: 60000, // send pushes scheduled up to 60 sec in the future
connection_retries: 3, // retry this many times on recoverable errors
connection_factor: 1000, // exponential backoff factor
@@ -67,7 +64,6 @@ plugins.setConfigs(FEATURE_NAME, {
pool_bytes: 10000, // bytes mode streams high water mark
pool_concurrency: 5, // max number of same type connections
pool_pools: 10, // max number of connections in total
- message_timeout: 3600000, // timeout for a message not sent yet (for TooLateToSend error)
default_content_available: false, // sets content-available: 1 by default for ios
});
@@ -88,7 +84,8 @@ plugins.register('/master', function() {
fields(platforms, true).forEach(f => common.dbUserMap[f] = f);
PUSH.cache = common.cache.cls(PUSH_CACHE_GROUP);
setTimeout(() => {
- require('../../../api/parts/jobs').job('push:clear', {ghosts: true}).replace().schedule('at 3:00 pm every 7 days');
+ const jobManager = require('../../../api/parts/jobs');
+ jobManager.job("push:clear-stats").replace().schedule("at 3:00 am every 7 days");
}, 10000);
});
@@ -106,7 +103,7 @@ plugins.register('/master/runners', runners => {
sender = undefined;
}
catch (e) {
- log.e('Sending stopped with an error', e);
+ log.e('Sender crached', e);
sender = undefined;
}
}
@@ -168,9 +165,6 @@ plugins.register('/i', async ob => {
log.i('Invalid segmentation for [CLY]_push_action from %s: %j (msg %s, count %j)', params.qstring.device_id, event.segmentation, msg ? 'found' : 'not found', event.segmentation.count);
continue;
}
- else {
- log.d('Recording push action: [%s] (%s) {%d}, %j', msg.id, params.app_user.uid, count, event);
- }
let p = event.segmentation.p,
a = msg.triggers.filter(tr => tr.kind === TriggerKind.Cohort || tr.kind === TriggerKind.Event).length > 0,
@@ -229,7 +223,7 @@ plugins.register('/i', async ob => {
/**
* Handy function for handling api calls (see apis obj above)
- *
+ *
* @param {object} apisObj apis.i or apis.o
* @param {object} ob object from pluginManager ({params, qstring, ...})
* @returns {boolean} true if the call has been handled
@@ -276,7 +270,7 @@ function apiCall(apisObj, ob) {
/**
* Wrap push endpoint catching any push-specific errors from it
- *
+ *
* @param {string} method endpoint name
* @param {function} fn actual endpoint returning a promise
* @returns {function} CRUD callback
@@ -369,8 +363,9 @@ plugins.register('/i/app_users/export', ({app_id, uids, export_commands, dbargs,
/**
* @apiDefine PushMessageBody
- *
+ *
* @apiBody {ObjectID} app Application ID
+ * @apiBody {Boolean} saveStats Store each individual push records into push_stats for debugging
* @apiBody {String[]} platforms Array of platforms to send to
* @apiBody {String="draft"} [status] Message status, only set to draft when creating or editing a draft message, don't set otherwise
* @apiBody {Object} filter={} User profile filter to limit recipients of this message
@@ -388,9 +383,9 @@ plugins.register('/i/app_users/export', ({app_id, uids, export_commands, dbargs,
* @apiBody {Number} [triggers.time] [only for event, cohort triggers] Time in ms since 00:00 in case event or cohort message is to be sent in users' timezones
* @apiBody {Boolean} [triggers.reschedule] [only for event, cohort triggers] Allow rescheduling to next day if it's too late to send on scheduled day
* @apiBody {Number} [triggers.delay] [only for event, cohort triggers] Milliseconds to delay sending of event or cohort message
- * @apiBody {Number} [triggers.cap] [only for event, cohort & api triggers] Set maximum number of notifications sent to a particular user
+ * @apiBody {Number} [triggers.cap] [only for event, cohort & api triggers] Set maximum number of notifications sent to a particular user
* @apiBody {Number} [triggers.sleep] [only for event, cohort & api triggers] Set minimum time in ms between two notifications for a particular user (a notification is discarded if it's less than that)
- * @apiBody {String[]} [triggers.events] [only for event trigger] Event keys
+ * @apiBody {String[]} [triggers.events] [only for event trigger] Event keys
* @apiBody {String[]} [triggers.cohorts] [only for cohort trigger] Cohort ids
* @apiBody {Boolean} [triggers.entry] [only for cohort trigger] Send on cohort entry (true) or exit (false)
* @apiBody {Boolean} [triggers.cancels] [only for cohort trigger] A notification is to be discarded if user exits cohort (when entry = true) before notification is sent
@@ -417,9 +412,10 @@ plugins.register('/i/app_users/export', ({app_id, uids, export_commands, dbargs,
/**
* @apiDefine PushMessage
- *
+ *
* @apiSuccess {ObjectID} _id Message ID
* @apiSuccess {ObjectID} app Application ID
+ * @apiSuccess {Boolean} saveStats Store each individual push records into push_stats for debugging
* @apiSuccess {String[]} platforms Array of platforms to send to
* @apiSuccess {Number} state Message state, for internal use
* @apiSuccess {String="created", "inactive", "draft", "scheduled", "sending", "sent", "stopped", "failed"} [status] Message status: "created" is for messages yet to be scheduled (put into queue), "inactive" - cannot be scheduled (approval required for push approver plugin), "draft", "scheduled", "sending", "sent", "stopped" - automated message has been stopped, "failed" - failed to send all notifications
@@ -438,9 +434,9 @@ plugins.register('/i/app_users/export', ({app_id, uids, export_commands, dbargs,
* @apiSuccess {Number} [triggers.time] [only for event, cohort triggers] Time in ms since 00:00 in case event or cohort message is to be sent in users' timezones
* @apiSuccess {Boolean} [triggers.reschedule] [only for event, cohort triggers] Allow rescheduling to next day if it's too late to send on scheduled day
* @apiSuccess {Number} [triggers.delay] [only for event, cohort triggers] Milliseconds to delay sending of event or cohort message
- * @apiSuccess {Number} [triggers.cap] [only for event, cohort & api triggers] Set maximum number of notifications sent to a particular user
+ * @apiSuccess {Number} [triggers.cap] [only for event, cohort & api triggers] Set maximum number of notifications sent to a particular user
* @apiSuccess {Number} [triggers.sleep] [only for event, cohort & api triggers] Set minimum time in ms between two notifications for a particular user (a notification is discarded if it's less than that)
- * @apiSuccess {String[]} [triggers.events] [only for event trigger] Event keys
+ * @apiSuccess {String[]} [triggers.events] [only for event trigger] Event keys
* @apiSuccess {String[]} [triggers.cohorts] [only for cohort trigger] Cohort ids
* @apiSuccess {Boolean} [triggers.entry] [only for cohort trigger] Send on cohort entry (true) or exit (false)
* @apiSuccess {Boolean} [triggers.cancels] [only for cohort trigger] A notification is to be discarded if user exits cohort (when entry = true) before notification is sent
@@ -469,7 +465,7 @@ plugins.register('/i/app_users/export', ({app_id, uids, export_commands, dbargs,
* @apiSuccess {Object} [result.sent] Number notifications sent successfully
* @apiSuccess {Object} [result.actioned] Number notifications with positive user reactions (notification taps & button clicks)
* @apiSuccess {Object} [result.errored] Number notifications which weren't sent due to various errors
- * @apiSuccess {Object[]} [result.lastErrors] Array of last 10 errors
+ * @apiSuccess {Object[]} [result.lastErrors] Array of last 10 errors
* @apiSuccess {Object[]} [result.lastRuns] Array of last 10 sending runs
* @apiSuccess {Date} [result.next] Next sending date
* @apiSuccess {Object} [result.subs] Sub results - a map of subresult key to Result object. Subresults are used to store platform and locale specific results.
@@ -500,4 +496,4 @@ plugins.register('/i/app_users/export', ({app_id, uids, export_commands, dbargs,
* @apiSuccess {Boolean} [info.demo] Whether the message was created using populator plugin
*/
-module.exports = PUSH;
\ No newline at end of file
+module.exports = PUSH;
diff --git a/plugins/push/api/jobs/clear-stats.js b/plugins/push/api/jobs/clear-stats.js
new file mode 100644
index 00000000000..ba201671cc1
--- /dev/null
+++ b/plugins/push/api/jobs/clear-stats.js
@@ -0,0 +1,27 @@
+'use strict';
+/**
+ * @typedef {import("mongodb").Db} MongoDb
+ */
+
+const { Job } = require('../../../../api/parts/jobs/job.js');
+const log = require('../../../../api/utils/log.js')('job:push:clear-stats');
+
+const EXPIRY = 30 * 24 * 60 * 60 * 1000; // 30 days
+
+/**
+ * Clears push_stats collection
+ */
+class ClearStatsJob extends Job {
+ /**
+ * Clears push_stats based on EXPIRY and MAX_RECORDS
+ * @param {MongoDb} db - db connection
+ */
+ async run(db) {
+ log.d('Clearing push_stats');
+ await db.collection("push_stats").deleteMany({
+ d: { $lte: new Date(Date.now() - EXPIRY) }
+ });
+ }
+}
+
+module.exports = ClearStatsJob;
\ No newline at end of file
diff --git a/plugins/push/api/jobs/clear.js b/plugins/push/api/jobs/clear.js
index d80617d6735..15edde6e1ba 100644
--- a/plugins/push/api/jobs/clear.js
+++ b/plugins/push/api/jobs/clear.js
@@ -73,130 +73,11 @@ class ClearJob extends job.Job {
}
});
}
- else if (this.data.ghosts) {
- db.collection('plugins').findOne({_id: 'plugins'}, (err, plugins) => {
- if (err) {
- log.w('Failed to load config when clearing ghosts', err);
- done(err);
- }
- else if (!plugins || !plugins.push || !plugins.push.deduplicate) {
- done();
- }
- else {
- db.collection('apps').find({}, {_id: 1}).toArray((err2, apps) => {
- if (err2) {
- log.w('Failed to load apps when clearing ghosts', err2);
- done(err2);
- }
- else {
- this.nextApp(db, apps || []).then(() => {
- log.i('Done clearing ghosts');
- done();
- }, e => done(e));
- }
- });
- }
- });
- }
else {
log.e('dunno what to clear: %j', this.data);
done('dunno what to clear: ', JSON.stringify(this.data));
}
}
-
- /**
- * Process next app when clearing ghost push users
- *
- * @param {Db} db mongo db
- * @param {Object[]} apps apps array
- * @param {function} done callback
- */
- async nextApp(db, apps) {
- if (!apps.length) {
- return;
- }
-
- let app = apps.pop(),
- push_count = await db.collection(`push_${app._id}`).countDocuments();
-
- if (push_count === 0) {
- await this.nextApp(db, apps);
- return;
- }
-
- let uids_count = await db.collection(`app_users${app._id}`).countDocuments();
- if (uids_count === push_count) {
- await this.nextApp(db, apps);
- return;
- }
-
-
- let push_cursor = db.collection(`push_${app._id}`).find({}, {_id: 1}),
- uids = await db.collection(`app_users${app._id}`).find({}, {uid: 1}).toArray(),
- to_remove = [];
-
- uids = new Set(uids.map(u => u.uid));
-
- for await (const doc of push_cursor) {
- if (!uids.has(doc._id)) {
- to_remove.push(doc._id);
- }
- }
-
- if (to_remove.length) {
- log.d('found %d ghost push users for %s, removing', to_remove.length, app._id);
- await db.collection(`push_${app._id}`).deleteMany({_id: {$in: to_remove}});
- }
-
- await this.nextApp(db, apps);
- }
-
- // /**
- // * Process next app when clearing ghost push users
- // *
- // * @param {Db} db mongo db
- // * @param {Object[]} apps apps array
- // * @param {function} done callback
- // */
- // nextApp(db, apps, done) {
- // if (!apps.length) {
- // done();
- // return;
- // }
-
- // let app = apps.pop();
-
- // db.collection(`push_${app._id}`).aggregate([
- // {$project: {_id: 1}},
- // {$lookup: {from: `app_users${app._id}`, localField: '_id', foreignField: 'uid', as: 'app_user'}},
- // {$match: {app_user: {$size: 0}}}
- // ]).toArray((err, docs) => {
- // if (err) {
- // log.w('Failed to run clear aggregation for %s', app._id, err);
- // done(err);
- // }
- // else {
- // docs = (docs || []).map(d => d._id);
-
- // log.d('Found %d ghost push users for %s', docs.length, app._id);
- // if (docs.length) {
- // db.collection(`push_${app._id}`).deleteMany({_id: {$in: docs}}, (e2, res) => {
- // if (e2) {
- // log.w('Failed to delete ghost users for %s', app._id, e2);
- // done(e2);
- // }
- // else {
- // log.d('Deleted %d ghost push users for %s', res && res.deletedCount || 0, app._id);
- // this.nextApp(db, apps, done);
- // }
- // });
- // }
- // else {
- // this.nextApp(db, apps, done);
- // }
- // }
- // });
- // }
}
module.exports = ClearJob;
\ No newline at end of file
diff --git a/plugins/push/api/jobs/schedule.js b/plugins/push/api/jobs/schedule.js
index 73e0cd9f202..575a9642f2c 100644
--- a/plugins/push/api/jobs/schedule.js
+++ b/plugins/push/api/jobs/schedule.js
@@ -56,103 +56,39 @@ class ScheduleJob extends J.Job {
else if (this.message.is(State.Error)) {
error = 'Message is in Error state';
}
+ else if (!this.message.triggerPlain()) {
+ error = 'No plain trigger in the message';
+ }
else {
- let plain = this.message.triggerPlain(),
- resch = this.message.triggerRescheduleable();
- if (!plain && !resch) {
- error = 'No plain or rescheduleable trigger in the message';
+ let res = await this.message.updateAtomically({_id: this.message._id, state: this.message.state}, {$set: {state: State.Created | State.Streamable, status: Status.Scheduled}});
+ if (!res) {
+ error = 'Failed to update message';
}
- else {
- if (plain) {
- let res = await this.message.updateAtomically(
- { _id: this.message._id },
- {
- $set: {
- state: State.Created | State.Scheduling,
- status: Status.Scheduled
- }
- }
- );
-
- if (!res) {
- error = 'Failed to update message';
- }
-
- let result = await this.audience.push(plain).setStart(this.data.start).run(); // this.data.start is supposed to be undefined for now
-
- if (result.total === 0) {
- update = {
- $set: {
- 'result.total': 0,
- 'result.processed': 0,
- 'state': State.Created | State.Done | State.Error,
- status: Status.Failed,
- 'result.error': 'NoAudience'
- },
- $unset: {
- 'result.next': 1
- }
- };
- }
-
- if (update) {
- await this.message.update(update, () => {});
- log.i('Scheduled message %s: %j / %j / %j', this.message.id, this.message.state, this.message.status, this.message.result.json);
- }
- await this.message.updateAtomically(
- { _id: this.message._id },
- {
- $bit: {
- state: {
- and: ~State.Scheduling,
- or: State.Streamable
- }
- }
- }
- );
- }
- if (resch) {
- let res = await this.message.updateAtomically(
- { _id: this.message._id },
- {
- $bit: {
- state: {
- and: ~State.Streamable,
- or: State.Scheduling
- }
- },
- $set: {
- status: Status.Scheduled
- }
- }
- );
- if (!res) {
- error = 'Failed to update message';
+ let trigger = this.message.triggerPlain(),
+ result = await this.audience.push(trigger).setStart(this.data.start).run(); // this.data.start is supposed to be undefined for now
+
+ if (result.total === 0) {
+ update = {
+ $set: {
+ 'result.total': 0,
+ 'result.processed': 0,
+ 'state': State.Created | State.Done | State.Error,
+ status: Status.Failed,
+ 'result.error': 'NoAudience'
+ },
+ $unset: {
+ 'result.next': 1
}
-
- let now = new Date(this.data.reference),
- result = await this.audience.push(resch).setStart(now).run();
-
- log.i('Rescheduleable message %s scheduling result for %s: %j, full result %j', this.message.id, now, result, this.message.result.json);
-
- await this.message.updateAtomically(
- { _id: this.message._id },
- {
- $bit: {
- state: {
- and: ~State.Scheduling,
- or: State.Streamable
- }
- }
- }
- );
-
- await this.message.schedule(log);
- }
+ };
}
}
+ if (update) {
+ await this.message.update(update, () => {});
+ log.i('Scheduled message %s: %j / %j / %j', this.message.id, this.message.state, this.message.status, this.message.result.json);
+ }
+
if (error) {
done(error);
}
diff --git a/plugins/push/api/jobs/util/connector.js b/plugins/push/api/jobs/util/connector.js
index 50ef28a7652..eed4cbfa72c 100644
--- a/plugins/push/api/jobs/util/connector.js
+++ b/plugins/push/api/jobs/util/connector.js
@@ -1,5 +1,5 @@
const { DoFinish } = require('./do_finish'),
- { State, Status, Creds, pools, FRAME, PushError, SendError, ERROR, MAX_RUNS } = require('../../send');
+ { Message, State, Status, Creds, pools, FRAME, PushError, SendError, ERROR, MAX_RUNS } = require('../../send');
/**
* Stream responsible for handling sending results:
@@ -118,16 +118,15 @@ class Connector extends DoFinish {
return;
}
else if (!message) {
- // let query = Message.filter(new Date(), this.state.cfg.sendAhead);
- // query._id = push.m;
- let query = { _id: push.m };
+ let query = Message.filter(new Date(), this.state.cfg.sendAhead);
+ query._id = push.m;
this.db.collection('messages').findOne(query).then(msg => {
if (msg) {
this.log.d('sending message %s, %j', push.m, msg);
this.state.setMessage(msg); // only turns to app if there's one or more credentials found
}
else {
- this.log.e('message not found', push.m, query);
+ this.log.e('message not found', push.m);
this.state.discardMessage(push.m);
}
this.do_transform(push, encoding, callback);
@@ -170,7 +169,7 @@ class Connector extends DoFinish {
}
}, callback);
}
- else if (push._id.getTimestamp().getTime() < Date.now() - this.state.cfg.message_timeout) {
+ else if (push._id.getTimestamp().getTime() < Date.now() - 3600000) {
this.tooLateToSend.addAffected(push._id, 1);
this.do_flush(callback, true);
return;
@@ -179,7 +178,7 @@ class Connector extends DoFinish {
let creds = app.creds[push.p],
pid = pools.id(creds.hash, push.p, push.f);
if (pools.has(pid)) { // already connected
- // this.log.d('pgc', push._id); // Push Goes to Connection
+ this.log.d('pgc', push._id); // Push Goes to Connection
callback(null, push);
}
else if (pools.isFull) { // no connection yet and we can't create it, just ignore push so it could be sent next time
diff --git a/plugins/push/api/jobs/util/resultor.js b/plugins/push/api/jobs/util/resultor.js
index cff2018b9c7..382c4c91353 100644
--- a/plugins/push/api/jobs/util/resultor.js
+++ b/plugins/push/api/jobs/util/resultor.js
@@ -1,6 +1,23 @@
const { FRAME, FRAME_NAME } = require('../../send/proto'),
{ DoFinish } = require('./do_finish'),
{ ERROR, TriggerKind, State, Status, PushError, Result } = require('../../send/data');
+/**
+ * @typedef {import("mongodb").ObjectId} ObjectId
+ */
+
+/**
+ * PushStat object (collection: push_stats)
+ * @typedef {Object} PushStat
+ * @property {ObjectId} a - application id
+ * @property {ObjectId} m - message id from "messages" collection
+ * @property {string} u - uid from app_users{appId}
+ * @property {string} t - token from "push_{appId}" collection
+ * @property {string=} r - id returned from provider
+ * @property {Date} d - date this message sent to this user
+ * @property {string=} e - error message
+ * @property {string} p - platform: "a" for android, "i" for ios and "h" for huawei
+ * @property {string} f - token type: "p" for production
+ */
/**
* Stream responsible for handling sending results:
@@ -34,7 +51,10 @@ class Resultor extends DoFinish {
this.fatalErrors = {}; // {mid: []}
this.toDelete = []; // [push id, push id, ...]
this.count = 0; // number of results cached
- this.last = null; // time of last data from
+ this.last = null; // time of last data from
+
+ /** @type {PushStat[]} */
+ this.pushStats = [];
this.data.on('app', app => {
this.changed[app._id] = {};
@@ -118,11 +138,17 @@ class Resultor extends DoFinish {
if (id < 0) {
return;
}
- let {p, m, pr} = this.data.pushes[id],
+ const p = this.data.pushes[id];
+ let {p: platform, m, pr} = p,
msg = this.data.message(m),
result,
rp, rl;
+ // additional fields to keep this in push_stats
+ if (msg && msg.saveStats) {
+ this.pushStats.push({ a: p.a, m: p.m, p: p.p, f: p.f, u: p.u, t: p.t, d: new Date, r: null, e: results.toString() });
+ }
+
if (msg) {
result = msg.result;
result.lastRun.processed++;
@@ -131,7 +157,7 @@ class Resultor extends DoFinish {
else {
result = this.noMessage[m] || (this.noMessage[m] = new Result());
}
- rp = result.sub(p, undefined, PLATFORM[p].parent);
+ rp = result.sub(platform, undefined, PLATFORM[platform].parent);
rl = rp.sub(pr.la || 'default');
result.processed++;
@@ -141,8 +167,8 @@ class Resultor extends DoFinish {
rl.recordError(results.message, 1);
rl.processed++;
- if (PLATFORM[p].parent) {
- rp = result.sub(PLATFORM[p].parent),
+ if (PLATFORM[platform].parent) {
+ rp = result.sub(PLATFORM[platform].parent),
rl = rp.sub(pr.la || 'default');
rp.recordError(results.message, 1);
rp.processed++;
@@ -159,29 +185,39 @@ class Resultor extends DoFinish {
}
else {
results.forEach(res => {
- let id, token;
- if (typeof res === 'string') {
- // this.log.d('Ok for %s', id);
- id = res;
- }
- else {
+ let id, resultId, token;
+
+ if (Array.isArray(res)) {
this.log.d('New token for %s', id);
id = res[0];
token = res[1];
}
+ else {
+ id = res;
+ }
+
+ if (typeof id !== "string") {
+ resultId = id.r;
+ id = id.p;
+ }
let p = this.data.pushes[id];
if (!p) { // 2 or more resultors on one pool
return;
}
- this.data.decSending(p.m);
-
- let m = this.data.message(p.m),
+ let msg = this.data.message(p.m),
result, rp, rl;
- if (m) {
- result = m.result;
+ // additional fields to keep this in push_stats
+ if (msg && msg.saveStats) {
+ this.pushStats.push({ a: p.a, m: p.m, p: p.p, f: p.f, u: p.u, t: p.t, d: new Date, r: resultId, e: null });
+ }
+
+ this.data.decSending(p.m);
+
+ if (msg) {
+ result = msg.result;
result.lastRun.processed++;
}
else {
@@ -233,13 +269,20 @@ class Resultor extends DoFinish {
return;
}
this.log.d('Error %d %s for %s', results.type, results.name, id);
- let {m, p, pr} = this.data.pushes[id],
+ const p = this.data.pushes[id];
+ let {m, p: platform, pr} = p,
result, rp, rl;
+ let msg = this.data.message(m);
+
+ // additional fields to keep this in push_stats
+ if (msg && msg.saveStats) {
+ this.pushStats.push({ a: p.a, m: p.m, p: p.p, f: p.f, u: p.u, t: p.t, d: new Date, r: null, e: results.toString() });
+ }
+
mids[m] = (mids[m] || 0) + 1;
delete this.data.pushes[id];
this.toDelete.push(id);
- let msg = this.data.message(m);
if (msg) {
result = msg.result;
}
@@ -247,24 +290,17 @@ class Resultor extends DoFinish {
result = this.noMessage[m] || (this.noMessage[m] = new Result());
}
- result.processed++;
- result.recordError(results.message, 1);
-
- rp = result.sub(p, undefined, PLATFORM[p].parent);
+ rp = result.sub(platform, undefined, PLATFORM[platform].parent);
rl = rp.sub(pr.la || 'default');
rp.processed++;
- rp.recordError(results.message, 1);
rl.processed++;
- rl.recordError(results.message, 1);
- if (PLATFORM[p].parent) {
- rp = result.sub(PLATFORM[p].parent),
+ if (PLATFORM[platform].parent) {
+ rp = result.sub(PLATFORM[platform].parent),
rl = rp.sub(pr.la || 'default');
rp.processed++;
- rp.recordError(results.message, 1);
rl.processed++;
- rl.recordError(results.message, 1);
}
});
@@ -280,6 +316,7 @@ class Resultor extends DoFinish {
else {
result = this.noMessage[mid] || (this.noMessage[mid] = new Result());
}
+ result.processed += mids[mid];
let run = result.lastRun;
if (run) {
@@ -288,7 +325,7 @@ class Resultor extends DoFinish {
}
result.pushError(error);
- this.data.decSending(mid, mids[mid]);
+ this.data.decSending(mid);
}
}
@@ -313,7 +350,6 @@ class Resultor extends DoFinish {
promises = this.data.messages().map(m => {
m.result.lastRun.ended = new Date();
- // if (await Message.hasPushRecords(m.id)) {
if (this.data.isSending(m.id)) {
this.log.d('message %s is still in processing (%d out of %d)', m.id, m.result.processed, m.result.total);
return m.save();
@@ -331,35 +367,6 @@ class Resultor extends DoFinish {
status = Status.Scheduled;
}
}
- else if (m.triggerRescheduleable()) {
- let resch = m.triggerRescheduleable();
- if (m.result.total === m.result.errored) {
- state = State.Created | State.Error | State.Done;
- status = Status.Stopped;
- error = 'Failed to send all notifications';
- }
- else if (m.result.total === m.result.processed) {
- if (!resch.nextReference(resch.last)) { // TODO: this will probably result in skipping last reference if it's scheduled before last message in queue is sent
- state = State.Created | State.Done;
- status = Status.Sent;
- }
- else {
- state = m.state & ~State.Streaming;
- status = Status.Scheduled;
- }
- }
- else { // shouldn't happen, but possible in some weird cases
- state = m.state & ~State.Streaming;
- status = Status.Scheduled;
- // TODO: We're already scheduling the next message on jobs/schedule.js after creating push records.
- // It shouldn't matter if all of the queue processed or not.
- // m.schedule(this.log).then(() => {
- // this.log.i('Rescheduled %s from resultor', m.id);
- // }, e => {
- // this.log.e('Rescheduling error for %s from resultor', m.id, e);
- // });
- }
- }
else {
if (m.result.total === m.result.errored) {
state = State.Created | State.Error | State.Done;
@@ -398,7 +405,7 @@ class Resultor extends DoFinish {
let count = this.noMessage[mid].processed;
delete this.noMessage[mid];
- return this.db.collection('messages').updateOne({_id: this.db.ObjectID(mid)}, {$inc: {errored: count, processed: count, 'errors.NoMessage': count}});
+ return this.db.updateOne({_id: this.db.ObjectID(mid)}, {$inc: {errored: count, processed: count, 'errors.NoMessage': count}});
}));
if (this.toDelete.length) {
@@ -509,7 +516,6 @@ class Resultor extends DoFinish {
this.log.d('Recording %d [CLY]_push_sent\'s: %j', sent, params);
require('../../../../../api/parts/data/events').processEvents(params);
- //plugins.dispatch("/plugins/drill", {params: params, dbAppUser: params.app_user, events: params.qstring.events});
try {
this.log.d('Recording %d data points', sent);
@@ -543,6 +549,11 @@ class Resultor extends DoFinish {
}
}
+ if (this.pushStats.length) {
+ promises.push(this.db.collection("push_stats").insertMany(this.pushStats));
+ this.pushStats = [];
+ }
+
Promise.all(promises).then(() => {
this.log.d('do_flush done');
callback();
diff --git a/plugins/push/api/jobs/util/stream_wrapper.js b/plugins/push/api/jobs/util/stream_wrapper.js
deleted file mode 100644
index da081317fce..00000000000
--- a/plugins/push/api/jobs/util/stream_wrapper.js
+++ /dev/null
@@ -1,115 +0,0 @@
-const { PassThrough } = require('stream'),
- { dbext } = require('../../send/index'),
- log = require('../../../../../api/utils/log')('push:send:stream');
-
-/**
- * Wrapper around Mongo stream which handles timeouts and resumes if possible.
- */
-class StreamWrapper extends PassThrough {
- /**
- * Stream constructor
- *
- * @param {Object} col mongo collection object
- * @param {Object} filter object to filter push records
- * @param {number} sendAhead include notifications scheduled this far in the future
- * @param {number} timeout timeout to restart stream
- * @param {number} maxErrors maximum number of underlying stream errors including timeouts before ending the stream
- */
- constructor(col, filter = {}, sendAhead = 0, timeout = 10000, maxErrors = 10) {
- super({
- objectMode: true,
- emitClose: true
- });
- this.col = col;
- this.filter = filter;
- this.sendAhead = sendAhead;
- this.timeout = timeout;
- this.maxErrors = maxErrors;
- this.last = dbext.oidBlankWithDate(new Date(2000, 1, 1));
- this.lastEmited = Date.now();
- this.errors = 0;
- this.newStream();
- }
-
- /**
- * Start new stream
- *
- * @returns {object} mongo stream
- */
- newStream() {
- let less = dbext.oidBlankWithDate(new Date(Date.now() + this.sendAhead)),
- stream = this.col.find({ ...this.filter, _id: {$lte: less, $gt: this.last} }).stream(),
- /** periodic function for checking for timeout */
- check = () => {
- if (this.lastEmited === null) {
- log.i('stream closed, ignoring timeout');
- }
- else if (this.lastEmited < Date.now() - this.timeout) {
- stream.unpipe(this);
- stream.destroy();
- this.errors++;
-
- if (this.errors >= this.maxErrors) {
- log.i('no data from stream since %s, ending', new Date(this.lastEmited));
- this.emit('error', new Error(this.errors + 'th timeout'));
- this.end();
- }
- else {
- log.i('no data from stream since %s, restarting from %s (%s)', new Date(this.lastEmited), this.last, this.last.getTimestamp());
- this.newStream();
- }
- }
- else {
- nextCheck = setTimeout(check, this.timeout / 10);
- }
- },
- nextCheck;
-
- log.d('streaming starting from %s (%s)', this.last, this.last.getTimestamp());
-
- let i = 0;
- stream.on('data', obj => {
- if (i % 1000 === 0) {
- log.d('%j', obj);
- }
- i++;
- this.last = obj._id;
- this.lastEmited = Date.now();
- });
- stream.on('end', () => {
- log.i('stream exhausted after %d records, ending', i);
- clearTimeout(nextCheck);
- this.push(null);
- });
- stream.on('close', () => {
- this.lastEmited = null;
- log.i('stream close');
- });
- stream.on('unpipe', () => {
- log.i('stream unpipe');
- });
- stream.on('error', err => {
- log.i('stream error', err);
- this.errors++;
- stream.unpipe(this);
- stream.destroy();
-
- if (this.errors >= this.maxErrors) {
- this.emit('error', err);
- this.end();
- }
- else {
- this.newStream();
- }
- });
-
- stream.pipe(this, {end: false});
-
- nextCheck = setTimeout(check.bind(this), 1000);
-
- return this.stream = stream;
- }
-}
-
-
-module.exports = { StreamWrapper };
\ No newline at end of file
diff --git a/plugins/push/api/proxy.js b/plugins/push/api/proxy.js
index 7b8f976218e..83a1bcadc79 100644
--- a/plugins/push/api/proxy.js
+++ b/plugins/push/api/proxy.js
@@ -37,7 +37,6 @@ function proxyAgent(url, proxy, agentConfig = {}) {
// socket.ref();
// };
- let rejects = [];
this.createConnection = (options, callback) => {
let connectOptions = {
method: 'CONNECT',
@@ -84,49 +83,6 @@ function proxyAgent(url, proxy, agentConfig = {}) {
// sock.removeAllListeners();
callback(err);
});
- socket.on('error', err => {
- err = err || new Error('ProxySocketError');
- log.e('socket errored, rejecting %d promises', rejects.length, err);
- rejects.forEach(rej => rej(err));
-
- try {
- sock.emit('timeout', err);
- }
- catch (e) {
- log.e('Failed to emit err on client socket', e);
- }
- try {
- sock.destroy(err);
- }
- catch (e) {
- log.e('Failed to destroy client socket on proxy err', e);
- }
-
- callback(err);
-
- });
- socket.on('timeout', err => {
- err = err || new Error('ProxyTimeout');
- log.e('socket timeouted, rejecting %d promises', rejects.length, err);
- rejects.forEach(rej => rej(err));
-
- try {
- sock.emit('timeout', err);
- }
- catch (e) {
- log.e('Failed to emit timeout on client socket', e);
- }
- try {
- sock.destroy(err);
- }
- catch (e) {
- log.e('Failed to destroy client socket on ProxyTimeout', e);
- }
- callback(err);
- });
- socket.on('end', err => {
- log.e('socket ended', err);
- });
callback(null, sock);
// callback(null, sock);
// Super.createConnection.apply(self, [{...options, socket}, callback]);
@@ -154,27 +110,16 @@ function proxyAgent(url, proxy, agentConfig = {}) {
});
connect.once('error', err => {
- // connect.removeAllListeners();
+ connect.removeAllListeners();
callback(err);
});
connect.once('timeout', () => {
- connect.destroy(new Error('ProxyTimeout'));
+ connect.destroy(new Error('Proxy timeout'));
});
connect.end();
};
-
- this.pushReject = rej => {
- rejects.push(rej);
- };
-
- this.popReject = rej => {
- let i = rejects.indexOf(rej);
- if (i !== -1) {
- rejects.splice(i, 1);
- }
- };
};
if (url.protocol === 'http:') {
diff --git a/plugins/push/api/send/audience.js b/plugins/push/api/send/audience.js
index 25a9bcda317..a3cb46a0fb3 100644
--- a/plugins/push/api/send/audience.js
+++ b/plugins/push/api/send/audience.js
@@ -2,7 +2,7 @@ const common = require('../../../../api/utils/common'),
{ PushError, ERROR } = require('./data/error'),
{ util } = require('./std'),
{ Message, State, TriggerKind, Result, dbext } = require('./data'),
- { DEFAULTS, Time } = require('./data/const'),
+ { DEFAULTS } = require('./data/const'),
{ PLATFORM } = require('./platforms'),
{ Push } = require('./data/message'),
{ fields, TK } = require('./platforms'),
@@ -45,22 +45,6 @@ const common = require('../../../../api/utils/common'),
}
};
-/**
- * Get current time, to be able to override it in tests
- *
- * @returns {Number} current date in ms
- */
-let now = () => Date.now();
-
-/**
- * Set now function, for tests
- *
- * @param {function} f now function
- */
-function setNow(f) {
- now = f;
-}
-
/**
* Class encapsulating user selection / queue / message scheduling logic
*/
@@ -89,7 +73,6 @@ class Audience {
if (!this.app) {
throw new PushError(`App ${this.message.app} not found`, ERROR.EXCEPTION);
}
- this.plugins = await common.db.collection('plugins').findOne({_id: 'plugins'});
}
return this.app;
}
@@ -195,9 +178,6 @@ class Audience {
if (!project.tk) {
project.tk = 1;
}
- if (!project.tz) {
- project.tz = 1;
- }
steps.push({$project: project});
}
@@ -232,7 +212,7 @@ class Audience {
let query = filter.user;
if (query) {
let params = {
- time: common.initTimeObj(this.app.timezone, now()),
+ time: common.initTimeObj(this.app.timezone, Date.now()),
qstring: Object.assign({app_id: this.app._id.toString()}, query),
app_id: this.app._id.toString()
};
@@ -294,7 +274,7 @@ class Audience {
// drill().drill.openDrillDb();
let params = {
- time: common.initTimeObj(this.app.timezone, now()),
+ time: common.initTimeObj(this.app.timezone, Date.now()),
qstring: Object.assign({app_id: this.app._id.toString()}, query),
app_id: this.app._id.toString()
};
@@ -423,7 +403,7 @@ class Mapper {
ret.pr[k] = user[k];
}
});
- // common.log('push').d('mapped push', ret);
+ common.log('push').d('mapped push', ret);
return ret;
}
}
@@ -444,12 +424,12 @@ class PlainApiMapper extends Mapper {
map(user, date, c, offset = 0) {
let d = date.getTime();
if (this.trigger.tz) {
- let utz = (user.tz === undefined || user.tz === null ? this.offset || 0 : parseFloat(user.tz) || 0) * 60000;
+ let utz = (user.tz === undefined || user.tz === null ? this.offset || 0 : user.tz || 0) * 60000;
d = date.getTime() - this.trigger.sctz * 60000 - utz;
- if (d < (now() - (Time.TOO_LATE_TO_SEND - Time.TIME_TO_SEND))) {
+ if (d < Date.now()) {
if (this.trigger.reschedule) {
- d = d + Time.DAY;
+ d = d + 24 * 60 * 60000;
}
else {
return null;
@@ -488,9 +468,9 @@ class CohortsEventsMapper extends Mapper {
auto.setMilliseconds(0);
inTz = auto.getTime() + this.trigger.time + (new Date().getTimezoneOffset() || 0) * 60000 - utz;
- if (inTz < (now() - (Time.TOO_LATE_TO_SEND - Time.TIME_TO_SEND))) {
+ if (inTz < Date.now()) {
if (this.trigger.reschedule) {
- d = inTz + Time.DAY;
+ d = inTz + 24 * 60 * 60000;
}
else {
return null;
@@ -526,40 +506,6 @@ class CohortsEventsMapper extends Mapper {
}
}
-/**
- * Plain or API triggers mapper - uses date calculation logic for those cases
- */
-class MultiRecurringMapper extends Mapper {
- /**
- * Map app_user object to message
- *
- * @param {object} user app_user object
- * @param {Date} date reference date (time of delivery in UTC, only user tz is what's left to add here for tz messages)
- * @param {object[]} c [Content.json] overrides
- * @param {int} offset rate limit offset
- * @returns {object} push object ready to be inserted
- */
- map(user, date, c, offset) {
- let d = date.getTime();
-
- // send in user's timezone
- if (this.trigger.tz) {
- let utz = Number(user.tz === undefined || user.tz === null ? this.offset || 0 : user.tz || 0);
- d -= (utz + date.getTimezoneOffset()) * 60000;
- }
-
- if (d < (now() - (Time.TOO_LATE_TO_SEND - Time.TIME_TO_SEND))) {
- if (this.trigger.reschedule) {
- d += Time.DAY;
- }
- else {
- return null;
- }
- }
-
- return super.map(user, d, c, offset);
- }
-}
/**
* Pushing / popping notes to queue logic
*/
@@ -577,14 +523,8 @@ class PusherPopper {
if (trigger.kind === TriggerKind.API || trigger.kind === TriggerKind.Plain) {
this.mappers[p + f] = new PlainApiMapper(audience.app, audience.message, trigger, p, f);
}
- else if (trigger.kind === TriggerKind.Recurring || trigger.kind === TriggerKind.Multi) {
- this.mappers[p + f] = new MultiRecurringMapper(audience.app, audience.message, trigger, p, f);
- }
- else if (trigger.kind === TriggerKind.Event || trigger.kind === TriggerKind.Cohort) {
- this.mappers[p + f] = new CohortsEventsMapper(audience.app, audience.message, trigger, p, f);
- }
else {
- throw new PushError('Invalid trigger kind ' + trigger.kind);
+ this.mappers[p + f] = new CohortsEventsMapper(audience.app, audience.message, trigger, p, f);
}
}));
}
@@ -723,8 +663,7 @@ class Pusher extends PusherPopper {
offset = 0,
curPeriod = 0,
ratePeriod = (this.audience.app.plugins.push.rate || {}).period || 0,
- rateNumber = (this.audience.app.plugins.push.rate || {}).rate || 0,
- deduplicate = this.audience.plugins && this.audience.plugins.push && this.audience.plugins.push.deduplicate || false;
+ rateNumber = (this.audience.app.plugins.push.rate || {}).rate || 0;
for await (let user of stream) {
let push = user[TK][0],
@@ -791,162 +730,14 @@ class Pusher extends PusherPopper {
}
}
- if (result.total) {
- this.audience.log.d('inserting final batch of %d, %d records total', batch.length, batch.total);
- await batch.flush([11000]);
- }
-
-
- if (result.total > 1 && deduplicate) {
- this.audience.log.d('Checking for duplicates');
-
- // group notifications just scheduled by token, message id and date up to a minute precision (won't work with heavy rate limiting)
- // [
- // {$match: {m: this.audience.message._id}},
- // {$addFields: {d: {$dateToString: {date: '$_id', format: '%Y-%m-%dT%H:%M'}}}},
- // {$project: {_id: 1, t: 1, m: 1, d: 1}},
- // {$group: {_id: {t: '$t', m: '$m', d: '$d'}, dups: {$push: '$_id'}, count: {$sum: 1}}},
- // {$match: {count: {$gt: 1}}},
- // {$project: {_id: '$dups'}}
- // ]
- let dups = await common.db.collection(Push.collection).aggregate([
- {$match: {m: this.audience.message._id}},
- {$addFields: {d: {$dateToString: {date: '$_id', format: '%Y-%m-%dT%H:%M'}}}},
- {$project: {_id: 1, t: 1, m: 1, d: 1, u: 1, p: 1, f: 1, 'la': '$pr.la'}},
- {$group: {_id: {t: '$t', m: '$m', d: '$d'}, dups: {$push: {_id: '$_id', u: '$u', la: '$la', p: '$p', f: '$f'}}, count: {$sum: 1}}},
- {$match: {count: {$gt: 1}}},
- {$project: {_id: '$dups'}}
- ]).toArray();
-
- let left = dups.length,
- notifications_to_remove = [],
- push_users_to_remove = [],
- app_users_to_unset = {},
- push_tokens_to_unset = {};
-
- if (left) {
- this.audience.log.i('Going to check %d duplicate with same token', left);
-
- let uids = new Set();
- for (const doc of dups) {
- for (const dup of doc._id) {
- uids.add(dup.u);
- }
- }
- uids = Array.from(uids);
- let [all_app_users, all_push_users] = await Promise.all([
- common.db.collection(`app_users${this.audience.app._id}`).find({uid: {$in: uids}}, {_id: 1, uid: 1, ls: 1}).toArray(),
- common.db.collection(`push_${this.audience.app._id}`).find({_id: {$in: uids}}, {_id: 1}).toArray()
- ]);
-
- all_app_users = arrayToKeyObject(all_app_users, 'uid');
- all_push_users = arrayToKeyObject(all_push_users, '_id');
-
- // iterating one by one is slow enough to have a switch in settings
- for (const doc of dups) {
- let pushes = doc._id,
- dup_uids = pushes.map(d => d.u),
- app_users = dup_uids.map(uid => all_app_users[uid]).filter(x => !!x),
- push_users = dup_uids.map(uid => all_push_users[uid]).filter(x => !!x).map(u => u._id);
-
- let ghost_push_users = push_users.filter(u => app_users.filter(au => au.uid === u).length === 0);
- if (ghost_push_users.length) {
- this.audience.log.d('Found %d stale push user record(s), removing', ghost_push_users.length);
- for (let u of ghost_push_users) {
- push_users_to_remove.push(u);
- for (let push of pushes.filter(p => p.u === u)) {
- notifications_to_remove.push(push._id);
- if (updates['result.total']) {
- updates['result.total'] -= 1;
- }
- if (updates[`result.subs.${push.p}.total`]) {
- updates[`result.subs.${push.p}.total`] -= 1;
- }
- let la = push.la || 'default';
- if (updates[`result.subs.${push.p}.subs.${la}.total`]) {
- updates[`result.subs.${push.p}.subs.${la}.total`] -= 1;
- }
- }
- pushes = pushes.filter(p => p.u !== u);
- }
- }
-
- app_users = app_users.filter(u => pushes.filter(p => p.u === u.uid).length !== 0);
-
- if (pushes.length && app_users.length > 1) {
- this.audience.log.d('Users %j have same token, their ls are %j, leaving only the recent one\'s token ', app_users.map(u => u._id), app_users.map(u => u.ls));
- app_users.sort((a, b) => b.ls - a.ls);
- while (app_users.length > 1) {
- let au = app_users.pop();
- for (let push of pushes.filter(p => p.u === au.uid)) {
- notifications_to_remove.push(push._id);
- if (updates['result.total']) {
- updates['result.total'] -= 1;
- }
- if (updates[`result.subs.${push.p}.total`]) {
- updates[`result.subs.${push.p}.total`] -= 1;
- }
- let la = push.la || 'default';
- if (updates[`result.subs.${push.p}.subs.${la}.total`]) {
- updates[`result.subs.${push.p}.subs.${la}.total`] -= 1;
- }
-
- if (!app_users_to_unset[push.p + push.f]) {
- app_users_to_unset[push.p + push.f] = [];
- }
- if (!push_tokens_to_unset[push.p + push.f]) {
- push_tokens_to_unset[push.p + push.f] = [];
- }
- app_users_to_unset[push.p + push.f].push(au._id);
- push_tokens_to_unset[push.p + push.f].push(au.uid);
- }
- }
- }
-
- left--;
-
- if (left > 0 && left % 1000 === 0) {
- this.audience.log.i('... still checking duplicates, %d left', left);
- }
- }
-
- this.audience.log.d('Removing %d pushes with duplicate tokens', notifications_to_remove.length);
- if (notifications_to_remove.length) {
- await common.db.collection(Push.collection).deleteMany({_id: {$in: notifications_to_remove}});
- }
-
- this.audience.log.d('Removing %d ghost push users', push_users_to_remove.length);
- if (push_users_to_remove.length) {
- await common.db.collection(`push_${this.audience.app._id}`).deleteMany({_id: {$in: push_users_to_remove}});
- }
-
- let unsets = Object.values(app_users_to_unset).map(arr => arr.length).reduce((a, b) => a + b, 0);
- this.audience.log.d('Unsetting %d duplicate user tokens in app_users', unsets);
- if (unsets) {
- for (let pf in app_users_to_unset) {
- await common.db.collection(`app_users${this.audience.app._id}`).updateMany({_id: {$in: app_users_to_unset[pf]}}, {$unset: {['tk' + pf]: 1}});
- }
- }
-
- unsets = Object.values(push_tokens_to_unset).map(arr => arr.length).reduce((a, b) => a + b, 0);
- this.audience.log.d('Unsetting %d duplicate user tokens in push_ collection', unsets);
- if (unsets) {
- for (let pf in push_tokens_to_unset) {
- await common.db.collection(`push_${this.audience.app._id}`).updateMany({_id: {$in: push_tokens_to_unset[pf]}}, {$unset: {['tk.' + pf]: 1}});
- }
- }
- }
- }
- else {
- this.audience.log.d('No duplicates found');
- }
-
if (result.total) {
let update = {$inc: updates};
if (Object.keys(virtuals).length) {
update.$set = virtuals;
}
await this.audience.message.update(update, () => {});
+ this.audience.log.d('inserting final batch of %d, %d records total, message update %j', batch.length, batch.total, update);
+ await batch.flush([11000]);
}
return result;
@@ -1028,19 +819,4 @@ class Popper extends PusherPopper {
}
}
-/**
- * Convert array of objects into a map indexed by given key, they key must be present in all objects
- *
- * @param {Object[]} arr array of objects
- * @param {String} key key
- * @returns {Object} resulting object
- */
-function arrayToKeyObject(arr, key) {
- let obj = {};
- for (const e of arr) {
- obj[e[key]] = e;
- }
- return obj;
-}
-
-module.exports = { Audience, MultiRecurringMapper, setNow };
\ No newline at end of file
+module.exports = { Audience };
\ No newline at end of file
diff --git a/plugins/push/api/send/data/const.js b/plugins/push/api/send/data/const.js
index 3ecb0119b34..1587178f33e 100644
--- a/plugins/push/api/send/data/const.js
+++ b/plugins/push/api/send/data/const.js
@@ -26,6 +26,7 @@ const MEDIA_MIME_ANDROID = [
};
const DEFAULTS = {
+ schedule_ahead: 5 * 60000, // schedule job needs to be scheduled this much ms prior to the job date
queue_insert_batch: 100000, // insert into "push" collection in batches of 100 000 records
max_media_size: 1024 * 1024 // 1Mb is a very conservative limit for media attachments
};
@@ -147,33 +148,8 @@ const TriggerKind = {
Event: 'event', // Automated on-event message
Cohort: 'cohort', // Automated on-cohort message
API: 'api', // API (Transactional) message
- Recurring: 'rec', // Recurring message,
- Multi: 'multi', // Multiple times,
};
-/**
- * Recurring message types
- */
-const RecurringType = {
- Daily: 'daily',
- Weekly: 'weekly',
- Monthly: 'monthly'
-};
-
-
-/**
- * Time limits (0 ... 24h in milliseconds - 1)
- */
-const Time = {
- MIN: 0, // min time of day in ms
- MAX: 24 * 60 * 60000 - 1, // max time of day in ms
- DAY: 24 * 60 * 60000, // ms in a day
- SEND_AHEAD: 5 * 60000, // send message max 5min early
- TIME_TO_SEND: 2 * 60000, // generally 2min should be enough to send a notification
- TOO_LATE_TO_SEND: 1 * 60 * 60000, // send message max 1hr late
- EASTMOST_TIMEZONE: 14 * 60 * 60000, // the most eastern timezone possible
- SCHEDULE_AHEAD: 10 * 60000, // schedule messages this much ahead (plus EASTMOST_TIMEZONE for timezoned messages) to ensure audience calculation runs on time
-};
/* eslint-enable key-spacing, no-multi-spaces */
@@ -222,8 +198,6 @@ module.exports = {
STATUSES: Object.values(Status),
TriggerKind,
- RecurringType,
- Time,
PersType,
PERS_TYPES: Object.values(PersType),
diff --git a/plugins/push/api/send/data/index.js b/plugins/push/api/send/data/index.js
index fd4e707c244..0bd501e80b6 100644
--- a/plugins/push/api/send/data/index.js
+++ b/plugins/push/api/send/data/index.js
@@ -1,6 +1,6 @@
-const { S, State, Status, STATUSES, TriggerKind, RecurringType, Time, MEDIA_MIME_ALL, MEDIA_MIME_IOS, MEDIA_MIME_ANDROID, DBMAP } = require('./const'),
+const { S, State, Status, STATUSES, TriggerKind, MEDIA_MIME_ALL, MEDIA_MIME_IOS, MEDIA_MIME_ANDROID, DBMAP } = require('./const'),
{ PushError, SendError, ConnectionError, ValidationError, ERROR } = require('./error'),
- { Trigger, PlainTrigger, EventTrigger, CohortTrigger, APITrigger, MultiTrigger, RecurringTrigger } = require('./trigger'),
+ { Trigger, PlainTrigger, EventTrigger, CohortTrigger, APITrigger } = require('./trigger'),
{ Info } = require('./info'),
{ Creds } = require('./creds'),
{ Filter } = require('./filter'),
@@ -20,15 +20,11 @@ module.exports = {
Creds,
TriggerKind,
- RecurringType,
- Time,
Trigger,
PlainTrigger,
EventTrigger,
CohortTrigger,
APITrigger,
- MultiTrigger,
- RecurringTrigger,
Filter,
Content,
diff --git a/plugins/push/api/send/data/info.js b/plugins/push/api/send/data/info.js
index 820d8994c6c..8ff389c0076 100644
--- a/plugins/push/api/send/data/info.js
+++ b/plugins/push/api/send/data/info.js
@@ -33,7 +33,7 @@ class Info extends Validatable {
* @param {Date} data.started date of first sending start
* @param {Date} data.startedLast date of last sending start
* @param {Date} data.finished date of state being set to Done
- * @param {Boolean} data.demo true if this is a demo message
+ * @param {Date} data.demo true if this is a demo message
*/
constructor(data) {
super(data);
diff --git a/plugins/push/api/send/data/message.js b/plugins/push/api/send/data/message.js
index bc0f8e882c3..02c331c667f 100644
--- a/plugins/push/api/send/data/message.js
+++ b/plugins/push/api/send/data/message.js
@@ -1,5 +1,5 @@
'use strict';
-const { State, Status, STATUSES, Mongoable, S, S_REGEXP, Time } = require('./const'),
+const { State, Status, STATUSES, Mongoable, DEFAULTS, S, S_REGEXP } = require('./const'),
{ Filter } = require('./filter'),
{ Content } = require('./content'),
{ Trigger, PlainTrigger, TriggerKind } = require('./trigger'),
@@ -33,13 +33,14 @@ class Message extends Mongoable {
/**
* Validation scheme of this class
- *
+ *
* @returns {object} validateArgs scheme
*/
static get scheme() {
return {
_id: { required: false, type: 'ObjectID' },
app: { required: true, type: 'ObjectID' },
+ saveStats: { required: false, type: 'Boolean' },
platforms: { required: true, type: 'String[]', in: () => require('../platforms').platforms },
state: { type: 'Number' },
status: { type: 'String', in: Object.values(Status) },
@@ -49,7 +50,6 @@ class Message extends Mongoable {
},
triggers: {
type: Trigger.scheme,
- discriminator: Trigger.discriminator.bind(Trigger),
array: true,
required: true,
'min-length': 1
@@ -107,21 +107,14 @@ class Message extends Mongoable {
*/
static filter(date, play, state = State.Streamable) {
let $lte = new Date(date.getTime() + play),
- $gte = new Date(date.getTime() - play),
- lte_plus = new Date(date.getTime() + play + 15 * 60 * 60 * 1000),
- gte_minus = new Date(date.getTime() - play - 15 * 60 * 60 * 1000);
+ $gte = new Date(date.getTime() - play);
return {
state: {$bitsAllSet: state},
$or: [
- {triggers: {$elemMatch: {kind: TriggerKind.Plain, tz: false, start: {$lte}}}}, // either almost now for non timezoned messages
- {triggers: {$elemMatch: {kind: TriggerKind.Plain, tz: true, start: {$lte: lte_plus}}}}, // or UTC+-15 (max possible with DST)
- {triggers: {$elemMatch: {kind: TriggerKind.Cohort, time: {$exists: false}, start: {$lte}, $or: [{end: {$gte}}, {end: {$exists: false}}]}}},
- {triggers: {$elemMatch: {kind: TriggerKind.Cohort, time: {$exists: true}, start: {$lte: lte_plus}, $or: [{end: {$gte: gte_minus}}, {end: {$exists: false}}]}}},
- {triggers: {$elemMatch: {kind: TriggerKind.Event, time: {$exists: false}, start: {$lte}, $or: [{end: {$gte}}, {end: {$exists: false}}]}}},
- {triggers: {$elemMatch: {kind: TriggerKind.Event, time: {$exists: true}, start: {$lte: lte_plus}, $or: [{end: {$gte: gte_minus}}, {end: {$exists: false}}]}}},
+ {triggers: {$elemMatch: {kind: TriggerKind.Plain, start: {$lte}}}},
+ {triggers: {$elemMatch: {kind: TriggerKind.Cohort, start: {$lte}, $or: [{end: {$gte}}, {end: {$exists: false}}]}}},
+ {triggers: {$elemMatch: {kind: TriggerKind.Event, start: {$lte}, $or: [{end: {$gte}}, {end: {$exists: false}}]}}},
{triggers: {$elemMatch: {kind: TriggerKind.API, start: {$lte}, $or: [{end: {$gte}}, {end: {$exists: false}}]}}},
- {triggers: {$elemMatch: {kind: TriggerKind.Multi, start: {$lte}, $or: [{end: {$gte}}, {end: {$exists: false}}]}}},
- {triggers: {$elemMatch: {kind: TriggerKind.Recurring, start: {$lte}, $or: [{end: {$gte}}, {end: {$exists: false}}]}}},
]
};
}
@@ -156,9 +149,32 @@ class Message extends Mongoable {
}
}
+ /**
+ * Getter for message.saveStats
+ *
+ * @returns {boolean} saveStats
+ */
+ get saveStats() {
+ return this._data.saveStats;
+ }
+
+ /**
+ * Setter for message.saveStats
+ *
+ * @param {boolean} value value to set
+ */
+ set saveStats(value) {
+ if (typeof value !== "boolean") {
+ this._data.saveStats = false;
+ }
+ else {
+ this._data.saveStats = value;
+ }
+ }
+
/**
* Getter for platforms
- *
+ *
* @returns {string[]|undefined} platforms array
*/
get platforms() {
@@ -167,7 +183,7 @@ class Message extends Mongoable {
/**
* Setter for platforms
- *
+ *
* @param {string[]|undefined} arr platforms array
*/
set platforms(arr) {
@@ -209,7 +225,7 @@ class Message extends Mongoable {
* @returns {boolean} true if the message is in this state
*/
is(inState) {
- return (inState === 0 && this.state === 0) || (this.state !== 0 && (this.state & inState) > 0);
+ return (this.state & inState) > 0;
}
/**
@@ -318,15 +334,6 @@ class Message extends Mongoable {
return this.triggerFind(TriggerKind.Plain);
}
- /**
- * Search for rescheduleable trigger
- *
- * @returns {ReschedulingTrigger|undefined} multi or recurring trigger if message has it
- */
- triggerRescheduleable() {
- return this.triggerFind(t => t.isRescheduleable);
- }
-
/**
* Getter for contents
*
@@ -454,30 +461,6 @@ class Message extends Mongoable {
return keys;
}
- /**
- * Returns the ids of messages that has at least one record in "push" collection
- *
- * @returns {string[]} ids of the messages
- */
- static async findStreamableMessageIds() {
- const streamableMessages = await this.findMany({
- state: {
- $bitsAllSet: State.Streamable
- }
- });
- return streamableMessages.map(message => message._id);
- }
-
- // static async hasPushRecords(id) {
- // let oid = dbext.oidBlankWithDate(new Date());
- // const push = await common.db.collection(Push.collection).findOne({
- // _id: { $lte: oid },
- // m: dbext.ObjectID(id),
- // });
- // // console.log(push, id);
- // return !!push;
- // }
-
/**
* Encode field key so it could be stored in mongo (replace dots with S - Separator)
*
@@ -549,7 +532,7 @@ class Message extends Mongoable {
*/
get needsScheduling() {
return this.state === State.Created && this.triggers.filter(t => t.kind === TriggerKind.Plain &&
- (!t.delayed || (t.delayed && !t.tz && t.start.getTime() > Date.now() - Time.SCHEDULE_AHEAD) || (t.delayed && t.tz && t.start.getTime() > Date.now() - (Time.EASTMOST_TIMEZONE + Time.SCHEDULE_AHEAD)))).length > 0;
+ (!t.delayed || (t.delayed && t.start.getTime() > Date.now() - 5 * 60000))).length > 0;
}
/**
@@ -657,11 +640,11 @@ class Message extends Mongoable {
* @param {log} log logger
*/
async schedule(log) {
+ if (this.is(State.Streamable) || this.is(State.Streaming)) {
+ await this.stop(log);
+ }
let plain = this.triggerPlain();
if (plain) {
- if (this.is(State.Streamable) || this.is(State.Streaming)) {
- await this.stop(log);
- }
if (this.is(State.Cleared) && !this.triggerAutoOrApi()) {
// reset message state removing all errors set by .stop() above
await this.updateAtomically({_id: this._id, state: this.state}, {
@@ -676,30 +659,13 @@ class Message extends Mongoable {
}
});
}
- let date = Date.now();
- if (plain.delayed) {
- date = plain.start.getTime() - (plain.tz ? (Time.EASTMOST_TIMEZONE + Time.SCHEDULE_AHEAD) : Time.SCHEDULE_AHEAD);
- }
+ let date = plain.delayed ? plain.start.getTime() - DEFAULTS.schedule_ahead : Date.now();
await require('../../../../../api/parts/jobs').job('push:schedule', {mid: this._id, aid: this.app}).replace().once(date);
}
if (this.triggerAutoOrApi() && (this.is(State.Done) || this.state === State.Created)) {
await this.updateAtomically({_id: this._id, state: this.state}, {$set: {state: State.Streamable | State.Created, status: Status.Scheduled}});
await require('../../../../pluginManager').getPluginsApis().push.cache.write(this.id, this.json);
}
- let resch = this.triggerRescheduleable();
- if (resch && !this.is(State.Done)) {
- let reference = resch.nextReference(resch.last),
- start = reference && resch.scheduleDate(reference);
- log.i('Rescheduling message %s: reference %s (was %s), start %s', this.id, reference, resch.last, start);
- if (start) {
- await this.updateAtomically({_id: this._id, state: this.state, 'triggers.kind': resch.kind}, {$set: {'triggers.$.last': reference, 'triggers.$.prev': resch.last}});
- await require('../../../../../api/parts/jobs').job('push:schedule', {mid: this._id, aid: this.app, reference}).replace().once(start);
- }
- else {
- log.i('Message %s is sent, won\'t reschedule', this.id);
- // await this.updateAtomically({_id: this._id, state: this.state}, {$set: {state: State.Created | State.Done, status: Status.Sent}});
- }
- }
}
/**
@@ -714,7 +680,6 @@ class Message extends Mongoable {
let plain = this.triggerPlain(),
auto = this.triggerAutoOrApi(),
- resch = this.triggerRescheduleable(),
removed = 0,
audience = new Audience(log, this);
@@ -726,9 +691,6 @@ class Message extends Mongoable {
else if (plain) {
removed += await audience.pop(plain).clear();
}
- else if (resch) {
- removed += await audience.pop(resch).clear();
- }
await JOBS.cancel('push:schedule', {mid: this._id, aid: this.app});
@@ -738,8 +700,6 @@ class Message extends Mongoable {
await PLUGINS.getPluginsApis().push.cache.remove(this.id);
}
- log.i('Stopped message %s deleting %d notes', this.id, removed);
-
return removed;
}
}
diff --git a/plugins/push/api/send/data/template.js b/plugins/push/api/send/data/template.js
index 0db4f9090b1..e2b8e0916ce 100644
--- a/plugins/push/api/send/data/template.js
+++ b/plugins/push/api/send/data/template.js
@@ -71,61 +71,6 @@ class Template {
return this.str(this.titles, str, pers, p);
}
- /**
- * Simplified version of {@link compile} for push/user query
- *
- * @param {object} push push object to compile
- * @returns {object} simplified message sending result
- */
- guess_compile(push) {
- let la = push.pr.la,
- title, message;
-
- this.result = this.platform.empty(this.msg);
- for (let i = 0; i < this.contents.length; i++) {
- let content = this.contents[i];
- if ((!content.p || content.p === this.platform.key) && (!content.la || content.la === la)) {
- this.appl(this.platform.fields, content, push.pr);
- if (content.title && !content.titlePers) {
- this.platform.map.title(this, content.title);
- }
- if (content.message && !content.messagePers) {
- this.platform.map.message(this, content.message);
- }
- }
- }
-
- for (let i = this.contents.length - 1; i >= 0; i--) {
- let c = this.contents[i];
- if (c.la && c.la !== la) {
- continue;
- }
-
- if (title === undefined) {
- if (c.titlePers) {
- title = this.title(c.title, c.titlePersDeup, push.pr);
- }
- else {
- title = c.title;
- }
- }
- if (message === undefined) {
- if (c.messagePers) {
- message = this.message(c.message, c.messagePersDeup, push.pr);
- }
- else {
- message = c.message;
- }
- }
- }
-
- return {
- _id: this.msg.id,
- title,
- message
- };
- }
-
/**
* Compile msg to platform-specific payload
*
diff --git a/plugins/push/api/send/data/trigger.js b/plugins/push/api/send/data/trigger.js
index ac4fd1537cd..9ece4c22ca1 100644
--- a/plugins/push/api/send/data/trigger.js
+++ b/plugins/push/api/send/data/trigger.js
@@ -1,8 +1,7 @@
'use strict';
-const { PushError, ValidationError } = require('./error'),
- { toDate, TriggerKind, Validatable, RecurringType, Time } = require('./const'),
- moment = require('moment');
+const { PushError } = require('./error'),
+ { toDate, TriggerKind, Validatable } = require('./const');
/**
* Base clsss for message triggers
@@ -30,53 +29,16 @@ class Trigger extends Validatable {
this._data = data;
}
- /**
- * Check if the trigger is rescheduleable
- */
- get isRescheduleable() {
- return this instanceof ReschedulingTrigger;
- }
-
/**
* Class validation rules
*/
static get scheme() {
return {
kind: {type: 'String', in: Object.values(TriggerKind)},
- start: {type: 'Date', required: true},
- last: {type: 'Date', required: false},
+ start: {type: 'Date', required: true}
};
}
- /**
- * Class validation rules for all trigger kinds
- * @param {object} data data to validate
- * @returns {object} trigger scheme for given data
- */
- static discriminator(data) {
- if (data.kind === TriggerKind.Cohort) {
- return CohortTrigger.scheme;
- }
- else if (data.kind === TriggerKind.Event) {
- return EventTrigger.scheme;
- }
- else if (data.kind === TriggerKind.API) {
- return APITrigger.scheme;
- }
- else if (data.kind === TriggerKind.Plain) {
- return PlainTrigger.scheme;
- }
- else if (data.kind === TriggerKind.Recurring) {
- return RecurringTrigger.scheme;
- }
- else if (data.kind === TriggerKind.Multi) {
- return MultiTrigger.scheme;
- }
- else {
- throw new ValidationError('Unsupported Trigger kind');
- }
- }
-
/**
* Class validation rules
*/
@@ -129,12 +91,6 @@ class Trigger extends Validatable {
else if (data.kind === TriggerKind.API) {
return new APITrigger(data);
}
- else if (data.kind === TriggerKind.Recurring) {
- return new RecurringTrigger(data);
- }
- else if (data.kind === TriggerKind.Multi) {
- return new MultiTrigger(data);
- }
else {
throw new PushError(`Invalid trigger kind ${data.kind}`);
}
@@ -212,7 +168,7 @@ class PlainTrigger extends Trigger {
*/
constructor(data) {
data.kind = TriggerKind.Plain;
- data.tz = typeof data.sctz === 'number' ? true : false;
+ data.tz = data.tz || false;
super(data);
}
@@ -313,7 +269,7 @@ class AutoTrigger extends Trigger {
return Object.assign({}, super.scheme, {
end: {type: 'Date', required: false},
actuals: {type: 'Boolean', required: false},
- time: {type: 'Number', required: false, min: Time.MIN, max: Time.MAX},
+ time: {type: 'Number', required: false},
reschedule: {type: 'Boolean', required: false},
delay: {type: 'Number', required: false},
cap: {type: 'Number', required: false},
@@ -700,558 +656,4 @@ class APITrigger extends AutoTrigger {
}
}
-/**
- * Superclass for triggers which allow message to be scheduled again
- */
-class ReschedulingTrigger extends Trigger {
- /**
- * Class validation rules
- */
- static get scheme() {
- return Object.assign({}, super.scheme, {
- tz: {type: 'Boolean', required: false},
- sctz: {type: 'Number', required: false},
- delayed: {type: 'Boolean', required: false},
- reschedule: {type: 'Boolean', required: false},
- last: {type: 'Date', required: false},
- prev: {type: 'Date', required: false},
- });
- }
-
- /**
- * Get prev reference date
- *
- * @returns {Date|undefined} prev reference date
- */
- get prev() {
- return toDate(this._data.prev);
- }
-
- /**
- * Set prev reference date
- *
- * @param {Date|number} prev message prev reference date
- */
- set prev(prev) {
- if (prev) {
- this._data.prev = toDate(prev);
- }
- else {
- delete this._data.prev;
- }
- }
-
- /**
- * Get last reference date
- *
- * @returns {Date|undefined} last reference date
- */
- get last() {
- return toDate(this._data.last);
- }
-
- /**
- * Set last reference date
- *
- * @param {Date|number} last message last reference date
- */
- set last(last) {
- if (last) {
- this._data.last = toDate(last);
- }
- else {
- delete this._data.last;
- }
- }
-
- /**
- * Calculate first reference date = date when a UTC user should receive this message
- *
- * @returns {Date} first reference date
- */
- reference() {
- if (Math.random() < 2) {
- throw new Error('Must be overridden');
- }
- return new Date();
- }
-
- /**
- * Calculate next reference date = date when a UTC user should receive this message
- *
- * @param {Date|null} previousReference previous reference date if any
- * @returns {Date} next reference date
- */
- nextReference(/*previousReference*/) {
- if (Math.random() < 2) {
- throw new Error('Must be overridden');
- }
- return null;
- }
-
- /**
- * Calculate next schedule job date
- *
- * @param {Date} reference reference date
- * @returns {Date|null} date for next schedule job or null if no more reschedules is possible
- */
- scheduleDate(/*reference*/) {
- if (Math.random() < 2) {
- throw new Error('Must be overridden');
- }
- return null;
- }
-
- /**
- * Getter for sctz
- *
- * @returns {number|undefined} in case tz = true, this is scheduler's timezone offset in minutes (GMT +3 is "-180")
- */
- get sctz() {
- return this._data.sctz;
- }
-
- /**
- * Set scheduler's timezone offset, effectively setting `tz` prop as well
- *
- * @param {number|undefined} sctz scheduler's timezone offset in seconds (GMT +3 = `-180`)
- */
- set sctz(sctz) {
- if (typeof sctz === 'number') {
- this._data.sctz = sctz;
- this._data.tz = true;
- }
- else {
- delete this._data.sctz;
- delete this._data.tz;
- }
- }
-
- /**
- * Getter for tz
- * Note that you don't set this field, but set `sctz` instead
- *
- * @returns {boolean} true if the trigger is timezoned
- */
- get tz() {
- return typeof this._data.sctz === 'number';
- }
-
- /**
- * Getter for delayed
- *
- * @returns {boolean|undefined} true if audience calculation is delayed
- */
- get delayed() {
- return this._data.delayed;
- }
-
- /**
- * Set delayed property
- *
- * @param {boolean|undefined} delayed true if audience calculation should be delayed
- */
- set delayed(delayed) {
- if (typeof delayed === 'boolean') {
- this._data.delayed = delayed;
- }
- else {
- delete this._data.delayed;
- }
- }
-
- /**
- * Getter for reschedule
- *
- * @returns {boolean|undefined} true if notification should be rescheduled to next day if it cannot be sent on time
- */
- get reschedule() {
- return this._data.reschedule;
- }
-
- /**
- * Set reschedule property
- *
- * @param {boolean|undefined} reschedule true if notification should be rescheduled to next day if it cannot be sent on time
- */
- set reschedule(reschedule) {
- if (typeof reschedule === 'boolean') {
- this._data.reschedule = reschedule;
- }
- else {
- delete this._data.reschedule;
- }
- }
-}
-
-
-/**
- * Recurring trigger
- */
-class RecurringTrigger extends ReschedulingTrigger {
- /**
- * Constructor
- *
- * @param {object|null} data filter data
- * @param {Date} data.end message end date (don't send anything after this date, set status to Stopped)
- * @param {string} data.bucket notification frequency ("daily", "weekly", "monthly")
- * @param {number} data.time time (milliseconds since 00:00) when to send in user's timezone
- * @param {string} data.every repetition indicator (every 7 days/weeks/months)
- * @param {Number[]} data.on repetition indicator (on 1-Monday, 2-Tuesday... or Day 1st, 2nd, 3rd... of month)
- * @param {boolean} data.sctz in case tz = true, sctz is scheduler's timezone offset in minutes (GMT +3 is "-180")
- * @param {boolean} delayed true if audience calculation should be done right before sending the message
- */
- constructor(data) {
- data.kind = TriggerKind.Recurring;
- super(data);
- }
-
- /**
- * Class validation rules
- */
- static get scheme() {
- return Object.assign({}, super.scheme, {
- sctz: {type: 'Number', required: true},
- end: {type: 'Date', required: false},
- bucket: {type: 'String', required: true, in: Object.values(RecurringType)},
- time: {type: 'Number', required: true, min: Time.MIN, max: Time.MAX},
- every: {type: 'Number', required: true},
- on: {type: 'Number[]', required: false},
- });
- }
-
- /**
- * Calculate first reference date = date when a UTC user should receive this message
- *
- * @returns {Date} first reference date
- */
- reference() {
- let date = new Date(this.start.getTime() - this.sctz * 60000); // minimal reference date in UTC, TBD: what happens when day overflows here?
- date.setHours(Math.floor(this.time / 60 / 60000));
- date.setMinutes(Math.floor((this.time - date.getHours() * 60 * 60000) / 60000));
- date.setSeconds(0);
- date.setMilliseconds(0);
-
- if (this.bucket === RecurringType.Weekly) {
- let days = this.on.map(on => moment(date).locale('ru').day(on).toDate())
- .concat(this.on.map(on => moment(date).locale('ru').add(-1, 'weeks').day(on).toDate()))
- .concat(this.on.map(on => moment(date).locale('ru').add(1, 'weeks').day(on).toDate()));
- days = days.filter(d => d.getTime() >= this.start.getTime());
- days.sort((a, b) => a.getTime() > b.getTime() ? 1 : -1);
- date = days.shift();
- while (days.length && date && date.getTime() < this.start.getTime()) {
- date = days.shift();
- }
- }
- else if (this.bucket === RecurringType.Monthly) {
- let prevMonth = moment(date).add(-1, 'months'),
- nextMonth = moment(date).add(1, 'months'),
- daysInCurMonth = moment(date).add(1, 'months').date(1).add(-1, 'days').toDate(),
- daysInPrevMonth = prevMonth.add(1, 'months').date(1).add(-1, 'days').toDate(),
- daysInNextMonth = nextMonth.add(1, 'months').date(1).add(-1, 'days').toDate();
-
- let days = this.on.map(on => moment(date).date(on > 0 ? on : daysInCurMonth + on).toDate())
- .concat(this.on.map(on => prevMonth.date(on > 0 ? on : daysInPrevMonth + on).toDate()))
- .concat(this.on.map(on => nextMonth.date(on > 0 ? on : daysInNextMonth + on).toDate()))
- .filter(d => d.getTime() >= this.start.getTime());
-
- days.sort((a, b) => a.getTime() > b.getTime() ? 1 : -1);
- date = days.shift();
- while (days.length && date && date.getTime() < this.start.getTime()) {
- date = days.shift();
- }
- }
-
- return date;
- }
-
- /**
- * Calculate next reference date = date when a UTC user should receive this message
- *
- * @param {Date|null} previousReference previous reference date if any
- * @returns {Date} next reference date
- */
- nextReference(previousReference) {
- let next = previousReference ? new Date(previousReference.getTime()) : this.reference();
- if (!next && !this.reference()) {
- require('../../../../../api/utils/log')('push:trigger').e('Failed to find first reference date for trigger: %j', this.json);
- return null;
- }
- if (this.bucket === RecurringType.Daily) {
- if (!this.last && !previousReference) {
- return next;
- }
- next.setDate(next.getDate() + this.every);
- }
- else if (this.bucket === RecurringType.Weekly) {
- let day = moment(next).locale('ru').day();
- if (!this.last && !previousReference && this.on.includes(day)) {
- return next;
- }
- let days = this.on.map(on => moment(next).locale('ru').day(on).toDate())
- .concat(this.on.map(on => moment(next).locale('ru').add(-this.every, 'weeks').day(on).toDate()))
- .concat(this.on.map(on => moment(next).locale('ru').add(this.every, 'weeks').day(on).toDate()));
- days = days
- .filter(d => d.getTime() > this.start.getTime())
- .filter(d => this.last ? true : d.getTime() > next.getTime());
- days.sort((a, b) => a.getTime() > b.getTime() ? 1 : -1);
- next = days[0];
-
- }
- else if (this.bucket === RecurringType.Monthly) {
- let prevMonth = moment(next).add(-this.every, 'months'),
- nextMonth = moment(next).add(this.every, 'months'),
- daysInCurMonth = moment(next).add(1, 'months').date(1).add(-1, 'days').toDate(),
- daysInPrevMonth = prevMonth.add(1, 'months').date(1).add(-1, 'days').toDate(),
- daysInNextMonth = nextMonth.add(1, 'months').date(1).add(-1, 'days').toDate();
-
- let day = next.getDate();
- if (!this.last && !previousReference && this.on.filter(on => (on > 0 ? on : daysInCurMonth + on) === day).length) {
- return next;
- }
-
- let days = this.on.map(on => moment(next).date(on > 0 ? on : daysInCurMonth + on).toDate())
- .concat(this.on.map(on => prevMonth.date(on > 0 ? on : daysInPrevMonth + on).toDate()))
- .concat(this.on.map(on => nextMonth.date(on > 0 ? on : daysInNextMonth + on).toDate()))
- .filter(d => d.getTime() > this.start.getTime())
- .filter(d => this.last ? true : d.getTime() > next.getTime());
- days.sort((a, b) => a.getTime() > b.getTime() ? 1 : -1);
- next = days[0];
- }
- else {
- throw new PushError('Invalid bucket');
- }
-
- // reset time just in case
- next.setHours(Math.floor(this.time / 60 / 60000));
- next.setMinutes(Math.floor((this.time - next.getHours() * 60 * 60000) / 60000));
- next.setSeconds(0);
- next.setMilliseconds(0);
-
- return next;
- }
-
- /**
- * Calculate next schedule job date
- *
- * @param {Date} reference reference date
- * @param {Number} now current time in ms (for tests to be able to override it)
- * @returns {Date|null} date for next schedule job or null if no more reschedules is possible
- */
- scheduleDate(reference) {
- let ref = reference,
- date = new Date(ref.getTime() - Time.EASTMOST_TIMEZONE - Time.SCHEDULE_AHEAD);
- return this.end && date.getTime() > this.end.getTime() ? null : date;
- }
-
- /**
- * Get end date
- *
- * @returns {Date|undefined} end date
- */
- get end() {
- return toDate(this._data.end);
- }
-
- /**
- * Set end date
- *
- * @param {Date|number} end message end date
- */
- set end(end) {
- if (end) {
- this._data.end = toDate(end);
- }
- else {
- delete this._data.end;
- }
- }
-
- /**
- * Get bucket
- *
- * @returns {Date|undefined} bucket
- */
- get bucket() {
- return this._data.bucket;
- }
-
- /**
- * Set bucket
- *
- * @param {Date|number} bucket trigger bucket
- */
- set bucket(bucket) {
- if (typeof bucket === 'string') {
- this._data.bucket = bucket;
- }
- else {
- delete this._data.bucket;
- }
- }
-
- /**
- * Getter for time
- *
- * @returns {number|undefined} time (seconds since 00:00) when to send in user's timezone
- */
- get time() {
- return this._data.time;
- }
-
- /**
- * Setter for time
- *
- * @param {number|undefined} time time (seconds since 00:00) when to send in user's timezone
- */
- set time(time) {
- if (typeof time === 'number') {
- this._data.time = time;
- }
- else {
- delete this._data.time;
- }
- }
-
- /**
- * Getter for every
- *
- * @returns {number|undefined} repeat each this many weeks / months
- */
- get every() {
- return this._data.every;
- }
-
- /**
- * Setter for every
- *
- * @param {number|undefined} every repeat each this many weeks / months
- */
- set every(every) {
- if (typeof every === 'number') {
- this._data.every = every;
- }
- else {
- delete this._data.every;
- }
- }
-
- /**
- * Getter for on
- *
- * @returns {number|undefined} repeat each of these weekdays / month days
- */
- get on() {
- return this._data.on;
- }
-
- /**
- * Setter for on
- *
- * @param {number|undefined} on repeat each of these weekdays / month days
- */
- set on(on) {
- if (Array.isArray(on) && !on.filter(n => typeof n !== 'number').length) {
- this._data.on = on;
- }
- else {
- delete this._data.on;
- }
- }
-
-}
-
-/**
- * Multi trigger
- */
-class MultiTrigger extends ReschedulingTrigger {
- /**
- * Constructor
- *
- * @param {object|null} data filter data
- * @param {boolean} data.sctz in case tz = true, sctz is scheduler's timezone offset in minutes (GMT +3 is "-180")
- * @param {Date[]} data.dates delivery times for multiple notifications
- * @param {boolean} delayed true if audience calculation should be done right before sending the message
- * */
- constructor(data) {
- data.kind = TriggerKind.Multi;
- super(data);
- }
-
- /**
- * Class validation rules
- */
- static get scheme() {
- return Object.assign({}, super.scheme, {
- dates: {type: 'Date[]', required: true},
- });
- }
-
- /**
- * Calculate first reference date = date when a UTC user should receive this message
- *
- * @returns {Date} first reference date
- */
- reference() {
- return this.tz ? new Date(toDate(this.dates[0]).getTime() - this.sctz * 60000) : toDate(this.dates[0]);
- }
-
- /**
- * Calculate next reference date = date when a UTC user should receive this message
- *
- * @param {Date|null} previousReference previous reference date if any
- * @returns {Date} next reference date
- */
- nextReference(previousReference) {
- if (previousReference) {
- return this.dates.map(d => this.tz ? new Date(toDate(d).getTime() - this.sctz * 60000) : toDate(d))
- .filter(d => toDate(d).getTime() > toDate(previousReference).getTime())[0];
- }
- else {
- return this.reference();
- }
- }
-
- /**
- * Calculate next schedule job date
- *
- * @param {Date} reference reference date
- * @param {Number} now current time in ms (for tests to be able to override it)
- * @returns {Date|null} date for next schedule job or null if no more reschedules is possible
- */
- scheduleDate(reference) {
- if (!reference) {
- return null;
- }
- let ref = reference,
- date = this.tz ? new Date(ref.getTime() - Time.EASTMOST_TIMEZONE - Time.SCHEDULE_AHEAD) : new Date(ref.getTime() - Time.SCHEDULE_AHEAD);
- return this.end && date.getTime() > this.end.getTime() ? null : date;
- }
-
- /**
- * Getter for dates
- *
- * @returns {number|undefined} array of dates to send the message on
- */
- get dates() {
- return this._data.dates;
- }
-
- /**
- * Setter for dates
- *
- * @param {number|undefined} dates array of dates to send the message on
- */
- set dates(dates) {
- if (Array.isArray(dates) && !dates.filter(n => !(n instanceof Date)).length) {
- dates.sort();
- this._data.dates = dates;
- }
- else {
- delete this._data.dates;
- }
- }
-
-}
-
-module.exports = { Trigger, TriggerKind, PlainTrigger, EventTrigger, CohortTrigger, APITrigger, MultiTrigger, RecurringTrigger };
+module.exports = { Trigger, TriggerKind, PlainTrigger, EventTrigger, CohortTrigger, APITrigger };
\ No newline at end of file
diff --git a/plugins/push/api/send/platforms/a.js b/plugins/push/api/send/platforms/a.js
index 43212cb9971..a19c2d81c25 100644
--- a/plugins/push/api/send/platforms/a.js
+++ b/plugins/push/api/send/platforms/a.js
@@ -155,7 +155,7 @@ class FCM extends Splitter {
return errors[err];
};
- const messages = pushes.map(p => p.t).map((token) => ({
+ const messages = pushes.map(({ t: token }) => ({
token,
...content,
}));
@@ -178,27 +178,29 @@ class FCM extends Splitter {
.sendEach(messages)
.then(async result => {
const allPushIds = pushes.map(p => p._id);
-
- if (!result.failureCount) {
- this.send_results(allPushIds, bytes);
- return;
- }
-
// array of successfully sent push._id:
const sentSuccessfully = [];
// check for each message
for (let i = 0; i < result.responses.length; i++) {
- const { success, error } = result.responses[i];
+ const { success, error, messageId } = result.responses[i];
if (success) {
- sentSuccessfully.push(allPushIds[i]);
+ sentSuccessfully.push({ p: allPushIds[i], r: messageId });
}
else {
const sdkError = FCM_SDK_ERRORS[error.code];
// check if the sdk error is mapped to an internal error.
// set to default if its not.
let internalErrorCode = sdkError?.mapTo ?? ERROR.DATA_PROVIDER;
- let internalErrorMessage = sdkError?.message ?? "Invalid error message";
+ let internalErrorMessage = sdkError?.message;
+ if (!internalErrorMessage) {
+ if (error.code && error.message) {
+ internalErrorMessage = "[" + error.code + "] " + error.message;
+ }
+ else {
+ internalErrorMessage = "Invalid error message";
+ }
+ }
errorObject(internalErrorCode, internalErrorMessage)
.addAffected(pushes[i]._id, one);
}
@@ -407,7 +409,7 @@ const FIELDS = {
* A number comes from SDK, we need to map it into smth like tkip/tkid/tkia
*/
const FIELDS_TITLES = {
- '0': 'Android Firebase Token',
+ '0': 'FCM Token',
};
/**
@@ -502,5 +504,4 @@ module.exports = {
fields,
map,
connection: FCM,
-
};
diff --git a/plugins/push/api/send/platforms/h.js b/plugins/push/api/send/platforms/h.js
index b118f5448e3..35674d5b5be 100644
--- a/plugins/push/api/send/platforms/h.js
+++ b/plugins/push/api/send/platforms/h.js
@@ -512,7 +512,7 @@ const FIELDS = {
* A number comes from SDK, we need to map it into smth like tkhp/tkht
*/
const FIELDS_TITLES = {
- '0': 'Android Huawei Token',
+ '0': 'HMS Token',
};
/**
diff --git a/plugins/push/api/send/platforms/i.js b/plugins/push/api/send/platforms/i.js
index 8e7b84617ff..b441e3a239f 100644
--- a/plugins/push/api/send/platforms/i.js
+++ b/plugins/push/api/send/platforms/i.js
@@ -50,9 +50,9 @@ const FIELDS = {
* A number comes from SDK, we need to map it into smth like tkip/tkid/tkia
*/
const FIELDS_TITLES = {
- '0': 'iOS Production Token', // prod
- '1': 'iOS Development Token', // debug
- '2': 'iOS AdHoc / TestFlight Token', // ad hoc
+ '0': 'APN Production Token', // prod
+ '1': 'APN Development Token', // debug
+ '2': 'APN AdHoc / TestFlight Token', // ad hoc
};
/**
@@ -162,24 +162,12 @@ const CREDS = {
var tpks = safeBag.cert.getExtension({id: '1.2.840.113635.100.6.3.6'});
if (tpks) {
- tpks = tpks.value.replace(/0[\x00-\x1f\(\)!]/gi, ''); //eslint-disable-line no-useless-escape
- tpks = tpks.replace('\f\f', '\f');
- tpks = tpks.split('\f');
- tpks = tpks.map(s => s.replace(/[^A-Za-z\-\.]/gi, '').trim()); //eslint-disable-line no-useless-escape
-
- // TODO: next line is a workaround for a p12 file not being parsed
- // correctly. find a better extension parsing method and remove it
- // (also remove the other string replacement stuff here). in the
- // problematic file, first topic was starting with a "-". full
- // value of the extension was something like this:
- // - 0\x82\x01\x05\f-ly.count.CountlySwift0\x07\f
- // - \x05topic\f2ly.count.CountlySwift.voip0\x06\
- // - f\x04voip\f:ly.count.CountlySwift.complicati
- // - on0\x0E\f\fcomplication\f6ly.count.CountlySw
- // - ift.voip-ptt0\x0B\f\t.voip-ptt
- tpks = tpks.map(s => s.replace(/^[^A-Za-z\.]/, "").trim());
-
+ tpks = tpks.value.replace(/0[\x00-\x1f\(\)!]/gi, '') //eslint-disable-line no-useless-escape
+ .replace('\f\f', '\f')
+ .split('\f')
+ .map(s => s.replace(/[^A-Za-z\-\.]/gi, '').trim()); //eslint-disable-line no-useless-escape
tpks.shift();
+
for (var i = 0; i < tpks.length; i++) {
for (var j = 0; j < tpks.length; j++) {
if (i !== j && tpks[j].indexOf(tpks[i]) === 0) {
@@ -595,13 +583,6 @@ class APN extends Base {
return this.templates[id] || (this.templates[id] = new Template(this.messages[id], PLATFORM[this.type.substr(0, 1)], true));
}
- /**
- * A getter for Base to check if running a rety worth a shot
- */
- get cannotRetry() {
- return !this.session || this.session.closed || this.session.destroyed;
- }
-
/**
* Send push notifications
*
@@ -611,7 +592,6 @@ class APN extends Base {
*/
send(pushesData, length) {
if (!this.session) {
- this.log.i('Reconnecting to APN');
return this.connect().then(ok => {
if (ok) {
return this.send(pushesData, length);
@@ -619,18 +599,12 @@ class APN extends Base {
else {
return ok;
}
- }).catch(err => {
- this.log.e('Failed to reconnect to APN, rejecting %d pushes', pushesData.length, err);
- err.addAffected(pushesData.map(p => p._id), length);
- this.send_push_fail(err);
- throw err;
});
}
return this.with_retries(pushesData, length, (pushes, bytes, attempt) => new Promise((resolve, reject) => {
this.log.d('%d-th attempt for %d bytes', attempt, bytes);
let self = this,
- session = this.session,
nonRecoverableError,
recoverableErrors = 0,
oks = [],
@@ -655,22 +629,18 @@ class APN extends Base {
/**
* Called on stream completion, returns results for this batch
*/
- streamDone = session.streamDone = function() {
- session.streamDoneCount--;
- // self.log.d('streamDone (left %j) %j %j %j %j %j', session.streamDoneCount, oks.length, recoverableErrors, nonRecoverableError && nonRecoverableError.left.length || 0, nonRecoverableError && nonRecoverableError.affected.length || 0, pushes.length);
- if (oks.length + recoverableErrors + (nonRecoverableError && nonRecoverableError.left.length || 0) + (nonRecoverableError && nonRecoverableError.affected.length || 0) === pushes.length) {
+ streamDone = () => {
+ if (oks.length + recoverableErrors + (nonRecoverableError && nonRecoverableError.left.length || 0) === pushes.length) {
let errored = nonRecoverableError && nonRecoverableError.bytes || 0;
if (oks.length) {
- self.send_results(oks, bytes - errored);
+ this.send_results(oks, bytes - errored);
}
for (let k in errors) {
errored += errors[k].affectedBytes;
- self.send_push_error(errors[k]);
+ this.send_push_error(errors[k]);
}
if (nonRecoverableError) {
- self.send_push_fail(nonRecoverableError);
reject(nonRecoverableError);
- delete self.session;
}
else {
resolve();
@@ -678,194 +648,139 @@ class APN extends Base {
}
};
- // session.handleError = function(err) {
- // if (!(err instanceof ConnectionError)) {
- // err = nonRecoverableError = new ConnectionError(`SessionClosedOrDestroyed`, ERROR.CONNECTION_PROVIDER);
- // }
- // else {
- // nonRecoverableError = err;
- // }
-
- // while (session.streamDoneCount-- > 0) {
- // streamDone
- // }
- // }
-
- session.streamDoneCount = 0;
this.log.d('sending %d streams', pushes.length);
- pushes.forEach(p => {
- session.streamDoneCount = (session.streamDoneCount || 0) + 1;
- // self.log.d('[%s]: sending %s', p._id, p._id);
- // if (i % 200 === 0) {
- // self.log.d('[%s] %j / %j', p._id, session.closed, session.destroyed);
- // }
+ pushes.forEach((p, i) => {
+ // this.log.d('%d: sending', i);
+ if (i % 200 === 0) {
+ this.log.d('state', this.session.state);
+ }
if (nonRecoverableError) {
- self.log.d('[%s]: nonRecoverableError', p._id);
nonRecoverableError.addLeft(p._id, one);
streamDone();
return;
}
- if (!self.messages[p.m]) {
- self.log.e('No message %s', p.m);
+ if (!this.messages[p.m]) {
+ this.log.e('No message %s', p.m);
}
- if (session.closed || session.destroyed || session.goawayed) {
+ let content = this.template(p.m).compile(p),
+ reqHeaders = self.headersSecondWithToken(p.t);
+ // find if we need to add the priority header (check if content-available set)
+ delete reqHeaders["apns-priority"];
+ const message = self.messages[p.m];
+ if (message && Array.isArray(message.contents)) {
+ const contentItem = message.contents.find(cont => Array.isArray(cont.specific));
+ if (contentItem) {
+ const obj = contentItem.specific.find(cont => cont.setContentAvailable !== undefined);
+ if (obj && obj.setContentAvailable) {
+ reqHeaders["apns-priority"] = 5;
+ }
+ }
+ }
+ // =======0========000=================0========000=================0========0
+ let stream = this.session.request(reqHeaders),
+ status,
+ data = '';
+ stream.on('error', err => {
if (!nonRecoverableError) {
- nonRecoverableError = new ConnectionError(`SessionClosedOrDestroyed`, ERROR.CONNECTION_PROVIDER).addLeft(p._id, one);
+ nonRecoverableError = new ConnectionError(`APN Stream Error: ${err.message}`, ERROR.CONNECTION_PROVIDER).addAffected(p._id, one);
}
else {
- nonRecoverableError.addLeft(p._id, one);
+ nonRecoverableError.addAffected(p._id, one);
+ }
+ });
+ stream.on('frameError', (type, code, id) => {
+ this.log.e('stream frameError %d, %d, %d', type, code, id);
+ });
+ stream.on('timeout', () => {
+ this.log.e('stream timeout');
+ if (!nonRecoverableError) {
+ nonRecoverableError = new ConnectionError(`APN Stream Error: timeout`, ERROR.CONNECTION_PROVIDER).addAffected(p._id, one);
+ }
+ else {
+ nonRecoverableError.addAffected(p._id, one);
}
streamDone();
- return;
- }
-
- try {
- let content = self.template(p.m).compile(p),
- reqHeaders = self.headersSecondWithToken(p.t);
-
- // find if we need to add the priority header (check if content-available set)
- delete reqHeaders["apns-priority"];
- const message = self.messages[p.m];
- if (message && Array.isArray(message.contents)) {
- const contentItem = message.contents.find(i => Array.isArray(i.specific));
- if (contentItem) {
- const obj = contentItem.specific.find(i => i.setContentAvailable !== undefined);
- if (obj && obj.setContentAvailable) {
- reqHeaders["apns-priority"] = 5;
- }
- }
+ });
+ stream.on('response', function(headers) {
+ status = headers[':status'];
+ // self.log.d('%d: status %d: %j', i, status, self.session.state);
+ if (status === 200) {
+ const apnsUniqueId = headers["apns-unique-id"];
+ oks.push({ p: p._id, r: apnsUniqueId });
+ stream.destroy();
+ streamDone();
}
- // =======0========000=================0========000=================0========0
-
- let stream = session.request(reqHeaders),
- status,
- data = '';
-
- stream.on('error', err => {
- self.log.e('[%s]: stream error %j %j / %j', p._id, session.state, session.closed, session.destroyed, err);
- if (!nonRecoverableError) {
- nonRecoverableError = new ConnectionError(`APN Stream Error: ${err && err.message || 'check logs'}`, ERROR.CONNECTION_PROVIDER).addAffected(p._id, one);
- }
- else {
- nonRecoverableError.addAffected(p._id, one);
- }
+ else if (status === 410) {
+ stream.destroy();
+ error(ERROR.DATA_TOKEN_EXPIRED, 'ExpiredToken').addAffected(p._id, one);
streamDone();
- });
- stream.on('frameError', (type, code, id) => {
- self.log.e('[%s] stream frameError %d, %d, %d', p._id, type, code, id);
- });
- stream.on('timeout', () => {
- self.log.e('[%s] stream timeout %s', p._id);
+ }
+ else if (status === 500 || status === 503 || status === 404 || status === 405 || status === 413) {
+ stream.destroy();
+ this.session.destroy();
if (!nonRecoverableError) {
- nonRecoverableError = new ConnectionError(`APN Stream Error: timeout`, ERROR.CONNECTION_PROVIDER).addAffected(p._id, one);
+ nonRecoverableError = new ConnectionError(`APN Server Error: ${status}`, ERROR.CONNECTION_PROVIDER).addAffected(p._id, one);
}
else {
nonRecoverableError.addAffected(p._id, one);
}
- streamDone();
- });
- stream.on('response', function(headers) {
- status = headers[':status'];
- if (status === 200) {
- // self.log.d('[%s] response done %d', p._id, status);
- oks.push(p._id);
- stream.destroy();
- streamDone();
- // self.log.d('[%s] response done %d', p._id, status);
- }
- else if (status === 410) {
- // self.log.d('[%s]: status %d: %j / %j', p._id, status, session.closed, session.destroyed);
- stream.destroy();
- error(ERROR.DATA_TOKEN_EXPIRED, 'ExpiredToken').addAffected(p._id, one);
- streamDone();
- // self.log.d('[%s] response done %d', p._id, status);
- }
- else if (status === 500 || status === 503 || status === 404 || status === 405 || status === 413) {
- self.log.e('[%s]: APN returned error %d, destroying session', p._id, status);
- stream.destroy();
- session && session.destroy();
- if (!nonRecoverableError) {
- nonRecoverableError = new ConnectionError(`APN Server Error: ${status}`, ERROR.CONNECTION_PROVIDER).addAffected(p._id, one);
- }
- else {
- nonRecoverableError.addAffected(p._id, one);
- }
- }
- else if (status === 400 || status === 403 || status === 429) {
- self.log.d('[%s]: status %d: %j / %j', p._id, status, session.closed, session.destroyed);
- // handle in on('end') because we need response error code
- }
- });
- stream.on('data', dt => {
- data += dt;
- });
- stream.on('end', () => {
- self.log.d('[%s] end %s', p._id, status);
- if (status === 400 || status === 403 || status === 429) {
- self.log.d('[%s]: end %d: %j / %j', p._id, status, session.closed, session.destroyed);
- try {
- let json = JSON.parse(data);
- if (status === 400) {
- if (json.reason) {
- if (json.reason === 'DeviceTokenNotForTopic' || json.reason === 'BadDeviceToken') {
- error(ERROR.DATA_TOKEN_INVALID, json.reason).addAffected(p._id, one);
- }
- else {
- error(ERROR.DATA_COUNTLY, json.reason).addAffected(p._id, one);
- }
- }
- else {
- self.log.e('[%s] provider returned %d: %j', p._id, status, json);
- error(ERROR.DATA_PROVIDER, data).addAffected(p._id, one);
- }
- }
- else if (status === 403) {
- if (!nonRecoverableError) {
- nonRecoverableError = new ConnectionError(`APN Unauthorized: ${status} (${json.reason})`, ERROR.INVALID_CREDENTIALS).addAffected(p._id, one);
+ }
+ else if (status === 400 || status === 403 || status === 429) {
+ // handle in on('end') because we need response error code
+ }
+ });
+ stream.on('data', dt => {
+ data += dt;
+ });
+ stream.on('end', () => {
+ if (status === 400 || status === 403 || status === 429) {
+ try {
+ let json = JSON.parse(data);
+ if (status === 400) {
+ if (json.reason) {
+ if (json.reason === 'DeviceTokenNotForTopic' || json.reason === 'BadDeviceToken') {
+ error(ERROR.DATA_TOKEN_INVALID, json.reason).addAffected(p._id, one);
}
else {
- nonRecoverableError.addAffected(p._id, one);
+ error(ERROR.DATA_COUNTLY, json.reason).addAffected(p._id, one);
}
}
- else if (status === 429) {
- self.log.e('[%s] provider returned %d: %j', p._id, status, json);
+ else {
+ self.log.e('provider returned %d: %j', status, json);
error(ERROR.DATA_PROVIDER, data).addAffected(p._id, one);
}
+ }
+ else if (status === 403) {
+ if (!nonRecoverableError) {
+ nonRecoverableError = new ConnectionError(`APN Unauthorized: ${status} (${json.reason})`, ERROR.INVALID_CREDENTIALS).addAffected(p._id, one);
+ }
else {
- throw new PushError('IMPOSSIBRU');
+ nonRecoverableError.addAffected(p._id, one);
}
}
- catch (e) {
- self.log.e('provider returned %d: %s', status, data, e);
+ else if (status === 429) {
+ self.log.e('provider returned %d: %j', status, json);
error(ERROR.DATA_PROVIDER, data).addAffected(p._id, one);
}
- streamDone();
+ else {
+ throw new PushError('IMPOSSIBRU');
+ }
}
- else if (!status) {
- // most likely a timeout
- streamDone();
+ catch (e) {
+ self.log.e('provider returned %d: %s', status, data, e);
+ error(ERROR.DATA_PROVIDER, data).addAffected(p._id, one);
}
- });
- stream.setEncoding('utf-8');
- stream.setTimeout(10000, () => {
- self.log.w('[%s]: cancelling stream on timeout', p._id);
- stream.close(HTTP2.constants.NGHTTP2_CANCEL);
- });
- stream.end(content);
- // self.log.d('[%s]: sent %s', p._id, content);
- }
- catch (err) {
- self.log.e('[%s] http/2 exception when trying to send a request, recording as non recoverable (%j / %j): %j', p._id, session.closed, session.destroyed, err);
- if (!nonRecoverableError) {
- nonRecoverableError = new ConnectionError(`APN Stream Error: ${err.message}`, ERROR.CONNECTION_PROVIDER).addAffected(p._id, one);
- }
- else {
- nonRecoverableError.addAffected(p._id, one);
+ streamDone();
}
- streamDone();
- }
+ });
+ stream.setEncoding('utf-8');
+ stream.setTimeout(10000, () => {
+ self.log.w('%d: cancelling stream %d for push %s / %s', i, stream.id, p._id, p.t);
+ stream.close(HTTP2.constants.NGHTTP2_CANCEL);
+ });
+ stream.end(content);
});
}));
}
@@ -901,50 +816,10 @@ class APN extends Base {
let session = HTTP2.connect(this.authority, this.sessionOptions);
- // session.setTimeout(10000);
-
session.on('error', err => {
- this.log.e('session error %d', session.streamDoneCount, err);
+ this.log.e('session error', err);
reject(new ConnectionError(err.message, ERROR.CONNECTION_PROVIDER));
- });
-
- session.on('timeout', (err, lastStreamId, opaqueData) => {
- try {
- this.log.e('session timeout %d', session.streamDoneCount, err, lastStreamId, opaqueData, opaqueData && opaqueData.toString('utf-8'));
- }
- catch (e) {
- this.log.e('session timeout %d', session.streamDoneCount, err, lastStreamId, opaqueData);
- }
- while (session.streamDoneCount > 0) {
- session.streamDone();
- }
- session.goawayed = true;
- delete this.session;
- reject(new ConnectionError(err && err.message || 'Session timeout', ERROR.CONNECTION_PROVIDER));
- // session.destroy();
- });
-
- session.on('close', err => {
- this.log.e('session close %d', session.streamDoneCount, err);
- while (session.streamDoneCount > 0) {
- session.streamDone();
- }
- session.goawayed = true;
- delete this.session;
- // session.destroy();
- reject(new ConnectionError(err && err.message || 'Session close', ERROR.CONNECTION_PROVIDER));
- this.log.e('session closed %d', session.streamDoneCount, err);
- });
-
- session.on('goaway', err => {
- this.log.e('session goaway %d', session.streamDoneCount, err);
- while (session.streamDoneCount > 0) {
- session.streamDone();
- }
- session.goawayed = true;
- delete this.session;
- reject(new ConnectionError(err && err.message || 'Session goaway', ERROR.CONNECTION_PROVIDER));
- // session.destroy();
+ session.destroy();
});
session.on('connect', () => {
@@ -958,7 +833,7 @@ class APN extends Base {
});
stream.on('response', headers => {
let status = headers[':status'];
- this.log.d('first request provider returned %d', status);
+ this.log.d('provider returned %d', status);
if (status === 403 || status === 400) {
if (status === 400) {
this.session = session;
diff --git a/plugins/push/api/send/platforms/utils/splitter.js b/plugins/push/api/send/platforms/utils/splitter.js
index 00d71482e2f..48bf0cf18b6 100644
--- a/plugins/push/api/send/platforms/utils/splitter.js
+++ b/plugins/push/api/send/platforms/utils/splitter.js
@@ -83,12 +83,7 @@ class Splitter extends Base {
res.on('data', d => {
res.reply += d;
});
- res.on('end', () => {
- if (this.opts.agent && this.opts.agent.popReject) {
- this.opts.agent.popReject(reject);
- }
- handler(res);
- });
+ res.on('end', () => handler(res));
// res.on('close', () => handler(res));
});
// req.on('socket', socket => {
@@ -98,10 +93,6 @@ class Splitter extends Base {
this.log.d('send request error', error);
reject([0, error]);
});
-
- if (this.opts.agent && this.opts.agent.pushReject) {
- this.opts.agent.pushReject(reject);
- }
req.end(content);
});
}
diff --git a/plugins/push/api/send/sender.js b/plugins/push/api/send/sender.js
index 8980a3a00e7..16e887c8c1c 100644
--- a/plugins/push/api/send/sender.js
+++ b/plugins/push/api/send/sender.js
@@ -1,10 +1,8 @@
const { State } = require('../jobs/util/state'),
{ Batcher } = require('../jobs/util/batcher'),
- { Resultor } = require('../jobs/util/resultor'),
- { StreamWrapper } = require('../jobs/util/stream_wrapper'),
- { Connector } = require('../jobs/util/connector'),
+ { Resultor } = require('../jobs//util/resultor'),
+ { Connector } = require('../jobs//util/connector'),
{ PushError, ERROR, dbext, pools } = require('./index'),
- { Message } = require("./data/message"),
common = require('../../../../api/utils/common');
/**
@@ -50,7 +48,7 @@ class Sender {
// last date this job sends notifications for
this.last = Date.now() + cfg.sendAhead;
- let plugins = await common.db.collection('plugins').findOne({ _id: "plugins" });
+ let plugins = await common.db.collection('plugins').findOne({_id: "plugins"});
if (!plugins) {
throw new PushError('No plugins configuration', ERROR.DATA_COUNTLY);
}
@@ -121,14 +119,6 @@ class Sender {
auth: !(plugins.push.proxyunauthorized || false),
};
}
- if (plugins.push.message_timeout) {
- if (typeof plugins.push.message_timeout === "number") {
- cfg.message_timeout = plugins.push.message_timeout;
- }
- else {
- common.log(`push:send`).w('Invalid message timeout configuration: %j', plugins.push.message_timeout);
- }
- }
}
return cfg;
@@ -139,10 +129,7 @@ class Sender {
*/
async watch() {
let oid = dbext.oidBlankWithDate(new Date()),
- count = await common.db.collection('push').count({
- _id: {$lte: oid},
- m: { $in: await Message.findStreamableMessageIds() }
- });
+ count = await common.db.collection('push').count({_id: {$lte: oid}});
return count > 0;
}
// /**
@@ -184,31 +171,60 @@ class Sender {
try {
// await db.collection('messages').updateMany({_id: {$in: Object.keys(this.msgs)}}, {$set: {state: State.Streaming, status: Status.Sending}});
+
// stream the pushes
- let wrapper = new StreamWrapper(
- common.db.collection('push'),
- { m: { $in: await Message.findStreamableMessageIds() } },
- state.cfg.sendAhead,
- 30000,
- 20
- ),
+ let pushes = common.db.collection('push').find({_id: {$lte: dbext.oidBlankWithDate(new Date(Date.now() + state.cfg.sendAhead))}}).stream(),
resolve, reject,
promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
- });
+ }),
+ last = Date.now(),
+ finalTimeout,
+ /**
+ * Periodic check to ensure mongo stream is closed once no more data is sent
+ */
+ check = () => {
+ if (last === null) {
+ // do nothing, already unpiped
+ }
+ else if (last + 120000 < Date.now()) {
+ this.log.w('Streaming timeout, ignoring the rest');
+ last = null;
+ pushes.unpipe(connector);
+ connector.end();
+ finalTimeout = setTimeout(() => {
+ try {
+ if (connector) {
+ connector.destroy(new PushError('Streaming timeout'));
+ }
+ finalTimeout = setTimeout(() => resolve(), 10000);
+ }
+ catch (e) {
+ this.log.e('Streaming timeout: connection destruction error', e);
+ }
+ }, 5 * 60 * 1000);
+ }
+ else {
+ setTimeout(check, 10000);
+ }
+ };
- wrapper.on('close', () => {
- this.log.w('wrapper close');
+ pushes.on('close', () => {
+ last = null;
+ this.log.w('pushes close');
});
- wrapper.on('unpipe', () => {
- this.log.w('wrapper unpipe');
+ pushes.on('unpipe', () => {
+ last = null;
+ this.log.w('pushes unpipe');
});
+ pushes.on('data', () => last = Date.now());
+ setTimeout(check, 10000);
connector.on('close', () => this.log.w('connector close'));
connector.on('unpipe', () => this.log.w('connector unpipe'));
- wrapper
+ pushes
.pipe(connector)
.pipe(batcher)
.pipe(resultor, {end: false});
@@ -226,7 +242,7 @@ class Sender {
pools.exit();
resolve();
});
- wrapper.on('error', err => {
+ pushes.on('error', err => {
this.log.e('Streaming error', err);
reject(err);
});
@@ -245,6 +261,8 @@ class Sender {
await promise;
+ clearTimeout(finalTimeout);
+
this.log.i('<<<<<<<<<< done sending');
}
catch (e) {
diff --git a/plugins/push/api/send/std.js b/plugins/push/api/send/std.js
index 38a6fa2bf3a..acc9de179ad 100644
--- a/plugins/push/api/send/std.js
+++ b/plugins/push/api/send/std.js
@@ -249,19 +249,12 @@ class Base extends Duplex {
catch (e) {
this.log.w('Retriable error %d of %d', attempt, max, e);
if (!(e instanceof PushError)) {
- this.sending -= bytes;
throw e;
}
else if (e.isException) {
- this.sending -= bytes;
throw e;
}
else if (e.isCredentials) {
- this.sending -= bytes;
- throw e;
- }
- else if (this.cannotRetry) {
- this.sending -= bytes;
throw e;
}
// else if (e.hasAffected || e.hasLeft) {
diff --git a/plugins/push/frontend/app.js b/plugins/push/frontend/app.js
index 3d0c1698c82..de3804e23bd 100644
--- a/plugins/push/frontend/app.js
+++ b/plugins/push/frontend/app.js
@@ -18,7 +18,7 @@ module.exports = {
db.collection('apps').find().toArray(function(err, apps) {
if (apps && apps.length) {
apps.forEach(a => {
- db.collection(`app_users${a._id}`).createIndexes(Object.values(FIELDS).map(f => ({name: 'tk' + f, key: {['tk' + f]: 1}, sparse: true}))).catch(() => {});
+ db.collection(`app_users${a._id}`).createIndexes(Object.values(FIELDS).map(f => ({name: 'tk' + f, key: {['tk' + f]: 1}}))).catch(() => {});
});
}
});
diff --git a/plugins/push/frontend/public/javascripts/countly.models.js b/plugins/push/frontend/public/javascripts/countly.models.js
index d4334958814..c28b13d8314 100644
--- a/plugins/push/frontend/public/javascripts/countly.models.js
+++ b/plugins/push/frontend/public/javascripts/countly.models.js
@@ -19,36 +19,7 @@
var TypeEnum = Object.freeze({
ONE_TIME: "oneTime",
AUTOMATIC: "automatic",
- TRANSACTIONAL: "transactional",
- RECURRING: "rec",
- MULTIPLE: "multi",
- EVENTS: "event",
- COHORTS: "cohort",
- });
- var KindEnum = Object.freeze({
- ALL: ["plain", "event", "cohort", "api", "rec", "multi"],
- Plain: 'plain',
- Automatic: "auto",
- // Event: 'event',
- // Cohort: 'cohort',
- API: 'api',
- Recurring: 'rec',
- Multi: 'multi',
- });
- var CampaignTypes = [
- {label: CV.i18n('push-notification-drawer.one-time'), description: CV.i18n('push-notification-drawer.one-time-description')},
- {label: CV.i18n('push-notification-drawer.automated'), description: CV.i18n('push-notification-drawer.automated-description')},
- {label: CV.i18n('push-notification-drawer.recurring'), description: CV.i18n('push-notification-drawer.recurring-description')},
- {label: CV.i18n('push-notification-drawer.multiple-days'), description: CV.i18n('push-notification-drawer.multiple-days-description')},
- {label: CV.i18n('push-notification-drawer.api'), description: CV.i18n('push-notification-drawer.api-description')}
- ];
- var TriggerTypeEnum = Object.freeze({
- PLAIN: "One-Time",
- API: "API",
- EVENT: "Automated",
- COHORT: "Automated",
- REC: "Recurring",
- MULTI: "Multiple Days"
+ TRANSACTIONAL: "transactional"
});
var PeriodEnum = Object.freeze({
WEEKLY: "weekly",
@@ -158,9 +129,6 @@
targetingOptions[TargetingEnum.ALL] = {label: CV.i18n('push-notification.all-push-enabled-users'), value: TargetingEnum.ALL};
targetingOptions[TargetingEnum.SEGMENTED] = {label: CV.i18n('push-notification.segmented-push-enabled-users'), value: TargetingEnum.SEGMENTED};
- var bucketList = ["daily", "weekly", "monthly"];
- var weeklyRepetitionOptions = [{label: CV.i18n('common.monday'), value: 1}, {label: CV.i18n('common.tuesday'), value: 2}, {label: CV.i18n('common.wednesday'), value: 3}, {label: CV.i18n('common.thursday'), value: 4}, {label: CV.i18n('common.friday'), value: 5}, {label: CV.i18n('common.saturday'), value: 6}, {label: CV.i18n('common.sunday'), value: 7}];
-
var triggerOptions = {};
triggerOptions[TriggerEnum.COHORT_ENTRY] = {label: CV.i18n('push-notification.cohorts-entry'), value: TriggerEnum.COHORT_ENTRY};
triggerOptions[TriggerEnum.COHORT_EXIT] = {label: CV.i18n('push-notification.cohorts-exit'), value: TriggerEnum.COHORT_EXIT};
@@ -249,14 +217,15 @@
result[PlatformEnum.ALL] = this.getInitialModelDashboardPlatform();
return result;
},
- getInitialBaseModel: function(dto) {
+ getInitialBaseModel: function() {
return {
isEe: typeof countlySegmentation !== 'undefined',
isGeo: typeof countlyLocationTargetComponent !== 'undefined',
isCohorts: typeof countlyCohorts !== 'undefined',
_id: null,
demo: false,
- name: (dto && dto.name ? dto.name : ""),
+ saveStats: false,
+ name: "",
platforms: [],
message: {
default: {
@@ -313,12 +282,11 @@
days: 7,
hours: 0
},
- dashboard: {},
- campaignType: ''
+ dashboard: {}
};
},
- getInitialOneTimeModel: function(dto) {
- var baseModel = this.getInitialBaseModel(dto);
+ getInitialOneTimeModel: function() {
+ var baseModel = this.getInitialBaseModel();
baseModel.oneTime = {
targeting: TargetingEnum.ALL,
pastSchedule: PastScheduleEnum.SKIP,
@@ -326,8 +294,8 @@
};
return baseModel;
},
- getInitialAutomaticModel: function(dto) {
- var baseModel = this.getInitialBaseModel(dto);
+ getInitialAutomaticModel: function() {
+ var baseModel = this.getInitialBaseModel();
baseModel.automatic = {
deliveryMethod: DeliveryMethodEnum.IMMEDIATELY,
delayed: {
@@ -345,55 +313,22 @@
days: 0,
hours: 0
},
- usersTimezone: "00",
- pastSchedule: PastScheduleEnum.SKIP,
+ usersTimezone: "00"
};
return baseModel;
},
- getInitialTransactionalModel: function(dto) {
- return this.getInitialBaseModel(dto);
- },
- getInitialRecurringModel: function(dto) {
- var baseModel = this.getInitialBaseModel(dto);
- baseModel.rec = {
- targeting: TargetingEnum.ALL,
- pastSchedule: PastScheduleEnum.SKIP,
- audienceSelection: AudienceSelectionEnum.NOW,
- };
- baseModel.delivery.repetition = {
- bucket: bucketList[0],
- every: 7,
- at: moment().valueOf(),
- on: []
- };
- return baseModel;
- },
- getInitialMultipleModel: function(dto) {
- var baseModel = this.getInitialBaseModel(dto);
- baseModel.multi = {
- targeting: TargetingEnum.ALL,
- pastSchedule: PastScheduleEnum.SKIP,
- audienceSelection: AudienceSelectionEnum.NOW,
- };
- var today = new Date();
- baseModel.delivery.multipleDates = [today.getTime()];
- return baseModel;
+ getInitialTransactionalModel: function() {
+ return this.getInitialBaseModel();
},
- getInitialModel: function(type, dto) {
+ getInitialModel: function(type) {
if (type === TypeEnum.ONE_TIME) {
- return this.getInitialOneTimeModel(dto);
+ return this.getInitialOneTimeModel();
}
- else if (type === TypeEnum.AUTOMATIC) {
- return this.getInitialAutomaticModel(dto);
+ if (type === TypeEnum.AUTOMATIC) {
+ return this.getInitialAutomaticModel();
}
- else if (type === TypeEnum.TRANSACTIONAL) {
- return this.getInitialTransactionalModel(dto);
- }
- else if (type === TypeEnum.RECURRING) {
- return this.getInitialRecurringModel(dto);
- }
- else if (type === TypeEnum.MULTIPLE) {
- return this.getInitialMultipleModel(dto);
+ if (type === TypeEnum.TRANSACTIONAL) {
+ return this.getInitialTransactionalModel();
}
throw new Error('Unknown push notification type:' + type);
},
@@ -627,22 +562,12 @@
app_id: countlyCommon.ACTIVE_APP_ID,
visibleColumns: JSON.stringify(context.state.params.selectedDynamicCols),
};
- // var type = context.rootState.countlyPushNotificationMain.selectedPushNotificationType;
+ var type = context.rootState.countlyPushNotificationMain.selectedPushNotificationType;
var status = context.rootState.countlyPushNotificationMain.statusFilter;
- var kind = context.rootState.countlyPushNotificationMain.selectedPushNotificationKind;
- // var params = countlyPushNotification.service.getFetchAllParameters(type, status);
- var platform = context.rootState.countlyPushNotificationMain.platformFilter;
- if (platform && platform.length && platform !== ALL_FILTER_OPTION_VALUE) {
- data.platform = platform[0];
- }
- if (status && status.length && status !== ALL_FILTER_OPTION_VALUE) {
- data.status = status;
+ var params = countlyPushNotification.service.getFetchAllParameters(type, status);
+ for (var key in params) {
+ data[key] = params[key];
}
-
- data.kind = JSON.stringify(kind);
- // for (var key in params) {
- // data[key] = params[key];
- // }
return {
type: "GET",
url: countlyCommon.API_PARTS.data.r + "/push/message/all",
@@ -705,24 +630,6 @@
}, {disableAutoCatch: true});
});
},
- fetchMessageStats: function(_id, period = "30days") {
- return new Promise(function(resolve, reject) {
- CV.$.ajax({
- type: "GET",
- url: countlyCommon.API_PARTS.data.r + "/push/message/stats",
- data: { _id, period },
- dataType: "json",
- success: function(response) {
- resolve(response);
- },
- error: function(error) {
- console.error(error);
- var errorMessage = countlyPushNotification.helper.getErrorMessage(error);
- reject(new Error(errorMessage));
- },
- }, {disableAutoCatch: true});
- });
- },
getDashboard: function(echo) {
var data = {
app_id: countlyCommon.ACTIVE_APP_ID
@@ -1055,18 +962,12 @@
if (dto.triggers[0].kind === 'plain') {
return TypeEnum.ONE_TIME;
}
- else if (dto.triggers[0].kind === 'cohort' || dto.triggers[0].kind === 'event') {
+ if (dto.triggers[0].kind === 'cohort' || dto.triggers[0].kind === 'event') {
return TypeEnum.AUTOMATIC;
}
- else if (dto.triggers[0].kind === 'api') {
+ if (dto.triggers[0].kind === 'api') {
return TypeEnum.TRANSACTIONAL;
}
- else if (dto.triggers[0].kind === 'rec') {
- return TypeEnum.RECURRING;
- }
- else if (dto.triggers[0].kind === 'multi') {
- return TypeEnum.MULTIPLE;
- }
throw new Error('Unknown push notification type:', dto);
},
mapOneTimeSeriesData: function(dto) {
@@ -1178,11 +1079,10 @@
},
sent: pushNotificationDtoItem.result.sent || 0,
actioned: pushNotificationDtoItem.result.actioned || 0,
- notificationType: self.mapNotificationType(pushNotificationDtoItem),
createdBy: pushNotificationDtoItem.info && pushNotificationDtoItem.info.createdByName || '',
lastDate: {
date: pushNotificationDtoItem.info && pushNotificationDtoItem.info.lastDate ? moment(pushNotificationDtoItem.info.lastDate).format("MMMM Do YYYY") : null,
- time: pushNotificationDtoItem.info && pushNotificationDtoItem.info.lastDate ? moment(pushNotificationDtoItem.info.lastDate).format("h:mm:00 a") : null,
+ time: pushNotificationDtoItem.info && pushNotificationDtoItem.info.lastDate ? moment(pushNotificationDtoItem.info.lastDate).format("h:mm:ss a") : null,
},
platforms: self.mapPlatforms(pushNotificationDtoItem.platforms),
content: self.findDefaultLocaleItem(pushNotificationDtoItem.contents).message
@@ -1190,23 +1090,6 @@
});
return rowsModel;
},
- mapNotificationType: function(dto) {
- switch (dto.triggers[0].kind) {
- case "plain":
- return TriggerTypeEnum.PLAIN;
- case "api":
- return TriggerTypeEnum.API;
- case "event":
- case "cohort":
- return TriggerTypeEnum.EVENT;
- case "rec":
- return TriggerTypeEnum.REC;
- case "multi":
- return TriggerTypeEnum.MULTI;
- default:
- return null;
- }
- },
mapTargeting: function(dto) {
if (dto.filter && (dto.filter.cohorts && dto.filter.cohorts.length || dto.filter.geos && dto.filter.geos.length)) {
return TargetingEnum.SEGMENTED;
@@ -1531,9 +1414,10 @@
return {
_id: dto._id || null,
demo: this.mapDemo(dto),
+ saveStats: dto.saveStats || false,
status: this.mapStatus(dto),
createdAt: dto.info && dto.info.created ? moment(dto.info.created).format("dddd, Do MMMM YYYY h:mm") : null,
- name: dto.info && countlyCommon.unescapeHtml(dto.info.title),
+ name: dto.info && dto.info.title,
createdBy: dto.info && dto.info.createdByName || '',
platforms: this.mapPlatforms(dto.platforms),
localizations: localizations,
@@ -1548,10 +1432,6 @@
drill: dto.filter && dto.filter.drill,
expiration: countlyPushNotification.helper.convertMSToDaysAndHours(this.findDefaultLocaleItem(dto.contents).expiration),
dashboard: this.mapDashboard(dto),
- campaignType: "",
- isCohorts: typeof countlyCohorts !== 'undefined',
- isEe: typeof countlySegmentation !== 'undefined',
- isGeo: typeof countlyLocationTargetComponent !== 'undefined',
};
},
mapDtoToOneTimeModel: function(dto) {
@@ -1560,7 +1440,6 @@
model[TypeEnum.ONE_TIME].targeting = this.mapTargeting(dto);
model[TypeEnum.ONE_TIME].pastSchedule = PastScheduleEnum.SKIP; //NOTE: past schedule is not supported at the moment. Auto trigger reschedule is not used anywhere.
model.type = TypeEnum.ONE_TIME;
- // model.campaignType = "One-Time";
var triggerDto = dto.triggers[0];
model.delivery = {
startDate: triggerDto.start ? moment(triggerDto.start).valueOf() : null,
@@ -1578,7 +1457,6 @@
mapDtoToAutomaticModel: function(dto) {
var model = this.mapDtoToBaseModel(dto);
model.type = TypeEnum.AUTOMATIC;
- // model.campaignType = "Automated";
var triggerDto = dto.triggers[0];
model.cohorts = triggerDto.cohorts || [];
model.delivery = {
@@ -1595,7 +1473,6 @@
events: triggerDto.events || [],
capping: Boolean(triggerDto.cap),
usersTimezone: null,
- pastSchedule: PastScheduleEnum.SKIP
};
if (triggerDto.time) {
var result = countlyPushNotification.helper.convertMSToDaysAndHours(triggerDto.time);
@@ -1618,72 +1495,17 @@
};
return model;
},
- mapDtoToRecurringModel: function(dto) {
- var model = this.mapDtoToBaseModel(dto);
- model.type = TypeEnum.RECURRING;
- model[TypeEnum.RECURRING] = {};
- model[TypeEnum.RECURRING].targeting = this.mapTargeting(dto);
- model[TypeEnum.RECURRING].pastSchedule = PastScheduleEnum.SKIP; //NOTE: past schedule is not supported at the moment. Auto trigger reschedule is not used anywhere.
- var triggerDto = dto.triggers[0];
- model.delivery = {
- startDate: triggerDto.start ? moment(triggerDto.start).valueOf() : null,
- endDate: triggerDto.end ? moment(triggerDto.end).valueOf() : null,
- type: dto.info && dto.info.scheduled ? SendEnum.LATER : SendEnum.NOW,
- repetition: {bucket: triggerDto.bucket, every: parseInt(triggerDto.every), on: triggerDto.on || []},
- prev: moment(triggerDto.prev).valueOf(),
- last: moment(triggerDto.last).valueOf(),
- };
- if (triggerDto.time) {
- var result = countlyPushNotification.helper.convertMSToDaysAndHours(triggerDto.time);
- model.delivery.repetition.at = new Date();
- model.delivery.repetition.at.setHours(result.hours, result.minutes);
- }
- if (model.status === 'draft' && model.delivery.type === SendEnum.NOW) {
- model.delivery.startDate = moment().valueOf();
- }
- model[TypeEnum.RECURRING].audienceSelection = triggerDto.delayed ? AudienceSelectionEnum.BEFORE : AudienceSelectionEnum.NOW;
- return model;
- },
- mapDtoToMultipleModel: function(dto) {
- var model = this.mapDtoToBaseModel(dto);
- model[TypeEnum.MULTIPLE] = {};
- model[TypeEnum.MULTIPLE].targeting = this.mapTargeting(dto);
- model[TypeEnum.MULTIPLE].pastSchedule = PastScheduleEnum.SKIP; //NOTE: past schedule is not supported at the moment. Auto trigger reschedule is not used anywhere.
- model.type = TypeEnum.MULTIPLE;
- var triggerDto = dto.triggers[0];
- model.delivery = {
- startDate: triggerDto.start ? moment(triggerDto.start).valueOf() : null,
- endDate: null,
- type: dto.info && dto.info.scheduled ? SendEnum.LATER : SendEnum.NOW,
- multipleDates: triggerDto.dates || [],
- prev: moment(triggerDto.prev).valueOf(),
- last: moment(triggerDto.last).valueOf(),
- };
-
- if (model.status === 'draft' && model.delivery.type === SendEnum.NOW) {
- model.delivery.startDate = moment().valueOf();
- }
- model[TypeEnum.MULTIPLE].audienceSelection = triggerDto.delayed ? AudienceSelectionEnum.BEFORE : AudienceSelectionEnum.NOW;
- model.timezone = triggerDto.tz ? TimezoneEnum.DEVICE : TimezoneEnum.SAME;
- return model;
- },
mapDtoToModel: function(dto) {
var pushNotificationType = this.mapType(dto);
if (pushNotificationType === TypeEnum.ONE_TIME) {
return this.mapDtoToOneTimeModel(dto);
}
- else if (pushNotificationType === TypeEnum.AUTOMATIC) {
+ if (pushNotificationType === TypeEnum.AUTOMATIC) {
return this.mapDtoToAutomaticModel(dto);
}
- else if (pushNotificationType === TypeEnum.TRANSACTIONAL) {
+ if (pushNotificationType === TypeEnum.TRANSACTIONAL) {
return this.mapDtoToTransactionalModel(dto);
}
- else if (pushNotificationType === TypeEnum.RECURRING) {
- return this.mapDtoToRecurringModel(dto);
- }
- else if (pushNotificationType === TypeEnum.MULTIPLE) {
- return this.mapDtoToMultipleModel(dto);
- }
throw new Error('Unknown push notification type:' + pushNotificationType);
},
mapMediaMetadata: function(metadataDto) {
@@ -2048,9 +1870,6 @@
result.sctz = new Date().getTimezoneOffset();
}
}
- else if (model.delivery.type === SendEnum.NOW) {
- result.start = Date.now();
- }
result.delayed = model[TypeEnum.ONE_TIME].audienceSelection === AudienceSelectionEnum.BEFORE;
return [result];
},
@@ -2098,45 +1917,6 @@
mapTransactionalTrigger: function(model) {
return [{kind: 'api', start: model.delivery.startDate}];
},
- mapRecurringTrigger: function(model, options) {
- var result = {
- kind: 'rec',
- start: model.delivery.startDate,
- bucket: model.delivery.repetition.bucket,
- every: parseInt(model.delivery.repetition.every),
- on: model.delivery.repetition.on
- };
- if (typeof model.delivery.repetition.at === 'number') {
- model.delivery.repetition.at = new Date(model.delivery.repetition.at);
- }
- var repeatedHour = {
- hours: model.delivery.repetition.at.getHours(),
- minutes: model.delivery.repetition.at.getMinutes()
- };
-
- if (options.isEndDateSet) {
- result.end = model.delivery.endDate;
- }
-
- result.time = countlyPushNotification.helper.convertDateTimeToMS(repeatedHour);
- result.delayed = model[TypeEnum.RECURRING].audienceSelection === AudienceSelectionEnum.BEFORE;
- result.tz = true;
- result.sctz = new Date().getTimezoneOffset();
- return [result];
- },
- mapMultipleTrigger: function(model) {
- var result = {
- kind: 'multi',
- start: model.delivery.startDate,
- dates: model.delivery.multipleDates,
- };
- if (model.timezone === TimezoneEnum.DEVICE) {
- result.tz = true;
- result.sctz = new Date().getTimezoneOffset();
- }
- result.delayed = model[TypeEnum.MULTIPLE].audienceSelection === AudienceSelectionEnum.BEFORE;
- return [result];
- },
mapFilters: function(model, options) {
var result = {};
if (model.user) {
@@ -2167,18 +1947,6 @@
if (model.type === TypeEnum.AUTOMATIC && options.isLocationSet && model.locations.length) {
result.geos = model.locations;
}
- if (model.type === TypeEnum.RECURRING && model[TypeEnum.RECURRING].targeting === TargetingEnum.SEGMENTED && model.cohorts.length) {
- result.cohorts = model.cohorts;
- }
- if (model.type === TypeEnum.RECURRING && model[TypeEnum.RECURRING].targeting === TargetingEnum.SEGMENTED && model.locations.length) {
- result.geos = model.locations;
- }
- if (model.type === TypeEnum.MULTIPLE && model[TypeEnum.MULTIPLE].targeting === TargetingEnum.SEGMENTED && model.cohorts.length) {
- result.cohorts = model.cohorts;
- }
- if (model.type === TypeEnum.MULTIPLE && model[TypeEnum.MULTIPLE].targeting === TargetingEnum.SEGMENTED && model.locations.length) {
- result.geos = model.locations;
- }
return Object.keys(result).length === 0 ? null : result;
},
getLocalizationsCount: function(locales) {
@@ -2229,6 +1997,7 @@
mapModelToBaseDto: function(pushNotificationModel, options) {
var resultDto = {
app: countlyCommon.ACTIVE_APP_ID,
+ saveStats: pushNotificationModel.saveStats || false,
platforms: this.mapPlatforms(pushNotificationModel.platforms),
};
if (pushNotificationModel._id) {
@@ -2281,32 +2050,16 @@
dto.triggers = this.mapTransactionalTrigger(pushNotificationModel);
return dto;
},
- mapModelToRecurringDto: function(pushNotificationModel, options) {
- var dto = this.mapModelToBaseDto(pushNotificationModel, options);
- dto.triggers = this.mapRecurringTrigger(pushNotificationModel, options);
- return dto;
- },
- mapModelToMultipleDto: function(pushNotificationModel, options) {
- var dto = this.mapModelToBaseDto(pushNotificationModel, options);
- dto.triggers = this.mapMultipleTrigger(pushNotificationModel, options);
- return dto;
- },
mapModelToDto: function(pushNotificationModel, options) {
if (pushNotificationModel.type === TypeEnum.ONE_TIME) {
return this.mapModelToOneTimeDto(pushNotificationModel, options);
}
- else if (pushNotificationModel.type === TypeEnum.AUTOMATIC) {
+ if (pushNotificationModel.type === TypeEnum.AUTOMATIC) {
return this.mapModelToAutomaticDto(pushNotificationModel, options);
}
- else if (pushNotificationModel.type === TypeEnum.TRANSACTIONAL) {
+ if (pushNotificationModel.type === TypeEnum.TRANSACTIONAL) {
return this.mapModelToTransactionalDto(pushNotificationModel, options);
}
- else if (pushNotificationModel.type === TypeEnum.RECURRING) {
- return this.mapModelToRecurringDto(pushNotificationModel, options);
- }
- else if (pushNotificationModel.type === TypeEnum.MULTIPLE) {
- return this.mapModelToMultipleDto(pushNotificationModel, options);
- }
throw Error('Unknown push notification type:', pushNotificationModel.type);
},
mapIOSAppLevelConfig: function(model) {
@@ -2412,10 +2165,7 @@
ALL_FILTER_OPTION_VALUE: ALL_FILTER_OPTION_VALUE,
ALL_FILTER_OPTION_LABEL: ALL_FILTER_OPTION_LABEL,
TypeEnum: TypeEnum,
- KindEnum: KindEnum,
- CampaignTypes: CampaignTypes,
PeriodEnum: PeriodEnum,
- TriggerTypeEnum: TriggerTypeEnum,
PlatformEnum: PlatformEnum,
StatusEnum: StatusEnum,
UserCommandEnum: UserCommandEnum,
@@ -2437,19 +2187,6 @@
startDateOptions: startDateOptions,
audienceSelectionOptions: audienceSelectionOptions,
targetingOptions: targetingOptions,
- bucketList: bucketList,
- weeklyRepetitionOptions: weeklyRepetitionOptions,
- monthlyRepetitionOptions: function() {
- const days = [];
- for (let i = 1; i <= 28; i++) {
- days.push({ label: CV.i18n('push-notification.day') + " " + i, value: i });
- }
- days.push({ label: CV.i18n('push-notification.last-day'), value: 0 });
- days.push({ label: CV.i18n('push-notification.x-day-before-the-last-day', 1), value: -1 });
- days.push({ label: CV.i18n('push-notification.x-days-before-the-last-day', 2), value: -2 });
-
- return days;
- },
triggerOptions: triggerOptions,
triggerNotMetOptions: triggerNotMetOptions,
deliveryDateCalculationOptions: deliveryDateCalculationOptions,
@@ -2915,10 +2652,6 @@
messageSettings[PlatformEnum.ANDROID] = {};
return {
pushNotification: countlyPushNotification.helper.getInitialModel(TypeEnum.ONE_TIME),
- messageStats: {
- sent: [],
- action: []
- },
platformFilter: null,
platformFilterOptions: [],
localeFilter: null,
@@ -2945,19 +2678,6 @@
context.dispatch('onFetchError', {error: error, useLoader: true});
});
},
- fetchMessageStats: function(context, { messageId, period }) {
- context.dispatch('onFetchInit', {useLoader: true});
- countlyPushNotification.api.fetchMessageStats(messageId, period)
- .then(function(model) {
- context.commit('setMessageStats', model);
- context.dispatch('onFetchSuccess', {useLoader: true});
- })
- .catch(function(error) {
- console.error(error);
- context.dispatch('onFetchError', {error: error, useLoader: true});
- });
-
- },
onUserCommand: function(context, payload) {
context.commit('setUserCommand', payload);
},
@@ -3037,9 +2757,6 @@
setPushNotification: function(state, value) {
state.pushNotification = value;
},
- setMessageStats: function(state, value) {
- state.messageStats = value;
- },
setUserCommand: function(state, value) {
state.userCommand = value;
},
@@ -3093,8 +2810,6 @@
return {
rows: [],
selectedPushNotificationType: countlyPushNotification.service.TypeEnum.ONE_TIME,
- selectedPushNotificationKind: countlyPushNotification.service.KindEnum.ALL,
- selectedTriggerKind: countlyPushNotification.service.TriggerTypeEnum.PLAIN,
statusFilter: ALL_FILTER_OPTION_VALUE,
platformFilter: countlyPushNotification.service.PlatformEnum.ALL,
areRowsLoading: false,
@@ -3104,10 +2819,6 @@
},
isDrawerOpen: false,
isLoadingTable: true,
- activeFilter: {
- platform: "all",
- status: "all"
- },
};
};
@@ -3173,41 +2884,22 @@
onSetAreRowsLoading: function(context, value) {
context.commit('setAreRowsLoading', value);
},
- onSetTriggerKind: function(context, value) {
- context.commit('setTriggerKind', value);
- },
onSetPushNotificationType: function(context, value) {
context.commit('resetPushNotifications');
context.commit('setPushNotificationType', value);
},
- onSetPushNotificationKind: function(context, value) {
- context.commit('resetPushNotifications');
- context.commit('setPushNotificationKind', value);
- },
onSetPlatformFilter: function(context, value) {
context.commit('setPlatformFilter', value);
},
onSetStatusFilter: function(context, value) {
context.commit('setStatusFilter', value);
},
- onSetActiveFilter: function(context, value) {
- context.commit('setActiveFilter', value);
- }
};
var mainMutations = {
setPushNotificationType: function(state, value) {
state.selectedPushNotificationType = value;
},
- setTriggerKind: function(state, value) {
- state.selectedTriggerKind = value;
- },
- setPushNotificationKind: function(state, value) {
- state.selectedPushNotificationKind = value;
- },
- setActiveFilter: function(state, value) {
- state.activeFilter = value;
- },
resetPushNotifications: function(state) {
Object.assign(state, getMainInitialState());
},
@@ -3356,24 +3048,4 @@
destroy: false,
});
};
-
- var TT = {
- tkid: 'iOS Development Token',
- tkia: 'iOS Ad Hoc / TestFlight Token',
- tkip: 'iOS Production Token',
- tkap: 'Android Firebase Token',
- tkhp: 'Android Huawei Token'
- };
-
- countlyPushNotification.getTokenTypes = function() {
- return Object.keys(TT);
- };
-
- countlyPushNotification.getTokenNames = function() {
- return Object.values(TT);
- };
-
- countlyPushNotification.getTokenName = function(type) {
- return TT[type];
- };
}(window.countlyPushNotification = window.countlyPushNotification || {}));
\ No newline at end of file
diff --git a/plugins/push/frontend/public/javascripts/countly.views.component.common.js b/plugins/push/frontend/public/javascripts/countly.views.component.common.js
index cd982c96338..84082df30e1 100644
--- a/plugins/push/frontend/public/javascripts/countly.views.component.common.js
+++ b/plugins/push/frontend/public/javascripts/countly.views.component.common.js
@@ -18,15 +18,6 @@
description: {
type: String,
required: false,
- },
- tooltip: {
- type: String,
- required: false,
- },
- size: {
- type: String,
- default: 'medium',
- required: false
}
},
data: function() {
@@ -43,17 +34,6 @@
},
hasDefaultSlot: function() {
return Boolean(this.$slots.default);
- },
- calculatedHeight() {
- if (this.size === 'small') {
- return '60px';
- }
- else if (this.size === 'large') {
- return '110px';
- }
- else {
- return '97px';
- }
}
},
template: "#large-radio-button-with-description"
@@ -81,11 +61,6 @@
type: Boolean,
required: false,
default: false,
- },
- disabled: {
- type: Boolean,
- required: false,
- default: false,
}
},
data: function() {
@@ -894,7 +869,6 @@
return {
PlatformEnum: countlyPushNotification.service.PlatformEnum,
MessageTypeEnum: countlyPushNotification.service.MessageTypeEnum,
- platformsForSummary: ["ios", "android"]
};
},
computed: {
@@ -1009,33 +983,9 @@
convertDaysInMsToDays: function(daysInMs) {
return daysInMs / this.DAY_TO_MS_RATIO;
},
- formatDateAndTime: function(date, isMultiple) {
- if (isMultiple) {
- const dates = date.map(function(eachDate) {
- return countlyPushNotification.helper.formatDateTime(eachDate, 'MMMM Do YYYY h:mm a').toString();
- });
- return dates.join(", ");
- }
+ formatDateAndTime: function(date) {
return countlyPushNotification.helper.formatDateTime(date, 'MMMM Do, YYYY, h:mm a');
},
- formatDateTime: function(dateTime, format) {
- return countlyPushNotification.helper.formatDateTime(dateTime, format);
- },
- formatRepetitionDays: function(repetitionDays) {
- const days = this.weeklyRepetitionOptions.map(option => option.label);
- const selectedDays = repetitionDays.map(day => days[day - 1]);
- return selectedDays.join(', ');
- },
- calculateDeliveryDates: function(prev, last) {
- var nextDeliveryDates = [];
- if (prev && prev > Date.now()) {
- nextDeliveryDates.push(this.formatDateTime(prev, 'DD MMMM YYYY'));
- }
- if (last && last > Date.now() && last !== prev) {
- nextDeliveryDates.push(this.formatDateTime(last, 'DD MMMM YYYY'));
- }
- return nextDeliveryDates.join(', ');
- },
setCohorts: function(cohorts) {
this.cohorts = cohorts;
},
@@ -1109,59 +1059,4 @@
}
});
- countlyPushNotificationComponent.DetailsStatsTab = countlyVue.views.create({
- template: '#details-stats-tab',
- data: () => {
- return {
- selectedPeriod: "30days",
- periodOptions: [
- { label: "30 days", value: "30days" },
- { label: "24 weeks", value: "24weeks" },
- { label: "12 months", value: "12months" }
- ]
- };
- },
- mounted() {
- this.fetchMessageStats();
- },
- computed: {
- chartOpts: function() {
- return {
- xAxis: {
- axisLabel: {
- formatter: date => moment(date).format("DD MMM")
- }
- },
- tooltip: {
- axisPointer: {
- label: {
- formatter: date => moment(date.value).format("LL")
- }
- }
- },
- series: [
- {
- name: "Sent Messages",
- type: "bar",
- data: this.$store.state.countlyPushNotificationDetails.messageStats.sent,
- },
- {
- name: "Actioned Messages",
- type: "bar",
- data: this.$store.state.countlyPushNotificationDetails.messageStats.action,
- }
- ]
- };
- }
- },
- methods: {
- fetchMessageStats() {
- this.$store.dispatch("countlyPushNotificationDetails/fetchMessageStats", {
- messageId: this.$store.state.countlyPushNotificationDetails.pushNotification._id,
- period: this.selectedPeriod
- });
- }
- }
- });
-
})(window.countlyPushNotificationComponent = window.countlyPushNotificationComponent || {});
\ No newline at end of file
diff --git a/plugins/push/frontend/public/javascripts/countly.views.js b/plugins/push/frontend/public/javascripts/countly.views.js
index dbd5b16f74b..37d463bb781 100644
--- a/plugins/push/frontend/public/javascripts/countly.views.js
+++ b/plugins/push/frontend/public/javascripts/countly.views.js
@@ -1,5 +1,5 @@
/* eslint-disable no-console */
-/* global countlyVue,countlyPlugins,app,CV,countlyPushNotification,countlyPushNotificationComponent,CountlyHelpers,countlyCommon,countlyGlobal,countlyAuth,countlyGraphNotesCommon, moment*/
+/* global countlyVue,countlyPlugins,app,CV,countlyPushNotification,countlyPushNotificationComponent,CountlyHelpers,countlyCommon,countlyGlobal,countlyAuth,countlyGraphNotesCommon*/
(function() {
@@ -76,6 +76,10 @@
default: null,
required: false,
},
+ type: {
+ type: String,
+ default: countlyPushNotification.service.TypeEnum.ONE_TIME
+ },
userCommand: {
type: String,
default: countlyPushNotification.service.UserCommandEnum.CREATE,
@@ -98,7 +102,6 @@
isFetchEventsLoading: false,
isFetchLocationsLoading: false,
isLoading: false,
- isEstimationLoading: false,
localizationOptions: [],
userPropertiesOptions: [],
cohortOptions: [],
@@ -120,13 +123,9 @@
MediaTypeEnum: countlyPushNotification.service.MediaTypeEnum,
UserCommandEnum: countlyPushNotification.service.UserCommandEnum,
UserPropertyTypeEnum: countlyPushNotification.service.UserPropertyTypeEnum,
- TriggerTypeEnum: countlyPushNotification.service.TriggerTypeEnum,
messageTypeFilterOptions: messageTypeFilterOptions,
startDateOptions: countlyPushNotification.service.startDateOptions,
targetingOptions: countlyPushNotification.service.targetingOptions,
- bucketList: countlyPushNotification.service.bucketList,
- weeklyRepetitionOptions: countlyPushNotification.service.weeklyRepetitionOptions,
- monthlyRepetitionOptions: countlyPushNotification.service.monthlyRepetitionOptions(),
audienceSelectionOptions: countlyPushNotification.service.audienceSelectionOptions,
triggerOptions: countlyPushNotification.service.triggerOptions,
triggerNotMetOptions: countlyPushNotification.service.triggerNotMetOptions,
@@ -148,35 +147,15 @@
isLocationSet: false,
multipleLocalizations: false,
urlRegex: new RegExp('([A-Za-z][A-Za-z0-9+\\-.]*):(?:(//)(?:((?:[A-Za-z0-9\\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?((?:\\[(?:(?:(?:(?:[0-9A-Fa-f]{1,4}:){6}|::(?:[0-9A-Fa-f]{1,4}:){5}|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}|(?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}|(?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:|(?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::)(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|[Vv][0-9A-Fa-f]+\\.[A-Za-z0-9\\-._~!$&\'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:[A-Za-z0-9\\-._~!$&\'()*+,;=]|%[0-9A-Fa-f]{2})*))(?::([0-9]*))?((?:/(?:[A-Za-z0-9\\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|/((?:(?:[A-Za-z0-9\\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:/(?:[A-Za-z0-9\\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)?)|((?:[A-Za-z0-9\\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})+(?:/(?:[A-Za-z0-9\\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)|)(?:\\?((?:[A-Za-z0-9\\-._~!$&\'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*))?(?:\\#((?:[A-Za-z0-9\\-._~!$&\'()*+,;=:@/?]|%[0-9A-Fa-f]{2})*))?'),
- pushNotificationUnderEdit: null,
- campaignTypes: countlyPushNotification.service.CampaignTypes,
+ pushNotificationUnderEdit: JSON.parse(JSON.stringify(countlyPushNotification.helper.getInitialModel(this.type))),
currentNumberOfUsers: 0,
today: Date.now(),
appConfig: {},
- title: '',
- type: countlyPushNotification.service.TypeEnum.ONE_TIME,
- campaignType: "One-Time",
- campaignTypeMapper: {"One-Time": "oneTime", "Automated": "automatic", "Recurring": "rec", "Multiple Days": "multi", "API": "transactional"}
};
},
watch: {
- type: function(val) {
- if (val) {
- this.pushNotificationUnderEdit = JSON.parse(JSON.stringify(countlyPushNotification.helper.getInitialModel(this.type, this.pushNotificationUnderEdit)));
- this.updatePlatformsBasedOnAppConfig();
- }
- },
- 'campaignType': {
- handler: function(newVal) {
- // var campaignTypeMapper = {"One-Time": "oneTime", "Automated": "automatic", "Recurring": "rec", "Multiple Days": "multi", "API": "transactional"};
- if (typeof this.campaignTypeMapper[newVal] !== "undefined") {
- this.type = this.campaignTypeMapper[newVal];
- }
- else if (typeof this.campaignTypeMapper[newVal] === "undefined") {
- this.type = newVal;
- }
- },
- deep: true
+ type: function() {
+ this.pushNotificationUnderEdit = JSON.parse(JSON.stringify(countlyPushNotification.helper.getInitialModel(this.type)));
}
},
computed: {
@@ -222,6 +201,17 @@
}
return CV.i18n('push-notification.send-for-approval');
},
+ title: function() {
+ if (this.type === countlyPushNotification.service.TypeEnum.ONE_TIME) {
+ return CV.i18n('push-notification.create-one-time-notification');
+ }
+ if (this.type === countlyPushNotification.service.TypeEnum.AUTOMATIC) {
+ return CV.i18n('push-notification.create-automated-notification');
+ }
+ if (this.type === countlyPushNotification.service.TypeEnum.TRANSACTIONAL) {
+ return CV.i18n('push-notification.create-transactional-notification');
+ }
+ },
addButtonLabel: function() {
if (this.pushNotificationUnderEdit.message[this.activeLocalization].buttons.length === 0) {
return CV.i18n('push-notification.add-first-button');
@@ -339,7 +329,7 @@
}
return allLocations;
}, []);
- },
+ }
},
methods: {
getInitialPushNotificationDrawerSettingsState: function() {
@@ -363,11 +353,6 @@
formatDateTime: function(dateTime, format) {
return countlyPushNotification.helper.formatDateTime(dateTime, format);
},
- formatRepetitionDays: function(repetitionDays) {
- const days = this.weeklyRepetitionOptions.map(option => option.label);
- const selectedDays = repetitionDays.map(day => days[day - 1]);
- return selectedDays.join(', ');
- },
setUserPropertyOptions: function(propertyList) {
var allPropertyOptions = [];
if (this.type === this.TypeEnum.AUTOMATIC && this.pushNotificationUnderEdit.automatic.trigger === this.TriggerEnum.EVENT) {
@@ -384,16 +369,16 @@
});
},
isDeliveryNextStepFromInfoStep: function(nextStep, currentStep) {
- return nextStep === 2 && currentStep === 1;
+ return nextStep === 1 && currentStep === 0;
},
isReviewNextStepFromContentStep: function(nextStep, currentStep) {
- return nextStep === 4 && currentStep === 3;
+ return nextStep === 3 && currentStep === 2;
},
isContentNextStepFromInfoStep: function(nextStep, currentStep) {
- return nextStep === 3 && currentStep === 1;
+ return nextStep === 2 && currentStep === 0;
},
isContentNextStepFromAnyPreviousStep: function(nextStep, currentStep) {
- return nextStep === 3 && currentStep < 3;
+ return nextStep === 2 && currentStep < 2;
},
isEditMode: function() {
return this.userCommand === this.UserCommandEnum.DUPLICATE ||
@@ -411,7 +396,7 @@
return this.isReviewNextStepFromContentStep(nextStep, currentStep) && this.pushNotificationUnderEdit.messageType === this.MessageTypeEnum.CONTENT;
},
validateContentOnEnterIfNecessary: function(nextStep, currentStep) {
- if (this.shouldValidateContentOnEnter(nextStep, currentStep) && this.$refs.content) {
+ if (this.shouldValidateContentOnEnter(nextStep, currentStep)) {
this.$refs.content.validate();
}
},
@@ -420,73 +405,11 @@
this.fetchUserPropertyOptions();
}
},
- validateDeliveryDates: function(nextStep, currentStep) {
- if (currentStep === 2 && nextStep === 3 && this.isEndDateSet && this.pushNotificationUnderEdit.delivery.endDate && this.pushNotificationUnderEdit.delivery.startDate) {
- return new Date(this.pushNotificationUnderEdit.delivery.endDate) >= new Date(this.pushNotificationUnderEdit.delivery.startDate);
- }
- return true;
- },
- validateStartDates: function(nextStep, currentStep) {
- if (currentStep === 2 && nextStep === 3 && this.type !== this.campaignTypeMapper.API) {
- var startDate = new Date();
- var today = new Date();
- var validDate = new Date(today.getTime() + (15 * 60 * 60 * 1000));
- if (this.type === "rec") {
- startDate = new Date(this.pushNotificationUnderEdit.delivery.startDate);
- }
- else if (this.type === "oneTime") {
- if (this.pushNotificationUnderEdit.timezone === "device") {
- startDate = new Date(this.pushNotificationUnderEdit.delivery.startDate);
- }
- else {
- return true;
- }
- }
- else if (this.type === "multi") {
- if (this.pushNotificationUnderEdit.timezone === "device") {
- var multipleDates = this.pushNotificationUnderEdit.delivery.multipleDates;
- for (var i = 0; i < multipleDates.length; i++) {
- var inputDate = new Date(multipleDates[i]);
- if (inputDate.getTime() < validDate.getTime()) {
- return false;
- }
- }
- return true;
- }
- else {
- return true;
- }
- }
- else if (this.type === "automatic") {
- if (this.pushNotificationUnderEdit.automatic.deliveryMethod === "immediately" && this.pushNotificationUnderEdit.delivery.type === "later") {
- startDate = new Date(this.pushNotificationUnderEdit.delivery.startDate);
- }
- else {
- return true;
- }
- }
- if (startDate < validDate) {
- return false;
- }
- else {
- return true;
- }
- }
- return true;
- },
onStepClick: function(nextStep, currentStep) {
this.validateContentOnEnterIfNecessary(nextStep, currentStep);
this.fetchUserPropertyOptionsOnContentEnter(nextStep, currentStep);
- // if (!this.validateStartDates(nextStep, currentStep)) {
- // CountlyHelpers.notify({ message: CV.i18n('push-notification.start-date-validation-warning'), type: "error"});
- // return;
- // }
- if (!this.validateDeliveryDates(nextStep, currentStep)) {
- CountlyHelpers.notify({ message: CV.i18n('push-notification-drawer.date-validation'), type: "error"});
- return;
- }
if (this.shouldEstimate(nextStep, currentStep)) {
- this.estimate(); // estimate in the background
+ return this.estimate();
}
if (this.shouldValidateContentBeforeExit(nextStep, currentStep)) {
return this.$refs.content.validate();
@@ -531,9 +454,6 @@
setIsLoading: function(value) {
this.isLoading = value;
},
- setEstimationLoading: function(value) {
- this.isEstimationLoading = value;
- },
getQueryFilter: function() {
if (!this.queryFilter) {
return {};
@@ -547,7 +467,7 @@
resolve(false);
return;
}
- self.setEstimationLoading(true);
+ self.setIsLoading(true);
var options = {};
options.isLocationSet = self.isLocationSet;
options.from = self.from;
@@ -583,7 +503,7 @@
CountlyHelpers.notify({ message: error.message, type: "error"});
resolve(false);
}).finally(function() {
- self.setEstimationLoading(false);
+ self.setIsLoading(false);
});
});
},
@@ -731,7 +651,6 @@
this.isConfirmed = false;
this.multipleLocalizations = false;
this.expandedPlatformSettings = [];
- this.campaignType = "One-Time";
this.isAddUserPropertyPopoverOpen = {
title: false,
content: false
@@ -806,21 +725,10 @@
return this.queryFilter && this.queryFilter.queryObject && Object.keys(this.queryFilter.queryObject).length === 0;
},
onOpen: function() {
- const selectedTriggerKindMapper = {"oneTime": "One-Time", "automatic": "Automated", "rec": "Recurring", "multi": "Multiple Days", "transactional": "API"};
if (this.id) {
this.fetchPushNotificationById();
- if (this.$store.state.countlyPushNotificationMain && this.$store.state.countlyPushNotificationMain.selectedTriggerKind) {
- this.campaignType = this.$store.state.countlyPushNotificationMain.selectedTriggerKind;
- }
- else if (this.$store.state.countlyPushNotificationDetails && this.$store.state.countlyPushNotificationDetails.pushNotification.type) {
- this.campaignType = selectedTriggerKindMapper[this.$store.state.countlyPushNotificationDetails.pushNotification.type];
- }
- this.title = CV.i18n('push-notification.update-notification');
return;
}
- else {
- this.title = CV.i18n('push-notification.create-new-notification');
- }
this.updatePlatformsBasedOnAppConfig();
this.estimateIfNecessary();
this.setEnabledUsers(this.$store.state.countlyPushNotificationDashboard.enabledUsers);
@@ -1065,9 +973,6 @@
});
this.resetAllMediaURLIfNecessary();
},
- onSelectedBucket: function() {
- this.pushNotificationUnderEdit.delivery.repetition.on = [];
- },
afterMediaURLValidate: function(platform, isValid) {
if (isValid) {
this.fetchMediaMetadata(platform, this.pushNotificationUnderEdit.settings[platform].mediaURL);
@@ -1193,11 +1098,6 @@
this.isEndDateSet = true;
}
},
- updateRecurringOptions: function() {
- if (this.pushNotificationUnderEdit.delivery.endDate) {
- this.isEndDateSet = true;
- }
- },
updateTransactionalOptions: function() {
if (this.userCommand === this.UserCommandEnum.DUPLICATE) {
this.resetDelivery();
@@ -1223,9 +1123,6 @@
if (self.pushNotificationUnderEdit.type === self.TypeEnum.TRANSACTIONAL) {
self.updateTransactionalOptions();
}
- if (self.pushNotificationUnderEdit.type === self.TypeEnum.RECURRING) {
- self.updateRecurringOptions();
- }
if (self.pushNotificationUnderEdit.type === self.TypeEnum.ONE_TIME) {
if (self.hasAnyFilters()) {
self.estimate();
@@ -1260,32 +1157,13 @@
catch (error) {
console.error(error);
}
- },
- removeDate: function(index) {
- if (this.pushNotificationUnderEdit.delivery.multipleDates.length < 2) {
- CountlyHelpers.notify({message: CV.i18n('push-notification.cannot-remove-last-date'), type: "error"});
- return;
- }
- this.pushNotificationUnderEdit.delivery.multipleDates.splice(index, 1);
- },
- addDate: function() {
- this.pushNotificationUnderEdit.delivery.multipleDates.push(new Date().getTime());
- },
- formatDeliveryDates: function(values) {
- const dates = values.map((timestamp) => moment(timestamp).format('MM/DD/YYYY h:mm:ss A'));
- return dates.join(', ');
}
},
- beforeMount: function() {
- this.type = countlyPushNotification.service.TypeEnum.ONE_TIME;
- this.pushNotificationUnderEdit = JSON.parse(JSON.stringify(countlyPushNotification.helper.getInitialModel(this.type)));
- },
mounted: function() {
this.fetchCohorts();
this.fetchLocations();
this.fetchEvents();
this.getAppConfig();
- this.TypeEnum = countlyPushNotification.service.TypeEnum;
},
components: {
"message-setting-element": countlyPushNotificationComponent.MessageSettingElement,
@@ -1335,28 +1213,10 @@
value: "createdBy",
label: CV.i18n('push-notification.table-created-by'),
default: false
- },
- {
- value: "created",
- label: CV.i18n('push-notification.table-created'),
- default: false
}
- ],
- notificationTypes: [],
- selectedNotificationKind: [],
- platformOptions: []
+ ]
};
},
- watch: {
- selectedNotificationKind: {
- handler(newValue) {
- const apiKinds = this.mapNotificationKinds(newValue);
- this.$store.dispatch('countlyPushNotificationMain/onSetPushNotificationKind', apiKinds);
- this.$store.dispatch('countlyPushNotificationMain/fetchPushTable', true);
- },
- deep: true
- }
- },
computed: {
selectedPushNotificationType: function() {
return this.$store.state.countlyPushNotificationMain.selectedPushNotificationType;
@@ -1459,41 +1319,6 @@
hasApproverPermission: function() {
return countlyPushNotification.service.hasApproverPermission();
},
- activeFilterFields: function() {
- var self = this;
- var statusOptions = Object.keys(self.statusOptions).map(key => ({label: self.statusOptions[key].label, value: self.statusOptions[key].value}));
-
- statusOptions.push({label: 'All Status', value: ''});
- const lastElementStatus = statusOptions.pop();
- statusOptions.unshift(lastElementStatus);
-
-
- return [
- {
- label: "Platform",
- key: "platform",
- items: this.platformFilters,
- default: ""
- },
- {
- label: "Status",
- key: "status",
- items: statusOptions,
- default: ""
- }
- ];
- },
- activeFilter: {
- set: function(value) {
- this.$store.dispatch("countlyPushNotificationMain/onSetPlatformFilter", value.platform);
- this.$store.dispatch("countlyPushNotificationMain/onSetStatusFilter", value.status);
- this.$store.dispatch("countlyPushNotificationMain/onSetActiveFilter", value);
- return this.$store.dispatch('countlyPushNotificationMain/fetchPushTable');
- },
- get: function() {
- return this.$store.state.countlyPushNotificationMain.activeFilter;
- }
- },
},
methods: {
refresh: function() {
@@ -1513,7 +1338,7 @@
onApprove: function(id) {
this.handleUserCommands(this.UserCommandEnum.APPROVE, id);
},
- handleUserCommands: function(command, pushNotificationId, notificationType) {
+ handleUserCommands: function(command, pushNotificationId) {
this.$store.dispatch('countlyPushNotificationMain/onUserCommand', {type: command, pushNotificationId: pushNotificationId});
switch (command) {
case this.UserCommandEnum.RESEND: {
@@ -1537,7 +1362,6 @@
break;
}
case this.UserCommandEnum.EDIT: {
- this.$store.dispatch('countlyPushNotificationMain/onSetTriggerKind', notificationType);
this.$store.dispatch('countlyPushNotificationMain/onSetIsDrawerOpen', true);
break;
}
@@ -1597,7 +1421,9 @@
if (!this.canUserUpdate) {
return false;
}
- return status === this.StatusEnum.STOPPED
+ return status === this.StatusEnum.CREATED
+ || status === this.StatusEnum.SENT
+ || status === this.StatusEnum.STOPPED
|| status === this.StatusEnum.FAILED;
},
shouldShowStopUserCommand: function(status) {
@@ -1643,44 +1469,13 @@
}
}
},
- mapNotificationKinds(notificationKinds) {
- const kindMapping = {
- plain: "plain",
- auto: ["event", "cohort"],
- rec: "rec",
- multi: "multi",
- api: "api",
- all: ["plain", "event", "cohort", "rec", "multi", "api"]
- };
- const mappedKinds = [];
-
- if (!notificationKinds.length) {
- return kindMapping.all;
- }
-
- notificationKinds.forEach(kind => {
- if (kindMapping[kind]) {
- if (Array.isArray(kindMapping[kind])) {
- mappedKinds.push(...kindMapping[kind]);
- }
- else {
- mappedKinds.push(kindMapping[kind]);
- }
- }
- });
- return mappedKinds;
+ onRowClick: function(row) {
+ window.location.hash = "#/messaging/details/" + row._id;
}
},
mounted: function() {
this.$store.dispatch('countlyPushNotificationMain/fetchPushTable', true);
- this.notificationTypes.push(
- {label: "One-Time Notifications", value: "plain"},
- {label: "Automated Notifications", value: "auto"},
- {label: "Recurring Notifications", value: "rec"},
- {label: "Multiple Notifications", value: "multi"},
- {label: "API Notifications", value: "api"}
- );
- },
+ }
});
var PushNotificationView = countlyVue.views.create({
@@ -1711,7 +1506,7 @@
},
userCommand: function() {
return this.$store.state.countlyPushNotificationMain.userCommand;
- }
+ },
},
watch: {
isDrawerOpen: function(value) {
@@ -1794,11 +1589,6 @@
title: CV.i18n('push-notification-details.errors-tab'),
name: "errors",
component: countlyPushNotificationComponent.DetailsErrorsTab
- },
- {
- title: CV.i18n('push-notification-details.stats-tab'),
- name: "stats",
- component: countlyPushNotificationComponent.DetailsStatsTab
}
],
usersTargetedOptionsXAxis: {
@@ -1815,7 +1605,7 @@
barGrid: {
right: "80%",
left: 0,
- },
+ }
};
},
computed: {
@@ -1827,7 +1617,6 @@
},
localeFilterOptions: function() {
if (this.pushNotification.dashboard[this.selectedPlatformFilter]) {
-
return Object.keys(this.pushNotification.dashboard[this.selectedPlatformFilter].locales).map(function(localeKey) {
return countlyPushNotification.mapper.incoming.mapLocalizationByKey(localeKey);
});
@@ -1934,23 +1723,6 @@
},
dashboardTokens: function() {
return this.$store.state.countlyPushNotificationDashboard.tokens;
- },
- errorCount: function() {
- const globalError = this.$store.state.countlyPushNotificationDetails.pushNotification.error;
- if (globalError) {
- const allErrors = this.$store.state.countlyPushNotificationDetails.pushNotification.errors;
- const copyErrors = allErrors.concat([]);
- copyErrors.unshift(this.globalError);
- return copyErrors.length;
- }
- return this.$store.state.countlyPushNotificationDetails.pushNotification.errors.length || 0;
- },
- customIcon: function() {
- const implementedTab = this.errorCount ? "errors" : null;
- return {
- implementedTab: implementedTab,
- iconTemplate: ' ' + this.errorCount + '
'
- };
}
},
watch: {
@@ -2053,7 +1825,9 @@
if (!this.canUserUpdate) {
return false;
}
- return status === this.StatusEnum.STOPPED
+ return status === this.StatusEnum.CREATED
+ || status === this.StatusEnum.SENT
+ || status === this.StatusEnum.STOPPED
|| status === this.StatusEnum.FAILED;
},
shouldShowStopUserCommand: function(status) {
@@ -2150,7 +1924,7 @@
var queryData = {message: {"$nin": [this.pushNotification._id]}};
var $in = [];
if (this.pushNotification.user) {
- Object.assign(queryData, JSON.parse(this.pushNotification.user));
+ queryData.user = this.pushNotification.user;
}
if (this.pushNotification.locations && this.pushNotification.locations.length) {
queryData.geo = {"$in": this.pushNotification.locations};
@@ -2185,30 +1959,6 @@
onMobileMessagePlatformChange: function(value) {
this.$store.dispatch('countlyPushNotificationDetails/onSetMobileMessagePlatform', value);
},
- downloadLogs: function() {
- try {
- const rows = [];
- rows.push([CV.i18n('push-notification.users-targeted'), CV.i18n('push-notification.sent-notifications'), CV.i18n('push-notification.clicked-notifications'), CV.i18n('push-notification.failed')]);
- rows.push([(this.targetedUsers + "%" + " " + (this.selectedDashboard.processed || 0) + " " + CV.i18n('push-notification.users')), (this.sentPushNotifications + "%" + " " + (this.selectedDashboard.sent || 0) + " " + CV.i18n('push-notification.users')), (this.clickedPushNotifications + "%" + " " + (this.selectedDashboard.actioned || 0) + " " + CV.i18n('push-notification.users')), (this.failedPushNotifications + "%" + " " + (this.selectedDashboard.errored || 0) + " " + CV.i18n('push-notification.users'))]);
- let csvContent = "data:text/csv;charset=utf-8,";
- rows.forEach((rowArray) => {
- const row = rowArray.join(",");
- csvContent += row + "\r\n";
- });
- const encodedUri = encodeURI(csvContent);
- const link = document.createElement("a");
- link.setAttribute("href", encodedUri);
- link.setAttribute("download", "Push_Notification_Detail_Metrics_" + moment().format("DD-MMM-YYYY") + ".csv");
- link.style.visibility = "hidden";
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- CountlyHelpers.notify({message: "Downloaded successfully!", type: 'success', sticky: false});
- }
- catch (error) {
- CountlyHelpers.notify({message: error.message, type: 'error', sticky: false});
- }
- }
},
components: {
"mobile-message-preview": countlyPushNotificationComponent.MobileMessagePreview,
@@ -2823,8 +2573,7 @@
data: function() {
return {
command: "CREATE_PUSH_NOTIFICATION",
- label: CV.i18n('push-notification.send-message-to-users'),
- tooltipMessage: CV.i18n('push-notification.send-message-to-users-tooltip')
+ label: CV.i18n('push-notification.send-message-to-users')
};
},
computed: {
@@ -2841,7 +2590,7 @@
return false;
}
},
- template: '{{label}}
',
+ template: '{{label}}',
});
var PushNotificationDrawerWrapper = countlyVue.views.create({
@@ -3057,7 +2806,7 @@
/**
- *
+ *
* @returns {Object} container data with create new message event handler
*/
function getCreateNewMessageEventContainerData() {
@@ -3073,7 +2822,7 @@
};
}
/**
- *
+ *
* @returns {Object} container data with push notification drawer
*/
function getDrawerContainerData() {
@@ -3082,7 +2831,7 @@
name: "pushNotificationDrawer",
pluginName: "push",
component: PushNotificationDrawerWrapper,
- type: countlyPushNotification.service.TypeEnum.ONE_TIME
+ type: countlyPushNotification.service.TypeEnum.ONE_TIME,
};
}
/**
diff --git a/plugins/push/frontend/public/localization/push.properties b/plugins/push/frontend/public/localization/push.properties
index 5f0da5c60bb..6851e76082f 100755
--- a/plugins/push/frontend/public/localization/push.properties
+++ b/plugins/push/frontend/public/localization/push.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Campaign Name
-push-notification.notification-name-description = You can give a name to your camgain, this will only visible internally (optional).
-push-notification.enter-notification-name = Enter Campaign Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -99,13 +94,13 @@ push-notification.all-push-enabled-users-description = Send to all users who hav
push-notification.use-segmentation = Use segmentation
push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
push-notification.push-enabled-users = Push-enabled users
-push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s) or profile group(s)
-push-notification.send-to-users-in-cohorts-description = Select cohort(s) or profile group(s) of users who qualify to receive the notification.
+push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
+push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
-push-notification.select-cohort-to-set-trigger = Select one or more cohorts or profile groups to set the trigger
+push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
push-notification.select-location = Please select a location
push-notification.when-to-determine-users = When to determine the users?
@@ -114,10 +109,10 @@ push-notification.determine-users-before = Determine users right before sending
push-notification.determine-users-now = Determine users now
push-notification.triggers = Triggers
push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
-push-notification.cohorts-entry = Cohort(s) or Profile Group(s) entry
-push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts or profile groups you select.
-push-notification.cohorts-exit = Cohort(s) or Profile Group(s) exit
-push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts or profile groups you select.
+push-notification.cohorts-entry = Cohort(s) entry
+push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
+push-notification.cohorts-exit = Cohort(s) exit
+push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
push-notification.performed-events = Performed Event(s)
push-notification.performed-events-description = Triggered when user performs a selected event.
push-notification.select-event = Please select an event
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -269,6 +246,9 @@ push-notification.testing-tooltip = Sends the push notification to applications'
push-notification.send-to-test-users = Send to test users
push-notification.confirmation-uppercase = CONFIRMATION
push-notification.confirmation-uppercase-description = CONFIRMATION description
+push-notification.save-push-stats = Keep individual push records for each user
+push-notification.debugging = DEBUGGING
+push-notification.push-stats-warning = This options enables the storage of each push record inside "push_stats" collection for every message per device for debug purposes. Please enable this option with caution since it can fill up the database quickly.
push-notification.i-am-ready-to-send = I am ready to send this message to real-users
push-notification.was-successfully-saved = Push notification message was successfully saved
push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
@@ -306,7 +286,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +303,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -334,7 +312,7 @@ push-notification-details.delivery-sub-header = Delivery
push-notification-details.delivery-type = Delivery type
push-notification-details.scheduled-for = Scheduled for
push-notification-details.expiration-time = Expiration time
-push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
+push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
push-notification-details.no-errors-found = No errors were found
push-notification.users-targeted = Users Targeted
push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
@@ -350,11 +328,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -395,7 +368,7 @@ push-notification.define-with-cohort = Define with Cohort
push-notification.enter-user-id = Enter User ID
push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
-push-notification.select-cohort = Please select a cohort/profile group
+push-notification.select-cohort = Please select a cohort
push-notification.user-list = User List
push-notification.username = Username
push-notification.user-id = User ID
@@ -405,7 +378,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -416,57 +388,17 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -483,20 +415,17 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
-push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
push-notification.error-code.MissingRegistration.desc = Please contact customer support.
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -512,7 +441,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Push Notification messages have been discarded because time of arrival would be at least 60 minutes later than expected.
push-notification.error-code.del = Message deleted
@@ -525,7 +453,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_ar.properties b/plugins/push/frontend/public/localization/push_ar.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_ar.properties
+++ b/plugins/push/frontend/public/localization/push_ar.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_bg.properties b/plugins/push/frontend/public/localization/push_bg.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_bg.properties
+++ b/plugins/push/frontend/public/localization/push_bg.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_bs.properties b/plugins/push/frontend/public/localization/push_bs.properties
new file mode 100644
index 00000000000..0dc7ccf6fab
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_bs.properties
@@ -0,0 +1,577 @@
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
+push.plugin-title = Push Notifications
+push.plugin-description = Increase loyalty, user retention & satisfaction with native iOS and Android push notifications
+push.sidebar.section = Messaging
+push.sidebar.overview = Overview
+push.sidebar.messages = Messages
+
+push.no-message = No message
+push.create = Create Message
+push.create-message-n = Create Message to {0} users
+
+mgmt-plugins.push.here = here
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android (Google FCM)
+mgmt-plugins.push.android.key = Firebase key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from
+mgmt-plugins.push.h = Android (Huawei Push Kit)
+mgmt-plugins.push.h.key = Huawei App ID
+mgmt-plugins.push.h.key.desc = Your numerical Huawei App ID (Client ID)
+mgmt-plugins.push.h.secret = App Secret
+mgmt-plugins.push.h.secret.desc = Huawei App Secret, sign secret of your app can be found in code signing properties or at
+mgmt-plugins.push.h.secret.hds = Huawei developer portal
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.error.h.key = Please enter Huawei App ID
+mgmt-plugins.push.error.h.secret = Please enter Huawei App Secret
+mgmt-plugins.push.error.h.keynum = Huawei App ID can contain only digits
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.p12 = Universal certificate (p12) is already uploaded
+mgmt-plugins.push.uploaded.p8 = Key file (p8) is already uploaded
+mgmt-plugins.push.uploaded.bundle = Bundle id of this certificate:
+mgmt-plugins.push.detected = Detected key type:
+mgmt-plugins.push.rate = Rate limit
+mgmt-plugins.push.rate.rate = Maximum number of notifications scheduled per period
+mgmt-plugins.push.rate.help = Push notifications sent to FCM and APNS will separately be rate limited based on this configuration for each push notification campaign
+mgmt-plugins.push.rate.period = Period duration (seconds)
+mgmt-plugins.push.rate.period.help = Timeframe to apply the rate limit to
+
+systemlogs.action.push_message_created = Push Message Created
+systemlogs.action.push_credentials_update = Push Credentials Updated
+systemlogs.action.push_message_deleted = Push Message Deleted
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM). It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = Total number of messages sent for this application within selected period of time.
+help.dashboard.push.actions = Number of actions performed for this app. Action represents a positive reaction of a user to your message. Please see SDK guide to know how to enable this metric in your app.
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or FCM tokens stored in the database.
+
+pu.po.title = Create Push Notification
+pu.po.desc = Compose your push notification in 4 easy steps
+
+pu.po.view.title = Push Notification
+pu.po.view.desc = Message details
+
+pu.po.preview = Preview
+pu.po.preview.help = Please note that this is a preview screen. What you see here may not be same as what end users see on their smartphones due to varying device sizes.
+
+pu.po.tt.pers = Add personalized content
+pu.po.tt.emoji = Add emoji
+
+pu.po.tab0.title = Apps & Platforms
+pu.po.tab0.title.auto = Platforms
+pu.po.tab0.desc = Destinations
+
+pu.po.tab1.title = Scheduling
+pu.po.tab1.desc = Set message date
+pu.po.tab1.title.auto = Campaign Rules
+pu.po.tab1.desc.auto = Triggers & dates
+
+pu.po.tab1.chr = Cohorts
+pu.po.tab1.chr-desc = Send to the users currently in selected cohorts
+
+pu.po.tab1.aud = Audience Selection
+pu.po.tab1.now.t = Now
+pu.po.tab1.now.d = Select users now
+pu.po.tab1.later.t = Before sending
+pu.po.tab1.later.d = Select users right before sending the message
+
+pu.po.tab2.ddc = Delivery Date Calculation
+pu.po.tab2.ddc.arr = Relative to the date event arrived to the server
+pu.po.tab2.ddc.evt = Relative to the date event occurred on a device
+# pu.po.tab2.ddc.h = In "event occurrence" case Countly only sends notifications within 30 minutes of actual event recording date, discarding any "late" notifications which could be triggered due to event arriving to the server with a delay because of networking issues.
+# pu.po.tab2.ddc.h = Note that larger amount of notifications won't be sent in case of event occurence date since an event might arrive to the server with a delay due to networking issues. On the other hand, accuracy of "event occurence" case is better, since there won't be any late notifications.
+# pu.po.tab2.ddc.arr = Relative to the event arrival to the server date
+# pu.po.tab2.ddc.evt = Relative to the event occurence on the device date
+
+pu.po.tab2.trc = Behaviour when trigger condition is no longer met
+pu.po.tab2.trc.true = Cancel when user exits selected cohort(s)
+pu.po.tab2.trc.false = Cancel when user enters selected cohort(s) back
+pu.po.tab2.trc.dont = Send anyway
+
+pu.po.tab2.title.auto = Message Delivery
+pu.po.tab2.desc.auto = Periodicity & capping
+
+pu.po.compose.title = Message
+pu.po.compose.desc = Compose content
+
+pu.po.review.title = Review
+pu.po.review.desc = Check your message
+
+pu.po.tab0.apps = Apps
+pu.po.tab0.add = Add App
+pu.po.tab0.select-apps = Select Apps
+pu.po.tab0.select-apps-desc = Only apps with APN or FCM credentials are displayed
+pu.po.tab0.select-platforms = Select Platforms
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or FCM credentials
+pu.platform.i = iOS
+pu.platform.a = Android
+pu.po.prev = Previous step
+pu.po.next = Next step
+pu.po.send = Send!
+pu.po.start = Start!
+pu.po.edit = Save
+pu.po.close = Close
+pu.po.duplicate = Duplicate
+pu.po.delete = Delete
+
+pu.po.tab1.testing = Testing
+pu.po.tab1.testing-desc = Send to production users or to test users?
+pu.po.tab1.testing-prod = Production Users
+pu.po.tab1.testing-test = Test Users
+pu.po.tab1.testing-test-desc = Development & test users only
+
+pu.po.tab1.scheduling = Scheduling
+pu.po.tab1.scheduling-desc = Send now or schedule sending for later
+pu.po.tab1.scheduling-now = Send now
+pu.po.tab1.scheduling-auto-now = Start now
+pu.po.tab1.scheduling-now-desc = Sending will start once you click Send
+pu.po.tab1.scheduling-date = Schedule
+pu.po.tab1.scheduling-date-desc = Set specific date & time for this message
+pu.po.tab1.tz = Send according to user's timezone?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = No
+pu.po.tab1.tz-no-desc = Send all notifications at once
+pu.po.tab1.tz-yes = Send in user timezones
+pu.po.tab1.tz-yes-desc = Send each notification in timezone of the user it's for
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = Geolocations
+pu.po.tab1.geos-desc = Filter users by their last known location?
+pu.po.tab1.geos.no = No filtering
+
+
+pu.po.recipients.s = Recipient: {0}
+pu.po.recipients.m = Recipients: {0}
+pu.po.recipients.temporary = Number of users calculation is still running, it can take up to several minutes in tough cases. Feel free to send your message without waiting.
+
+pu.po.tab2.message.type = Message type
+pu.po.tab2.extras = Additional options
+
+pu.type.message = Message
+pu.type.data = Data-only
+pu.type.rich = Rich
+
+pu.po.loading = We're counting your users
+pu.po.loading-desc = Please wait, it will be done soon
+
+pu.po.sending = Saving
+pu.po.sending-desc = Just a moment
+
+pu.po.sent = Saved
+pu.po.sent-desc = All good!
+
+pu.po.tab2.placeholder = Write your message here (default is required, add more localized messages if needed)
+pu.po.tab2.default-message = Your message
+pu.po.tab2.default-message.invalid = Default message is required
+pu.po.tab2.default-button-title.invalid = Default button title is required
+pu.po.tab2.default-button-link.invalid = Default button link is required
+pu.po.tab2.extras.sound = Send sound
+pu.po.tab2.extras.sound.invalid = Sound must be a string
+pu.po.tab2.extras.badge = Add badge
+pu.po.tab2.extras.badge.invalid = Badge must be a valid number
+pu.po.tab2.extras.badge.help = iOS supports badges by default, Android requires additional steps (more details in our Android SDK Guide)
+pu.po.tab2.extras.media = Attachment URL
+pu.po.tab2.extras.media.placeholder = Image URL
+pu.po.tab2.extras.media.invalid = Must be a valid URL to an image (JPG, PNG) or animation (GIF) less than 10MB in size, audio (MP3, WAV, AIF) less than 5MB in size or video (MPEG, MPEG2, MPEG4) less than 50MB in size
+pu.po.tab2.extras.media.toobig = Media attachment must be less than 10MB for images and animations, less than 5MB for audio & 50MB for videos
+pu.po.tab2.extras.media.help = Media attachments are fully supported on iOS 10+. Android supports only images, iOS 9- doesn't support media at all. In case media is not supported, users will only see message text.
+pu.po.tab2.extras.url = On click URL
+pu.po.tab2.extras.url.invalid = URL must be valid
+pu.po.tab2.extras.url.help = Default URL or deeplink which is being open when user taps a message in drawer
+pu.po.tab2.extras.data = Send JSON
+pu.po.tab2.extras.data.invalid = This field must contain valid JSON string
+pu.po.tab2.extras.data.placeholder = JSON string
+pu.po.tab2.extras.data.help = App-specific JSON data can be sent along with standard content
+pu.po.tab2.mtitle = Message title
+pu.po.tab2.mtitle.placeholder = Optional title for your message
+pu.po.tab2.mtext = Message text
+pu.po.tab2.mbtn = Buttons
+pu.po.tab2.mbtns = Number of buttons
+pu.po.tab2.mbtn.urls = Button URLs
+pu.po.tab2.mbtn.req = Button title required
+pu.po.tab2.mbtn.url = Must be a valid URL
+pu.po.tab2.mbtn.0 = Button 0
+pu.po.tab2.mbtn.1 = Button 1
+pu.po.tab2.mbtn.2 = Button 2
+pu.po.tab2.btntext = Button text
+pu.po.tab2.urlordeep = URL or deeplink
+pu.po.tab2.rich = Rich notification options
+pu.po.tab2.mmedia = Media
+pu.po.tab2.mmedia.type.image = Image
+pu.po.tab2.mmedia.type.anima = Animation
+pu.po.tab2.mmedia.type.audio = Audio
+pu.po.tab2.mmedia.type.video = Video
+pu.po.tab2.mmedia.type.warn.android = This type of media is not supported on Android
+pu.po.tab2.mmedia.status = Request status:
+pu.po.tab2.default-message.help = Default localization for all users. You can override default message & button names by setting them for specific locales.
+pu.po.no-users = Sorry, there are no push-enabled users for specified options.
+pu.po.no-users-try-change = Try to change
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = Start over
+pu.po.tab2.variable = Variable
+pu.po.tab2.capital = Make variable value start from capital letter
+pu.po.tab2.fallback = Fallback value
+pu.po.tab2.help = Default value which will be used in case user profile doesn't have this variable
+pu.po.tab2.props = User Properties
+pu.po.tab2.cust = Custom Variables
+pu.po.tab2.varpl = Select variable
+pu.po.tab2.fallpl = Enter fallback value
+pu.po.tab2.tt = User''s "{0}" property which falls back to "{1}"
+
+datepicker.dt.click = Set date & time
+datepicker.tz = Send in user's timezone
+datepicker.clear = Clear
+datepicker.apply = Apply
+datepicker.pick-time = Pick Time
+
+pu.locale.default = Default
+pu.locale.null = Unknown
+pu.po.tab3.review = Review
+pu.po.tab3.apps = Apps
+pu.po.tab3.platforms = Platforms
+pu.po.tab3.date = Date
+pu.po.tab3.date.now = At the time of message creation
+pu.po.tab3.date.intz = ; in user timezones
+pu.po.tab3.unknown = Unknown
+pu.po.tab3.type = Type
+pu.po.tab3.type.message = Text message
+pu.po.tab3.type.data = Data
+pu.po.tab3.type.update = Update (deprecated)
+pu.po.tab3.type.review = Review (deprecated)
+pu.po.tab3.type.category = Category (deprecated)
+pu.po.tab3.type.link = URL (deprecated)
+pu.po.tab3.test = Send to test devices
+pu.po.tab3.test.true = Yes
+pu.po.tab3.test.false = No
+pu.po.tab3.btns = Buttons
+pu.po.tab3.media = Media
+pu.po.tab3.extras = Standard options
+
+pu.po.tab3.extras.sound = Sound
+pu.po.tab3.extras.badge = iOS badge
+pu.po.tab3.extras.url = On click URL
+pu.po.tab3.extras.data = Extra data
+pu.po.tab3.extras.media = Media
+
+pu.po.tab3.date.date = Scheduled to be sent on
+pu.po.tab3.date.sent = Sent on
+pu.po.tab3.date.tz = Sent in user timezone
+
+pu.po.tab3.audience = Recipients
+
+pu.po.tab3.errors = Errors
+pu.po.tab3.errors.code = Code
+pu.po.tab3.errors.message = Error
+pu.po.tab3.errors.count = Count
+
+pu.po.confirm = Confirm sending
+pu.po.confirm.ready = I’m ready to send this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will receive this campaign after it is started.
+pu.po.recipients.message.details = This message will automatically be delivered to app users as they match campaign trigger criteria.
+pu.po.recipients.message.edit = Message modification only affects notifications scheduled after modification takes place.
+
+pu.dash.users = Users
+pu.dash.users.total = Total Users
+pu.dash.users.enabl = Messaging-enabled Users
+pu.dash.totals = Overall
+pu.dash.metrics = Metrics
+pu.dash.metrics.sent = Messages sent
+pu.dash.metrics.acti = Actions performed
+pu.dash.create = Create Message
+pu.dash.monthly = Monthly
+pu.dash.weekly = Weekly
+pu.dash.messages = Messages
+pu.dash.messages.all = All
+pu.dash.messages.api = API
+pu.dash.messages.dash = Dashboard
+pu.dash.actions = Actions
+pu.dash.sent = Sent
+
+
+pu.t.nothing = No records found
+pu.t.search = Search by default message
+pu.t.message = Message
+pu.t.apps = Apps
+pu.t.status = Status
+pu.t.created = Created
+pu.t.sent-scheduled = Date sent / Scheduled
+pu.t.result = Sent / Actioned
+
+push.message.status.initial = Initial
+push.message.status.created = Created
+push.message.status.scheduled = Scheduled
+push.message.status.sending = Sending
+push.message.status.sending-errors = Sending with errors
+push.message.status.aborted = Aborted
+push.message.status.sent = Sent
+push.message.status.sent-errors = Sent with errors
+
+push.message.status.auto.true = Active
+push.message.status.auto.false = Inactive
+
+push.error.econnrefused = Countly cannot connect to APN/FCM. Please check your proxy server settings (if any) and / or server connectivity to APN/FCM servers.
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = Process exited while sending this messsage due to connection being unexpectedly closed by APNS. Some notifications might have been sent twice (up to 500).
+push.error.3-eof = APNS connection error. Possible reasons include: invalid certificate / auth key, firewall block, system root certificates (CA) issues.
+push.error.no-credentials = You don't have credentials for any of selected app-platform combinations.
+push.error.no-app-credentials = This application doesn't have any push notification credentials set.
+push.error.no-cohorts = Automated messages depend on Cohorts and Events, yet you don't have any of those.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+push.error.no.cohorts = No Cohorts or events
+push.error.no.credentials = No credentials
+push.error.i.understand = OK, I understand
+
+
+push.errorCodes.bug = You found a bug! Please contact support.
+push.errorCodes = Errors:
+push.errorCode.i400 = APN 400 Bad request
+push.errorCode.i400+BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse the certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to the Bundle ID of your application
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403 Certificate error
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403 error: InvalidProviderToken. Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push.errorCode.i405 = APN 405 Bad method
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413 Payload too large
+push.errorCode.i413.desc = Message was too large and APN declined to deliver it.
+push.errorCode.i429 = APN 429 Too many requests
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500 Internal error
+push.errorCode.i500.desc = Apple server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.i503 = APN 503 Shutdown
+push.errorCode.i503.desc = Apple server unexpectedly decided to shutdown returning HTTP error 503. Please try again later.
+
+push.errorCode.a200 = FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push.errorCode.a200+InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push.errorCode.a200+MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push.errorCode.a200+InvalidDataKey.desc = Message contains invalid data key, please check:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push.errorCode.a200+TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push.errorCode.a400 = FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = FCM 500 Internal error
+push.errorCode.a500.desc = Google server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.a200+Unavailable.desc = Google server unexpectedly returned HTTP error 200+Unavailable. Please try again later.
+push.errorCode.a200+InternalServerError.desc = Google server unexpectedly returned HTTP error 200+InternalServerError. Please try again later.
+push.errorCode.a501 = FCM 501 Error
+push.errorCode.a502 = FCM 502 Error
+push.errorCode.a503 = FCM 503 Error
+push.errorCode.link.i = Apple docs
+push.errorCode.link.a = Google docs
+push.errorCode.skiptz = Too late to send
+push.errorCode.skiptz.desc = This much notifications have been discarded because time of arrival would be at least 60 minutes later than expected (either due to user's timezone, or due to networking issues).
+push.errorCode.del = Message deleted
+push.errorCode.del.desc = This much notifications have been discarded their message has been deleted.
+push.errorCode.aborted = Aborted
+push.errorCode.aborted.desc = This much messages have been removed from queue after an unrecoverable error. Please check error message above or contact support if there's no error message.
+push.errorCode.consent = Consent cancelled
+push.errorCode.consent.desc = This much messages have been removed from queue after user removed push consent.
+
+push.totals.processed = Processed
+push.totals.sent = Accepted
+push.totals.errors = Errors
+
+pu.po.users.s = {0} user
+pu.po.users.m = {0} users
+pu.po.metrics = Metrics
+pu.po.metrics.processed = Processed
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = Sent Successfully
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & FCM
+pu.po.metrics.sent.none = No notifications were sent! Please check message errors
+pu.po.metrics.sent.one = Your notification has been sent successfully!
+pu.po.metrics.sent.all = All notifications have been sent successfully!
+pu.po.metrics.actions = Actioned
+pu.po.metrics.actions.desc = How many users performed push notification action
+pu.po.metrics.actions.all = All users performed action! Good Job!
+pu.po.metrics.actions.performed = performed action.
+pu.po.metrics.actions0.performed = opened default URL.
+pu.po.metrics.actions1.performed = clicked first button.
+pu.po.metrics.actions2.performed = clicked second button.
+pu.po.left.to.send.s = {0} notification left to send
+pu.po.left.to.send.m = {0} notifications left to send
+pu.po.left.to.send.none = All notifications are sent!
+pu.po.left.to.send.batch = next batch will start at {0}
+pu.po.expired.s = {0} token expired
+pu.po.expired.m = {0} tokens expired
+pu.po.unset.s = {0} tokens expired
+pu.po.unset.m = {0} token expired
+pu.po.errors.s = {0} notification wasn\'t sent due to an error
+pu.po.errors.m = {0} notifications weren\'t sent due to an error
+
+pu.apn.uni = Universal Certificate (Production & Sandbox)
+pu.apn.none = None
+
+pu.gcm.gcm = FCM Key
+pu.gcm.none = None
+
+pu.remove = Remove credentials
+pu.validate = Validate
+pu.validating = Validating credentials
+pu.validation.error = Credentials error:
+pu.remove = Remove credentials
+pu.creds.none = None
+pu.creds.type.apn_universal = APN Universal Certificate is set
+pu.creds.type.apn_token = APN Auth Key is set
+pu.creds.type.gcm = FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase Server Key
+pu.creds.cert = P12 Certificate
+pu.creds.pass = Passphrase
+pu.creds.auth_key = P8 Key File
+pu.creds.key_id = Auth Key ID
+pu.creds.team_id = Team ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN Certificate (Sandbox & Production)
+pu.creds.apn.type.apn_token = APN Auth Key
+
+userdata.push = Push tokens
+pu.tk.id = APN Test token (development)
+pu.tk.ia = APN Test token (ad hoc or TestFlight)
+pu.tk.ip = APN Production token
+pu.tk.at = FCM Test token
+pu.tk.ap = FCM Production token
+pu.tk.ht = Huawei Test token
+pu.tk.hp = Huawei Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = Create Message
+pu.dash.btn-group.automated-message = Automated Message
+pu.dash.btn-group.automated-message-desc = Create an automated push campaign to send a message to users when their-in-app behaviour matches defined criteria.
+pu.dash.btn-group.automated-message-link = Learn more about automation
+pu.dash.btn-group.one-time-message = One-time Message
+pu.dash.btn-group.one-time-message-desc = Create a one-time push notification campaign to send right away on in the future.
+pu.dash.btn-group-available-in-enterprise = Available in enterprise edition
+pu.dash.btn.learn-more = Learn more about automation
+
+pu.po.tab1.trigger-type = Trigger Type
+pu.po.tab1.trigger-type.entry = Cohort Entry
+pu.po.tab1.trigger-type.exit = Cohort Exit
+pu.po.tab1.trigger-type.event = Performed Event
+pu.po.tab1.cohort-entry-desc = Triggered when user enters into any of the cohorts you select
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.cohort-event-desc = Triggered when user performs a selected event
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = Recalculation of cohorts above will trigger message sending process automatically
+pu.po.tab1.select-cohort-placeholder = Select cohorts(s)
+pu.po.tab1.select-event = Select one or more events to set a trigger
+pu.po.tab1.select-event-placeholder = Select event(s)
+pu.po.tab1.campaign-start-date = Campaign Start Date
+pu.po.tab1.additional-options = Additional Options
+pu.po.tab1.campaign-end-date = Campaign end date
+
+pu.po.tab2.delivery-method = Delivery method
+pu.po.tab2.delivery-method-desc = Choose when your message should be delivered
+pu.po.tab2.immediately = Immediately
+pu.po.tab2.immediately-desc = Deliver the message as soon as triggering cohort is recalculated
+pu.po.tab2.immediately-desc-event = Deliver the message as soon as triggering event reached the server
+pu.po.tab2.delayed = Delayed
+pu.po.tab2.delivery-time = Delivery time
+pu.po.tab2.delivery-time-desc = Set an optional delivery time for your message
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = Send in users' timezone at
+pu.po.tab2.select-time = Select time
+pu.po.tab2.capping = Capping
+pu.po.tab2.capping-desc = Configure number of messages per user. Enabling this option will limit number of messages sent to the same user.
+pu.po.tab2.capping.no = No capping
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered to or exited from the cohort
+pu.po.tab2.capping.no-desc-event = Message is sent whenever user's event is received by the server
+pu.po.tab2.capping.yes = Capped
+pu.po.tab2.capping.yes-desc = Number of messages is limited
+pu.po.tab2.message-per-user = Maximum messages per user
+pu.po.tab2.message-per-user-desc = Total number of messages individual user can receive from this campaign
+pu.po.tab2.sleep = Minimum time between messages
+pu.po.tab2.sleep-desc = User will be eligible to receive a repetitive message only if she / he triggers the campaign conditions at least configured time after previous message.
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = App
+pu.po.tab4.campaign-rules = Campaign Rules
+pu.po.tab4.trigger-type = Trigger Type
+pu.po.tab4.trigger-cohort-entry = Cohort entry
+pu.po.tab4.trigger-cohort-exit = Cohort exit
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = Cohort
+pu.po.tab4.cohorts.m = Cohorts ({0})
+pu.po.tab4.events.no = Events(s) were deleted
+pu.po.tab4.events.s = Event
+pu.po.tab4.events.m = Events ({0})
+pu.po.tab4.caping = Capping
+pu.po.tab4.caping-message = At most {0} message is going to be sent per user
+pu.po.tab4.message-content = Message Content
+pu.po.tab4.message-title = Title
+pu.po.tab4.message-text = Text
+pu.po.tab4.message-sound = Sound
+pu.po.tab4.message-media = Media
+pu.po.tab4.message-badge = Badge
+
+push.po.one-time-messages = ONE-TIME MESSAGES
+push.po.automated-messages = AUTOMATED MESSAGES
+push.po.table.dublicate = Duplicate
+push.po.table.resend = Resend failed notifications
+push.po.table.edit = Edit
+push.po.table.delete = Delete
+push.po.table.recipients = View recipients
+
+pu.po.progress = Progress
+pu.po.progress.auto = 30 days overview
+pu.never = Never
+pu.days.s = day
+pu.days.m = days
+pu.hours.s = hour
+pu.hours.m =hours
+pu.messages.s = message
+pu.messages.m = messages
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
+
+push.proxyhost = Proxy Hostname
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxypass = Proxy Password
+
+push.note.gcm.t = Your push notifications can't be delivered
+push.note.gcm.m = Following apps have GCM credentials instead of Firebase ones: {0}.
Usage of GCM is no longer possible since Google stopped accepting requests to GCM endpoint.
Please update app credentials to a valid FCM server key.
+
+mail.autopush-error-subject = Countly Automated Push Problem
+mail.autopush-error = Hi {0},
Your automated message cannot be sent due to a repeating error. Please review message status and reactivate the message once the problem is resolved.
Best,
A fellow Countly Admin
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
diff --git a/plugins/push/frontend/public/localization/push_ca.properties b/plugins/push/frontend/public/localization/push_ca.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_ca.properties
+++ b/plugins/push/frontend/public/localization/push_ca.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_de.properties b/plugins/push/frontend/public/localization/push_de.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_de.properties
+++ b/plugins/push/frontend/public/localization/push_de.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_pt.properties b/plugins/push/frontend/public/localization/push_de_DE.properties
similarity index 85%
rename from plugins/push/frontend/public/localization/push_pt.properties
rename to plugins/push/frontend/public/localization/push_de_DE.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_pt.properties
+++ b/plugins/push/frontend/public/localization/push_de_DE.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_el.properties b/plugins/push/frontend/public/localization/push_el.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_el.properties
+++ b/plugins/push/frontend/public/localization/push_el.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_es.properties b/plugins/push/frontend/public/localization/push_es.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_es.properties
+++ b/plugins/push/frontend/public/localization/push_es.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_et.properties b/plugins/push/frontend/public/localization/push_et.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_et.properties
+++ b/plugins/push/frontend/public/localization/push_et.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_fa.properties b/plugins/push/frontend/public/localization/push_fa.properties
new file mode 100644
index 00000000000..0dc7ccf6fab
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_fa.properties
@@ -0,0 +1,577 @@
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
+push.plugin-title = Push Notifications
+push.plugin-description = Increase loyalty, user retention & satisfaction with native iOS and Android push notifications
+push.sidebar.section = Messaging
+push.sidebar.overview = Overview
+push.sidebar.messages = Messages
+
+push.no-message = No message
+push.create = Create Message
+push.create-message-n = Create Message to {0} users
+
+mgmt-plugins.push.here = here
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android (Google FCM)
+mgmt-plugins.push.android.key = Firebase key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from
+mgmt-plugins.push.h = Android (Huawei Push Kit)
+mgmt-plugins.push.h.key = Huawei App ID
+mgmt-plugins.push.h.key.desc = Your numerical Huawei App ID (Client ID)
+mgmt-plugins.push.h.secret = App Secret
+mgmt-plugins.push.h.secret.desc = Huawei App Secret, sign secret of your app can be found in code signing properties or at
+mgmt-plugins.push.h.secret.hds = Huawei developer portal
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.error.h.key = Please enter Huawei App ID
+mgmt-plugins.push.error.h.secret = Please enter Huawei App Secret
+mgmt-plugins.push.error.h.keynum = Huawei App ID can contain only digits
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.p12 = Universal certificate (p12) is already uploaded
+mgmt-plugins.push.uploaded.p8 = Key file (p8) is already uploaded
+mgmt-plugins.push.uploaded.bundle = Bundle id of this certificate:
+mgmt-plugins.push.detected = Detected key type:
+mgmt-plugins.push.rate = Rate limit
+mgmt-plugins.push.rate.rate = Maximum number of notifications scheduled per period
+mgmt-plugins.push.rate.help = Push notifications sent to FCM and APNS will separately be rate limited based on this configuration for each push notification campaign
+mgmt-plugins.push.rate.period = Period duration (seconds)
+mgmt-plugins.push.rate.period.help = Timeframe to apply the rate limit to
+
+systemlogs.action.push_message_created = Push Message Created
+systemlogs.action.push_credentials_update = Push Credentials Updated
+systemlogs.action.push_message_deleted = Push Message Deleted
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM). It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = Total number of messages sent for this application within selected period of time.
+help.dashboard.push.actions = Number of actions performed for this app. Action represents a positive reaction of a user to your message. Please see SDK guide to know how to enable this metric in your app.
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or FCM tokens stored in the database.
+
+pu.po.title = Create Push Notification
+pu.po.desc = Compose your push notification in 4 easy steps
+
+pu.po.view.title = Push Notification
+pu.po.view.desc = Message details
+
+pu.po.preview = Preview
+pu.po.preview.help = Please note that this is a preview screen. What you see here may not be same as what end users see on their smartphones due to varying device sizes.
+
+pu.po.tt.pers = Add personalized content
+pu.po.tt.emoji = Add emoji
+
+pu.po.tab0.title = Apps & Platforms
+pu.po.tab0.title.auto = Platforms
+pu.po.tab0.desc = Destinations
+
+pu.po.tab1.title = Scheduling
+pu.po.tab1.desc = Set message date
+pu.po.tab1.title.auto = Campaign Rules
+pu.po.tab1.desc.auto = Triggers & dates
+
+pu.po.tab1.chr = Cohorts
+pu.po.tab1.chr-desc = Send to the users currently in selected cohorts
+
+pu.po.tab1.aud = Audience Selection
+pu.po.tab1.now.t = Now
+pu.po.tab1.now.d = Select users now
+pu.po.tab1.later.t = Before sending
+pu.po.tab1.later.d = Select users right before sending the message
+
+pu.po.tab2.ddc = Delivery Date Calculation
+pu.po.tab2.ddc.arr = Relative to the date event arrived to the server
+pu.po.tab2.ddc.evt = Relative to the date event occurred on a device
+# pu.po.tab2.ddc.h = In "event occurrence" case Countly only sends notifications within 30 minutes of actual event recording date, discarding any "late" notifications which could be triggered due to event arriving to the server with a delay because of networking issues.
+# pu.po.tab2.ddc.h = Note that larger amount of notifications won't be sent in case of event occurence date since an event might arrive to the server with a delay due to networking issues. On the other hand, accuracy of "event occurence" case is better, since there won't be any late notifications.
+# pu.po.tab2.ddc.arr = Relative to the event arrival to the server date
+# pu.po.tab2.ddc.evt = Relative to the event occurence on the device date
+
+pu.po.tab2.trc = Behaviour when trigger condition is no longer met
+pu.po.tab2.trc.true = Cancel when user exits selected cohort(s)
+pu.po.tab2.trc.false = Cancel when user enters selected cohort(s) back
+pu.po.tab2.trc.dont = Send anyway
+
+pu.po.tab2.title.auto = Message Delivery
+pu.po.tab2.desc.auto = Periodicity & capping
+
+pu.po.compose.title = Message
+pu.po.compose.desc = Compose content
+
+pu.po.review.title = Review
+pu.po.review.desc = Check your message
+
+pu.po.tab0.apps = Apps
+pu.po.tab0.add = Add App
+pu.po.tab0.select-apps = Select Apps
+pu.po.tab0.select-apps-desc = Only apps with APN or FCM credentials are displayed
+pu.po.tab0.select-platforms = Select Platforms
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or FCM credentials
+pu.platform.i = iOS
+pu.platform.a = Android
+pu.po.prev = Previous step
+pu.po.next = Next step
+pu.po.send = Send!
+pu.po.start = Start!
+pu.po.edit = Save
+pu.po.close = Close
+pu.po.duplicate = Duplicate
+pu.po.delete = Delete
+
+pu.po.tab1.testing = Testing
+pu.po.tab1.testing-desc = Send to production users or to test users?
+pu.po.tab1.testing-prod = Production Users
+pu.po.tab1.testing-test = Test Users
+pu.po.tab1.testing-test-desc = Development & test users only
+
+pu.po.tab1.scheduling = Scheduling
+pu.po.tab1.scheduling-desc = Send now or schedule sending for later
+pu.po.tab1.scheduling-now = Send now
+pu.po.tab1.scheduling-auto-now = Start now
+pu.po.tab1.scheduling-now-desc = Sending will start once you click Send
+pu.po.tab1.scheduling-date = Schedule
+pu.po.tab1.scheduling-date-desc = Set specific date & time for this message
+pu.po.tab1.tz = Send according to user's timezone?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = No
+pu.po.tab1.tz-no-desc = Send all notifications at once
+pu.po.tab1.tz-yes = Send in user timezones
+pu.po.tab1.tz-yes-desc = Send each notification in timezone of the user it's for
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = Geolocations
+pu.po.tab1.geos-desc = Filter users by their last known location?
+pu.po.tab1.geos.no = No filtering
+
+
+pu.po.recipients.s = Recipient: {0}
+pu.po.recipients.m = Recipients: {0}
+pu.po.recipients.temporary = Number of users calculation is still running, it can take up to several minutes in tough cases. Feel free to send your message without waiting.
+
+pu.po.tab2.message.type = Message type
+pu.po.tab2.extras = Additional options
+
+pu.type.message = Message
+pu.type.data = Data-only
+pu.type.rich = Rich
+
+pu.po.loading = We're counting your users
+pu.po.loading-desc = Please wait, it will be done soon
+
+pu.po.sending = Saving
+pu.po.sending-desc = Just a moment
+
+pu.po.sent = Saved
+pu.po.sent-desc = All good!
+
+pu.po.tab2.placeholder = Write your message here (default is required, add more localized messages if needed)
+pu.po.tab2.default-message = Your message
+pu.po.tab2.default-message.invalid = Default message is required
+pu.po.tab2.default-button-title.invalid = Default button title is required
+pu.po.tab2.default-button-link.invalid = Default button link is required
+pu.po.tab2.extras.sound = Send sound
+pu.po.tab2.extras.sound.invalid = Sound must be a string
+pu.po.tab2.extras.badge = Add badge
+pu.po.tab2.extras.badge.invalid = Badge must be a valid number
+pu.po.tab2.extras.badge.help = iOS supports badges by default, Android requires additional steps (more details in our Android SDK Guide)
+pu.po.tab2.extras.media = Attachment URL
+pu.po.tab2.extras.media.placeholder = Image URL
+pu.po.tab2.extras.media.invalid = Must be a valid URL to an image (JPG, PNG) or animation (GIF) less than 10MB in size, audio (MP3, WAV, AIF) less than 5MB in size or video (MPEG, MPEG2, MPEG4) less than 50MB in size
+pu.po.tab2.extras.media.toobig = Media attachment must be less than 10MB for images and animations, less than 5MB for audio & 50MB for videos
+pu.po.tab2.extras.media.help = Media attachments are fully supported on iOS 10+. Android supports only images, iOS 9- doesn't support media at all. In case media is not supported, users will only see message text.
+pu.po.tab2.extras.url = On click URL
+pu.po.tab2.extras.url.invalid = URL must be valid
+pu.po.tab2.extras.url.help = Default URL or deeplink which is being open when user taps a message in drawer
+pu.po.tab2.extras.data = Send JSON
+pu.po.tab2.extras.data.invalid = This field must contain valid JSON string
+pu.po.tab2.extras.data.placeholder = JSON string
+pu.po.tab2.extras.data.help = App-specific JSON data can be sent along with standard content
+pu.po.tab2.mtitle = Message title
+pu.po.tab2.mtitle.placeholder = Optional title for your message
+pu.po.tab2.mtext = Message text
+pu.po.tab2.mbtn = Buttons
+pu.po.tab2.mbtns = Number of buttons
+pu.po.tab2.mbtn.urls = Button URLs
+pu.po.tab2.mbtn.req = Button title required
+pu.po.tab2.mbtn.url = Must be a valid URL
+pu.po.tab2.mbtn.0 = Button 0
+pu.po.tab2.mbtn.1 = Button 1
+pu.po.tab2.mbtn.2 = Button 2
+pu.po.tab2.btntext = Button text
+pu.po.tab2.urlordeep = URL or deeplink
+pu.po.tab2.rich = Rich notification options
+pu.po.tab2.mmedia = Media
+pu.po.tab2.mmedia.type.image = Image
+pu.po.tab2.mmedia.type.anima = Animation
+pu.po.tab2.mmedia.type.audio = Audio
+pu.po.tab2.mmedia.type.video = Video
+pu.po.tab2.mmedia.type.warn.android = This type of media is not supported on Android
+pu.po.tab2.mmedia.status = Request status:
+pu.po.tab2.default-message.help = Default localization for all users. You can override default message & button names by setting them for specific locales.
+pu.po.no-users = Sorry, there are no push-enabled users for specified options.
+pu.po.no-users-try-change = Try to change
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = Start over
+pu.po.tab2.variable = Variable
+pu.po.tab2.capital = Make variable value start from capital letter
+pu.po.tab2.fallback = Fallback value
+pu.po.tab2.help = Default value which will be used in case user profile doesn't have this variable
+pu.po.tab2.props = User Properties
+pu.po.tab2.cust = Custom Variables
+pu.po.tab2.varpl = Select variable
+pu.po.tab2.fallpl = Enter fallback value
+pu.po.tab2.tt = User''s "{0}" property which falls back to "{1}"
+
+datepicker.dt.click = Set date & time
+datepicker.tz = Send in user's timezone
+datepicker.clear = Clear
+datepicker.apply = Apply
+datepicker.pick-time = Pick Time
+
+pu.locale.default = Default
+pu.locale.null = Unknown
+pu.po.tab3.review = Review
+pu.po.tab3.apps = Apps
+pu.po.tab3.platforms = Platforms
+pu.po.tab3.date = Date
+pu.po.tab3.date.now = At the time of message creation
+pu.po.tab3.date.intz = ; in user timezones
+pu.po.tab3.unknown = Unknown
+pu.po.tab3.type = Type
+pu.po.tab3.type.message = Text message
+pu.po.tab3.type.data = Data
+pu.po.tab3.type.update = Update (deprecated)
+pu.po.tab3.type.review = Review (deprecated)
+pu.po.tab3.type.category = Category (deprecated)
+pu.po.tab3.type.link = URL (deprecated)
+pu.po.tab3.test = Send to test devices
+pu.po.tab3.test.true = Yes
+pu.po.tab3.test.false = No
+pu.po.tab3.btns = Buttons
+pu.po.tab3.media = Media
+pu.po.tab3.extras = Standard options
+
+pu.po.tab3.extras.sound = Sound
+pu.po.tab3.extras.badge = iOS badge
+pu.po.tab3.extras.url = On click URL
+pu.po.tab3.extras.data = Extra data
+pu.po.tab3.extras.media = Media
+
+pu.po.tab3.date.date = Scheduled to be sent on
+pu.po.tab3.date.sent = Sent on
+pu.po.tab3.date.tz = Sent in user timezone
+
+pu.po.tab3.audience = Recipients
+
+pu.po.tab3.errors = Errors
+pu.po.tab3.errors.code = Code
+pu.po.tab3.errors.message = Error
+pu.po.tab3.errors.count = Count
+
+pu.po.confirm = Confirm sending
+pu.po.confirm.ready = I’m ready to send this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will receive this campaign after it is started.
+pu.po.recipients.message.details = This message will automatically be delivered to app users as they match campaign trigger criteria.
+pu.po.recipients.message.edit = Message modification only affects notifications scheduled after modification takes place.
+
+pu.dash.users = Users
+pu.dash.users.total = Total Users
+pu.dash.users.enabl = Messaging-enabled Users
+pu.dash.totals = Overall
+pu.dash.metrics = Metrics
+pu.dash.metrics.sent = Messages sent
+pu.dash.metrics.acti = Actions performed
+pu.dash.create = Create Message
+pu.dash.monthly = Monthly
+pu.dash.weekly = Weekly
+pu.dash.messages = Messages
+pu.dash.messages.all = All
+pu.dash.messages.api = API
+pu.dash.messages.dash = Dashboard
+pu.dash.actions = Actions
+pu.dash.sent = Sent
+
+
+pu.t.nothing = No records found
+pu.t.search = Search by default message
+pu.t.message = Message
+pu.t.apps = Apps
+pu.t.status = Status
+pu.t.created = Created
+pu.t.sent-scheduled = Date sent / Scheduled
+pu.t.result = Sent / Actioned
+
+push.message.status.initial = Initial
+push.message.status.created = Created
+push.message.status.scheduled = Scheduled
+push.message.status.sending = Sending
+push.message.status.sending-errors = Sending with errors
+push.message.status.aborted = Aborted
+push.message.status.sent = Sent
+push.message.status.sent-errors = Sent with errors
+
+push.message.status.auto.true = Active
+push.message.status.auto.false = Inactive
+
+push.error.econnrefused = Countly cannot connect to APN/FCM. Please check your proxy server settings (if any) and / or server connectivity to APN/FCM servers.
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = Process exited while sending this messsage due to connection being unexpectedly closed by APNS. Some notifications might have been sent twice (up to 500).
+push.error.3-eof = APNS connection error. Possible reasons include: invalid certificate / auth key, firewall block, system root certificates (CA) issues.
+push.error.no-credentials = You don't have credentials for any of selected app-platform combinations.
+push.error.no-app-credentials = This application doesn't have any push notification credentials set.
+push.error.no-cohorts = Automated messages depend on Cohorts and Events, yet you don't have any of those.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+push.error.no.cohorts = No Cohorts or events
+push.error.no.credentials = No credentials
+push.error.i.understand = OK, I understand
+
+
+push.errorCodes.bug = You found a bug! Please contact support.
+push.errorCodes = Errors:
+push.errorCode.i400 = APN 400 Bad request
+push.errorCode.i400+BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse the certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to the Bundle ID of your application
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403 Certificate error
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403 error: InvalidProviderToken. Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push.errorCode.i405 = APN 405 Bad method
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413 Payload too large
+push.errorCode.i413.desc = Message was too large and APN declined to deliver it.
+push.errorCode.i429 = APN 429 Too many requests
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500 Internal error
+push.errorCode.i500.desc = Apple server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.i503 = APN 503 Shutdown
+push.errorCode.i503.desc = Apple server unexpectedly decided to shutdown returning HTTP error 503. Please try again later.
+
+push.errorCode.a200 = FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push.errorCode.a200+InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push.errorCode.a200+MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push.errorCode.a200+InvalidDataKey.desc = Message contains invalid data key, please check:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push.errorCode.a200+TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push.errorCode.a400 = FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = FCM 500 Internal error
+push.errorCode.a500.desc = Google server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.a200+Unavailable.desc = Google server unexpectedly returned HTTP error 200+Unavailable. Please try again later.
+push.errorCode.a200+InternalServerError.desc = Google server unexpectedly returned HTTP error 200+InternalServerError. Please try again later.
+push.errorCode.a501 = FCM 501 Error
+push.errorCode.a502 = FCM 502 Error
+push.errorCode.a503 = FCM 503 Error
+push.errorCode.link.i = Apple docs
+push.errorCode.link.a = Google docs
+push.errorCode.skiptz = Too late to send
+push.errorCode.skiptz.desc = This much notifications have been discarded because time of arrival would be at least 60 minutes later than expected (either due to user's timezone, or due to networking issues).
+push.errorCode.del = Message deleted
+push.errorCode.del.desc = This much notifications have been discarded their message has been deleted.
+push.errorCode.aborted = Aborted
+push.errorCode.aborted.desc = This much messages have been removed from queue after an unrecoverable error. Please check error message above or contact support if there's no error message.
+push.errorCode.consent = Consent cancelled
+push.errorCode.consent.desc = This much messages have been removed from queue after user removed push consent.
+
+push.totals.processed = Processed
+push.totals.sent = Accepted
+push.totals.errors = Errors
+
+pu.po.users.s = {0} user
+pu.po.users.m = {0} users
+pu.po.metrics = Metrics
+pu.po.metrics.processed = Processed
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = Sent Successfully
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & FCM
+pu.po.metrics.sent.none = No notifications were sent! Please check message errors
+pu.po.metrics.sent.one = Your notification has been sent successfully!
+pu.po.metrics.sent.all = All notifications have been sent successfully!
+pu.po.metrics.actions = Actioned
+pu.po.metrics.actions.desc = How many users performed push notification action
+pu.po.metrics.actions.all = All users performed action! Good Job!
+pu.po.metrics.actions.performed = performed action.
+pu.po.metrics.actions0.performed = opened default URL.
+pu.po.metrics.actions1.performed = clicked first button.
+pu.po.metrics.actions2.performed = clicked second button.
+pu.po.left.to.send.s = {0} notification left to send
+pu.po.left.to.send.m = {0} notifications left to send
+pu.po.left.to.send.none = All notifications are sent!
+pu.po.left.to.send.batch = next batch will start at {0}
+pu.po.expired.s = {0} token expired
+pu.po.expired.m = {0} tokens expired
+pu.po.unset.s = {0} tokens expired
+pu.po.unset.m = {0} token expired
+pu.po.errors.s = {0} notification wasn\'t sent due to an error
+pu.po.errors.m = {0} notifications weren\'t sent due to an error
+
+pu.apn.uni = Universal Certificate (Production & Sandbox)
+pu.apn.none = None
+
+pu.gcm.gcm = FCM Key
+pu.gcm.none = None
+
+pu.remove = Remove credentials
+pu.validate = Validate
+pu.validating = Validating credentials
+pu.validation.error = Credentials error:
+pu.remove = Remove credentials
+pu.creds.none = None
+pu.creds.type.apn_universal = APN Universal Certificate is set
+pu.creds.type.apn_token = APN Auth Key is set
+pu.creds.type.gcm = FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase Server Key
+pu.creds.cert = P12 Certificate
+pu.creds.pass = Passphrase
+pu.creds.auth_key = P8 Key File
+pu.creds.key_id = Auth Key ID
+pu.creds.team_id = Team ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN Certificate (Sandbox & Production)
+pu.creds.apn.type.apn_token = APN Auth Key
+
+userdata.push = Push tokens
+pu.tk.id = APN Test token (development)
+pu.tk.ia = APN Test token (ad hoc or TestFlight)
+pu.tk.ip = APN Production token
+pu.tk.at = FCM Test token
+pu.tk.ap = FCM Production token
+pu.tk.ht = Huawei Test token
+pu.tk.hp = Huawei Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = Create Message
+pu.dash.btn-group.automated-message = Automated Message
+pu.dash.btn-group.automated-message-desc = Create an automated push campaign to send a message to users when their-in-app behaviour matches defined criteria.
+pu.dash.btn-group.automated-message-link = Learn more about automation
+pu.dash.btn-group.one-time-message = One-time Message
+pu.dash.btn-group.one-time-message-desc = Create a one-time push notification campaign to send right away on in the future.
+pu.dash.btn-group-available-in-enterprise = Available in enterprise edition
+pu.dash.btn.learn-more = Learn more about automation
+
+pu.po.tab1.trigger-type = Trigger Type
+pu.po.tab1.trigger-type.entry = Cohort Entry
+pu.po.tab1.trigger-type.exit = Cohort Exit
+pu.po.tab1.trigger-type.event = Performed Event
+pu.po.tab1.cohort-entry-desc = Triggered when user enters into any of the cohorts you select
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.cohort-event-desc = Triggered when user performs a selected event
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = Recalculation of cohorts above will trigger message sending process automatically
+pu.po.tab1.select-cohort-placeholder = Select cohorts(s)
+pu.po.tab1.select-event = Select one or more events to set a trigger
+pu.po.tab1.select-event-placeholder = Select event(s)
+pu.po.tab1.campaign-start-date = Campaign Start Date
+pu.po.tab1.additional-options = Additional Options
+pu.po.tab1.campaign-end-date = Campaign end date
+
+pu.po.tab2.delivery-method = Delivery method
+pu.po.tab2.delivery-method-desc = Choose when your message should be delivered
+pu.po.tab2.immediately = Immediately
+pu.po.tab2.immediately-desc = Deliver the message as soon as triggering cohort is recalculated
+pu.po.tab2.immediately-desc-event = Deliver the message as soon as triggering event reached the server
+pu.po.tab2.delayed = Delayed
+pu.po.tab2.delivery-time = Delivery time
+pu.po.tab2.delivery-time-desc = Set an optional delivery time for your message
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = Send in users' timezone at
+pu.po.tab2.select-time = Select time
+pu.po.tab2.capping = Capping
+pu.po.tab2.capping-desc = Configure number of messages per user. Enabling this option will limit number of messages sent to the same user.
+pu.po.tab2.capping.no = No capping
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered to or exited from the cohort
+pu.po.tab2.capping.no-desc-event = Message is sent whenever user's event is received by the server
+pu.po.tab2.capping.yes = Capped
+pu.po.tab2.capping.yes-desc = Number of messages is limited
+pu.po.tab2.message-per-user = Maximum messages per user
+pu.po.tab2.message-per-user-desc = Total number of messages individual user can receive from this campaign
+pu.po.tab2.sleep = Minimum time between messages
+pu.po.tab2.sleep-desc = User will be eligible to receive a repetitive message only if she / he triggers the campaign conditions at least configured time after previous message.
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = App
+pu.po.tab4.campaign-rules = Campaign Rules
+pu.po.tab4.trigger-type = Trigger Type
+pu.po.tab4.trigger-cohort-entry = Cohort entry
+pu.po.tab4.trigger-cohort-exit = Cohort exit
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = Cohort
+pu.po.tab4.cohorts.m = Cohorts ({0})
+pu.po.tab4.events.no = Events(s) were deleted
+pu.po.tab4.events.s = Event
+pu.po.tab4.events.m = Events ({0})
+pu.po.tab4.caping = Capping
+pu.po.tab4.caping-message = At most {0} message is going to be sent per user
+pu.po.tab4.message-content = Message Content
+pu.po.tab4.message-title = Title
+pu.po.tab4.message-text = Text
+pu.po.tab4.message-sound = Sound
+pu.po.tab4.message-media = Media
+pu.po.tab4.message-badge = Badge
+
+push.po.one-time-messages = ONE-TIME MESSAGES
+push.po.automated-messages = AUTOMATED MESSAGES
+push.po.table.dublicate = Duplicate
+push.po.table.resend = Resend failed notifications
+push.po.table.edit = Edit
+push.po.table.delete = Delete
+push.po.table.recipients = View recipients
+
+pu.po.progress = Progress
+pu.po.progress.auto = 30 days overview
+pu.never = Never
+pu.days.s = day
+pu.days.m = days
+pu.hours.s = hour
+pu.hours.m =hours
+pu.messages.s = message
+pu.messages.m = messages
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
+
+push.proxyhost = Proxy Hostname
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxypass = Proxy Password
+
+push.note.gcm.t = Your push notifications can't be delivered
+push.note.gcm.m = Following apps have GCM credentials instead of Firebase ones: {0}.
Usage of GCM is no longer possible since Google stopped accepting requests to GCM endpoint.
Please update app credentials to a valid FCM server key.
+
+mail.autopush-error-subject = Countly Automated Push Problem
+mail.autopush-error = Hi {0},
Your automated message cannot be sent due to a repeating error. Please review message status and reactivate the message once the problem is resolved.
Best,
A fellow Countly Admin
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
diff --git a/plugins/push/frontend/public/localization/push_ir.properties b/plugins/push/frontend/public/localization/push_fa_IR.properties
similarity index 85%
rename from plugins/push/frontend/public/localization/push_ir.properties
rename to plugins/push/frontend/public/localization/push_fa_IR.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_ir.properties
+++ b/plugins/push/frontend/public/localization/push_fa_IR.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_fr.properties b/plugins/push/frontend/public/localization/push_fr.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_fr.properties
+++ b/plugins/push/frontend/public/localization/push_fr.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_hi.properties b/plugins/push/frontend/public/localization/push_hi.properties
new file mode 100644
index 00000000000..0dc7ccf6fab
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_hi.properties
@@ -0,0 +1,577 @@
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
+push.plugin-title = Push Notifications
+push.plugin-description = Increase loyalty, user retention & satisfaction with native iOS and Android push notifications
+push.sidebar.section = Messaging
+push.sidebar.overview = Overview
+push.sidebar.messages = Messages
+
+push.no-message = No message
+push.create = Create Message
+push.create-message-n = Create Message to {0} users
+
+mgmt-plugins.push.here = here
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android (Google FCM)
+mgmt-plugins.push.android.key = Firebase key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from
+mgmt-plugins.push.h = Android (Huawei Push Kit)
+mgmt-plugins.push.h.key = Huawei App ID
+mgmt-plugins.push.h.key.desc = Your numerical Huawei App ID (Client ID)
+mgmt-plugins.push.h.secret = App Secret
+mgmt-plugins.push.h.secret.desc = Huawei App Secret, sign secret of your app can be found in code signing properties or at
+mgmt-plugins.push.h.secret.hds = Huawei developer portal
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.error.h.key = Please enter Huawei App ID
+mgmt-plugins.push.error.h.secret = Please enter Huawei App Secret
+mgmt-plugins.push.error.h.keynum = Huawei App ID can contain only digits
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.p12 = Universal certificate (p12) is already uploaded
+mgmt-plugins.push.uploaded.p8 = Key file (p8) is already uploaded
+mgmt-plugins.push.uploaded.bundle = Bundle id of this certificate:
+mgmt-plugins.push.detected = Detected key type:
+mgmt-plugins.push.rate = Rate limit
+mgmt-plugins.push.rate.rate = Maximum number of notifications scheduled per period
+mgmt-plugins.push.rate.help = Push notifications sent to FCM and APNS will separately be rate limited based on this configuration for each push notification campaign
+mgmt-plugins.push.rate.period = Period duration (seconds)
+mgmt-plugins.push.rate.period.help = Timeframe to apply the rate limit to
+
+systemlogs.action.push_message_created = Push Message Created
+systemlogs.action.push_credentials_update = Push Credentials Updated
+systemlogs.action.push_message_deleted = Push Message Deleted
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM). It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = Total number of messages sent for this application within selected period of time.
+help.dashboard.push.actions = Number of actions performed for this app. Action represents a positive reaction of a user to your message. Please see SDK guide to know how to enable this metric in your app.
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or FCM tokens stored in the database.
+
+pu.po.title = Create Push Notification
+pu.po.desc = Compose your push notification in 4 easy steps
+
+pu.po.view.title = Push Notification
+pu.po.view.desc = Message details
+
+pu.po.preview = Preview
+pu.po.preview.help = Please note that this is a preview screen. What you see here may not be same as what end users see on their smartphones due to varying device sizes.
+
+pu.po.tt.pers = Add personalized content
+pu.po.tt.emoji = Add emoji
+
+pu.po.tab0.title = Apps & Platforms
+pu.po.tab0.title.auto = Platforms
+pu.po.tab0.desc = Destinations
+
+pu.po.tab1.title = Scheduling
+pu.po.tab1.desc = Set message date
+pu.po.tab1.title.auto = Campaign Rules
+pu.po.tab1.desc.auto = Triggers & dates
+
+pu.po.tab1.chr = Cohorts
+pu.po.tab1.chr-desc = Send to the users currently in selected cohorts
+
+pu.po.tab1.aud = Audience Selection
+pu.po.tab1.now.t = Now
+pu.po.tab1.now.d = Select users now
+pu.po.tab1.later.t = Before sending
+pu.po.tab1.later.d = Select users right before sending the message
+
+pu.po.tab2.ddc = Delivery Date Calculation
+pu.po.tab2.ddc.arr = Relative to the date event arrived to the server
+pu.po.tab2.ddc.evt = Relative to the date event occurred on a device
+# pu.po.tab2.ddc.h = In "event occurrence" case Countly only sends notifications within 30 minutes of actual event recording date, discarding any "late" notifications which could be triggered due to event arriving to the server with a delay because of networking issues.
+# pu.po.tab2.ddc.h = Note that larger amount of notifications won't be sent in case of event occurence date since an event might arrive to the server with a delay due to networking issues. On the other hand, accuracy of "event occurence" case is better, since there won't be any late notifications.
+# pu.po.tab2.ddc.arr = Relative to the event arrival to the server date
+# pu.po.tab2.ddc.evt = Relative to the event occurence on the device date
+
+pu.po.tab2.trc = Behaviour when trigger condition is no longer met
+pu.po.tab2.trc.true = Cancel when user exits selected cohort(s)
+pu.po.tab2.trc.false = Cancel when user enters selected cohort(s) back
+pu.po.tab2.trc.dont = Send anyway
+
+pu.po.tab2.title.auto = Message Delivery
+pu.po.tab2.desc.auto = Periodicity & capping
+
+pu.po.compose.title = Message
+pu.po.compose.desc = Compose content
+
+pu.po.review.title = Review
+pu.po.review.desc = Check your message
+
+pu.po.tab0.apps = Apps
+pu.po.tab0.add = Add App
+pu.po.tab0.select-apps = Select Apps
+pu.po.tab0.select-apps-desc = Only apps with APN or FCM credentials are displayed
+pu.po.tab0.select-platforms = Select Platforms
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or FCM credentials
+pu.platform.i = iOS
+pu.platform.a = Android
+pu.po.prev = Previous step
+pu.po.next = Next step
+pu.po.send = Send!
+pu.po.start = Start!
+pu.po.edit = Save
+pu.po.close = Close
+pu.po.duplicate = Duplicate
+pu.po.delete = Delete
+
+pu.po.tab1.testing = Testing
+pu.po.tab1.testing-desc = Send to production users or to test users?
+pu.po.tab1.testing-prod = Production Users
+pu.po.tab1.testing-test = Test Users
+pu.po.tab1.testing-test-desc = Development & test users only
+
+pu.po.tab1.scheduling = Scheduling
+pu.po.tab1.scheduling-desc = Send now or schedule sending for later
+pu.po.tab1.scheduling-now = Send now
+pu.po.tab1.scheduling-auto-now = Start now
+pu.po.tab1.scheduling-now-desc = Sending will start once you click Send
+pu.po.tab1.scheduling-date = Schedule
+pu.po.tab1.scheduling-date-desc = Set specific date & time for this message
+pu.po.tab1.tz = Send according to user's timezone?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = No
+pu.po.tab1.tz-no-desc = Send all notifications at once
+pu.po.tab1.tz-yes = Send in user timezones
+pu.po.tab1.tz-yes-desc = Send each notification in timezone of the user it's for
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = Geolocations
+pu.po.tab1.geos-desc = Filter users by their last known location?
+pu.po.tab1.geos.no = No filtering
+
+
+pu.po.recipients.s = Recipient: {0}
+pu.po.recipients.m = Recipients: {0}
+pu.po.recipients.temporary = Number of users calculation is still running, it can take up to several minutes in tough cases. Feel free to send your message without waiting.
+
+pu.po.tab2.message.type = Message type
+pu.po.tab2.extras = Additional options
+
+pu.type.message = Message
+pu.type.data = Data-only
+pu.type.rich = Rich
+
+pu.po.loading = We're counting your users
+pu.po.loading-desc = Please wait, it will be done soon
+
+pu.po.sending = Saving
+pu.po.sending-desc = Just a moment
+
+pu.po.sent = Saved
+pu.po.sent-desc = All good!
+
+pu.po.tab2.placeholder = Write your message here (default is required, add more localized messages if needed)
+pu.po.tab2.default-message = Your message
+pu.po.tab2.default-message.invalid = Default message is required
+pu.po.tab2.default-button-title.invalid = Default button title is required
+pu.po.tab2.default-button-link.invalid = Default button link is required
+pu.po.tab2.extras.sound = Send sound
+pu.po.tab2.extras.sound.invalid = Sound must be a string
+pu.po.tab2.extras.badge = Add badge
+pu.po.tab2.extras.badge.invalid = Badge must be a valid number
+pu.po.tab2.extras.badge.help = iOS supports badges by default, Android requires additional steps (more details in our Android SDK Guide)
+pu.po.tab2.extras.media = Attachment URL
+pu.po.tab2.extras.media.placeholder = Image URL
+pu.po.tab2.extras.media.invalid = Must be a valid URL to an image (JPG, PNG) or animation (GIF) less than 10MB in size, audio (MP3, WAV, AIF) less than 5MB in size or video (MPEG, MPEG2, MPEG4) less than 50MB in size
+pu.po.tab2.extras.media.toobig = Media attachment must be less than 10MB for images and animations, less than 5MB for audio & 50MB for videos
+pu.po.tab2.extras.media.help = Media attachments are fully supported on iOS 10+. Android supports only images, iOS 9- doesn't support media at all. In case media is not supported, users will only see message text.
+pu.po.tab2.extras.url = On click URL
+pu.po.tab2.extras.url.invalid = URL must be valid
+pu.po.tab2.extras.url.help = Default URL or deeplink which is being open when user taps a message in drawer
+pu.po.tab2.extras.data = Send JSON
+pu.po.tab2.extras.data.invalid = This field must contain valid JSON string
+pu.po.tab2.extras.data.placeholder = JSON string
+pu.po.tab2.extras.data.help = App-specific JSON data can be sent along with standard content
+pu.po.tab2.mtitle = Message title
+pu.po.tab2.mtitle.placeholder = Optional title for your message
+pu.po.tab2.mtext = Message text
+pu.po.tab2.mbtn = Buttons
+pu.po.tab2.mbtns = Number of buttons
+pu.po.tab2.mbtn.urls = Button URLs
+pu.po.tab2.mbtn.req = Button title required
+pu.po.tab2.mbtn.url = Must be a valid URL
+pu.po.tab2.mbtn.0 = Button 0
+pu.po.tab2.mbtn.1 = Button 1
+pu.po.tab2.mbtn.2 = Button 2
+pu.po.tab2.btntext = Button text
+pu.po.tab2.urlordeep = URL or deeplink
+pu.po.tab2.rich = Rich notification options
+pu.po.tab2.mmedia = Media
+pu.po.tab2.mmedia.type.image = Image
+pu.po.tab2.mmedia.type.anima = Animation
+pu.po.tab2.mmedia.type.audio = Audio
+pu.po.tab2.mmedia.type.video = Video
+pu.po.tab2.mmedia.type.warn.android = This type of media is not supported on Android
+pu.po.tab2.mmedia.status = Request status:
+pu.po.tab2.default-message.help = Default localization for all users. You can override default message & button names by setting them for specific locales.
+pu.po.no-users = Sorry, there are no push-enabled users for specified options.
+pu.po.no-users-try-change = Try to change
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = Start over
+pu.po.tab2.variable = Variable
+pu.po.tab2.capital = Make variable value start from capital letter
+pu.po.tab2.fallback = Fallback value
+pu.po.tab2.help = Default value which will be used in case user profile doesn't have this variable
+pu.po.tab2.props = User Properties
+pu.po.tab2.cust = Custom Variables
+pu.po.tab2.varpl = Select variable
+pu.po.tab2.fallpl = Enter fallback value
+pu.po.tab2.tt = User''s "{0}" property which falls back to "{1}"
+
+datepicker.dt.click = Set date & time
+datepicker.tz = Send in user's timezone
+datepicker.clear = Clear
+datepicker.apply = Apply
+datepicker.pick-time = Pick Time
+
+pu.locale.default = Default
+pu.locale.null = Unknown
+pu.po.tab3.review = Review
+pu.po.tab3.apps = Apps
+pu.po.tab3.platforms = Platforms
+pu.po.tab3.date = Date
+pu.po.tab3.date.now = At the time of message creation
+pu.po.tab3.date.intz = ; in user timezones
+pu.po.tab3.unknown = Unknown
+pu.po.tab3.type = Type
+pu.po.tab3.type.message = Text message
+pu.po.tab3.type.data = Data
+pu.po.tab3.type.update = Update (deprecated)
+pu.po.tab3.type.review = Review (deprecated)
+pu.po.tab3.type.category = Category (deprecated)
+pu.po.tab3.type.link = URL (deprecated)
+pu.po.tab3.test = Send to test devices
+pu.po.tab3.test.true = Yes
+pu.po.tab3.test.false = No
+pu.po.tab3.btns = Buttons
+pu.po.tab3.media = Media
+pu.po.tab3.extras = Standard options
+
+pu.po.tab3.extras.sound = Sound
+pu.po.tab3.extras.badge = iOS badge
+pu.po.tab3.extras.url = On click URL
+pu.po.tab3.extras.data = Extra data
+pu.po.tab3.extras.media = Media
+
+pu.po.tab3.date.date = Scheduled to be sent on
+pu.po.tab3.date.sent = Sent on
+pu.po.tab3.date.tz = Sent in user timezone
+
+pu.po.tab3.audience = Recipients
+
+pu.po.tab3.errors = Errors
+pu.po.tab3.errors.code = Code
+pu.po.tab3.errors.message = Error
+pu.po.tab3.errors.count = Count
+
+pu.po.confirm = Confirm sending
+pu.po.confirm.ready = I’m ready to send this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will receive this campaign after it is started.
+pu.po.recipients.message.details = This message will automatically be delivered to app users as they match campaign trigger criteria.
+pu.po.recipients.message.edit = Message modification only affects notifications scheduled after modification takes place.
+
+pu.dash.users = Users
+pu.dash.users.total = Total Users
+pu.dash.users.enabl = Messaging-enabled Users
+pu.dash.totals = Overall
+pu.dash.metrics = Metrics
+pu.dash.metrics.sent = Messages sent
+pu.dash.metrics.acti = Actions performed
+pu.dash.create = Create Message
+pu.dash.monthly = Monthly
+pu.dash.weekly = Weekly
+pu.dash.messages = Messages
+pu.dash.messages.all = All
+pu.dash.messages.api = API
+pu.dash.messages.dash = Dashboard
+pu.dash.actions = Actions
+pu.dash.sent = Sent
+
+
+pu.t.nothing = No records found
+pu.t.search = Search by default message
+pu.t.message = Message
+pu.t.apps = Apps
+pu.t.status = Status
+pu.t.created = Created
+pu.t.sent-scheduled = Date sent / Scheduled
+pu.t.result = Sent / Actioned
+
+push.message.status.initial = Initial
+push.message.status.created = Created
+push.message.status.scheduled = Scheduled
+push.message.status.sending = Sending
+push.message.status.sending-errors = Sending with errors
+push.message.status.aborted = Aborted
+push.message.status.sent = Sent
+push.message.status.sent-errors = Sent with errors
+
+push.message.status.auto.true = Active
+push.message.status.auto.false = Inactive
+
+push.error.econnrefused = Countly cannot connect to APN/FCM. Please check your proxy server settings (if any) and / or server connectivity to APN/FCM servers.
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = Process exited while sending this messsage due to connection being unexpectedly closed by APNS. Some notifications might have been sent twice (up to 500).
+push.error.3-eof = APNS connection error. Possible reasons include: invalid certificate / auth key, firewall block, system root certificates (CA) issues.
+push.error.no-credentials = You don't have credentials for any of selected app-platform combinations.
+push.error.no-app-credentials = This application doesn't have any push notification credentials set.
+push.error.no-cohorts = Automated messages depend on Cohorts and Events, yet you don't have any of those.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+push.error.no.cohorts = No Cohorts or events
+push.error.no.credentials = No credentials
+push.error.i.understand = OK, I understand
+
+
+push.errorCodes.bug = You found a bug! Please contact support.
+push.errorCodes = Errors:
+push.errorCode.i400 = APN 400 Bad request
+push.errorCode.i400+BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse the certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to the Bundle ID of your application
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403 Certificate error
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403 error: InvalidProviderToken. Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push.errorCode.i405 = APN 405 Bad method
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413 Payload too large
+push.errorCode.i413.desc = Message was too large and APN declined to deliver it.
+push.errorCode.i429 = APN 429 Too many requests
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500 Internal error
+push.errorCode.i500.desc = Apple server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.i503 = APN 503 Shutdown
+push.errorCode.i503.desc = Apple server unexpectedly decided to shutdown returning HTTP error 503. Please try again later.
+
+push.errorCode.a200 = FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push.errorCode.a200+InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push.errorCode.a200+MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push.errorCode.a200+InvalidDataKey.desc = Message contains invalid data key, please check:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push.errorCode.a200+TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push.errorCode.a400 = FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = FCM 500 Internal error
+push.errorCode.a500.desc = Google server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.a200+Unavailable.desc = Google server unexpectedly returned HTTP error 200+Unavailable. Please try again later.
+push.errorCode.a200+InternalServerError.desc = Google server unexpectedly returned HTTP error 200+InternalServerError. Please try again later.
+push.errorCode.a501 = FCM 501 Error
+push.errorCode.a502 = FCM 502 Error
+push.errorCode.a503 = FCM 503 Error
+push.errorCode.link.i = Apple docs
+push.errorCode.link.a = Google docs
+push.errorCode.skiptz = Too late to send
+push.errorCode.skiptz.desc = This much notifications have been discarded because time of arrival would be at least 60 minutes later than expected (either due to user's timezone, or due to networking issues).
+push.errorCode.del = Message deleted
+push.errorCode.del.desc = This much notifications have been discarded their message has been deleted.
+push.errorCode.aborted = Aborted
+push.errorCode.aborted.desc = This much messages have been removed from queue after an unrecoverable error. Please check error message above or contact support if there's no error message.
+push.errorCode.consent = Consent cancelled
+push.errorCode.consent.desc = This much messages have been removed from queue after user removed push consent.
+
+push.totals.processed = Processed
+push.totals.sent = Accepted
+push.totals.errors = Errors
+
+pu.po.users.s = {0} user
+pu.po.users.m = {0} users
+pu.po.metrics = Metrics
+pu.po.metrics.processed = Processed
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = Sent Successfully
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & FCM
+pu.po.metrics.sent.none = No notifications were sent! Please check message errors
+pu.po.metrics.sent.one = Your notification has been sent successfully!
+pu.po.metrics.sent.all = All notifications have been sent successfully!
+pu.po.metrics.actions = Actioned
+pu.po.metrics.actions.desc = How many users performed push notification action
+pu.po.metrics.actions.all = All users performed action! Good Job!
+pu.po.metrics.actions.performed = performed action.
+pu.po.metrics.actions0.performed = opened default URL.
+pu.po.metrics.actions1.performed = clicked first button.
+pu.po.metrics.actions2.performed = clicked second button.
+pu.po.left.to.send.s = {0} notification left to send
+pu.po.left.to.send.m = {0} notifications left to send
+pu.po.left.to.send.none = All notifications are sent!
+pu.po.left.to.send.batch = next batch will start at {0}
+pu.po.expired.s = {0} token expired
+pu.po.expired.m = {0} tokens expired
+pu.po.unset.s = {0} tokens expired
+pu.po.unset.m = {0} token expired
+pu.po.errors.s = {0} notification wasn\'t sent due to an error
+pu.po.errors.m = {0} notifications weren\'t sent due to an error
+
+pu.apn.uni = Universal Certificate (Production & Sandbox)
+pu.apn.none = None
+
+pu.gcm.gcm = FCM Key
+pu.gcm.none = None
+
+pu.remove = Remove credentials
+pu.validate = Validate
+pu.validating = Validating credentials
+pu.validation.error = Credentials error:
+pu.remove = Remove credentials
+pu.creds.none = None
+pu.creds.type.apn_universal = APN Universal Certificate is set
+pu.creds.type.apn_token = APN Auth Key is set
+pu.creds.type.gcm = FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase Server Key
+pu.creds.cert = P12 Certificate
+pu.creds.pass = Passphrase
+pu.creds.auth_key = P8 Key File
+pu.creds.key_id = Auth Key ID
+pu.creds.team_id = Team ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN Certificate (Sandbox & Production)
+pu.creds.apn.type.apn_token = APN Auth Key
+
+userdata.push = Push tokens
+pu.tk.id = APN Test token (development)
+pu.tk.ia = APN Test token (ad hoc or TestFlight)
+pu.tk.ip = APN Production token
+pu.tk.at = FCM Test token
+pu.tk.ap = FCM Production token
+pu.tk.ht = Huawei Test token
+pu.tk.hp = Huawei Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = Create Message
+pu.dash.btn-group.automated-message = Automated Message
+pu.dash.btn-group.automated-message-desc = Create an automated push campaign to send a message to users when their-in-app behaviour matches defined criteria.
+pu.dash.btn-group.automated-message-link = Learn more about automation
+pu.dash.btn-group.one-time-message = One-time Message
+pu.dash.btn-group.one-time-message-desc = Create a one-time push notification campaign to send right away on in the future.
+pu.dash.btn-group-available-in-enterprise = Available in enterprise edition
+pu.dash.btn.learn-more = Learn more about automation
+
+pu.po.tab1.trigger-type = Trigger Type
+pu.po.tab1.trigger-type.entry = Cohort Entry
+pu.po.tab1.trigger-type.exit = Cohort Exit
+pu.po.tab1.trigger-type.event = Performed Event
+pu.po.tab1.cohort-entry-desc = Triggered when user enters into any of the cohorts you select
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.cohort-event-desc = Triggered when user performs a selected event
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = Recalculation of cohorts above will trigger message sending process automatically
+pu.po.tab1.select-cohort-placeholder = Select cohorts(s)
+pu.po.tab1.select-event = Select one or more events to set a trigger
+pu.po.tab1.select-event-placeholder = Select event(s)
+pu.po.tab1.campaign-start-date = Campaign Start Date
+pu.po.tab1.additional-options = Additional Options
+pu.po.tab1.campaign-end-date = Campaign end date
+
+pu.po.tab2.delivery-method = Delivery method
+pu.po.tab2.delivery-method-desc = Choose when your message should be delivered
+pu.po.tab2.immediately = Immediately
+pu.po.tab2.immediately-desc = Deliver the message as soon as triggering cohort is recalculated
+pu.po.tab2.immediately-desc-event = Deliver the message as soon as triggering event reached the server
+pu.po.tab2.delayed = Delayed
+pu.po.tab2.delivery-time = Delivery time
+pu.po.tab2.delivery-time-desc = Set an optional delivery time for your message
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = Send in users' timezone at
+pu.po.tab2.select-time = Select time
+pu.po.tab2.capping = Capping
+pu.po.tab2.capping-desc = Configure number of messages per user. Enabling this option will limit number of messages sent to the same user.
+pu.po.tab2.capping.no = No capping
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered to or exited from the cohort
+pu.po.tab2.capping.no-desc-event = Message is sent whenever user's event is received by the server
+pu.po.tab2.capping.yes = Capped
+pu.po.tab2.capping.yes-desc = Number of messages is limited
+pu.po.tab2.message-per-user = Maximum messages per user
+pu.po.tab2.message-per-user-desc = Total number of messages individual user can receive from this campaign
+pu.po.tab2.sleep = Minimum time between messages
+pu.po.tab2.sleep-desc = User will be eligible to receive a repetitive message only if she / he triggers the campaign conditions at least configured time after previous message.
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = App
+pu.po.tab4.campaign-rules = Campaign Rules
+pu.po.tab4.trigger-type = Trigger Type
+pu.po.tab4.trigger-cohort-entry = Cohort entry
+pu.po.tab4.trigger-cohort-exit = Cohort exit
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = Cohort
+pu.po.tab4.cohorts.m = Cohorts ({0})
+pu.po.tab4.events.no = Events(s) were deleted
+pu.po.tab4.events.s = Event
+pu.po.tab4.events.m = Events ({0})
+pu.po.tab4.caping = Capping
+pu.po.tab4.caping-message = At most {0} message is going to be sent per user
+pu.po.tab4.message-content = Message Content
+pu.po.tab4.message-title = Title
+pu.po.tab4.message-text = Text
+pu.po.tab4.message-sound = Sound
+pu.po.tab4.message-media = Media
+pu.po.tab4.message-badge = Badge
+
+push.po.one-time-messages = ONE-TIME MESSAGES
+push.po.automated-messages = AUTOMATED MESSAGES
+push.po.table.dublicate = Duplicate
+push.po.table.resend = Resend failed notifications
+push.po.table.edit = Edit
+push.po.table.delete = Delete
+push.po.table.recipients = View recipients
+
+pu.po.progress = Progress
+pu.po.progress.auto = 30 days overview
+pu.never = Never
+pu.days.s = day
+pu.days.m = days
+pu.hours.s = hour
+pu.hours.m =hours
+pu.messages.s = message
+pu.messages.m = messages
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
+
+push.proxyhost = Proxy Hostname
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxypass = Proxy Password
+
+push.note.gcm.t = Your push notifications can't be delivered
+push.note.gcm.m = Following apps have GCM credentials instead of Firebase ones: {0}.
Usage of GCM is no longer possible since Google stopped accepting requests to GCM endpoint.
Please update app credentials to a valid FCM server key.
+
+mail.autopush-error-subject = Countly Automated Push Problem
+mail.autopush-error = Hi {0},
Your automated message cannot be sent due to a repeating error. Please review message status and reactivate the message once the problem is resolved.
Best,
A fellow Countly Admin
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
diff --git a/plugins/push/frontend/public/localization/push_hu.properties b/plugins/push/frontend/public/localization/push_hu.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_hu.properties
+++ b/plugins/push/frontend/public/localization/push_hu.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_it.properties b/plugins/push/frontend/public/localization/push_it.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_it.properties
+++ b/plugins/push/frontend/public/localization/push_it.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_ja.properties b/plugins/push/frontend/public/localization/push_ja.properties
index 16f2a8544b2..604d7795728 100644
--- a/plugins/push/frontend/public/localization/push_ja.properties
+++ b/plugins/push/frontend/public/localization/push_ja.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = プッシュ送信済み
internal-events.[CLY]_push_action = プッシュアクション
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_ko.properties b/plugins/push/frontend/public/localization/push_ko.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_ko.properties
+++ b/plugins/push/frontend/public/localization/push_ko.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_nl.properties b/plugins/push/frontend/public/localization/push_ko_KR.properties
similarity index 85%
rename from plugins/push/frontend/public/localization/push_nl.properties
rename to plugins/push/frontend/public/localization/push_ko_KR.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_nl.properties
+++ b/plugins/push/frontend/public/localization/push_ko_KR.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_lv.properties b/plugins/push/frontend/public/localization/push_lv.properties
index a08fc2a3f7a..cdc75104111 100644
--- a/plugins/push/frontend/public/localization/push_lv.properties
+++ b/plugins/push/frontend/public/localization/push_lv.properties
@@ -1,536 +1,577 @@
-push-notification.title = Push Notifications
-push-notification.description = An overview of all push notifications sent and actions performed in response.
-push-notification.one-time = One-time Notifications
-push-notification.automated = Automated Notifications
-push-notification.transactional = API Notifications
-push-notification.total-app-users = Total App Users
-push-notification.enabled-users = Notification-enabled Users
-push-notification.enabled-users-percentage = Enabled Users Percentage
-push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
-push-notification.platform-filter-label-one-time = One-time notifications for
-push-notification.platform-filter-label-automatic = Automatic notificatons for
-push-notification.platform-filter-label-transactional = Transactional notifications for
-push-notification.platform-filter-all = All Platforms
-push-notification.platform-filter-android = Android
-push-notification.platform-filter-ios = IOS
-push-notification.status-filter-all = All Messages
-push-notification.create-button = New Message
-push-notification.time-period = TIME PERIOD
-push-notification.created-by = Created by
-push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
-push-notification.sent-serie-name = Notifications Sent
-push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
-push-notification.actions-performed-serie-name = Actions Performed
-push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
-push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
-push-notification.table-status = Status
-push-notification.table-created = Created
-push-notification.table-date-sent = Date Sent/Scheduled
-push-notification.table-sent = Sent
-push-notification.table-actioned = Actioned
-push-notification.table-created-by = Created By
-push-notification.table-message-content = Message Content
-push-notification.duplicate = Duplicate
-push-notification.delete = Delete
-push-notification.resend = Resend
-push-notification.approve = Approve
-push-notification.reject = Reject
-push-notification.start = Start
-push-notification.stop = Stop
-push-notification.edit-draft = Edit Draft
-push-notification.edit = Edit
-push-notification.sent = Sent
-push-notification.sending = Sending
-push-notification.created = Created
-push-notification.draft = Draft
-push-notification.waiting-for-approval = Waiting for approval
-push-notification.aborted = Aborted
-push-notification.failed = Failed
-push-notification.stopped = Stopped
-push-notification.scheduled = Scheduled
-push-notification.rejected = Rejected
-push-notification.time-chart-period-weekly = Weekly
-push-notification.time-chart-period-monthly = Monthly
-push-notification.time-chart-period-daily= Daily
-push-notification.now = Now
-push-notification.right-before-sending-the-message = Right before sending the message
-push-notification.segmented-push-enabled-users = Segmented push-enabled users
-push-notification.delivery-type = Delivery Type
-push-notification.delivery-timeframe = Delivery Timeframe
-push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
-push-notification.trigger-type = Trigger Type
-push-notification.ios-badge-number-setting = IOS badge number
-push-notification.ios-json-data-setting = IOS JSON data
-push-notification.ios-user-data-setting = IOS user data
-push-notification.android-badge-number-setting = Android badge number
-push-notification.android-json-data-setting = Android JSON data
-push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
-internal-events.[CLY]_push_sent = Push sent
-internal-events.[CLY]_push_action = Push action
-push-notification.android = Android
-push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
-
-push-notification.save = Save
-push-notification.send-for-approval = Send for approval
-push-notification.save-as-draft = Save as draft
-push-notification.create-one-time-notification = Create One-Time Push Notification
-push-notification.create-automated-notification = Create Automated Push Notification
-push-notification.create-transactional-notification = Create API Push Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
-push-notification.platforms = Platforms
-push-notification.android = Android
-push-notification.ios = iOS
-push-notification.targeting = Targeting
-push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
-push-notification.all-push-enabled-users = All push-enabled users
-push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
-push-notification.use-segmentation = Use segmentation
-push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
-push-notification.push-enabled-users = Push-enabled users
-push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
-push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
-push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
-push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
-push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
-push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
-push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
-push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
-push-notification.select-location = Please select a location
-push-notification.when-to-determine-users = When to determine the users?
-push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
-push-notification.determine-users-before = Determine users right before sending the message
-push-notification.determine-users-now = Determine users now
-push-notification.triggers = Triggers
-push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
-push-notification.cohorts-entry = Cohort(s) entry
-push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
-push-notification.cohorts-exit = Cohort(s) exit
-push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
-push-notification.performed-events = Performed Event(s)
-push-notification.performed-events-description = Triggered when user performs a selected event.
-push-notification.select-event = Please select an event
-push-notification.cohorts = Cohort(s)
-push-notification.geolocations = Geolocation(s)
-push-notification.events = Event(s)
-push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
-push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
-push-notification.start-date = Start date
-push-notification.set-start-date = Set Start Date
-push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
-push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
-push-notification.end-date = End date
-push-notification.set-end-date = Set End Date
-push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
-push-notification.delivery-method = Delivery Method
-push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
-push-notification.capping = Capping
-push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
-push-notification.no-capping = No Capping
-push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
-push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
-push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
-push-notification.send-anyway = Send anyway
-push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
-push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
-push-notification.send-now = Send now
-push-notification.send-now-description = Send the push notification immediately, once composition is complete.
-push-notification.scheduled = Scheduled
-push-notification.schedule-for-later = Schedule for later
-push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
-push-notification.delivery-time-tooltip = Set an optional delivery time for your message
-push-notification.timezone = Timezone
-push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
-push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
-push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
-push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
-push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
-push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
-push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
-push-notification.do-not-send-message = Do not send the message
-push-notification.deliver-next-day = Deliver the message next day
-push-notification.immediately = Immediately
-push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
-push-notification.delayed = Delayed
-push-notification.days = Days
-push-notification.day = Day
-push-notification.hours = Hours
-push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
-push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
-push-notification.maximum-messages-per-user = Maximum messages per user
-push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
-push-notification.messages = Messages
-push-notification.minimum-time-between-messages = Minimum time between messages
-push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
-push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
-push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
-push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
-push-notification.compose-message = Compose Message
-push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
-push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
-push-notification.default-message-is-required = Default message is required
-push-notification.content-message = Content message
-push-notification.silent-message = Silent message
-push-notification.message-title = Message title
-push-notification.add-variable = Add Variable
-push-notification.message-content = Message Content
-push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
-push-notification.buttons = Buttons
-push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
-push-notification.add-first-button = +Add First button
-push-notification.add-second-button = +Add Second button
-push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
-push-notification.enter-button-url = Enter Button URL or Deeplink
-push-notification.media-url = Media URL
-push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
-push-notification.enter-media-url = Enter Media URL
-push-notification.platform-settings = Platform Settings
-push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
-push-notification.sound-file-name = Sound File Name
-push-notification.enter-sound-file-name = Enter sound file name
-push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
-push-notification.add-badge-number = Add Badge Number
-push-notification.enter-badge-number = Enter badge number
-push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
-push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
-push-notification.subtitle = Subtitle
-push-notification.enter-your-subtitle = Enter your subtitle
-push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
-push-notification.on-click-url = On Click URL
-push-notification.enter-on-click-url = Enter on click URL
-push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
-push-notification.send-json = Send JSON
-push-notification.enter-json-data = Enter JSON data
-push-notification.send-json-description = Add app-specific JSON data along with standard content.
-push-notification.send-user-data = Send User Data
-push-notification.select-user-data = Select user data
-push-notification.send-user-data-description = Select user properties to send in your notification payload.
-push-notification.icon = Icon
-push-notification.icon-description = Set Android notification icon.
-push-notification.enter-icon = Enter icon
-push-notification.review-message = Review Mesage
-push-notification.review-message-tooltip = Review all the details of you push notification.
-push-notification.message-name = Message name
-push-notification.review-title = Title
-push-notification.content = Content
-push-notification.button-text = Button Text
-push-notification.button-url = Button URL
-push-notification.ios-media-url = iOS Media URL
-push-notification.android-media-url = Android Media URL
-push-notification.ios-badge-number = IOS badge number
-push-notification.ios-json-data = iOS JSON data
-push-notification.ios-user-data = iOS user data
-push-notification.android-badge-number = Android badge number
-push-notification.android-json-data = Android JSON data
-push-notification.android-user-data = Android user data
-push-notification.current-number-of-users = Current number of users
-push-notification.when-to-determine = When to determine
-push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
-push-notification.delivery = Delivery
-push-notification.delivery-description = Select the time you want the notification to be sent to users.
-push-notification.scheduled-for = Scheduled for
-push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
-push-notification.maximum-messages = Maximum {0} messages
-push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
-push-notification.confirmation = Confirmation
-push-notification.testing = TESTING
-push-notification.you-can-send-the-test-message = You can send the test message to test users
-push-notification.testing-tooltip = Sends the push notification to applications' test users
-push-notification.send-to-test-users = Send to test users
-push-notification.confirmation-uppercase = CONFIRMATION
-push-notification.confirmation-uppercase-description = CONFIRMATION description
-push-notification.i-am-ready-to-send = I am ready to send this message to real-users
-push-notification.was-successfully-saved = Push notification message was successfully saved
-push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
-push-notification.was-successfully-approved = Push notification has been successfully approved
-push-notification.was-successfully-rejected = Push notification has been successfully rejected
-push-notification.was-successfully-deleted = Push notification was successfully deleted
-push-notification.was-successfully-started = Push notification was successfully started
-push-notification.was-successfully-stopped = Push notification was successfully stopped
-
-# Add user property
-push-notification.event-properties = Event Properties
-push-notification.user-properties = User Properties
-push-notification.custom-properties = Custom Properties
-push-notification.add-user-property = Add User Property
-push-notification.api-property = Add User Property
-push-notification.search-in-properties = Search in Properties
-push-notification.select-property = Select Property
-push-notification.enter-value = Enter Value
-push-notification.start-with-capital-letter = Make user property start with capital letter
-push-notification.fallback-value = Fallback value
-push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
-push-notification.remove = Remove
-push-notification.confirm = Confirm
-push-notification.internal-properties = Internal Properties
-push-notification.external-properties = External Properties
-push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
-
-
-# Details
-push-notification-details.back-to = Back to Push Notifications
-push-notification-details.localization-filter-label = LOCALIZATION
-push-notification-details.localization-filter-all = All Localizations
-push-notification-details.summary-header = Notification Summary
-push-notification-details.summary-header-description = Overview of the notification message and its details.
-push-notification-details.message-tab = Message Content
-push-notification-details.targeting-tab = Targeting & Delivery
-push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
-push-notification-details.users-targeted-chart = Users Targeted
-push-notification-details.sent-messages-chart = Sent Messages
-push-notification-details.and-label = and
-push-notification-details.message-id = Message ID
-push-notification-details.results-for = Results for
-push-notification-details.created = Created
-push-notification-details.created-by = Created {0} by {1}
-
-push-notification-details.message-title = Title
-push-notification-details.message-content = Content
-push-notification-details.message-first-button-label = First Button Text
-push-notification-details.message-first-button-url = First Button URL
-push-notification-details.message-second-button-label = Second Button Text
-push-notification-details.message-second-button-url = Second Button URL
-push-notification-details.message-media-url = Media URL
-push-notification-details.ios-message-media-url = IOS media URL
-push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
-
-push-notification-details.targeting-sub-header = Targeting
-push-notification-details.targeted-users = Targeted users
-push-notification-details.geolocation = Geolocation
-push-notification-details.when-to-determine = When to determine
-push-notification-details.delivery-sub-header = Delivery
-push-notification-details.delivery-type = Delivery type
-push-notification-details.scheduled-for = Scheduled for
-push-notification-details.expiration-time = Expiration time
-push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
-push-notification-details.no-errors-found = No errors were found
-push-notification.users-targeted = Users Targeted
-push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
-push-notification.sent-notifications = Sent Notifications
-push-notification.sent-notifications-description = Total number of notifications sent.
-push-notification.clicked-notifications = Clicked Notifications
-push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
-push-notification.failed = Failed
-push-notification.failed-description = Total number of notifications that failed to get delivered.
-push-notification.no-errors-found = There are no errors found
-push-notification.affected-users = Affected Users
-push-notification.error-description = Description
-push-notification.error-code = Error Code
-push-notification.users = Users
-push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
-
-# Mobile Preview Component
-push-notification.mobile-preview-default-app-name = Your application name
-push-notification.mobile-preview-default-title = Your message title
-push-notification.mobile-preview-default-content = Your message content
-
-# Application settings
-push-notification.ios-settings = iOS settings
-push-notification.authentication-type = Authentication type
-push-notification.key-file-p8 = Key file (P8)
-push-notification.key-file-p12 = Sandbox + Production certificate (P12)
-push-notification.key-file-already-uploaded = Key file {0} is already uploaded
-push-notification.choose-file = Choose File
-push-notification.key-id = Key ID
-push-notification.team-id = Team ID
-push-notification.bundle-id = Bundle ID
-push-notification.passphrase = Passphrase
-push-notification.android-settings = Android (Google FCM)
-push-notification.firebase-key = Firebase key
-push-notification.huawei-settings = Android (Huawei Push Kit)
-push-notification.huawei-app-id = App ID
-push-notification.huawei-app-secret = App Secret
-push-notification.rate-limit = Rate limit
-push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
-push-notification.period-in-seconds = Period duration (seconds)
-push-notification.test-users = Test users
-push-notification.test-users-description = Test users description
-push-notification.define-new-user = +Define New User
-push-notification.user-definition = User Definition
-push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
-push-notification.see-user-list = See User List
-push-notification.define-new-user-title = Define New User
-push-notification.add-test-users-label = Add Users
-push-notification.definition-type = Definition Type
-push-notification.define-with-user-id = Define with User ID
-push-notification.define-with-cohort = Define with Cohort
-push-notification.enter-user-id = Enter User ID
-push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
-push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
-push-notification.select-cohort = Please select a cohort
-push-notification.user-list = User List
-push-notification.username = Username
-push-notification.user-id = User ID
-push-notification.cohort-name = Cohort Name
-push-notification.cancel = Cancel
-push-notification.i-understand-delete-key = I understand, delete this key
-push-notification.delete-key = Delete Key
-push-notification.test-users-were-successfully-removed = Test users have been successfully removed
-push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
-
-#Global settinsg
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
push.plugin-title = Push Notifications
+push.plugin-description = Increase loyalty, user retention & satisfaction with native iOS and Android push notifications
+push.sidebar.section = Vēstuļu paziņojumi
+push.sidebar.overview = Apskats
+push.sidebar.messages = Vēstules
+
+push.no-message = Nav ziņas
+push.create = Izveidot Ziņu
+push.create-message-n = Create Message to {0} users
+
+mgmt-plugins.push.here = here
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android (Google FCM)
+mgmt-plugins.push.android.key = Firebase key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from
+mgmt-plugins.push.h = Android (Huawei Push Kit)
+mgmt-plugins.push.h.key = Huawei App ID
+mgmt-plugins.push.h.key.desc = Your numerical Huawei App ID (Client ID)
+mgmt-plugins.push.h.secret = App Secret
+mgmt-plugins.push.h.secret.desc = Huawei App Secret, sign secret of your app can be found in code signing properties or at
+mgmt-plugins.push.h.secret.hds = Huawei developer portal
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.error.h.key = Please enter Huawei App ID
+mgmt-plugins.push.error.h.secret = Please enter Huawei App Secret
+mgmt-plugins.push.error.h.keynum = Huawei App ID can contain only digits
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.p12 = Universal certificate (p12) is already uploaded
+mgmt-plugins.push.uploaded.p8 = Key file (p8) is already uploaded
+mgmt-plugins.push.uploaded.bundle = Bundle id of this certificate:
+mgmt-plugins.push.detected = Detected key type:
+mgmt-plugins.push.rate = Rate limit
+mgmt-plugins.push.rate.rate = Maximum number of notifications scheduled per period
+mgmt-plugins.push.rate.help = Push notifications sent to FCM and APNS will separately be rate limited based on this configuration for each push notification campaign
+mgmt-plugins.push.rate.period = Period duration (seconds)
+mgmt-plugins.push.rate.period.help = Timeframe to apply the rate limit to
+
+systemlogs.action.push_message_created = Push Message Created
+systemlogs.action.push_credentials_update = Push Credentials Updated
+systemlogs.action.push_message_deleted = Push Message Deleted
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM). It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = Visu nosūtīto ziņojumu skaits šim periodam
+help.dashboard.push.actions = Number of actions performed for this app. Action represents a positive reaction of a user to your message. Please see SDK guide to know how to enable this metric in your app.
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or FCM tokens stored in the database.
+
+pu.po.title = Create Push Notification
+pu.po.desc = Compose your push notification in 4 easy steps
+
+pu.po.view.title = Push Notification
+pu.po.view.desc = Ziņas detaļas
+
+pu.po.preview = Preview
+pu.po.preview.help = Please note that this is a preview screen. What you see here may not be same as what end users see on their smartphones due to varying device sizes.
+
+pu.po.tt.pers = Add personalized content
+pu.po.tt.emoji = Add emoji
+
+pu.po.tab0.title = Aplikācijas un platformas
+pu.po.tab0.title.auto = Platforms
+pu.po.tab0.desc = Destinations
+
+pu.po.tab1.title = Scheduling
+pu.po.tab1.desc = Uzstādīt ziņas datumu
+pu.po.tab1.title.auto = Campaign Rules
+pu.po.tab1.desc.auto = Triggers & dates
+
+pu.po.tab1.chr = Cohorts
+pu.po.tab1.chr-desc = Send to the users currently in selected cohorts
+
+pu.po.tab1.aud = Audience Selection
+pu.po.tab1.now.t = Now
+pu.po.tab1.now.d = Select users now
+pu.po.tab1.later.t = Before sending
+pu.po.tab1.later.d = Select users right before sending the message
+
+pu.po.tab2.ddc = Delivery Date Calculation
+pu.po.tab2.ddc.arr = Relative to the date event arrived to the server
+pu.po.tab2.ddc.evt = Relative to the date event occurred on a device
+# pu.po.tab2.ddc.h = In "event occurrence" case Countly only sends notifications within 30 minutes of actual event recording date, discarding any "late" notifications which could be triggered due to event arriving to the server with a delay because of networking issues.
+# pu.po.tab2.ddc.h = Note that larger amount of notifications won't be sent in case of event occurence date since an event might arrive to the server with a delay due to networking issues. On the other hand, accuracy of "event occurence" case is better, since there won't be any late notifications.
+# pu.po.tab2.ddc.arr = Relative to the event arrival to the server date
+# pu.po.tab2.ddc.evt = Relative to the event occurence on the device date
+
+pu.po.tab2.trc = Behaviour when trigger condition is no longer met
+pu.po.tab2.trc.true = Cancel when user exits selected cohort(s)
+pu.po.tab2.trc.false = Cancel when user enters selected cohort(s) back
+pu.po.tab2.trc.dont = Send anyway
+
+pu.po.tab2.title.auto = Message Delivery
+pu.po.tab2.desc.auto = Periodicity & capping
+
+pu.po.compose.title = Message
+pu.po.compose.desc = Compose content
+
+pu.po.review.title = Review
+pu.po.review.desc = Check your message
+
+pu.po.tab0.apps = Aplikācijas
+pu.po.tab0.add = Pievienot applikāciju
+pu.po.tab0.select-apps = Izvēlēties applikāciju
+pu.po.tab0.select-apps-desc = Only apps with APN or FCM credentials are displayed
+pu.po.tab0.select-platforms = Izvēlēties platformas
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or FCM credentials
+pu.platform.i = IOS
+pu.platform.a = Android
+pu.po.prev = Previous step
+pu.po.next = Next step
+pu.po.send = Sūtīt!
+pu.po.start = Start!
+pu.po.edit = Save
+pu.po.close = Aizvērt
+pu.po.duplicate = Duplicate
+pu.po.delete = Izdzēst
+
+pu.po.tab1.testing = Testing
+pu.po.tab1.testing-desc = Send to production users or to test users?
+pu.po.tab1.testing-prod = Production Users
+pu.po.tab1.testing-test = Testa lietotāji
+pu.po.tab1.testing-test-desc = Development & test users only
+
+pu.po.tab1.scheduling = Scheduling
+pu.po.tab1.scheduling-desc = Send now or schedule sending for later
+pu.po.tab1.scheduling-now = Sūtīt tagad
+pu.po.tab1.scheduling-auto-now = Start now
+pu.po.tab1.scheduling-now-desc = Sending will start once you click Send
+pu.po.tab1.scheduling-date = Schedule
+pu.po.tab1.scheduling-date-desc = Set specific date & time for this message
+pu.po.tab1.tz = Send according to user's timezone?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = No
+pu.po.tab1.tz-no-desc = Send all notifications at once
+pu.po.tab1.tz-yes = Send in user timezones
+pu.po.tab1.tz-yes-desc = Send each notification in timezone of the user it's for
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = Geolocations
+pu.po.tab1.geos-desc = Filter users by their last known location?
+pu.po.tab1.geos.no = No filtering
+
+
+pu.po.recipients.s = Saņēmējs: {0}
+pu.po.recipients.m = Saņēmēji: {0}
+pu.po.recipients.temporary = Number of users calculation is still running, it can take up to several minutes in tough cases. Feel free to send your message without waiting.
+
+pu.po.tab2.message.type = Message type
+pu.po.tab2.extras = Additional options
+
+pu.type.message = Ziņa
+pu.type.data = Data-only
+pu.type.rich = Rich
+
+pu.po.loading = We're counting your users
+pu.po.loading-desc = Please wait, it will be done soon
+
+pu.po.sending = Saglabā
+pu.po.sending-desc = Tikai momentu
+
+pu.po.sent = Saglabāts
+pu.po.sent-desc = Viss ir labi!
+
+pu.po.tab2.placeholder = Write your message here (default is required, add more localized messages if needed)
+pu.po.tab2.default-message = Your message
+pu.po.tab2.default-message.invalid = Default message is required
+pu.po.tab2.default-button-title.invalid = Default button title is required
+pu.po.tab2.default-button-link.invalid = Default button link is required
+pu.po.tab2.extras.sound = Sūtīt skaņu
+pu.po.tab2.extras.sound.invalid = Skaņai jābūt stringam
+pu.po.tab2.extras.badge = Add badge
+pu.po.tab2.extras.badge.invalid = Badge must be a valid number
+pu.po.tab2.extras.badge.help = iOS supports badges by default, Android requires additional steps (more details in our Android SDK Guide)
+pu.po.tab2.extras.media = Attachment URL
+pu.po.tab2.extras.media.placeholder = Image URL
+pu.po.tab2.extras.media.invalid = Must be a valid URL to an image (JPG, PNG) or animation (GIF) less than 10MB in size, audio (MP3, WAV, AIF) less than 5MB in size or video (MPEG, MPEG2, MPEG4) less than 50MB in size
+pu.po.tab2.extras.media.toobig = Media attachment must be less than 10MB for images and animations, less than 5MB for audio & 50MB for videos
+pu.po.tab2.extras.media.help = Media attachments are fully supported on iOS 10+. Android supports only images, iOS 9- doesn't support media at all. In case media is not supported, users will only see message text.
+pu.po.tab2.extras.url = On click URL
+pu.po.tab2.extras.url.invalid = URL must be valid
+pu.po.tab2.extras.url.help = Default URL or deeplink which is being open when user taps a message in drawer
+pu.po.tab2.extras.data = Sūtīt JSON
+pu.po.tab2.extras.data.invalid = This field must contain valid JSON string
+pu.po.tab2.extras.data.placeholder = JSON string
+pu.po.tab2.extras.data.help = App-specific JSON data can be sent along with standard content
+pu.po.tab2.mtitle = Message title
+pu.po.tab2.mtitle.placeholder = Optional title for your message
+pu.po.tab2.mtext = Message text
+pu.po.tab2.mbtn = Buttons
+pu.po.tab2.mbtns = Number of buttons
+pu.po.tab2.mbtn.urls = Button URLs
+pu.po.tab2.mbtn.req = Button title required
+pu.po.tab2.mbtn.url = Must be a valid URL
+pu.po.tab2.mbtn.0 = Button 0
+pu.po.tab2.mbtn.1 = Button 1
+pu.po.tab2.mbtn.2 = Button 2
+pu.po.tab2.btntext = Button text
+pu.po.tab2.urlordeep = URL or deeplink
+pu.po.tab2.rich = Rich notification options
+pu.po.tab2.mmedia = Media
+pu.po.tab2.mmedia.type.image = Image
+pu.po.tab2.mmedia.type.anima = Animation
+pu.po.tab2.mmedia.type.audio = Audio
+pu.po.tab2.mmedia.type.video = Video
+pu.po.tab2.mmedia.type.warn.android = This type of media is not supported on Android
+pu.po.tab2.mmedia.status = Request status:
+pu.po.tab2.default-message.help = Default localization for all users. You can override default message & button names by setting them for specific locales.
+pu.po.no-users = Sorry, there are no push-enabled users for specified options.
+pu.po.no-users-try-change = Mēģināt mainīt
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = Sākt no jauna
+pu.po.tab2.variable = Variable
+pu.po.tab2.capital = Make variable value start from capital letter
+pu.po.tab2.fallback = Fallback value
+pu.po.tab2.help = Default value which will be used in case user profile doesn't have this variable
+pu.po.tab2.props = User Properties
+pu.po.tab2.cust = Custom Variables
+pu.po.tab2.varpl = Select variable
+pu.po.tab2.fallpl = Enter fallback value
+pu.po.tab2.tt = User''s "{0}" property which falls back to "{1}"
+
+datepicker.dt.click = Uzstādīt datumu & laiku
+datepicker.tz = Send in user's timezone
+datepicker.clear = Clear
+datepicker.apply = Apply
+datepicker.pick-time = Pick Time
+
+pu.locale.default = Default
+pu.locale.null = Nezināms
+pu.po.tab3.review = Review
+pu.po.tab3.apps = Applikācijas
+pu.po.tab3.platforms = Platformas
+pu.po.tab3.date = Datums
+pu.po.tab3.date.now = At the time of message creation
+pu.po.tab3.date.intz = ; in user timezones
+pu.po.tab3.unknown = Unknown
+pu.po.tab3.type = Tips
+pu.po.tab3.type.message = Text message
+pu.po.tab3.type.data = Datums
+pu.po.tab3.type.update = Update (deprecated)
+pu.po.tab3.type.review = Review (deprecated)
+pu.po.tab3.type.category = Category (deprecated)
+pu.po.tab3.type.link = URL (deprecated)
+pu.po.tab3.test = Send to test devices
+pu.po.tab3.test.true = Jā
+pu.po.tab3.test.false = Nē
+pu.po.tab3.btns = Buttons
+pu.po.tab3.media = Media
+pu.po.tab3.extras = Standard options
+
+pu.po.tab3.extras.sound = Skaņa
+pu.po.tab3.extras.badge = iOS badge
+pu.po.tab3.extras.url = On click URL
+pu.po.tab3.extras.data = Papildus datums
+pu.po.tab3.extras.media = Media
+
+pu.po.tab3.date.date = Scheduled to be sent on
+pu.po.tab3.date.sent = Sūtīt uz
+pu.po.tab3.date.tz = Sent in user timezone
+
+pu.po.tab3.audience = Saņēmējs
+
+pu.po.tab3.errors = Kļūdas
+pu.po.tab3.errors.code = Kods
+pu.po.tab3.errors.message = Kļūda
+pu.po.tab3.errors.count = Skaits
+
+pu.po.confirm = Apstiprināt sūtīšanu
+pu.po.confirm.ready = I’m ready to send this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will receive this campaign after it is started.
+pu.po.recipients.message.details = This message will automatically be delivered to app users as they match campaign trigger criteria.
+pu.po.recipients.message.edit = Message modification only affects notifications scheduled after modification takes place.
+
+pu.dash.users = Lietotāji
+pu.dash.users.total = Total Users
+pu.dash.users.enabl = Messaging-enabled Users
+pu.dash.totals = Overall
+pu.dash.metrics = Metrikas
+pu.dash.metrics.sent = Messages sent
+pu.dash.metrics.acti = Actions performed
+pu.dash.create = Create Message
+pu.dash.monthly = Monthly
+pu.dash.weekly = Weekly
+pu.dash.messages = Messages
+pu.dash.messages.all = All
+pu.dash.messages.api = API
+pu.dash.messages.dash = Dashboard
+pu.dash.actions = Actions
+pu.dash.sent = Sent
+
+
+pu.t.nothing = No records found
+pu.t.search = Search by default message
+pu.t.message = Message
+pu.t.apps = Apps
+pu.t.status = Status
+pu.t.created = Created
+pu.t.sent-scheduled = Date sent / Scheduled
+pu.t.result = Sent / Actioned
+
+push.message.status.initial = Initial
+push.message.status.created = Created
+push.message.status.scheduled = Scheduled
+push.message.status.sending = Sending
+push.message.status.sending-errors = Sending with errors
+push.message.status.aborted = Aborted
+push.message.status.sent = Sent
+push.message.status.sent-errors = Sent with errors
+
+push.message.status.auto.true = Active
+push.message.status.auto.false = Inactive
+
+push.error.econnrefused = Countly cannot connect to APN/FCM. Please check your proxy server settings (if any) and / or server connectivity to APN/FCM servers.
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = Process exited while sending this messsage due to connection being unexpectedly closed by APNS. Some notifications might have been sent twice (up to 500).
+push.error.3-eof = APNS connection error. Possible reasons include: invalid certificate / auth key, firewall block, system root certificates (CA) issues.
+push.error.no-credentials = You don't have credentials for any of selected app-platform combinations.
+push.error.no-app-credentials = This application doesn't have any push notification credentials set.
+push.error.no-cohorts = Automated messages depend on Cohorts and Events, yet you don't have any of those.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+push.error.no.cohorts = No Cohorts or events
+push.error.no.credentials = No credentials
+push.error.i.understand = OK, I understand
+
+
+push.errorCodes.bug = You found a bug! Please contact support.
+push.errorCodes = Kļūdas:
+push.errorCode.i400 = APN 400 Bad request
+push.errorCode.i400+BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse the certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to the Bundle ID of your application
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403 Certificate error
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403 error: InvalidProviderToken. Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push.errorCode.i405 = APN 405 Bad method
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413 Payload too large
+push.errorCode.i413.desc = Message was too large and APN declined to deliver it.
+push.errorCode.i429 = APN 429 Too many requests
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500 Internal error
+push.errorCode.i500.desc = Apple server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.i503 = APN 503 Shutdown
+push.errorCode.i503.desc = Apple server unexpectedly decided to shutdown returning HTTP error 503. Please try again later.
+
+push.errorCode.a200 = FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push.errorCode.a200+InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push.errorCode.a200+MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push.errorCode.a200+InvalidDataKey.desc = Message contains invalid data key, please check:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push.errorCode.a200+TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push.errorCode.a400 = FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = FCM 500 Internal error
+push.errorCode.a500.desc = Google server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.a200+Unavailable.desc = Google server unexpectedly returned HTTP error 200+Unavailable. Please try again later.
+push.errorCode.a200+InternalServerError.desc = Google server unexpectedly returned HTTP error 200+InternalServerError. Please try again later.
+push.errorCode.a501 = FCM 501 Error
+push.errorCode.a502 = FCM 502 Error
+push.errorCode.a503 = FCM 503 Error
+push.errorCode.link.i = Apple docs
+push.errorCode.link.a = Google docs
+push.errorCode.skiptz = Too late to send
+push.errorCode.skiptz.desc = This much notifications have been discarded because time of arrival would be at least 60 minutes later than expected (either due to user's timezone, or due to networking issues).
+push.errorCode.del = Message deleted
+push.errorCode.del.desc = This much notifications have been discarded their message has been deleted.
+push.errorCode.aborted = Aborted
+push.errorCode.aborted.desc = This much messages have been removed from queue after an unrecoverable error. Please check error message above or contact support if there's no error message.
+push.errorCode.consent = Consent cancelled
+push.errorCode.consent.desc = This much messages have been removed from queue after user removed push consent.
+
+push.totals.processed = Apstrādāts
+push.totals.sent = Pieņemtie
+push.totals.errors = Kļūdas
+
+pu.po.users.s = {0} user
+pu.po.users.m = {0} users
+pu.po.metrics = Metrikas
+pu.po.metrics.processed = Processed
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = Sent Successfully
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & FCM
+pu.po.metrics.sent.none = No notifications were sent! Please check message errors
+pu.po.metrics.sent.one = Your notification has been sent successfully!
+pu.po.metrics.sent.all = All notifications have been sent successfully!
+pu.po.metrics.actions = Actioned
+pu.po.metrics.actions.desc = How many users performed push notification action
+pu.po.metrics.actions.all = All users performed action! Good Job!
+pu.po.metrics.actions.performed = performed action.
+pu.po.metrics.actions0.performed = opened default URL.
+pu.po.metrics.actions1.performed = clicked first button.
+pu.po.metrics.actions2.performed = clicked second button.
+pu.po.left.to.send.s = {0} notification left to send
+pu.po.left.to.send.m = {0} notifications left to send
+pu.po.left.to.send.none = All notifications are sent!
+pu.po.left.to.send.batch = next batch will start at {0}
+pu.po.expired.s = {0} token expired
+pu.po.expired.m = {0} tokens expired
+pu.po.unset.s = {0} tokens expired
+pu.po.unset.m = {0} token expired
+pu.po.errors.s = {0} notification wasn\'t sent due to an error
+pu.po.errors.m = {0} notifications weren\'t sent due to an error
+
+pu.apn.uni = Universal Certificate (Production & Sandbox)
+pu.apn.none = None
+
+pu.gcm.gcm = FCM Key
+pu.gcm.none = None
+
+pu.remove = Remove credentials
+pu.validate = Validate
+pu.validating = Validating credentials
+pu.validation.error = Credentials error:
+pu.remove = Remove credentials
+pu.creds.none = None
+pu.creds.type.apn_universal = APN Universal Certificate is set
+pu.creds.type.apn_token = APN Auth Key is set
+pu.creds.type.gcm = FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase Server Key
+pu.creds.cert = P12 Certificate
+pu.creds.pass = Passphrase
+pu.creds.auth_key = P8 Key File
+pu.creds.key_id = Auth Key ID
+pu.creds.team_id = Team ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN Certificate (Sandbox & Production)
+pu.creds.apn.type.apn_token = APN Auth Key
+
+userdata.push = Push tokens
+pu.tk.id = APN Test token (development)
+pu.tk.ia = APN Test token (ad hoc or TestFlight)
+pu.tk.ip = APN Production token
+pu.tk.at = FCM Test token
+pu.tk.ap = FCM Production token
+pu.tk.ht = Huawei Test token
+pu.tk.hp = Huawei Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = Create Message
+pu.dash.btn-group.automated-message = Automated Message
+pu.dash.btn-group.automated-message-desc = Create an automated push campaign to send a message to users when their-in-app behaviour matches defined criteria.
+pu.dash.btn-group.automated-message-link = Learn more about automation
+pu.dash.btn-group.one-time-message = One-time Message
+pu.dash.btn-group.one-time-message-desc = Create a one-time push notification campaign to send right away on in the future.
+pu.dash.btn-group-available-in-enterprise = Available in enterprise edition
+pu.dash.btn.learn-more = Learn more about automation
+
+pu.po.tab1.trigger-type = Trigger Type
+pu.po.tab1.trigger-type.entry = Cohort Entry
+pu.po.tab1.trigger-type.exit = Cohort Exit
+pu.po.tab1.trigger-type.event = Performed Event
+pu.po.tab1.cohort-entry-desc = Triggered when user enters into any of the cohorts you select
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.cohort-event-desc = Triggered when user performs a selected event
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = Recalculation of cohorts above will trigger message sending process automatically
+pu.po.tab1.select-cohort-placeholder = Select cohorts(s)
+pu.po.tab1.select-event = Select one or more events to set a trigger
+pu.po.tab1.select-event-placeholder = Select event(s)
+pu.po.tab1.campaign-start-date = Campaign Start Date
+pu.po.tab1.additional-options = Additional Options
+pu.po.tab1.campaign-end-date = Campaign end date
+
+pu.po.tab2.delivery-method = Delivery method
+pu.po.tab2.delivery-method-desc = Choose when your message should be delivered
+pu.po.tab2.immediately = Immediately
+pu.po.tab2.immediately-desc = Deliver the message as soon as triggering cohort is recalculated
+pu.po.tab2.immediately-desc-event = Deliver the message as soon as triggering event reached the server
+pu.po.tab2.delayed = Delayed
+pu.po.tab2.delivery-time = Delivery time
+pu.po.tab2.delivery-time-desc = Set an optional delivery time for your message
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = Send in users' timezone at
+pu.po.tab2.select-time = Select time
+pu.po.tab2.capping = Capping
+pu.po.tab2.capping-desc = Configure number of messages per user. Enabling this option will limit number of messages sent to the same user.
+pu.po.tab2.capping.no = No capping
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered to or exited from the cohort
+pu.po.tab2.capping.no-desc-event = Message is sent whenever user's event is received by the server
+pu.po.tab2.capping.yes = Capped
+pu.po.tab2.capping.yes-desc = Number of messages is limited
+pu.po.tab2.message-per-user = Maximum messages per user
+pu.po.tab2.message-per-user-desc = Total number of messages individual user can receive from this campaign
+pu.po.tab2.sleep = Minimum time between messages
+pu.po.tab2.sleep-desc = User will be eligible to receive a repetitive message only if she / he triggers the campaign conditions at least configured time after previous message.
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = App
+pu.po.tab4.campaign-rules = Campaign Rules
+pu.po.tab4.trigger-type = Trigger Type
+pu.po.tab4.trigger-cohort-entry = Cohort entry
+pu.po.tab4.trigger-cohort-exit = Cohort exit
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = Cohort
+pu.po.tab4.cohorts.m = Cohorts ({0})
+pu.po.tab4.events.no = Events(s) were deleted
+pu.po.tab4.events.s = Event
+pu.po.tab4.events.m = Events ({0})
+pu.po.tab4.caping = Capping
+pu.po.tab4.caping-message = At most {0} message is going to be sent per user
+pu.po.tab4.message-content = Message Content
+pu.po.tab4.message-title = Title
+pu.po.tab4.message-text = Text
+pu.po.tab4.message-sound = Sound
+pu.po.tab4.message-media = Media
+pu.po.tab4.message-badge = Badge
+
+push.po.one-time-messages = ONE-TIME MESSAGES
+push.po.automated-messages = AUTOMATED MESSAGES
+push.po.table.dublicate = Duplicate
+push.po.table.resend = Resend failed notifications
+push.po.table.edit = Edit
+push.po.table.delete = Delete
+push.po.table.recipients = View recipients
+
+pu.po.progress = Progress
+pu.po.progress.auto = 30 days overview
+pu.never = Never
+pu.days.s = day
+pu.days.m = days
+pu.hours.s = hour
+pu.hours.m =hours
+pu.messages.s = message
+pu.messages.m = messages
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
+
push.proxyhost = Proxy Hostname
-push.proxypass = Proxy Password
push.proxyport = Proxy Port
push.proxyuser = Proxy Username
-push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
-push.proxyunauthorized = Do NOT check proxy HTTPS certificate
-push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
-push.connection_retries = Number of connection retries
-push.connection_factor = Time factor for exponential backoff between retries
-push.pool_pushes = Number of notifications in stream batches
-push.pool_bytes = Bytes in binary stream batches
-push.pool_concurrency = Maximum number of same type connections
-push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
-
-#Drawer from other views
-push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
-push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
-# Error codes
-push-notification.error-code.400.desc = 400 Bad request
-push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
-push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
-push-notification.error-code.405.desc = 405 Bad Method
-push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
-push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
-push-notification.error-code.500.desc = 500 Server error. Please try again later.
-push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
-push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
-push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
-push-notification.error-code.NoApp.desc = App not found when sending the notification.
-push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
-push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
-push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
-push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
-push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
-push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
-push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
-push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
-push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
-push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
-push-notification.error-code.MissingRegistration.desc = Please contact customer support.
-push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
-push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
-push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
-push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
-push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
-push-notification.error-code.InvalidTtl.desc = Please contact customer support.
-push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
-push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
-push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
-push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
-push-notification.error-code.NotRegistered.desc = FCM token expired
-push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
-push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
-push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
-push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
-push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
-push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
-push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
-
-push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
-push-notification.error-code.del = Message deleted
-push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
-push-notification.error-code.consent = Consent cancelled
-push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
-push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
-push-notification.error-code.aborted = Aborted
-push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
-push-notification.error-code.ExpiredToken = Expired Token
-push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
-
-# System Logs
-systemlogs.action.push_message_created = Push Notification created
-systemlogs.action.push_message_draft = Draft Push Notification created
-systemlogs.action.push_credentials_update = Push Credentials updated
-systemlogs.action.push_message_deleted = Push Notification deleted
-systemlogs.action.push_message_updated = Push Notification updated
-systemlogs.action.push_message_activated = Push Notification activated
-systemlogs.action.push_message_deactivated = Push Notification deactivated
-systemlogs.action.push_message_test = Test Push Notification sent
+push.proxypass = Proxy Password
+
+push.note.gcm.t = Your push notifications can't be delivered
+push.note.gcm.m = Following apps have GCM credentials instead of Firebase ones: {0}.
Usage of GCM is no longer possible since Google stopped accepting requests to GCM endpoint.
Please update app credentials to a valid FCM server key.
+
+mail.autopush-error-subject = Countly Automated Push Problem
+mail.autopush-error = Hi {0},
Your automated message cannot be sent due to a repeating error. Please review message status and reactivate the message once the problem is resolved.
Best,
A fellow Countly Admin
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
diff --git a/plugins/push/frontend/public/localization/push_no.properties b/plugins/push/frontend/public/localization/push_lv_LV.properties
similarity index 85%
rename from plugins/push/frontend/public/localization/push_no.properties
rename to plugins/push/frontend/public/localization/push_lv_LV.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_no.properties
+++ b/plugins/push/frontend/public/localization/push_lv_LV.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_my.properties b/plugins/push/frontend/public/localization/push_my.properties
new file mode 100644
index 00000000000..0dc7ccf6fab
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_my.properties
@@ -0,0 +1,577 @@
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
+push.plugin-title = Push Notifications
+push.plugin-description = Increase loyalty, user retention & satisfaction with native iOS and Android push notifications
+push.sidebar.section = Messaging
+push.sidebar.overview = Overview
+push.sidebar.messages = Messages
+
+push.no-message = No message
+push.create = Create Message
+push.create-message-n = Create Message to {0} users
+
+mgmt-plugins.push.here = here
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android (Google FCM)
+mgmt-plugins.push.android.key = Firebase key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from
+mgmt-plugins.push.h = Android (Huawei Push Kit)
+mgmt-plugins.push.h.key = Huawei App ID
+mgmt-plugins.push.h.key.desc = Your numerical Huawei App ID (Client ID)
+mgmt-plugins.push.h.secret = App Secret
+mgmt-plugins.push.h.secret.desc = Huawei App Secret, sign secret of your app can be found in code signing properties or at
+mgmt-plugins.push.h.secret.hds = Huawei developer portal
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.error.h.key = Please enter Huawei App ID
+mgmt-plugins.push.error.h.secret = Please enter Huawei App Secret
+mgmt-plugins.push.error.h.keynum = Huawei App ID can contain only digits
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.p12 = Universal certificate (p12) is already uploaded
+mgmt-plugins.push.uploaded.p8 = Key file (p8) is already uploaded
+mgmt-plugins.push.uploaded.bundle = Bundle id of this certificate:
+mgmt-plugins.push.detected = Detected key type:
+mgmt-plugins.push.rate = Rate limit
+mgmt-plugins.push.rate.rate = Maximum number of notifications scheduled per period
+mgmt-plugins.push.rate.help = Push notifications sent to FCM and APNS will separately be rate limited based on this configuration for each push notification campaign
+mgmt-plugins.push.rate.period = Period duration (seconds)
+mgmt-plugins.push.rate.period.help = Timeframe to apply the rate limit to
+
+systemlogs.action.push_message_created = Push Message Created
+systemlogs.action.push_credentials_update = Push Credentials Updated
+systemlogs.action.push_message_deleted = Push Message Deleted
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM). It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = Total number of messages sent for this application within selected period of time.
+help.dashboard.push.actions = Number of actions performed for this app. Action represents a positive reaction of a user to your message. Please see SDK guide to know how to enable this metric in your app.
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or FCM tokens stored in the database.
+
+pu.po.title = Create Push Notification
+pu.po.desc = Compose your push notification in 4 easy steps
+
+pu.po.view.title = Push Notification
+pu.po.view.desc = Message details
+
+pu.po.preview = Preview
+pu.po.preview.help = Please note that this is a preview screen. What you see here may not be same as what end users see on their smartphones due to varying device sizes.
+
+pu.po.tt.pers = Add personalized content
+pu.po.tt.emoji = Add emoji
+
+pu.po.tab0.title = Apps & Platforms
+pu.po.tab0.title.auto = Platforms
+pu.po.tab0.desc = Destinations
+
+pu.po.tab1.title = Scheduling
+pu.po.tab1.desc = Set message date
+pu.po.tab1.title.auto = Campaign Rules
+pu.po.tab1.desc.auto = Triggers & dates
+
+pu.po.tab1.chr = Cohorts
+pu.po.tab1.chr-desc = Send to the users currently in selected cohorts
+
+pu.po.tab1.aud = Audience Selection
+pu.po.tab1.now.t = Now
+pu.po.tab1.now.d = Select users now
+pu.po.tab1.later.t = Before sending
+pu.po.tab1.later.d = Select users right before sending the message
+
+pu.po.tab2.ddc = Delivery Date Calculation
+pu.po.tab2.ddc.arr = Relative to the date event arrived to the server
+pu.po.tab2.ddc.evt = Relative to the date event occurred on a device
+# pu.po.tab2.ddc.h = In "event occurrence" case Countly only sends notifications within 30 minutes of actual event recording date, discarding any "late" notifications which could be triggered due to event arriving to the server with a delay because of networking issues.
+# pu.po.tab2.ddc.h = Note that larger amount of notifications won't be sent in case of event occurence date since an event might arrive to the server with a delay due to networking issues. On the other hand, accuracy of "event occurence" case is better, since there won't be any late notifications.
+# pu.po.tab2.ddc.arr = Relative to the event arrival to the server date
+# pu.po.tab2.ddc.evt = Relative to the event occurence on the device date
+
+pu.po.tab2.trc = Behaviour when trigger condition is no longer met
+pu.po.tab2.trc.true = Cancel when user exits selected cohort(s)
+pu.po.tab2.trc.false = Cancel when user enters selected cohort(s) back
+pu.po.tab2.trc.dont = Send anyway
+
+pu.po.tab2.title.auto = Message Delivery
+pu.po.tab2.desc.auto = Periodicity & capping
+
+pu.po.compose.title = Message
+pu.po.compose.desc = Compose content
+
+pu.po.review.title = Review
+pu.po.review.desc = Check your message
+
+pu.po.tab0.apps = Apps
+pu.po.tab0.add = Add App
+pu.po.tab0.select-apps = Select Apps
+pu.po.tab0.select-apps-desc = Only apps with APN or FCM credentials are displayed
+pu.po.tab0.select-platforms = Select Platforms
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or FCM credentials
+pu.platform.i = iOS
+pu.platform.a = Android
+pu.po.prev = Previous step
+pu.po.next = Next step
+pu.po.send = Send!
+pu.po.start = Start!
+pu.po.edit = Save
+pu.po.close = Close
+pu.po.duplicate = Duplicate
+pu.po.delete = Delete
+
+pu.po.tab1.testing = Testing
+pu.po.tab1.testing-desc = Send to production users or to test users?
+pu.po.tab1.testing-prod = Production Users
+pu.po.tab1.testing-test = Test Users
+pu.po.tab1.testing-test-desc = Development & test users only
+
+pu.po.tab1.scheduling = Scheduling
+pu.po.tab1.scheduling-desc = Send now or schedule sending for later
+pu.po.tab1.scheduling-now = Send now
+pu.po.tab1.scheduling-auto-now = Start now
+pu.po.tab1.scheduling-now-desc = Sending will start once you click Send
+pu.po.tab1.scheduling-date = Schedule
+pu.po.tab1.scheduling-date-desc = Set specific date & time for this message
+pu.po.tab1.tz = Send according to user's timezone?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = No
+pu.po.tab1.tz-no-desc = Send all notifications at once
+pu.po.tab1.tz-yes = Send in user timezones
+pu.po.tab1.tz-yes-desc = Send each notification in timezone of the user it's for
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = Geolocations
+pu.po.tab1.geos-desc = Filter users by their last known location?
+pu.po.tab1.geos.no = No filtering
+
+
+pu.po.recipients.s = Recipient: {0}
+pu.po.recipients.m = Recipients: {0}
+pu.po.recipients.temporary = Number of users calculation is still running, it can take up to several minutes in tough cases. Feel free to send your message without waiting.
+
+pu.po.tab2.message.type = Message type
+pu.po.tab2.extras = Additional options
+
+pu.type.message = Message
+pu.type.data = Data-only
+pu.type.rich = Rich
+
+pu.po.loading = We're counting your users
+pu.po.loading-desc = Please wait, it will be done soon
+
+pu.po.sending = Saving
+pu.po.sending-desc = Just a moment
+
+pu.po.sent = Saved
+pu.po.sent-desc = All good!
+
+pu.po.tab2.placeholder = Write your message here (default is required, add more localized messages if needed)
+pu.po.tab2.default-message = Your message
+pu.po.tab2.default-message.invalid = Default message is required
+pu.po.tab2.default-button-title.invalid = Default button title is required
+pu.po.tab2.default-button-link.invalid = Default button link is required
+pu.po.tab2.extras.sound = Send sound
+pu.po.tab2.extras.sound.invalid = Sound must be a string
+pu.po.tab2.extras.badge = Add badge
+pu.po.tab2.extras.badge.invalid = Badge must be a valid number
+pu.po.tab2.extras.badge.help = iOS supports badges by default, Android requires additional steps (more details in our Android SDK Guide)
+pu.po.tab2.extras.media = Attachment URL
+pu.po.tab2.extras.media.placeholder = Image URL
+pu.po.tab2.extras.media.invalid = Must be a valid URL to an image (JPG, PNG) or animation (GIF) less than 10MB in size, audio (MP3, WAV, AIF) less than 5MB in size or video (MPEG, MPEG2, MPEG4) less than 50MB in size
+pu.po.tab2.extras.media.toobig = Media attachment must be less than 10MB for images and animations, less than 5MB for audio & 50MB for videos
+pu.po.tab2.extras.media.help = Media attachments are fully supported on iOS 10+. Android supports only images, iOS 9- doesn't support media at all. In case media is not supported, users will only see message text.
+pu.po.tab2.extras.url = On click URL
+pu.po.tab2.extras.url.invalid = URL must be valid
+pu.po.tab2.extras.url.help = Default URL or deeplink which is being open when user taps a message in drawer
+pu.po.tab2.extras.data = Send JSON
+pu.po.tab2.extras.data.invalid = This field must contain valid JSON string
+pu.po.tab2.extras.data.placeholder = JSON string
+pu.po.tab2.extras.data.help = App-specific JSON data can be sent along with standard content
+pu.po.tab2.mtitle = Message title
+pu.po.tab2.mtitle.placeholder = Optional title for your message
+pu.po.tab2.mtext = Message text
+pu.po.tab2.mbtn = Buttons
+pu.po.tab2.mbtns = Number of buttons
+pu.po.tab2.mbtn.urls = Button URLs
+pu.po.tab2.mbtn.req = Button title required
+pu.po.tab2.mbtn.url = Must be a valid URL
+pu.po.tab2.mbtn.0 = Button 0
+pu.po.tab2.mbtn.1 = Button 1
+pu.po.tab2.mbtn.2 = Button 2
+pu.po.tab2.btntext = Button text
+pu.po.tab2.urlordeep = URL or deeplink
+pu.po.tab2.rich = Rich notification options
+pu.po.tab2.mmedia = Media
+pu.po.tab2.mmedia.type.image = Image
+pu.po.tab2.mmedia.type.anima = Animation
+pu.po.tab2.mmedia.type.audio = Audio
+pu.po.tab2.mmedia.type.video = Video
+pu.po.tab2.mmedia.type.warn.android = This type of media is not supported on Android
+pu.po.tab2.mmedia.status = Request status:
+pu.po.tab2.default-message.help = Default localization for all users. You can override default message & button names by setting them for specific locales.
+pu.po.no-users = Sorry, there are no push-enabled users for specified options.
+pu.po.no-users-try-change = Try to change
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = Start over
+pu.po.tab2.variable = Variable
+pu.po.tab2.capital = Make variable value start from capital letter
+pu.po.tab2.fallback = Fallback value
+pu.po.tab2.help = Default value which will be used in case user profile doesn't have this variable
+pu.po.tab2.props = User Properties
+pu.po.tab2.cust = Custom Variables
+pu.po.tab2.varpl = Select variable
+pu.po.tab2.fallpl = Enter fallback value
+pu.po.tab2.tt = User''s "{0}" property which falls back to "{1}"
+
+datepicker.dt.click = Set date & time
+datepicker.tz = Send in user's timezone
+datepicker.clear = Clear
+datepicker.apply = Apply
+datepicker.pick-time = Pick Time
+
+pu.locale.default = Default
+pu.locale.null = Unknown
+pu.po.tab3.review = Review
+pu.po.tab3.apps = Apps
+pu.po.tab3.platforms = Platforms
+pu.po.tab3.date = Date
+pu.po.tab3.date.now = At the time of message creation
+pu.po.tab3.date.intz = ; in user timezones
+pu.po.tab3.unknown = Unknown
+pu.po.tab3.type = Type
+pu.po.tab3.type.message = Text message
+pu.po.tab3.type.data = Data
+pu.po.tab3.type.update = Update (deprecated)
+pu.po.tab3.type.review = Review (deprecated)
+pu.po.tab3.type.category = Category (deprecated)
+pu.po.tab3.type.link = URL (deprecated)
+pu.po.tab3.test = Send to test devices
+pu.po.tab3.test.true = Yes
+pu.po.tab3.test.false = No
+pu.po.tab3.btns = Buttons
+pu.po.tab3.media = Media
+pu.po.tab3.extras = Standard options
+
+pu.po.tab3.extras.sound = Sound
+pu.po.tab3.extras.badge = iOS badge
+pu.po.tab3.extras.url = On click URL
+pu.po.tab3.extras.data = Extra data
+pu.po.tab3.extras.media = Media
+
+pu.po.tab3.date.date = Scheduled to be sent on
+pu.po.tab3.date.sent = Sent on
+pu.po.tab3.date.tz = Sent in user timezone
+
+pu.po.tab3.audience = Recipients
+
+pu.po.tab3.errors = Errors
+pu.po.tab3.errors.code = Code
+pu.po.tab3.errors.message = Error
+pu.po.tab3.errors.count = Count
+
+pu.po.confirm = Confirm sending
+pu.po.confirm.ready = I’m ready to send this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will receive this campaign after it is started.
+pu.po.recipients.message.details = This message will automatically be delivered to app users as they match campaign trigger criteria.
+pu.po.recipients.message.edit = Message modification only affects notifications scheduled after modification takes place.
+
+pu.dash.users = Users
+pu.dash.users.total = Total Users
+pu.dash.users.enabl = Messaging-enabled Users
+pu.dash.totals = Overall
+pu.dash.metrics = Metrics
+pu.dash.metrics.sent = Messages sent
+pu.dash.metrics.acti = Actions performed
+pu.dash.create = Create Message
+pu.dash.monthly = Monthly
+pu.dash.weekly = Weekly
+pu.dash.messages = Messages
+pu.dash.messages.all = All
+pu.dash.messages.api = API
+pu.dash.messages.dash = Dashboard
+pu.dash.actions = Actions
+pu.dash.sent = Sent
+
+
+pu.t.nothing = No records found
+pu.t.search = Search by default message
+pu.t.message = Message
+pu.t.apps = Apps
+pu.t.status = Status
+pu.t.created = Created
+pu.t.sent-scheduled = Date sent / Scheduled
+pu.t.result = Sent / Actioned
+
+push.message.status.initial = Initial
+push.message.status.created = Created
+push.message.status.scheduled = Scheduled
+push.message.status.sending = Sending
+push.message.status.sending-errors = Sending with errors
+push.message.status.aborted = Aborted
+push.message.status.sent = Sent
+push.message.status.sent-errors = Sent with errors
+
+push.message.status.auto.true = Active
+push.message.status.auto.false = Inactive
+
+push.error.econnrefused = Countly cannot connect to APN/FCM. Please check your proxy server settings (if any) and / or server connectivity to APN/FCM servers.
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = Process exited while sending this messsage due to connection being unexpectedly closed by APNS. Some notifications might have been sent twice (up to 500).
+push.error.3-eof = APNS connection error. Possible reasons include: invalid certificate / auth key, firewall block, system root certificates (CA) issues.
+push.error.no-credentials = You don't have credentials for any of selected app-platform combinations.
+push.error.no-app-credentials = This application doesn't have any push notification credentials set.
+push.error.no-cohorts = Automated messages depend on Cohorts and Events, yet you don't have any of those.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+push.error.no.cohorts = No Cohorts or events
+push.error.no.credentials = No credentials
+push.error.i.understand = OK, I understand
+
+
+push.errorCodes.bug = You found a bug! Please contact support.
+push.errorCodes = Errors:
+push.errorCode.i400 = APN 400 Bad request
+push.errorCode.i400+BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse the certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to the Bundle ID of your application
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403 Certificate error
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403 error: InvalidProviderToken. Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push.errorCode.i405 = APN 405 Bad method
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413 Payload too large
+push.errorCode.i413.desc = Message was too large and APN declined to deliver it.
+push.errorCode.i429 = APN 429 Too many requests
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500 Internal error
+push.errorCode.i500.desc = Apple server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.i503 = APN 503 Shutdown
+push.errorCode.i503.desc = Apple server unexpectedly decided to shutdown returning HTTP error 503. Please try again later.
+
+push.errorCode.a200 = FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push.errorCode.a200+InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push.errorCode.a200+MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push.errorCode.a200+InvalidDataKey.desc = Message contains invalid data key, please check:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push.errorCode.a200+TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push.errorCode.a400 = FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = FCM 500 Internal error
+push.errorCode.a500.desc = Google server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.a200+Unavailable.desc = Google server unexpectedly returned HTTP error 200+Unavailable. Please try again later.
+push.errorCode.a200+InternalServerError.desc = Google server unexpectedly returned HTTP error 200+InternalServerError. Please try again later.
+push.errorCode.a501 = FCM 501 Error
+push.errorCode.a502 = FCM 502 Error
+push.errorCode.a503 = FCM 503 Error
+push.errorCode.link.i = Apple docs
+push.errorCode.link.a = Google docs
+push.errorCode.skiptz = Too late to send
+push.errorCode.skiptz.desc = This much notifications have been discarded because time of arrival would be at least 60 minutes later than expected (either due to user's timezone, or due to networking issues).
+push.errorCode.del = Message deleted
+push.errorCode.del.desc = This much notifications have been discarded their message has been deleted.
+push.errorCode.aborted = Aborted
+push.errorCode.aborted.desc = This much messages have been removed from queue after an unrecoverable error. Please check error message above or contact support if there's no error message.
+push.errorCode.consent = Consent cancelled
+push.errorCode.consent.desc = This much messages have been removed from queue after user removed push consent.
+
+push.totals.processed = Processed
+push.totals.sent = Accepted
+push.totals.errors = Errors
+
+pu.po.users.s = {0} user
+pu.po.users.m = {0} users
+pu.po.metrics = Metrics
+pu.po.metrics.processed = Processed
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = Sent Successfully
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & FCM
+pu.po.metrics.sent.none = No notifications were sent! Please check message errors
+pu.po.metrics.sent.one = Your notification has been sent successfully!
+pu.po.metrics.sent.all = All notifications have been sent successfully!
+pu.po.metrics.actions = Actioned
+pu.po.metrics.actions.desc = How many users performed push notification action
+pu.po.metrics.actions.all = All users performed action! Good Job!
+pu.po.metrics.actions.performed = performed action.
+pu.po.metrics.actions0.performed = opened default URL.
+pu.po.metrics.actions1.performed = clicked first button.
+pu.po.metrics.actions2.performed = clicked second button.
+pu.po.left.to.send.s = {0} notification left to send
+pu.po.left.to.send.m = {0} notifications left to send
+pu.po.left.to.send.none = All notifications are sent!
+pu.po.left.to.send.batch = next batch will start at {0}
+pu.po.expired.s = {0} token expired
+pu.po.expired.m = {0} tokens expired
+pu.po.unset.s = {0} tokens expired
+pu.po.unset.m = {0} token expired
+pu.po.errors.s = {0} notification wasn\'t sent due to an error
+pu.po.errors.m = {0} notifications weren\'t sent due to an error
+
+pu.apn.uni = Universal Certificate (Production & Sandbox)
+pu.apn.none = None
+
+pu.gcm.gcm = FCM Key
+pu.gcm.none = None
+
+pu.remove = Remove credentials
+pu.validate = Validate
+pu.validating = Validating credentials
+pu.validation.error = Credentials error:
+pu.remove = Remove credentials
+pu.creds.none = None
+pu.creds.type.apn_universal = APN Universal Certificate is set
+pu.creds.type.apn_token = APN Auth Key is set
+pu.creds.type.gcm = FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase Server Key
+pu.creds.cert = P12 Certificate
+pu.creds.pass = Passphrase
+pu.creds.auth_key = P8 Key File
+pu.creds.key_id = Auth Key ID
+pu.creds.team_id = Team ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN Certificate (Sandbox & Production)
+pu.creds.apn.type.apn_token = APN Auth Key
+
+userdata.push = Push tokens
+pu.tk.id = APN Test token (development)
+pu.tk.ia = APN Test token (ad hoc or TestFlight)
+pu.tk.ip = APN Production token
+pu.tk.at = FCM Test token
+pu.tk.ap = FCM Production token
+pu.tk.ht = Huawei Test token
+pu.tk.hp = Huawei Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = Create Message
+pu.dash.btn-group.automated-message = Automated Message
+pu.dash.btn-group.automated-message-desc = Create an automated push campaign to send a message to users when their-in-app behaviour matches defined criteria.
+pu.dash.btn-group.automated-message-link = Learn more about automation
+pu.dash.btn-group.one-time-message = One-time Message
+pu.dash.btn-group.one-time-message-desc = Create a one-time push notification campaign to send right away on in the future.
+pu.dash.btn-group-available-in-enterprise = Available in enterprise edition
+pu.dash.btn.learn-more = Learn more about automation
+
+pu.po.tab1.trigger-type = Trigger Type
+pu.po.tab1.trigger-type.entry = Cohort Entry
+pu.po.tab1.trigger-type.exit = Cohort Exit
+pu.po.tab1.trigger-type.event = Performed Event
+pu.po.tab1.cohort-entry-desc = Triggered when user enters into any of the cohorts you select
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.cohort-event-desc = Triggered when user performs a selected event
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = Recalculation of cohorts above will trigger message sending process automatically
+pu.po.tab1.select-cohort-placeholder = Select cohorts(s)
+pu.po.tab1.select-event = Select one or more events to set a trigger
+pu.po.tab1.select-event-placeholder = Select event(s)
+pu.po.tab1.campaign-start-date = Campaign Start Date
+pu.po.tab1.additional-options = Additional Options
+pu.po.tab1.campaign-end-date = Campaign end date
+
+pu.po.tab2.delivery-method = Delivery method
+pu.po.tab2.delivery-method-desc = Choose when your message should be delivered
+pu.po.tab2.immediately = Immediately
+pu.po.tab2.immediately-desc = Deliver the message as soon as triggering cohort is recalculated
+pu.po.tab2.immediately-desc-event = Deliver the message as soon as triggering event reached the server
+pu.po.tab2.delayed = Delayed
+pu.po.tab2.delivery-time = Delivery time
+pu.po.tab2.delivery-time-desc = Set an optional delivery time for your message
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = Send in users' timezone at
+pu.po.tab2.select-time = Select time
+pu.po.tab2.capping = Capping
+pu.po.tab2.capping-desc = Configure number of messages per user. Enabling this option will limit number of messages sent to the same user.
+pu.po.tab2.capping.no = No capping
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered to or exited from the cohort
+pu.po.tab2.capping.no-desc-event = Message is sent whenever user's event is received by the server
+pu.po.tab2.capping.yes = Capped
+pu.po.tab2.capping.yes-desc = Number of messages is limited
+pu.po.tab2.message-per-user = Maximum messages per user
+pu.po.tab2.message-per-user-desc = Total number of messages individual user can receive from this campaign
+pu.po.tab2.sleep = Minimum time between messages
+pu.po.tab2.sleep-desc = User will be eligible to receive a repetitive message only if she / he triggers the campaign conditions at least configured time after previous message.
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = App
+pu.po.tab4.campaign-rules = Campaign Rules
+pu.po.tab4.trigger-type = Trigger Type
+pu.po.tab4.trigger-cohort-entry = Cohort entry
+pu.po.tab4.trigger-cohort-exit = Cohort exit
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = Cohort
+pu.po.tab4.cohorts.m = Cohorts ({0})
+pu.po.tab4.events.no = Events(s) were deleted
+pu.po.tab4.events.s = Event
+pu.po.tab4.events.m = Events ({0})
+pu.po.tab4.caping = Capping
+pu.po.tab4.caping-message = At most {0} message is going to be sent per user
+pu.po.tab4.message-content = Message Content
+pu.po.tab4.message-title = Title
+pu.po.tab4.message-text = Text
+pu.po.tab4.message-sound = Sound
+pu.po.tab4.message-media = Media
+pu.po.tab4.message-badge = Badge
+
+push.po.one-time-messages = ONE-TIME MESSAGES
+push.po.automated-messages = AUTOMATED MESSAGES
+push.po.table.dublicate = Duplicate
+push.po.table.resend = Resend failed notifications
+push.po.table.edit = Edit
+push.po.table.delete = Delete
+push.po.table.recipients = View recipients
+
+pu.po.progress = Progress
+pu.po.progress.auto = 30 days overview
+pu.never = Never
+pu.days.s = day
+pu.days.m = days
+pu.hours.s = hour
+pu.hours.m =hours
+pu.messages.s = message
+pu.messages.m = messages
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
+
+push.proxyhost = Proxy Hostname
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxypass = Proxy Password
+
+push.note.gcm.t = Your push notifications can't be delivered
+push.note.gcm.m = Following apps have GCM credentials instead of Firebase ones: {0}.
Usage of GCM is no longer possible since Google stopped accepting requests to GCM endpoint.
Please update app credentials to a valid FCM server key.
+
+mail.autopush-error-subject = Countly Automated Push Problem
+mail.autopush-error = Hi {0},
Your automated message cannot be sent due to a repeating error. Please review message status and reactivate the message once the problem is resolved.
Best,
A fellow Countly Admin
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
diff --git a/plugins/push/frontend/public/localization/push_nb_NO.properties b/plugins/push/frontend/public/localization/push_nb_NO.properties
new file mode 100644
index 00000000000..0089ddd82fa
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_nb_NO.properties
@@ -0,0 +1,457 @@
+push-notification.title = Push Notifications
+push-notification.description = An overview of all push notifications sent and actions performed in response.
+push-notification.one-time = One-time Notifications
+push-notification.automated = Automated Notifications
+push-notification.transactional = API Notifications
+push-notification.total-app-users = Total App Users
+push-notification.enabled-users = Notification-enabled Users
+push-notification.enabled-users-percentage = Enabled Users Percentage
+push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
+push-notification.platform-filter-label-one-time = One-time notifications for
+push-notification.platform-filter-label-automatic = Automatic notificatons for
+push-notification.platform-filter-label-transactional = Transactional notifications for
+push-notification.platform-filter-all = All Platforms
+push-notification.platform-filter-android = Android
+push-notification.platform-filter-ios = IOS
+push-notification.status-filter-all = All Messages
+push-notification.create-button = New Message
+push-notification.time-period = TIME PERIOD
+push-notification.created-by = Created by
+push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
+push-notification.sent-serie-name = Notifications Sent
+push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
+push-notification.actions-performed-serie-name = Actions Performed
+push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
+push-notification.table-notification-name = Notificaton name
+push-notification.table-status = Status
+push-notification.table-created = Created
+push-notification.table-date-sent = Date Sent/Scheduled
+push-notification.table-sent = Sent
+push-notification.table-actioned = Actioned
+push-notification.table-created-by = Created By
+push-notification.table-message-content = Message Content
+push-notification.duplicate = Duplicate
+push-notification.delete = Delete
+push-notification.resend = Resend
+push-notification.approve = Approve
+push-notification.reject = Reject
+push-notification.start = Start
+push-notification.stop = Stop
+push-notification.edit-draft = Edit Draft
+push-notification.edit = Edit
+push-notification.sent = Sent
+push-notification.sending = Sending
+push-notification.created = Created
+push-notification.draft = Draft
+push-notification.waiting-for-approval = Waiting for approval
+push-notification.aborted = Aborted
+push-notification.failed = Failed
+push-notification.stopped = Stopped
+push-notification.scheduled = Scheduled
+push-notification.rejected = Rejected
+push-notification.time-chart-period-weekly = Weekly
+push-notification.time-chart-period-monthly = Monthly
+push-notification.time-chart-period-daily= Daily
+push-notification.now = Now
+push-notification.right-before-sending-the-message = Right before sending the message
+push-notification.segmented-push-enabled-users = Segmented push-enabled users
+push-notification.delivery-type = Delivery Type
+push-notification.delivery-timeframe = Delivery Timeframe
+push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
+push-notification.trigger-type = Trigger Type
+push-notification.ios-badge-number-setting = IOS badge number
+push-notification.ios-json-data-setting = IOS JSON data
+push-notification.ios-user-data-setting = IOS user data
+push-notification.android-badge-number-setting = Android badge number
+push-notification.android-json-data-setting = Android JSON data
+push-notification.android-user-data-setting = Android user data
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
+push-notification.android = Android
+push-notification.ios = iOS
+
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
+push-notification.save = Save
+push-notification.send-for-approval = Send for approval
+push-notification.save-as-draft = Save as draft
+push-notification.create-one-time-notification = Create One-Time Push Notification
+push-notification.create-automated-notification = Create Automated Push Notification
+push-notification.create-transactional-notification = Create API Push Notification
+push-notification.notification-name = Notification Name
+push-notification.notification-name-description = Set the name of push notification (optional).
+push-notification.enter-notification-name = Enter Notification Name
+push-notification.platforms = Platforms
+push-notification.android = Android
+push-notification.ios = iOS
+push-notification.targeting = Targeting
+push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
+push-notification.all-push-enabled-users = All push-enabled users
+push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
+push-notification.use-segmentation = Use segmentation
+push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
+push-notification.push-enabled-users = Push-enabled users
+push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
+push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
+push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
+push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
+push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
+push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
+push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
+push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-location = Please select a location
+push-notification.when-to-determine-users = When to determine the users?
+push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
+push-notification.determine-users-before = Determine users right before sending the message
+push-notification.determine-users-now = Determine users now
+push-notification.triggers = Triggers
+push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
+push-notification.cohorts-entry = Cohort(s) entry
+push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
+push-notification.cohorts-exit = Cohort(s) exit
+push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
+push-notification.performed-events = Performed Event(s)
+push-notification.performed-events-description = Triggered when user performs a selected event.
+push-notification.select-event = Please select an event
+push-notification.cohorts = Cohort(s)
+push-notification.geolocations = Geolocation(s)
+push-notification.events = Event(s)
+push-notification.delivery-date-calculation = Delivery date calculation
+push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
+push-notification.start-date = Start date
+push-notification.set-start-date = Set Start Date
+push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
+push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
+push-notification.end-date = End date
+push-notification.set-end-date = Set End Date
+push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
+push-notification.delivery-method = Delivery Method
+push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
+push-notification.capping = Capping
+push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
+push-notification.no-capping = No Capping
+push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
+push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
+push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
+push-notification.send-anyway = Send anyway
+push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
+push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
+push-notification.send-now = Send now
+push-notification.send-now-description = Send the push notification immediately, once composition is complete.
+push-notification.scheduled = Scheduled
+push-notification.schedule-for-later = Schedule for later
+push-notification.delivery-time = Delivery Time
+push-notification.delivery-time-tooltip = Set an optional delivery time for your message
+push-notification.timezone = Timezone
+push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
+push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
+push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
+push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
+push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
+push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
+push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
+push-notification.do-not-send-message = Do not send the message
+push-notification.deliver-next-day = Deliver the message next day
+push-notification.immediately = Immediately
+push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
+push-notification.delayed = Delayed
+push-notification.days = Days
+push-notification.hours = Hours
+push-notification.capped = Capped
+push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
+push-notification.maximum-messages-per-user = Maximum messages per user
+push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
+push-notification.messages = Messages
+push-notification.minimum-time-between-messages = Minimum time between messages
+push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
+push-notification.expiration-time = Expiration Time
+push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
+push-notification.notification-type = NOTIFICATION TYPE
+push-notification.compose-message = Compose Message
+push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
+push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
+push-notification.default-message-is-required = Default message is required
+push-notification.content-message = Content message
+push-notification.silent-message = Silent message
+push-notification.message-title = Message title
+push-notification.add-variable = Add Variable
+push-notification.message-content = Message Content
+push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
+push-notification.buttons = Buttons
+push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
+push-notification.add-first-button = +Add First button
+push-notification.add-second-button = +Add Second button
+push-notification.enter-x-button = Enter xButton
+push-notification.enter-button-url = Enter Button URL or Deeplink
+push-notification.media-url = Media URL
+push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
+push-notification.enter-media-url = Enter Media URL
+push-notification.platform-settings = Platform Settings
+push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
+push-notification.sound-file-name = Sound File Name
+push-notification.enter-sound-file-name = Enter sound file name
+push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
+push-notification.add-badge-number = Add Badge Number
+push-notification.enter-badge-number = Enter badge number
+push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
+push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
+push-notification.subtitle = Subtitle
+push-notification.enter-your-subtitle = Enter your subtitle
+push-notification.subtitle-description = Add a subheading for your message.
+push-notification.on-click-url = On Click URL
+push-notification.enter-on-click-url = Enter on click URL
+push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
+push-notification.send-json = Send JSON
+push-notification.enter-json-data = Enter JSON data
+push-notification.send-json-description = Add app-specific JSON data along with standard content.
+push-notification.send-user-data = Send User Data
+push-notification.select-user-data = Select user data
+push-notification.send-user-data-description = Select user properties to send in your notification payload.
+push-notification.icon = Icon
+push-notification.icon-description = Set Android notification icon.
+push-notification.enter-icon = Enter icon
+push-notification.review-message = Review Mesage
+push-notification.review-message-tooltip = Review all the details of you push notification.
+push-notification.message-name = Message name
+push-notification.review-title = Title
+push-notification.content = Content
+push-notification.button-text = Button Text
+push-notification.button-url = Button URL
+push-notification.ios-media-url = iOS Media URL
+push-notification.android-media-url = Android Media URL
+push-notification.ios-badge-number = IOS badge number
+push-notification.ios-json-data = iOS JSON data
+push-notification.ios-user-data = iOS user data
+push-notification.android-badge-number = Android badge number
+push-notification.android-json-data = Android JSON data
+push-notification.android-user-data = Android user data
+push-notification.current-number-of-users = Current number of users
+push-notification.when-to-determine = When to determine
+push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
+push-notification.delivery = Delivery
+push-notification.delivery-description = Select the time you want the notification to be sent to users.
+push-notification.scheduled-for = Scheduled for
+push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
+push-notification.maximum-messages = Maximum {0} messages
+push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
+push-notification.confirmation = Confirmation
+push-notification.testing = TESTING
+push-notification.you-can-send-the-test-message = You can send the test message to test users
+push-notification.testing-tooltip = Sends the push notification to applications' test users
+push-notification.send-to-test-users = Send to test users
+push-notification.confirmation-uppercase = CONFIRMATION
+push-notification.confirmation-uppercase-description = CONFIRMATION description
+push-notification.i-am-ready-to-send = I am ready to send this message to real-users
+push-notification.was-successfully-saved = Push notification message was successfully saved
+push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
+push-notification.was-successfully-approved = Push notification has been successfully approved
+push-notification.was-successfully-rejected = Push notification has been successfully rejected
+push-notification.was-successfully-deleted = Push notification was successfully deleted
+push-notification.was-successfully-started = Push notification was successfully started
+push-notification.was-successfully-stopped = Push notification was successfully stopped
+
+# Add user property
+push-notification.event-properties = Event Properties
+push-notification.user-properties = User Properties
+push-notification.custom-properties = Custom Properties
+push-notification.add-user-property = Add User Property
+push-notification.api-property = Add User Property
+push-notification.search-in-properties = Search in Properties
+push-notification.select-property = Select Property
+push-notification.enter-value = Enter Value
+push-notification.start-with-capital-letter = Make user property start with capital letter
+push-notification.fallback-value = Fallback value
+push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
+push-notification.remove = Remove
+push-notification.confirm = Confirm
+push-notification.internal-properties = Internal Properties
+push-notification.external-properties = External Properties
+push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
+
+
+# Details
+push-notification-details.back-to = Back to Push Notifications
+push-notification-details.localization-filter-label = LOCALIZATION
+push-notification-details.localization-filter-all = All Localizations
+push-notification-details.summary-header = Notification Summary
+push-notification-details.summary-header-description = Overview of the notification message and its details.
+push-notification-details.message-tab = Message Content
+push-notification-details.targeting-tab = Targeting & Delivery
+push-notification-details.errors-tab = Errors
+push-notification-details.users-targeted-chart = Users Targeted
+push-notification-details.sent-messages-chart = Sent Messages
+push-notification-details.and-label = and
+push-notification-details.message-id = Message ID
+push-notification-details.results-for = Results for
+push-notification-details.created = Created
+push-notification-details.created-by = Created {0} by {1}
+
+push-notification-details.message-title = Title
+push-notification-details.message-content = Content
+push-notification-details.message-first-button-label = First Button Text
+push-notification-details.message-first-button-url = First Button URL
+push-notification-details.message-second-button-label = Second Button Text
+push-notification-details.message-second-button-url = Second Button URL
+push-notification-details.message-media-url = Media URL
+push-notification-details.ios-message-media-url = IOS media URL
+push-notification-details.android-message-media-url = Android media URL
+
+push-notification-details.targeting-sub-header = Targeting
+push-notification-details.targeted-users = Targeted users
+push-notification-details.geolocation = Geolocation
+push-notification-details.when-to-determine = When to determine
+push-notification-details.delivery-sub-header = Delivery
+push-notification-details.delivery-type = Delivery type
+push-notification-details.scheduled-for = Scheduled for
+push-notification-details.expiration-time = Expiration time
+push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
+push-notification-details.no-errors-found = No errors were found
+push-notification.users-targeted = Users Targeted
+push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
+push-notification.sent-notifications = Sent Notifications
+push-notification.sent-notifications-description = Total number of notifications sent.
+push-notification.clicked-notifications = Clicked Notifications
+push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
+push-notification.failed = Failed
+push-notification.failed-description = Total number of notifications that failed to get delivered.
+push-notification.no-errors-found = There are no errors found
+push-notification.affected-users = Affected Users
+push-notification.error-description = Description
+push-notification.error-code = Error Code
+push-notification.users = Users
+push-notification.back-to-push-notification-details = Back to push notification
+
+# Mobile Preview Component
+push-notification.mobile-preview-default-app-name = Your application name
+push-notification.mobile-preview-default-title = Your message title
+push-notification.mobile-preview-default-content = Your message content
+
+# Application settings
+push-notification.ios-settings = iOS settings
+push-notification.authentication-type = Authentication type
+push-notification.key-file-p8 = Key file (P8)
+push-notification.key-file-p12 = Sandbox + Production certificate (P12)
+push-notification.key-file-already-uploaded = Key file {0} is already uploaded
+push-notification.choose-file = Choose File
+push-notification.key-id = Key ID
+push-notification.team-id = Team ID
+push-notification.bundle-id = Bundle ID
+push-notification.passphrase = Passphrase
+push-notification.android-settings = Android (Google FCM)
+push-notification.firebase-key = Firebase key
+push-notification.huawei-settings = Android (Huawei Push Kit)
+push-notification.huawei-app-id = App ID
+push-notification.huawei-app-secret = App Secret
+push-notification.rate-limit = Rate limit
+push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
+push-notification.period-in-seconds = Period duration (seconds)
+push-notification.test-users = Test users
+push-notification.test-users-description = Test users description
+push-notification.define-new-user = +Define New User
+push-notification.user-definition = User Definition
+push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
+push-notification.see-user-list = See User List
+push-notification.define-new-user-title = Define New User
+push-notification.add-test-users-label = Add Users
+push-notification.definition-type = Definition Type
+push-notification.define-with-user-id = Define with User ID
+push-notification.define-with-cohort = Define with Cohort
+push-notification.enter-user-id = Enter User ID
+push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
+push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-cohort = Please select a cohort
+push-notification.user-list = User List
+push-notification.username = Username
+push-notification.user-id = User ID
+push-notification.cohort-name = Cohort Name
+push-notification.cancel = Cancel
+push-notification.i-understand-delete-key = I understand, delete this key
+push-notification.delete-key = Delete Key
+push-notification.test-users-were-successfully-removed = Test users have been successfully removed
+push-notification.test-users-were-successfully-added = Test users have been successfully added
+
+#Global settinsg
+push.plugin-title = Push Notifications
+push.proxyhost = Proxy Hostname
+push.proxypass = Proxy Password
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
+push.proxyunauthorized = Do NOT check proxy HTTPS certificate
+push.sendahead = Send notifications scheduled up to this many ms into the future
+push.connection_retries = Number of connection retries
+push.connection_factor = Time factor for exponential backoff between retries
+push.pool_pushes = Number of notifications in stream batches
+push.pool_bytes = Bytes in binary stream batches
+push.pool_concurrency = Maximum number of same type connections
+push.pool_pools = Maximum number of connections in total
+
+#Drawer from other views
+push-notification.send-message-to-users = Send message to users
+push-notification.select-max-two-metrics = Select maximum 2 metrics
+# Error codes
+push-notification.error-code.400.desc = 400 Bad request
+push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
+push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
+push-notification.error-code.405.desc = 405 Bad Method
+push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
+push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
+push-notification.error-code.500.desc = 500 Server error. Please try again later.
+push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
+push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
+push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
+push-notification.error-code.NoApp.desc = App not found when sending the notification.
+push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
+push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
+push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
+push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
+push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
+push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
+push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push-notification.error-code.MissingRegistration.desc = Please contact customer support.
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
+push-notification.error-code.InvalidTtl.desc = Please contact customer support.
+push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
+push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
+push-notification.error-code.NotRegistered.desc = FCM token expired
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
+push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
+push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
+push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
+push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
+push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
+
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.del = Message deleted
+push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
+push-notification.error-code.consent = Consent cancelled
+push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
+push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
+push-notification.error-code.aborted = Aborted
+push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
+push-notification.error-code.ExpiredToken = Expired Token
+push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
+
+# System Logs
+systemlogs.action.push_message_created = Push Notification created
+systemlogs.action.push_message_draft = Draft Push Notification created
+systemlogs.action.push_credentials_update = Push Credentials updated
+systemlogs.action.push_message_deleted = Push Notification deleted
+systemlogs.action.push_message_updated = Push Notification updated
+systemlogs.action.push_message_activated = Push Notification activated
+systemlogs.action.push_message_deactivated = Push Notification deactivated
+systemlogs.action.push_message_test = Test Push Notification sent
diff --git a/plugins/push/frontend/public/localization/push_nl_NL.properties b/plugins/push/frontend/public/localization/push_nl_NL.properties
new file mode 100644
index 00000000000..0089ddd82fa
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_nl_NL.properties
@@ -0,0 +1,457 @@
+push-notification.title = Push Notifications
+push-notification.description = An overview of all push notifications sent and actions performed in response.
+push-notification.one-time = One-time Notifications
+push-notification.automated = Automated Notifications
+push-notification.transactional = API Notifications
+push-notification.total-app-users = Total App Users
+push-notification.enabled-users = Notification-enabled Users
+push-notification.enabled-users-percentage = Enabled Users Percentage
+push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
+push-notification.platform-filter-label-one-time = One-time notifications for
+push-notification.platform-filter-label-automatic = Automatic notificatons for
+push-notification.platform-filter-label-transactional = Transactional notifications for
+push-notification.platform-filter-all = All Platforms
+push-notification.platform-filter-android = Android
+push-notification.platform-filter-ios = IOS
+push-notification.status-filter-all = All Messages
+push-notification.create-button = New Message
+push-notification.time-period = TIME PERIOD
+push-notification.created-by = Created by
+push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
+push-notification.sent-serie-name = Notifications Sent
+push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
+push-notification.actions-performed-serie-name = Actions Performed
+push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
+push-notification.table-notification-name = Notificaton name
+push-notification.table-status = Status
+push-notification.table-created = Created
+push-notification.table-date-sent = Date Sent/Scheduled
+push-notification.table-sent = Sent
+push-notification.table-actioned = Actioned
+push-notification.table-created-by = Created By
+push-notification.table-message-content = Message Content
+push-notification.duplicate = Duplicate
+push-notification.delete = Delete
+push-notification.resend = Resend
+push-notification.approve = Approve
+push-notification.reject = Reject
+push-notification.start = Start
+push-notification.stop = Stop
+push-notification.edit-draft = Edit Draft
+push-notification.edit = Edit
+push-notification.sent = Sent
+push-notification.sending = Sending
+push-notification.created = Created
+push-notification.draft = Draft
+push-notification.waiting-for-approval = Waiting for approval
+push-notification.aborted = Aborted
+push-notification.failed = Failed
+push-notification.stopped = Stopped
+push-notification.scheduled = Scheduled
+push-notification.rejected = Rejected
+push-notification.time-chart-period-weekly = Weekly
+push-notification.time-chart-period-monthly = Monthly
+push-notification.time-chart-period-daily= Daily
+push-notification.now = Now
+push-notification.right-before-sending-the-message = Right before sending the message
+push-notification.segmented-push-enabled-users = Segmented push-enabled users
+push-notification.delivery-type = Delivery Type
+push-notification.delivery-timeframe = Delivery Timeframe
+push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
+push-notification.trigger-type = Trigger Type
+push-notification.ios-badge-number-setting = IOS badge number
+push-notification.ios-json-data-setting = IOS JSON data
+push-notification.ios-user-data-setting = IOS user data
+push-notification.android-badge-number-setting = Android badge number
+push-notification.android-json-data-setting = Android JSON data
+push-notification.android-user-data-setting = Android user data
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
+push-notification.android = Android
+push-notification.ios = iOS
+
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
+push-notification.save = Save
+push-notification.send-for-approval = Send for approval
+push-notification.save-as-draft = Save as draft
+push-notification.create-one-time-notification = Create One-Time Push Notification
+push-notification.create-automated-notification = Create Automated Push Notification
+push-notification.create-transactional-notification = Create API Push Notification
+push-notification.notification-name = Notification Name
+push-notification.notification-name-description = Set the name of push notification (optional).
+push-notification.enter-notification-name = Enter Notification Name
+push-notification.platforms = Platforms
+push-notification.android = Android
+push-notification.ios = iOS
+push-notification.targeting = Targeting
+push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
+push-notification.all-push-enabled-users = All push-enabled users
+push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
+push-notification.use-segmentation = Use segmentation
+push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
+push-notification.push-enabled-users = Push-enabled users
+push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
+push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
+push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
+push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
+push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
+push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
+push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
+push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-location = Please select a location
+push-notification.when-to-determine-users = When to determine the users?
+push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
+push-notification.determine-users-before = Determine users right before sending the message
+push-notification.determine-users-now = Determine users now
+push-notification.triggers = Triggers
+push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
+push-notification.cohorts-entry = Cohort(s) entry
+push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
+push-notification.cohorts-exit = Cohort(s) exit
+push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
+push-notification.performed-events = Performed Event(s)
+push-notification.performed-events-description = Triggered when user performs a selected event.
+push-notification.select-event = Please select an event
+push-notification.cohorts = Cohort(s)
+push-notification.geolocations = Geolocation(s)
+push-notification.events = Event(s)
+push-notification.delivery-date-calculation = Delivery date calculation
+push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
+push-notification.start-date = Start date
+push-notification.set-start-date = Set Start Date
+push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
+push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
+push-notification.end-date = End date
+push-notification.set-end-date = Set End Date
+push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
+push-notification.delivery-method = Delivery Method
+push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
+push-notification.capping = Capping
+push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
+push-notification.no-capping = No Capping
+push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
+push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
+push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
+push-notification.send-anyway = Send anyway
+push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
+push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
+push-notification.send-now = Send now
+push-notification.send-now-description = Send the push notification immediately, once composition is complete.
+push-notification.scheduled = Scheduled
+push-notification.schedule-for-later = Schedule for later
+push-notification.delivery-time = Delivery Time
+push-notification.delivery-time-tooltip = Set an optional delivery time for your message
+push-notification.timezone = Timezone
+push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
+push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
+push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
+push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
+push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
+push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
+push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
+push-notification.do-not-send-message = Do not send the message
+push-notification.deliver-next-day = Deliver the message next day
+push-notification.immediately = Immediately
+push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
+push-notification.delayed = Delayed
+push-notification.days = Days
+push-notification.hours = Hours
+push-notification.capped = Capped
+push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
+push-notification.maximum-messages-per-user = Maximum messages per user
+push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
+push-notification.messages = Messages
+push-notification.minimum-time-between-messages = Minimum time between messages
+push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
+push-notification.expiration-time = Expiration Time
+push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
+push-notification.notification-type = NOTIFICATION TYPE
+push-notification.compose-message = Compose Message
+push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
+push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
+push-notification.default-message-is-required = Default message is required
+push-notification.content-message = Content message
+push-notification.silent-message = Silent message
+push-notification.message-title = Message title
+push-notification.add-variable = Add Variable
+push-notification.message-content = Message Content
+push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
+push-notification.buttons = Buttons
+push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
+push-notification.add-first-button = +Add First button
+push-notification.add-second-button = +Add Second button
+push-notification.enter-x-button = Enter xButton
+push-notification.enter-button-url = Enter Button URL or Deeplink
+push-notification.media-url = Media URL
+push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
+push-notification.enter-media-url = Enter Media URL
+push-notification.platform-settings = Platform Settings
+push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
+push-notification.sound-file-name = Sound File Name
+push-notification.enter-sound-file-name = Enter sound file name
+push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
+push-notification.add-badge-number = Add Badge Number
+push-notification.enter-badge-number = Enter badge number
+push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
+push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
+push-notification.subtitle = Subtitle
+push-notification.enter-your-subtitle = Enter your subtitle
+push-notification.subtitle-description = Add a subheading for your message.
+push-notification.on-click-url = On Click URL
+push-notification.enter-on-click-url = Enter on click URL
+push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
+push-notification.send-json = Send JSON
+push-notification.enter-json-data = Enter JSON data
+push-notification.send-json-description = Add app-specific JSON data along with standard content.
+push-notification.send-user-data = Send User Data
+push-notification.select-user-data = Select user data
+push-notification.send-user-data-description = Select user properties to send in your notification payload.
+push-notification.icon = Icon
+push-notification.icon-description = Set Android notification icon.
+push-notification.enter-icon = Enter icon
+push-notification.review-message = Review Mesage
+push-notification.review-message-tooltip = Review all the details of you push notification.
+push-notification.message-name = Message name
+push-notification.review-title = Title
+push-notification.content = Content
+push-notification.button-text = Button Text
+push-notification.button-url = Button URL
+push-notification.ios-media-url = iOS Media URL
+push-notification.android-media-url = Android Media URL
+push-notification.ios-badge-number = IOS badge number
+push-notification.ios-json-data = iOS JSON data
+push-notification.ios-user-data = iOS user data
+push-notification.android-badge-number = Android badge number
+push-notification.android-json-data = Android JSON data
+push-notification.android-user-data = Android user data
+push-notification.current-number-of-users = Current number of users
+push-notification.when-to-determine = When to determine
+push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
+push-notification.delivery = Delivery
+push-notification.delivery-description = Select the time you want the notification to be sent to users.
+push-notification.scheduled-for = Scheduled for
+push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
+push-notification.maximum-messages = Maximum {0} messages
+push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
+push-notification.confirmation = Confirmation
+push-notification.testing = TESTING
+push-notification.you-can-send-the-test-message = You can send the test message to test users
+push-notification.testing-tooltip = Sends the push notification to applications' test users
+push-notification.send-to-test-users = Send to test users
+push-notification.confirmation-uppercase = CONFIRMATION
+push-notification.confirmation-uppercase-description = CONFIRMATION description
+push-notification.i-am-ready-to-send = I am ready to send this message to real-users
+push-notification.was-successfully-saved = Push notification message was successfully saved
+push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
+push-notification.was-successfully-approved = Push notification has been successfully approved
+push-notification.was-successfully-rejected = Push notification has been successfully rejected
+push-notification.was-successfully-deleted = Push notification was successfully deleted
+push-notification.was-successfully-started = Push notification was successfully started
+push-notification.was-successfully-stopped = Push notification was successfully stopped
+
+# Add user property
+push-notification.event-properties = Event Properties
+push-notification.user-properties = User Properties
+push-notification.custom-properties = Custom Properties
+push-notification.add-user-property = Add User Property
+push-notification.api-property = Add User Property
+push-notification.search-in-properties = Search in Properties
+push-notification.select-property = Select Property
+push-notification.enter-value = Enter Value
+push-notification.start-with-capital-letter = Make user property start with capital letter
+push-notification.fallback-value = Fallback value
+push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
+push-notification.remove = Remove
+push-notification.confirm = Confirm
+push-notification.internal-properties = Internal Properties
+push-notification.external-properties = External Properties
+push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
+
+
+# Details
+push-notification-details.back-to = Back to Push Notifications
+push-notification-details.localization-filter-label = LOCALIZATION
+push-notification-details.localization-filter-all = All Localizations
+push-notification-details.summary-header = Notification Summary
+push-notification-details.summary-header-description = Overview of the notification message and its details.
+push-notification-details.message-tab = Message Content
+push-notification-details.targeting-tab = Targeting & Delivery
+push-notification-details.errors-tab = Errors
+push-notification-details.users-targeted-chart = Users Targeted
+push-notification-details.sent-messages-chart = Sent Messages
+push-notification-details.and-label = and
+push-notification-details.message-id = Message ID
+push-notification-details.results-for = Results for
+push-notification-details.created = Created
+push-notification-details.created-by = Created {0} by {1}
+
+push-notification-details.message-title = Title
+push-notification-details.message-content = Content
+push-notification-details.message-first-button-label = First Button Text
+push-notification-details.message-first-button-url = First Button URL
+push-notification-details.message-second-button-label = Second Button Text
+push-notification-details.message-second-button-url = Second Button URL
+push-notification-details.message-media-url = Media URL
+push-notification-details.ios-message-media-url = IOS media URL
+push-notification-details.android-message-media-url = Android media URL
+
+push-notification-details.targeting-sub-header = Targeting
+push-notification-details.targeted-users = Targeted users
+push-notification-details.geolocation = Geolocation
+push-notification-details.when-to-determine = When to determine
+push-notification-details.delivery-sub-header = Delivery
+push-notification-details.delivery-type = Delivery type
+push-notification-details.scheduled-for = Scheduled for
+push-notification-details.expiration-time = Expiration time
+push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
+push-notification-details.no-errors-found = No errors were found
+push-notification.users-targeted = Users Targeted
+push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
+push-notification.sent-notifications = Sent Notifications
+push-notification.sent-notifications-description = Total number of notifications sent.
+push-notification.clicked-notifications = Clicked Notifications
+push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
+push-notification.failed = Failed
+push-notification.failed-description = Total number of notifications that failed to get delivered.
+push-notification.no-errors-found = There are no errors found
+push-notification.affected-users = Affected Users
+push-notification.error-description = Description
+push-notification.error-code = Error Code
+push-notification.users = Users
+push-notification.back-to-push-notification-details = Back to push notification
+
+# Mobile Preview Component
+push-notification.mobile-preview-default-app-name = Your application name
+push-notification.mobile-preview-default-title = Your message title
+push-notification.mobile-preview-default-content = Your message content
+
+# Application settings
+push-notification.ios-settings = iOS settings
+push-notification.authentication-type = Authentication type
+push-notification.key-file-p8 = Key file (P8)
+push-notification.key-file-p12 = Sandbox + Production certificate (P12)
+push-notification.key-file-already-uploaded = Key file {0} is already uploaded
+push-notification.choose-file = Choose File
+push-notification.key-id = Key ID
+push-notification.team-id = Team ID
+push-notification.bundle-id = Bundle ID
+push-notification.passphrase = Passphrase
+push-notification.android-settings = Android (Google FCM)
+push-notification.firebase-key = Firebase key
+push-notification.huawei-settings = Android (Huawei Push Kit)
+push-notification.huawei-app-id = App ID
+push-notification.huawei-app-secret = App Secret
+push-notification.rate-limit = Rate limit
+push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
+push-notification.period-in-seconds = Period duration (seconds)
+push-notification.test-users = Test users
+push-notification.test-users-description = Test users description
+push-notification.define-new-user = +Define New User
+push-notification.user-definition = User Definition
+push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
+push-notification.see-user-list = See User List
+push-notification.define-new-user-title = Define New User
+push-notification.add-test-users-label = Add Users
+push-notification.definition-type = Definition Type
+push-notification.define-with-user-id = Define with User ID
+push-notification.define-with-cohort = Define with Cohort
+push-notification.enter-user-id = Enter User ID
+push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
+push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-cohort = Please select a cohort
+push-notification.user-list = User List
+push-notification.username = Username
+push-notification.user-id = User ID
+push-notification.cohort-name = Cohort Name
+push-notification.cancel = Cancel
+push-notification.i-understand-delete-key = I understand, delete this key
+push-notification.delete-key = Delete Key
+push-notification.test-users-were-successfully-removed = Test users have been successfully removed
+push-notification.test-users-were-successfully-added = Test users have been successfully added
+
+#Global settinsg
+push.plugin-title = Push Notifications
+push.proxyhost = Proxy Hostname
+push.proxypass = Proxy Password
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
+push.proxyunauthorized = Do NOT check proxy HTTPS certificate
+push.sendahead = Send notifications scheduled up to this many ms into the future
+push.connection_retries = Number of connection retries
+push.connection_factor = Time factor for exponential backoff between retries
+push.pool_pushes = Number of notifications in stream batches
+push.pool_bytes = Bytes in binary stream batches
+push.pool_concurrency = Maximum number of same type connections
+push.pool_pools = Maximum number of connections in total
+
+#Drawer from other views
+push-notification.send-message-to-users = Send message to users
+push-notification.select-max-two-metrics = Select maximum 2 metrics
+# Error codes
+push-notification.error-code.400.desc = 400 Bad request
+push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
+push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
+push-notification.error-code.405.desc = 405 Bad Method
+push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
+push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
+push-notification.error-code.500.desc = 500 Server error. Please try again later.
+push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
+push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
+push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
+push-notification.error-code.NoApp.desc = App not found when sending the notification.
+push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
+push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
+push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
+push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
+push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
+push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
+push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push-notification.error-code.MissingRegistration.desc = Please contact customer support.
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
+push-notification.error-code.InvalidTtl.desc = Please contact customer support.
+push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
+push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
+push-notification.error-code.NotRegistered.desc = FCM token expired
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
+push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
+push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
+push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
+push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
+push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
+
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.del = Message deleted
+push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
+push-notification.error-code.consent = Consent cancelled
+push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
+push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
+push-notification.error-code.aborted = Aborted
+push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
+push-notification.error-code.ExpiredToken = Expired Token
+push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
+
+# System Logs
+systemlogs.action.push_message_created = Push Notification created
+systemlogs.action.push_message_draft = Draft Push Notification created
+systemlogs.action.push_credentials_update = Push Credentials updated
+systemlogs.action.push_message_deleted = Push Notification deleted
+systemlogs.action.push_message_updated = Push Notification updated
+systemlogs.action.push_message_activated = Push Notification activated
+systemlogs.action.push_message_deactivated = Push Notification deactivated
+systemlogs.action.push_message_test = Test Push Notification sent
diff --git a/plugins/push/frontend/public/localization/push_pl.properties b/plugins/push/frontend/public/localization/push_pl.properties
index a08fc2a3f7a..712642eebb4 100644
--- a/plugins/push/frontend/public/localization/push_pl.properties
+++ b/plugins/push/frontend/public/localization/push_pl.properties
@@ -1,536 +1,491 @@
-push-notification.title = Push Notifications
-push-notification.description = An overview of all push notifications sent and actions performed in response.
-push-notification.one-time = One-time Notifications
-push-notification.automated = Automated Notifications
-push-notification.transactional = API Notifications
-push-notification.total-app-users = Total App Users
-push-notification.enabled-users = Notification-enabled Users
-push-notification.enabled-users-percentage = Enabled Users Percentage
-push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
-push-notification.platform-filter-label-one-time = One-time notifications for
-push-notification.platform-filter-label-automatic = Automatic notificatons for
-push-notification.platform-filter-label-transactional = Transactional notifications for
-push-notification.platform-filter-all = All Platforms
-push-notification.platform-filter-android = Android
-push-notification.platform-filter-ios = IOS
-push-notification.status-filter-all = All Messages
-push-notification.create-button = New Message
-push-notification.time-period = TIME PERIOD
-push-notification.created-by = Created by
-push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
-push-notification.sent-serie-name = Notifications Sent
-push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
-push-notification.actions-performed-serie-name = Actions Performed
-push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
-push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
-push-notification.table-status = Status
-push-notification.table-created = Created
-push-notification.table-date-sent = Date Sent/Scheduled
-push-notification.table-sent = Sent
-push-notification.table-actioned = Actioned
-push-notification.table-created-by = Created By
-push-notification.table-message-content = Message Content
-push-notification.duplicate = Duplicate
-push-notification.delete = Delete
-push-notification.resend = Resend
-push-notification.approve = Approve
-push-notification.reject = Reject
-push-notification.start = Start
-push-notification.stop = Stop
-push-notification.edit-draft = Edit Draft
-push-notification.edit = Edit
-push-notification.sent = Sent
-push-notification.sending = Sending
-push-notification.created = Created
-push-notification.draft = Draft
-push-notification.waiting-for-approval = Waiting for approval
-push-notification.aborted = Aborted
-push-notification.failed = Failed
-push-notification.stopped = Stopped
-push-notification.scheduled = Scheduled
-push-notification.rejected = Rejected
-push-notification.time-chart-period-weekly = Weekly
-push-notification.time-chart-period-monthly = Monthly
-push-notification.time-chart-period-daily= Daily
-push-notification.now = Now
-push-notification.right-before-sending-the-message = Right before sending the message
-push-notification.segmented-push-enabled-users = Segmented push-enabled users
-push-notification.delivery-type = Delivery Type
-push-notification.delivery-timeframe = Delivery Timeframe
-push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
-push-notification.trigger-type = Trigger Type
-push-notification.ios-badge-number-setting = IOS badge number
-push-notification.ios-json-data-setting = IOS JSON data
-push-notification.ios-user-data-setting = IOS user data
-push-notification.android-badge-number-setting = Android badge number
-push-notification.android-json-data-setting = Android JSON data
-push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
-internal-events.[CLY]_push_sent = Push sent
-internal-events.[CLY]_push_action = Push action
-push-notification.android = Android
-push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
-
-push-notification.save = Save
-push-notification.send-for-approval = Send for approval
-push-notification.save-as-draft = Save as draft
-push-notification.create-one-time-notification = Create One-Time Push Notification
-push-notification.create-automated-notification = Create Automated Push Notification
-push-notification.create-transactional-notification = Create API Push Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
-push-notification.platforms = Platforms
-push-notification.android = Android
-push-notification.ios = iOS
-push-notification.targeting = Targeting
-push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
-push-notification.all-push-enabled-users = All push-enabled users
-push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
-push-notification.use-segmentation = Use segmentation
-push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
-push-notification.push-enabled-users = Push-enabled users
-push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
-push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
-push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
-push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
-push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
-push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
-push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
-push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
-push-notification.select-location = Please select a location
-push-notification.when-to-determine-users = When to determine the users?
-push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
-push-notification.determine-users-before = Determine users right before sending the message
-push-notification.determine-users-now = Determine users now
-push-notification.triggers = Triggers
-push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
-push-notification.cohorts-entry = Cohort(s) entry
-push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
-push-notification.cohorts-exit = Cohort(s) exit
-push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
-push-notification.performed-events = Performed Event(s)
-push-notification.performed-events-description = Triggered when user performs a selected event.
-push-notification.select-event = Please select an event
-push-notification.cohorts = Cohort(s)
-push-notification.geolocations = Geolocation(s)
-push-notification.events = Event(s)
-push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
-push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
-push-notification.start-date = Start date
-push-notification.set-start-date = Set Start Date
-push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
-push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
-push-notification.end-date = End date
-push-notification.set-end-date = Set End Date
-push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
-push-notification.delivery-method = Delivery Method
-push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
-push-notification.capping = Capping
-push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
-push-notification.no-capping = No Capping
-push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
-push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
-push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
-push-notification.send-anyway = Send anyway
-push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
-push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
-push-notification.send-now = Send now
-push-notification.send-now-description = Send the push notification immediately, once composition is complete.
-push-notification.scheduled = Scheduled
-push-notification.schedule-for-later = Schedule for later
-push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
-push-notification.delivery-time-tooltip = Set an optional delivery time for your message
-push-notification.timezone = Timezone
-push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
-push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
-push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
-push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
-push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
-push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
-push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
-push-notification.do-not-send-message = Do not send the message
-push-notification.deliver-next-day = Deliver the message next day
-push-notification.immediately = Immediately
-push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
-push-notification.delayed = Delayed
-push-notification.days = Days
-push-notification.day = Day
-push-notification.hours = Hours
-push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
-push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
-push-notification.maximum-messages-per-user = Maximum messages per user
-push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
-push-notification.messages = Messages
-push-notification.minimum-time-between-messages = Minimum time between messages
-push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
-push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
-push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
-push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
-push-notification.compose-message = Compose Message
-push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
-push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
-push-notification.default-message-is-required = Default message is required
-push-notification.content-message = Content message
-push-notification.silent-message = Silent message
-push-notification.message-title = Message title
-push-notification.add-variable = Add Variable
-push-notification.message-content = Message Content
-push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
-push-notification.buttons = Buttons
-push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
-push-notification.add-first-button = +Add First button
-push-notification.add-second-button = +Add Second button
-push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
-push-notification.enter-button-url = Enter Button URL or Deeplink
-push-notification.media-url = Media URL
-push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
-push-notification.enter-media-url = Enter Media URL
-push-notification.platform-settings = Platform Settings
-push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
-push-notification.sound-file-name = Sound File Name
-push-notification.enter-sound-file-name = Enter sound file name
-push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
-push-notification.add-badge-number = Add Badge Number
-push-notification.enter-badge-number = Enter badge number
-push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
-push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
-push-notification.subtitle = Subtitle
-push-notification.enter-your-subtitle = Enter your subtitle
-push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
-push-notification.on-click-url = On Click URL
-push-notification.enter-on-click-url = Enter on click URL
-push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
-push-notification.send-json = Send JSON
-push-notification.enter-json-data = Enter JSON data
-push-notification.send-json-description = Add app-specific JSON data along with standard content.
-push-notification.send-user-data = Send User Data
-push-notification.select-user-data = Select user data
-push-notification.send-user-data-description = Select user properties to send in your notification payload.
-push-notification.icon = Icon
-push-notification.icon-description = Set Android notification icon.
-push-notification.enter-icon = Enter icon
-push-notification.review-message = Review Mesage
-push-notification.review-message-tooltip = Review all the details of you push notification.
-push-notification.message-name = Message name
-push-notification.review-title = Title
-push-notification.content = Content
-push-notification.button-text = Button Text
-push-notification.button-url = Button URL
-push-notification.ios-media-url = iOS Media URL
-push-notification.android-media-url = Android Media URL
-push-notification.ios-badge-number = IOS badge number
-push-notification.ios-json-data = iOS JSON data
-push-notification.ios-user-data = iOS user data
-push-notification.android-badge-number = Android badge number
-push-notification.android-json-data = Android JSON data
-push-notification.android-user-data = Android user data
-push-notification.current-number-of-users = Current number of users
-push-notification.when-to-determine = When to determine
-push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
-push-notification.delivery = Delivery
-push-notification.delivery-description = Select the time you want the notification to be sent to users.
-push-notification.scheduled-for = Scheduled for
-push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
-push-notification.maximum-messages = Maximum {0} messages
-push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
-push-notification.confirmation = Confirmation
-push-notification.testing = TESTING
-push-notification.you-can-send-the-test-message = You can send the test message to test users
-push-notification.testing-tooltip = Sends the push notification to applications' test users
-push-notification.send-to-test-users = Send to test users
-push-notification.confirmation-uppercase = CONFIRMATION
-push-notification.confirmation-uppercase-description = CONFIRMATION description
-push-notification.i-am-ready-to-send = I am ready to send this message to real-users
-push-notification.was-successfully-saved = Push notification message was successfully saved
-push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
-push-notification.was-successfully-approved = Push notification has been successfully approved
-push-notification.was-successfully-rejected = Push notification has been successfully rejected
-push-notification.was-successfully-deleted = Push notification was successfully deleted
-push-notification.was-successfully-started = Push notification was successfully started
-push-notification.was-successfully-stopped = Push notification was successfully stopped
-
-# Add user property
-push-notification.event-properties = Event Properties
-push-notification.user-properties = User Properties
-push-notification.custom-properties = Custom Properties
-push-notification.add-user-property = Add User Property
-push-notification.api-property = Add User Property
-push-notification.search-in-properties = Search in Properties
-push-notification.select-property = Select Property
-push-notification.enter-value = Enter Value
-push-notification.start-with-capital-letter = Make user property start with capital letter
-push-notification.fallback-value = Fallback value
-push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
-push-notification.remove = Remove
-push-notification.confirm = Confirm
-push-notification.internal-properties = Internal Properties
-push-notification.external-properties = External Properties
-push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
-
-
-# Details
-push-notification-details.back-to = Back to Push Notifications
-push-notification-details.localization-filter-label = LOCALIZATION
-push-notification-details.localization-filter-all = All Localizations
-push-notification-details.summary-header = Notification Summary
-push-notification-details.summary-header-description = Overview of the notification message and its details.
-push-notification-details.message-tab = Message Content
-push-notification-details.targeting-tab = Targeting & Delivery
-push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
-push-notification-details.users-targeted-chart = Users Targeted
-push-notification-details.sent-messages-chart = Sent Messages
-push-notification-details.and-label = and
-push-notification-details.message-id = Message ID
-push-notification-details.results-for = Results for
-push-notification-details.created = Created
-push-notification-details.created-by = Created {0} by {1}
-
-push-notification-details.message-title = Title
-push-notification-details.message-content = Content
-push-notification-details.message-first-button-label = First Button Text
-push-notification-details.message-first-button-url = First Button URL
-push-notification-details.message-second-button-label = Second Button Text
-push-notification-details.message-second-button-url = Second Button URL
-push-notification-details.message-media-url = Media URL
-push-notification-details.ios-message-media-url = IOS media URL
-push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
-
-push-notification-details.targeting-sub-header = Targeting
-push-notification-details.targeted-users = Targeted users
-push-notification-details.geolocation = Geolocation
-push-notification-details.when-to-determine = When to determine
-push-notification-details.delivery-sub-header = Delivery
-push-notification-details.delivery-type = Delivery type
-push-notification-details.scheduled-for = Scheduled for
-push-notification-details.expiration-time = Expiration time
-push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
-push-notification-details.no-errors-found = No errors were found
-push-notification.users-targeted = Users Targeted
-push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
-push-notification.sent-notifications = Sent Notifications
-push-notification.sent-notifications-description = Total number of notifications sent.
-push-notification.clicked-notifications = Clicked Notifications
-push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
-push-notification.failed = Failed
-push-notification.failed-description = Total number of notifications that failed to get delivered.
-push-notification.no-errors-found = There are no errors found
-push-notification.affected-users = Affected Users
-push-notification.error-description = Description
-push-notification.error-code = Error Code
-push-notification.users = Users
-push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
-
-# Mobile Preview Component
-push-notification.mobile-preview-default-app-name = Your application name
-push-notification.mobile-preview-default-title = Your message title
-push-notification.mobile-preview-default-content = Your message content
-
-# Application settings
-push-notification.ios-settings = iOS settings
-push-notification.authentication-type = Authentication type
-push-notification.key-file-p8 = Key file (P8)
-push-notification.key-file-p12 = Sandbox + Production certificate (P12)
-push-notification.key-file-already-uploaded = Key file {0} is already uploaded
-push-notification.choose-file = Choose File
-push-notification.key-id = Key ID
-push-notification.team-id = Team ID
-push-notification.bundle-id = Bundle ID
-push-notification.passphrase = Passphrase
-push-notification.android-settings = Android (Google FCM)
-push-notification.firebase-key = Firebase key
-push-notification.huawei-settings = Android (Huawei Push Kit)
-push-notification.huawei-app-id = App ID
-push-notification.huawei-app-secret = App Secret
-push-notification.rate-limit = Rate limit
-push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
-push-notification.period-in-seconds = Period duration (seconds)
-push-notification.test-users = Test users
-push-notification.test-users-description = Test users description
-push-notification.define-new-user = +Define New User
-push-notification.user-definition = User Definition
-push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
-push-notification.see-user-list = See User List
-push-notification.define-new-user-title = Define New User
-push-notification.add-test-users-label = Add Users
-push-notification.definition-type = Definition Type
-push-notification.define-with-user-id = Define with User ID
-push-notification.define-with-cohort = Define with Cohort
-push-notification.enter-user-id = Enter User ID
-push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
-push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
-push-notification.select-cohort = Please select a cohort
-push-notification.user-list = User List
-push-notification.username = Username
-push-notification.user-id = User ID
-push-notification.cohort-name = Cohort Name
-push-notification.cancel = Cancel
-push-notification.i-understand-delete-key = I understand, delete this key
-push-notification.delete-key = Delete Key
-push-notification.test-users-were-successfully-removed = Test users have been successfully removed
-push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
-
-#Global settinsg
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
push.plugin-title = Push Notifications
-push.proxyhost = Proxy Hostname
-push.proxypass = Proxy Password
-push.proxyport = Proxy Port
-push.proxyuser = Proxy Username
-push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
-push.proxyunauthorized = Do NOT check proxy HTTPS certificate
-push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
-push.connection_retries = Number of connection retries
-push.connection_factor = Time factor for exponential backoff between retries
-push.pool_pushes = Number of notifications in stream batches
-push.pool_bytes = Bytes in binary stream batches
-push.pool_concurrency = Maximum number of same type connections
-push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
-
-#Drawer from other views
-push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
-push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
-# Error codes
-push-notification.error-code.400.desc = 400 Bad request
-push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
-push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
-push-notification.error-code.405.desc = 405 Bad Method
-push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
-push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
-push-notification.error-code.500.desc = 500 Server error. Please try again later.
-push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
-push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
-push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
-push-notification.error-code.NoApp.desc = App not found when sending the notification.
-push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
-push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
-push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
-push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
-push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
-push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
-push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
-push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
-push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
-push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
-push-notification.error-code.MissingRegistration.desc = Please contact customer support.
-push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
-push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
-push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
-push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
-push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
-push-notification.error-code.InvalidTtl.desc = Please contact customer support.
-push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
-push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
-push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
-push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
-push-notification.error-code.NotRegistered.desc = FCM token expired
-push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
-push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
-push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
-push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
-push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
-push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
-push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
-
-push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
-push-notification.error-code.del = Message deleted
-push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
-push-notification.error-code.consent = Consent cancelled
-push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
-push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
-push-notification.error-code.aborted = Aborted
-push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
-push-notification.error-code.ExpiredToken = Expired Token
-push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
-
-# System Logs
-systemlogs.action.push_message_created = Push Notification created
-systemlogs.action.push_message_draft = Draft Push Notification created
-systemlogs.action.push_credentials_update = Push Credentials updated
-systemlogs.action.push_message_deleted = Push Notification deleted
-systemlogs.action.push_message_updated = Push Notification updated
-systemlogs.action.push_message_activated = Push Notification activated
-systemlogs.action.push_message_deactivated = Push Notification deactivated
-systemlogs.action.push_message_test = Test Push Notification sent
+push.plugin-description = Increase loyalty, user retention & satisfaction with native iOS and Android push notifications
+push.sidebar.section = Messaging
+push.sidebar.overview = Overview
+push.sidebar.messages = Messages
+
+push.no-message = Brak wiadomości
+push.create = Utwórz wiadomość
+
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from here.
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android Settings
+mgmt-plugins.push.android.key = Firebase (FCM) or GCM key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from here
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.bundle = Bundle id of certificate:
+mgmt-plugins.push.detected = Detected key type:
+
+systemlogs.action.push_message_created = Push Message Created
+systemlogs.action.push_credentials_update = Push Credentials Updated
+systemlogs.action.push_message_deleted = Push Message Deleted
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM) or Google Cloud Messaging (GCM) service. It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console or Google API Console. Server automatically distinguishes between FCM and GCM keys and sends notification to an appropriate server.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = Total number of messages sent for this application within selected period of time.
+help.dashboard.push.actions = Number of actions performed for this app. Action represents a positive reaction of a user to your message. Please see SDK guide to know how to enable this metric in your app.
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or GCM/FCM tokens stored in the database.
+
+pu.po.title = Create Push Notification
+pu.po.desc = Compose your push notification in 4 easy steps
+
+pu.po.view.title = Push Notification
+pu.po.view.desc = Message details
+
+pu.po.tab0.title = Apps & Platforms
+pu.po.tab0.title.auto = Platforms
+pu.po.tab0.desc = Destinations
+
+pu.po.tab1.title = Scheduling
+pu.po.tab1.desc = Set message date
+pu.po.tab1.title.auto = Campaign Rules
+pu.po.tab1.desc.auto = Triggers & dates
+
+pu.po.tab2.title.auto = Message Delivery
+pu.po.tab2.desc.auto = Periodicity & capping
+
+pu.po.compose.title = Message
+pu.po.compose.desc = Compose content
+
+pu.po.review.title = Review
+pu.po.review.desc = Check your message
+
+pu.po.tab0.apps = Apps
+pu.po.tab0.add = Add App
+pu.po.tab0.select-apps = Select Apps
+pu.po.tab0.select-apps-desc = Only apps with APN or GCM/FCM credentials are displayed
+pu.po.tab0.select-platforms = Select Platforms
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or GCM/FCM credentials
+pu.platform.i = iOS
+pu.platform.a = Android
+pu.po.prev = Previous step
+pu.po.next = Next step
+pu.po.send = Send!
+pu.po.start = Start!
+pu.po.close = Close
+pu.po.duplicate = Duplicate
+pu.po.delete = Delete
+
+pu.po.tab1.testing = Testing
+pu.po.tab1.testing-desc = Send to production users or to test users?
+pu.po.tab1.testing-prod = Production Users
+pu.po.tab1.testing-test = Test Users
+pu.po.tab1.testing-test-desc = Development & test users only
+
+pu.po.tab1.scheduling = Scheduling
+pu.po.tab1.scheduling-desc = Send now or schedule sending for later
+pu.po.tab1.scheduling-now = Send now
+pu.po.tab1.scheduling-auto-now = Start now
+pu.po.tab1.scheduling-now-desc = Sending will start once you click Send
+pu.po.tab1.scheduling-date = Schedule
+pu.po.tab1.scheduling-date-desc = Set specific date & time for this message
+pu.po.tab1.tz = Send according to user's timezone?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = No
+pu.po.tab1.tz-no-desc = Send all notifications at once
+pu.po.tab1.tz-yes = Send in user timezones
+pu.po.tab1.tz-yes-desc = Send each notification in timezone of the user it's for
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = Geolocations
+pu.po.tab1.geos-desc = Filter users by their last known location?
+pu.po.tab1.geos.no = No filtering
+
+
+pu.po.recipients.s = Recipient: {0}
+pu.po.recipients.m = Recipients: {0}
+pu.po.recipients.temporary = Number of users calculation is still running, it can take up to several minutes in tough cases. Feel free to send your message without waiting.
+
+pu.po.tab2.message.type = Message type
+pu.po.tab2.extras = Additional options
+
+pu.type.message = Message
+pu.type.data = Data-only
+pu.type.rich = Rich
+
+pu.po.loading = We're counting your users
+pu.po.loading-desc = Please wait, it will be done soon
+
+pu.po.sending = Saving
+pu.po.sending-desc = Just a moment
+
+pu.po.sent = Saved
+pu.po.sent-desc = All good!
+
+pu.po.tab2.placeholder = Write your message here (default is required, add more localized messages if needed)
+pu.po.tab2.default-message = Your message
+pu.po.tab2.default-message.invalid = Default message is required
+pu.po.tab2.default-button-title.invalid = Default button title is required
+pu.po.tab2.default-button-link.invalid = Default button link is required
+pu.po.tab2.extras.sound = Send sound
+pu.po.tab2.extras.sound.invalid = Sound must be a string
+pu.po.tab2.extras.badge = Add badge
+pu.po.tab2.extras.badge.invalid = Badge must be a valid number
+pu.po.tab2.extras.badge.help = iOS supports badges by default, Android requires additional steps (more details in our Android SDK Guide)
+pu.po.tab2.extras.media = Attachment URL
+pu.po.tab2.extras.media.placeholder = Image URL
+pu.po.tab2.extras.media.invalid = Must be a valid URL to an image (JPG, PNG) or animation (GIF) less than 10MB in size, audio (MP3, WAV, AIF) less than 5MB in size or video (MPEG, MPEG2, MPEG4) less than 50MB in size
+pu.po.tab2.extras.media.toobig = Media attachment must be less than 10MB for images and animations, less than 5MB for audio & 50MB for videos
+pu.po.tab2.extras.media.help = Media attachments are fully supported on iOS 10+. Android supports only images, iOS 9- doesn't support media at all. In case media is not supported, users will only see message text.
+pu.po.tab2.extras.url = On click URL
+pu.po.tab2.extras.url.invalid = URL must be valid
+pu.po.tab2.extras.url.help = Default URL or deeplink which is being open when user taps a message in drawer
+pu.po.tab2.extras.data = Send JSON
+pu.po.tab2.extras.data.invalid = This field must contain valid JSON string
+pu.po.tab2.extras.data.placeholder = JSON string
+pu.po.tab2.extras.data.help = App-specific JSON data can be sent along with standard content
+pu.po.tab2.mtitle = Message title
+pu.po.tab2.mtitle.placeholder = Optional title for your message
+pu.po.tab2.mtext = Message text
+pu.po.tab2.mbtn = Buttons
+pu.po.tab2.mbtns = Number of buttons
+pu.po.tab2.mbtn.urls = Button URLs
+pu.po.tab2.mbtn.req = Button title required
+pu.po.tab2.mbtn.url = Must be a valid URL
+pu.po.tab2.mbtn.0 = Button 0
+pu.po.tab2.mbtn.1 = Button 1
+pu.po.tab2.mbtn.2 = Button 2
+pu.po.tab2.btntext = Button text
+pu.po.tab2.urlordeep = URL or deeplink
+pu.po.tab2.rich = Rich notification options
+pu.po.tab2.mmedia = Media
+pu.po.tab2.mmedia.type.image = Image
+pu.po.tab2.mmedia.type.anima = Animation
+pu.po.tab2.mmedia.type.audio = Audio
+pu.po.tab2.mmedia.type.video = Video
+pu.po.tab2.mmedia.type.warn.android = This type of media is not supported on Android
+pu.po.tab2.mmedia.status = Request status:
+pu.po.tab2.default-message.help = Default localization for all users. You can override default message & button names by setting them for specific locales.
+pu.po.no-users = Sorry, there are no push-enabled users for specified options.
+pu.po.no-users-try-change = Try to change
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = Start over
+
+datepicker.dt.click = Set date & time
+datepicker.tz = Send in user's timezone
+datepicker.clear = Clear
+datepicker.apply = Apply
+datepicker.pick-time = Pick Time
+
+pu.locale.default = Default
+pu.locale.null = Unknown
+pu.po.tab3.review = Review
+pu.po.tab3.apps = Apps
+pu.po.tab3.platforms = Platforms
+pu.po.tab3.date = Date
+pu.po.tab3.date.now = At the time of message creation
+pu.po.tab3.date.intz = ; in user timezones
+pu.po.tab3.location = Location
+pu.po.tab3.location.unknown = Unknown
+pu.po.tab3.type = Type
+pu.po.tab3.type.message = Text message
+pu.po.tab3.type.data = Data
+pu.po.tab3.type.update = Update (deprecated)
+pu.po.tab3.type.review = Review (deprecated)
+pu.po.tab3.type.category = Category (deprecated)
+pu.po.tab3.type.link = URL (deprecated)
+pu.po.tab3.test = Send to test devices
+pu.po.tab3.test.true = Yes
+pu.po.tab3.test.false = No
+pu.po.tab3.btns = Buttons
+pu.po.tab3.media = Media
+pu.po.tab3.extras = Standard options
+
+pu.po.tab3.extras.sound = Sound
+pu.po.tab3.extras.badge = iOS badge
+pu.po.tab3.extras.url = On click URL
+pu.po.tab3.extras.data = Extra data
+pu.po.tab3.extras.media = Media
+
+pu.po.tab3.date.date = Scheduled to sent on
+pu.po.tab3.date.sent = Sent on
+pu.po.tab3.date.tz = Sent in user timezone
+
+pu.po.tab3.audience = Recipients
+
+pu.po.tab3.errors = Errors
+pu.po.tab3.errors.code = Code
+pu.po.tab3.errors.message = Error
+pu.po.tab3.errors.count = Count
+
+pu.po.confirm = Confirm sending
+pu.po.confirm.ready = I’m ready to sent this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will recive this campaign after it is started.
+pu.po.recipients.message.details = This message will automatically be delivered to app users as they match campaign trigger criteria.
+
+pu.dash.users = Users
+pu.dash.users.total = Total Users
+pu.dash.users.enabl = Messaging-enabled Users
+pu.dash.totals = Overall
+pu.dash.metrics = Metrics
+pu.dash.metrics.sent = Messages sent
+pu.dash.metrics.acti = Actions performed
+pu.dash.create = Create Message
+pu.dash.monthly = Monthly
+pu.dash.weekly = Weekly
+pu.dash.messages = Messages
+pu.dash.messages.all = All
+pu.dash.messages.api = API
+pu.dash.messages.dash = Dashboard
+pu.dash.actions = Actions
+pu.dash.sent = Sent
+
+
+pu.t.nothing = No records found
+pu.t.search = Search by default message
+pu.t.message = Message
+pu.t.apps = Apps
+pu.t.status = Status
+pu.t.created = Created
+pu.t.sent-scheduled = Date sent / Scheduled
+pu.t.result = Sent / Actioned
+
+push.message.status.0 = Initial
+push.message.status.1 = Preparing
+push.message.status.2 = Zaplanowano
+push.message.status.4 = Wysyłanie
+push.message.status.8 = Wysłano
+push.message.status.10 = Sent
+push.message.status.16 = Błąd
+push.message.status.32 = Cancelled
+
+push.message.status.20 = Wysyłanie z błędami
+push.message.status.24 = Wysłano z błędami
+push.message.status.40 = Cancelled
+push.message.status.48 = Cancelled with errors
+push.message.status.56 = Cancelled with errors
+push.message.status.60 = Cancelled on server restart
+push.message.status.undefined = Preparing
+
+push.message.status.auto.true = Active
+push.message.status.auto.false = Inactive
+
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or GCM/FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = Process exited while sending this messsage due to connection being unexpectedly closed by APNS. Some notifications might have been sent twice (up to 500).
+push.error.3-eof = APNS connection error. Possible reasons include: invalid certificate / auth key, firewall block, system root certificates (CA) issues.
+push.error.no-credentials = You don't have credentials for any of selected app-platform combinations.
+push.error.no-cohorts = Automated messages depend on cohorts, yet you don't have any cohorts.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+
+push.errorCodes.bug = You found a bug! Please contact support.
+push.errorCodes = Errors:
+push.errorCode.i400 = APN 400 Bad request
+push.errorCode.i400+BadDeviceToken.desc = Your application supplied invalid device token to SDK. In most cases, it's due to invalid provisioning profile (app signing doesn't correspond to certificate used to send notifications) or entitlements not corresponding to this token (production token sent to sandbox server and vice versa). So please insure they're ok, clear your project and derived data, rebuild & reinstall the app and try again.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to app's Bundle ID
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403 Certificate error
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403 error: InvalidProviderToken. Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push.errorCode.i405 = APN 405 Bad method
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413 Payload too large
+push.errorCode.i413.desc = Message was too large and APN declined to deliver it.
+push.errorCode.i429 = APN 429 Too many requests
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500 Internal error
+push.errorCode.i500.desc = Apple server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.i503 = APN 503 Shutdown
+push.errorCode.i503.desc = Apple server unexpectedly decided to shutdown returning HTTP error 503. Please try again later.
+
+push.errorCode.a200 = GCM/FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles GCM/FCM tokens. Please ensure you do it right and contact support.
+push.errorCode.a200+MismatchSenderId.desc = Most probably SDK competes for tokens with other GCM / Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push.errorCode.a200+InvalidDataKey.desc = Message contains invalid data key, please check:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push.errorCode.a200+TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push.errorCode.a400 = GCM/FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = GCM/FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = GCM/FCM 500 Internal error
+push.errorCode.a500.desc = Google server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.a200+Unavailable.desc = Google server unexpectedly returned HTTP error 200+Unavailable. Please try again later.
+push.errorCode.a200+InternalServerError.desc = Google server unexpectedly returned HTTP error 200+InternalServerError. Please try again later.
+push.errorCode.a501 = GCM/FCM 501 Error
+push.errorCode.a502 = GCM/FCM 502 Error
+push.errorCode.a503 = GCM/FCM 503 Error
+push.errorCode.link.i = Apple docs
+push.errorCode.link.a = Google docs
+push.errorCode.skiptz = Skipped due to timezone
+push.errorCode.skiptz.desc = This many users are skipped, because they are more than 1 hour ahead of message creation date, due to their timezone.
+
+push.totals.processed = Processed
+push.totals.sent = Accepted
+push.totals.errors = Errors
+
+pu.po.users.s = {0} user
+pu.po.users.m = {0} users
+pu.po.metrics = Metrics
+pu.po.metrics.processed = Processed
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = Sent Successfully
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & GCM/FCM
+pu.po.metrics.sent.none = No notifications were sent! Please check message errors
+pu.po.metrics.sent.one = Your notification has been sent successfully!
+pu.po.metrics.sent.all = All notifications have been sent successfully!
+pu.po.metrics.actions = Actioned
+pu.po.metrics.actions.desc = How many users performed push notification action
+pu.po.metrics.actions.all = All users performed action! Good Job!
+pu.po.metrics.actions.performed = performed action.
+pu.po.metrics.actions0.performed = opened default URL.
+pu.po.metrics.actions1.performed = clicked first button.
+pu.po.metrics.actions2.performed = clicked second button.
+pu.po.left.to.send.s = {0} notification left to send
+pu.po.left.to.send.m = {0} notifications left to send
+pu.po.left.to.send.none = All notifications are sent!
+pu.po.left.to.send.batch = next batch will start at {0}
+pu.po.expired.s = {0} token expired
+pu.po.expired.m = {0} tokens expired
+pu.po.unset.s = {0} tokens expired
+pu.po.unset.m = {0} token expired
+pu.po.errors.s = {0} notification wasn\'t sent due to an error
+pu.po.errors.m = {0} notifications weren\'t sent due to an error
+
+pu.apn.uni = Universal Certificate (Production & Sandbox)
+pu.apn.none = None
+
+pu.gcm.gcm = GCM/FCM Key
+pu.gcm.none = None
+
+pu.remove = Remove credentials
+pu.validate = Validate
+pu.validating = Validating credentials
+pu.validation.error = Credentials error:
+pu.remove = Remove credentials
+pu.creds.none = None
+pu.creds.type.apn_universal = APN Universal Certificate is set
+pu.creds.type.apn_token = APN Auth Key is set
+pu.creds.type.gcm = GCM/FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase or GCM Server Key
+pu.creds.cert = P12 Certificate
+pu.creds.pass = Passphrase
+pu.creds.auth_key = P8 Key File
+pu.creds.key_id = Auth Key ID
+pu.creds.team_id = Team ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN Certificate (Sandbox & Production)
+pu.creds.apn.type.apn_token = APN Auth Key
+
+userdata.push = Push tokens
+pu.tk.id = APN Test token (development)
+pu.tk.ia = APN Test token (ad hoc or TestFlight)
+pu.tk.ip = APN Production token
+pu.tk.at = GCM/FCM Test token
+pu.tk.ap = GCM/FCM Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = Create Message
+pu.dash.btn-group.automated-message = Automated Message
+pu.dash.btn-group.automated-message-desc = Create an automated push campaign to send a message to users when their-in-app behaviour matches defined criteria.
+pu.dash.btn-group.one-time-message = One-time Message
+pu.dash.btn-group.one-time-message-desc = Create a one-time push notification campaign to send right away on in the future.
+pu.dash.btn-group-available-in-enterprise = Available in enterprise edition
+pu.dash.btn.learn-more = Learn more about automation
+
+pu.po.tab1.trigger-type = Trigger Type
+pu.po.tab1.trigger-type.entry = Cohort Entry
+pu.po.tab1.trigger-type.exit = Cohort Exit
+pu.po.tab1.cohort-entry-desc = Triggered when user enters into any of the cohorts you select
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = Recalculation of cohorts above will trigger message sending process automatically
+pu.po.tab1.select-cohort-placeholder = Select cohorts(s)
+pu.po.tab1.campaign-start-date = Campaign Start Date
+pu.po.tab1.additional-options = Additional Options
+pu.po.tab1.campaign-end-date = Campaign end date
+
+pu.po.tab2.delivery-method = Delivery method
+pu.po.tab2.delivery-method-desc = Choose when your message should be delivered
+pu.po.tab2.immediately = Immediately
+pu.po.tab2.immediately-desc = Deliver the message as soon as triggering cohort is recalculated
+pu.po.tab2.delayed = Delayed
+pu.po.tab2.delivery-time = Delivery time
+pu.po.tab2.delivery-time-desc = Set an optional delivery time for your message
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = Send in users' timezone at
+pu.po.tab2.select-time = Select time
+pu.po.tab2.capping = Capping
+pu.po.tab2.capping-desc = Configure number of messages per user. Enabling this option will limit number of messages sent to the same user.
+pu.po.tab2.capping.no = No capping
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered or exited from cohort
+pu.po.tab2.capping.yes = Capped
+pu.po.tab2.capping.yes-desc = Number of messages is limited
+pu.po.tab2.message-per-user = Maximum messages per user
+pu.po.tab2.message-per-user-desc = Total number of messages individual user can receive from this campaign
+pu.po.tab2.sleep = Minimum time between messages
+pu.po.tab2.sleep-desc = User will be eligible to receive a repetitive message only if she / he triggers the campaign conditions at least configured time after previous message.
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = App
+pu.po.tab4.send-to-test = Send to test device only
+pu.po.tab4.yes = Yes
+pu.po.tab4.no = Yes
+pu.po.tab4.campaign-rules = Campaign Rules
+pu.po.tab4.trigger-type = Trigger Type
+pu.po.tab4.trigger-cohort-entry = Cohort entry
+pu.po.tab4.trigger-cohort-exit = Cohort exit
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = Cohort
+pu.po.tab4.cohorts.m = Cohorts ({0})
+pu.po.tab4.caping = Capping
+pu.po.tab4.caping-message = At most {0} message is going to be sent per user
+pu.po.tab4.message-content = Message Content
+pu.po.tab4.message-title = Title
+pu.po.tab4.message-text = Text
+pu.po.tab4.message-sound = Sound
+pu.po.tab4.message-media = Media
+pu.po.tab4.message-badge = Badge
+
+push.po.one-time-messages = ONE-TIME MESSAGES
+push.po.automated-messages = AUTOMATED MESSAGES
+push.po.table.dublicate = Duplicate
+push.po.table.delete = Delete
+
+pu.po.progress = Progress
+pu.po.progress.auto = 30 days overview
+pu.never = Never
+pu.days.s = day
+pu.days.m = days
+pu.hours.s = hour
+pu.hours.m =hours
+pu.messages.s = message
+pu.messages.m = messages
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
diff --git a/plugins/push/frontend/public/localization/push_pl_PL.properties b/plugins/push/frontend/public/localization/push_pl_PL.properties
new file mode 100644
index 00000000000..0089ddd82fa
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_pl_PL.properties
@@ -0,0 +1,457 @@
+push-notification.title = Push Notifications
+push-notification.description = An overview of all push notifications sent and actions performed in response.
+push-notification.one-time = One-time Notifications
+push-notification.automated = Automated Notifications
+push-notification.transactional = API Notifications
+push-notification.total-app-users = Total App Users
+push-notification.enabled-users = Notification-enabled Users
+push-notification.enabled-users-percentage = Enabled Users Percentage
+push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
+push-notification.platform-filter-label-one-time = One-time notifications for
+push-notification.platform-filter-label-automatic = Automatic notificatons for
+push-notification.platform-filter-label-transactional = Transactional notifications for
+push-notification.platform-filter-all = All Platforms
+push-notification.platform-filter-android = Android
+push-notification.platform-filter-ios = IOS
+push-notification.status-filter-all = All Messages
+push-notification.create-button = New Message
+push-notification.time-period = TIME PERIOD
+push-notification.created-by = Created by
+push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
+push-notification.sent-serie-name = Notifications Sent
+push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
+push-notification.actions-performed-serie-name = Actions Performed
+push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
+push-notification.table-notification-name = Notificaton name
+push-notification.table-status = Status
+push-notification.table-created = Created
+push-notification.table-date-sent = Date Sent/Scheduled
+push-notification.table-sent = Sent
+push-notification.table-actioned = Actioned
+push-notification.table-created-by = Created By
+push-notification.table-message-content = Message Content
+push-notification.duplicate = Duplicate
+push-notification.delete = Delete
+push-notification.resend = Resend
+push-notification.approve = Approve
+push-notification.reject = Reject
+push-notification.start = Start
+push-notification.stop = Stop
+push-notification.edit-draft = Edit Draft
+push-notification.edit = Edit
+push-notification.sent = Sent
+push-notification.sending = Sending
+push-notification.created = Created
+push-notification.draft = Draft
+push-notification.waiting-for-approval = Waiting for approval
+push-notification.aborted = Aborted
+push-notification.failed = Failed
+push-notification.stopped = Stopped
+push-notification.scheduled = Scheduled
+push-notification.rejected = Rejected
+push-notification.time-chart-period-weekly = Weekly
+push-notification.time-chart-period-monthly = Monthly
+push-notification.time-chart-period-daily= Daily
+push-notification.now = Now
+push-notification.right-before-sending-the-message = Right before sending the message
+push-notification.segmented-push-enabled-users = Segmented push-enabled users
+push-notification.delivery-type = Delivery Type
+push-notification.delivery-timeframe = Delivery Timeframe
+push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
+push-notification.trigger-type = Trigger Type
+push-notification.ios-badge-number-setting = IOS badge number
+push-notification.ios-json-data-setting = IOS JSON data
+push-notification.ios-user-data-setting = IOS user data
+push-notification.android-badge-number-setting = Android badge number
+push-notification.android-json-data-setting = Android JSON data
+push-notification.android-user-data-setting = Android user data
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
+push-notification.android = Android
+push-notification.ios = iOS
+
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
+push-notification.save = Save
+push-notification.send-for-approval = Send for approval
+push-notification.save-as-draft = Save as draft
+push-notification.create-one-time-notification = Create One-Time Push Notification
+push-notification.create-automated-notification = Create Automated Push Notification
+push-notification.create-transactional-notification = Create API Push Notification
+push-notification.notification-name = Notification Name
+push-notification.notification-name-description = Set the name of push notification (optional).
+push-notification.enter-notification-name = Enter Notification Name
+push-notification.platforms = Platforms
+push-notification.android = Android
+push-notification.ios = iOS
+push-notification.targeting = Targeting
+push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
+push-notification.all-push-enabled-users = All push-enabled users
+push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
+push-notification.use-segmentation = Use segmentation
+push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
+push-notification.push-enabled-users = Push-enabled users
+push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
+push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
+push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
+push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
+push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
+push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
+push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
+push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-location = Please select a location
+push-notification.when-to-determine-users = When to determine the users?
+push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
+push-notification.determine-users-before = Determine users right before sending the message
+push-notification.determine-users-now = Determine users now
+push-notification.triggers = Triggers
+push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
+push-notification.cohorts-entry = Cohort(s) entry
+push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
+push-notification.cohorts-exit = Cohort(s) exit
+push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
+push-notification.performed-events = Performed Event(s)
+push-notification.performed-events-description = Triggered when user performs a selected event.
+push-notification.select-event = Please select an event
+push-notification.cohorts = Cohort(s)
+push-notification.geolocations = Geolocation(s)
+push-notification.events = Event(s)
+push-notification.delivery-date-calculation = Delivery date calculation
+push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
+push-notification.start-date = Start date
+push-notification.set-start-date = Set Start Date
+push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
+push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
+push-notification.end-date = End date
+push-notification.set-end-date = Set End Date
+push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
+push-notification.delivery-method = Delivery Method
+push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
+push-notification.capping = Capping
+push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
+push-notification.no-capping = No Capping
+push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
+push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
+push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
+push-notification.send-anyway = Send anyway
+push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
+push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
+push-notification.send-now = Send now
+push-notification.send-now-description = Send the push notification immediately, once composition is complete.
+push-notification.scheduled = Scheduled
+push-notification.schedule-for-later = Schedule for later
+push-notification.delivery-time = Delivery Time
+push-notification.delivery-time-tooltip = Set an optional delivery time for your message
+push-notification.timezone = Timezone
+push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
+push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
+push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
+push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
+push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
+push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
+push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
+push-notification.do-not-send-message = Do not send the message
+push-notification.deliver-next-day = Deliver the message next day
+push-notification.immediately = Immediately
+push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
+push-notification.delayed = Delayed
+push-notification.days = Days
+push-notification.hours = Hours
+push-notification.capped = Capped
+push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
+push-notification.maximum-messages-per-user = Maximum messages per user
+push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
+push-notification.messages = Messages
+push-notification.minimum-time-between-messages = Minimum time between messages
+push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
+push-notification.expiration-time = Expiration Time
+push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
+push-notification.notification-type = NOTIFICATION TYPE
+push-notification.compose-message = Compose Message
+push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
+push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
+push-notification.default-message-is-required = Default message is required
+push-notification.content-message = Content message
+push-notification.silent-message = Silent message
+push-notification.message-title = Message title
+push-notification.add-variable = Add Variable
+push-notification.message-content = Message Content
+push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
+push-notification.buttons = Buttons
+push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
+push-notification.add-first-button = +Add First button
+push-notification.add-second-button = +Add Second button
+push-notification.enter-x-button = Enter xButton
+push-notification.enter-button-url = Enter Button URL or Deeplink
+push-notification.media-url = Media URL
+push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
+push-notification.enter-media-url = Enter Media URL
+push-notification.platform-settings = Platform Settings
+push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
+push-notification.sound-file-name = Sound File Name
+push-notification.enter-sound-file-name = Enter sound file name
+push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
+push-notification.add-badge-number = Add Badge Number
+push-notification.enter-badge-number = Enter badge number
+push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
+push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
+push-notification.subtitle = Subtitle
+push-notification.enter-your-subtitle = Enter your subtitle
+push-notification.subtitle-description = Add a subheading for your message.
+push-notification.on-click-url = On Click URL
+push-notification.enter-on-click-url = Enter on click URL
+push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
+push-notification.send-json = Send JSON
+push-notification.enter-json-data = Enter JSON data
+push-notification.send-json-description = Add app-specific JSON data along with standard content.
+push-notification.send-user-data = Send User Data
+push-notification.select-user-data = Select user data
+push-notification.send-user-data-description = Select user properties to send in your notification payload.
+push-notification.icon = Icon
+push-notification.icon-description = Set Android notification icon.
+push-notification.enter-icon = Enter icon
+push-notification.review-message = Review Mesage
+push-notification.review-message-tooltip = Review all the details of you push notification.
+push-notification.message-name = Message name
+push-notification.review-title = Title
+push-notification.content = Content
+push-notification.button-text = Button Text
+push-notification.button-url = Button URL
+push-notification.ios-media-url = iOS Media URL
+push-notification.android-media-url = Android Media URL
+push-notification.ios-badge-number = IOS badge number
+push-notification.ios-json-data = iOS JSON data
+push-notification.ios-user-data = iOS user data
+push-notification.android-badge-number = Android badge number
+push-notification.android-json-data = Android JSON data
+push-notification.android-user-data = Android user data
+push-notification.current-number-of-users = Current number of users
+push-notification.when-to-determine = When to determine
+push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
+push-notification.delivery = Delivery
+push-notification.delivery-description = Select the time you want the notification to be sent to users.
+push-notification.scheduled-for = Scheduled for
+push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
+push-notification.maximum-messages = Maximum {0} messages
+push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
+push-notification.confirmation = Confirmation
+push-notification.testing = TESTING
+push-notification.you-can-send-the-test-message = You can send the test message to test users
+push-notification.testing-tooltip = Sends the push notification to applications' test users
+push-notification.send-to-test-users = Send to test users
+push-notification.confirmation-uppercase = CONFIRMATION
+push-notification.confirmation-uppercase-description = CONFIRMATION description
+push-notification.i-am-ready-to-send = I am ready to send this message to real-users
+push-notification.was-successfully-saved = Push notification message was successfully saved
+push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
+push-notification.was-successfully-approved = Push notification has been successfully approved
+push-notification.was-successfully-rejected = Push notification has been successfully rejected
+push-notification.was-successfully-deleted = Push notification was successfully deleted
+push-notification.was-successfully-started = Push notification was successfully started
+push-notification.was-successfully-stopped = Push notification was successfully stopped
+
+# Add user property
+push-notification.event-properties = Event Properties
+push-notification.user-properties = User Properties
+push-notification.custom-properties = Custom Properties
+push-notification.add-user-property = Add User Property
+push-notification.api-property = Add User Property
+push-notification.search-in-properties = Search in Properties
+push-notification.select-property = Select Property
+push-notification.enter-value = Enter Value
+push-notification.start-with-capital-letter = Make user property start with capital letter
+push-notification.fallback-value = Fallback value
+push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
+push-notification.remove = Remove
+push-notification.confirm = Confirm
+push-notification.internal-properties = Internal Properties
+push-notification.external-properties = External Properties
+push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
+
+
+# Details
+push-notification-details.back-to = Back to Push Notifications
+push-notification-details.localization-filter-label = LOCALIZATION
+push-notification-details.localization-filter-all = All Localizations
+push-notification-details.summary-header = Notification Summary
+push-notification-details.summary-header-description = Overview of the notification message and its details.
+push-notification-details.message-tab = Message Content
+push-notification-details.targeting-tab = Targeting & Delivery
+push-notification-details.errors-tab = Errors
+push-notification-details.users-targeted-chart = Users Targeted
+push-notification-details.sent-messages-chart = Sent Messages
+push-notification-details.and-label = and
+push-notification-details.message-id = Message ID
+push-notification-details.results-for = Results for
+push-notification-details.created = Created
+push-notification-details.created-by = Created {0} by {1}
+
+push-notification-details.message-title = Title
+push-notification-details.message-content = Content
+push-notification-details.message-first-button-label = First Button Text
+push-notification-details.message-first-button-url = First Button URL
+push-notification-details.message-second-button-label = Second Button Text
+push-notification-details.message-second-button-url = Second Button URL
+push-notification-details.message-media-url = Media URL
+push-notification-details.ios-message-media-url = IOS media URL
+push-notification-details.android-message-media-url = Android media URL
+
+push-notification-details.targeting-sub-header = Targeting
+push-notification-details.targeted-users = Targeted users
+push-notification-details.geolocation = Geolocation
+push-notification-details.when-to-determine = When to determine
+push-notification-details.delivery-sub-header = Delivery
+push-notification-details.delivery-type = Delivery type
+push-notification-details.scheduled-for = Scheduled for
+push-notification-details.expiration-time = Expiration time
+push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
+push-notification-details.no-errors-found = No errors were found
+push-notification.users-targeted = Users Targeted
+push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
+push-notification.sent-notifications = Sent Notifications
+push-notification.sent-notifications-description = Total number of notifications sent.
+push-notification.clicked-notifications = Clicked Notifications
+push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
+push-notification.failed = Failed
+push-notification.failed-description = Total number of notifications that failed to get delivered.
+push-notification.no-errors-found = There are no errors found
+push-notification.affected-users = Affected Users
+push-notification.error-description = Description
+push-notification.error-code = Error Code
+push-notification.users = Users
+push-notification.back-to-push-notification-details = Back to push notification
+
+# Mobile Preview Component
+push-notification.mobile-preview-default-app-name = Your application name
+push-notification.mobile-preview-default-title = Your message title
+push-notification.mobile-preview-default-content = Your message content
+
+# Application settings
+push-notification.ios-settings = iOS settings
+push-notification.authentication-type = Authentication type
+push-notification.key-file-p8 = Key file (P8)
+push-notification.key-file-p12 = Sandbox + Production certificate (P12)
+push-notification.key-file-already-uploaded = Key file {0} is already uploaded
+push-notification.choose-file = Choose File
+push-notification.key-id = Key ID
+push-notification.team-id = Team ID
+push-notification.bundle-id = Bundle ID
+push-notification.passphrase = Passphrase
+push-notification.android-settings = Android (Google FCM)
+push-notification.firebase-key = Firebase key
+push-notification.huawei-settings = Android (Huawei Push Kit)
+push-notification.huawei-app-id = App ID
+push-notification.huawei-app-secret = App Secret
+push-notification.rate-limit = Rate limit
+push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
+push-notification.period-in-seconds = Period duration (seconds)
+push-notification.test-users = Test users
+push-notification.test-users-description = Test users description
+push-notification.define-new-user = +Define New User
+push-notification.user-definition = User Definition
+push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
+push-notification.see-user-list = See User List
+push-notification.define-new-user-title = Define New User
+push-notification.add-test-users-label = Add Users
+push-notification.definition-type = Definition Type
+push-notification.define-with-user-id = Define with User ID
+push-notification.define-with-cohort = Define with Cohort
+push-notification.enter-user-id = Enter User ID
+push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
+push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-cohort = Please select a cohort
+push-notification.user-list = User List
+push-notification.username = Username
+push-notification.user-id = User ID
+push-notification.cohort-name = Cohort Name
+push-notification.cancel = Cancel
+push-notification.i-understand-delete-key = I understand, delete this key
+push-notification.delete-key = Delete Key
+push-notification.test-users-were-successfully-removed = Test users have been successfully removed
+push-notification.test-users-were-successfully-added = Test users have been successfully added
+
+#Global settinsg
+push.plugin-title = Push Notifications
+push.proxyhost = Proxy Hostname
+push.proxypass = Proxy Password
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
+push.proxyunauthorized = Do NOT check proxy HTTPS certificate
+push.sendahead = Send notifications scheduled up to this many ms into the future
+push.connection_retries = Number of connection retries
+push.connection_factor = Time factor for exponential backoff between retries
+push.pool_pushes = Number of notifications in stream batches
+push.pool_bytes = Bytes in binary stream batches
+push.pool_concurrency = Maximum number of same type connections
+push.pool_pools = Maximum number of connections in total
+
+#Drawer from other views
+push-notification.send-message-to-users = Send message to users
+push-notification.select-max-two-metrics = Select maximum 2 metrics
+# Error codes
+push-notification.error-code.400.desc = 400 Bad request
+push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
+push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
+push-notification.error-code.405.desc = 405 Bad Method
+push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
+push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
+push-notification.error-code.500.desc = 500 Server error. Please try again later.
+push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
+push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
+push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
+push-notification.error-code.NoApp.desc = App not found when sending the notification.
+push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
+push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
+push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
+push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
+push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
+push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
+push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push-notification.error-code.MissingRegistration.desc = Please contact customer support.
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
+push-notification.error-code.InvalidTtl.desc = Please contact customer support.
+push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
+push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
+push-notification.error-code.NotRegistered.desc = FCM token expired
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
+push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
+push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
+push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
+push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
+push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
+
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.del = Message deleted
+push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
+push-notification.error-code.consent = Consent cancelled
+push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
+push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
+push-notification.error-code.aborted = Aborted
+push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
+push-notification.error-code.ExpiredToken = Expired Token
+push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
+
+# System Logs
+systemlogs.action.push_message_created = Push Notification created
+systemlogs.action.push_message_draft = Draft Push Notification created
+systemlogs.action.push_credentials_update = Push Credentials updated
+systemlogs.action.push_message_deleted = Push Notification deleted
+systemlogs.action.push_message_updated = Push Notification updated
+systemlogs.action.push_message_activated = Push Notification activated
+systemlogs.action.push_message_deactivated = Push Notification deactivated
+systemlogs.action.push_message_test = Test Push Notification sent
diff --git a/plugins/push/frontend/public/localization/push_pt_BR.properties b/plugins/push/frontend/public/localization/push_pt_BR.properties
new file mode 100644
index 00000000000..0089ddd82fa
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_pt_BR.properties
@@ -0,0 +1,457 @@
+push-notification.title = Push Notifications
+push-notification.description = An overview of all push notifications sent and actions performed in response.
+push-notification.one-time = One-time Notifications
+push-notification.automated = Automated Notifications
+push-notification.transactional = API Notifications
+push-notification.total-app-users = Total App Users
+push-notification.enabled-users = Notification-enabled Users
+push-notification.enabled-users-percentage = Enabled Users Percentage
+push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
+push-notification.platform-filter-label-one-time = One-time notifications for
+push-notification.platform-filter-label-automatic = Automatic notificatons for
+push-notification.platform-filter-label-transactional = Transactional notifications for
+push-notification.platform-filter-all = All Platforms
+push-notification.platform-filter-android = Android
+push-notification.platform-filter-ios = IOS
+push-notification.status-filter-all = All Messages
+push-notification.create-button = New Message
+push-notification.time-period = TIME PERIOD
+push-notification.created-by = Created by
+push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
+push-notification.sent-serie-name = Notifications Sent
+push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
+push-notification.actions-performed-serie-name = Actions Performed
+push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
+push-notification.table-notification-name = Notificaton name
+push-notification.table-status = Status
+push-notification.table-created = Created
+push-notification.table-date-sent = Date Sent/Scheduled
+push-notification.table-sent = Sent
+push-notification.table-actioned = Actioned
+push-notification.table-created-by = Created By
+push-notification.table-message-content = Message Content
+push-notification.duplicate = Duplicate
+push-notification.delete = Delete
+push-notification.resend = Resend
+push-notification.approve = Approve
+push-notification.reject = Reject
+push-notification.start = Start
+push-notification.stop = Stop
+push-notification.edit-draft = Edit Draft
+push-notification.edit = Edit
+push-notification.sent = Sent
+push-notification.sending = Sending
+push-notification.created = Created
+push-notification.draft = Draft
+push-notification.waiting-for-approval = Waiting for approval
+push-notification.aborted = Aborted
+push-notification.failed = Failed
+push-notification.stopped = Stopped
+push-notification.scheduled = Scheduled
+push-notification.rejected = Rejected
+push-notification.time-chart-period-weekly = Weekly
+push-notification.time-chart-period-monthly = Monthly
+push-notification.time-chart-period-daily= Daily
+push-notification.now = Now
+push-notification.right-before-sending-the-message = Right before sending the message
+push-notification.segmented-push-enabled-users = Segmented push-enabled users
+push-notification.delivery-type = Delivery Type
+push-notification.delivery-timeframe = Delivery Timeframe
+push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
+push-notification.trigger-type = Trigger Type
+push-notification.ios-badge-number-setting = IOS badge number
+push-notification.ios-json-data-setting = IOS JSON data
+push-notification.ios-user-data-setting = IOS user data
+push-notification.android-badge-number-setting = Android badge number
+push-notification.android-json-data-setting = Android JSON data
+push-notification.android-user-data-setting = Android user data
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
+push-notification.android = Android
+push-notification.ios = iOS
+
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
+push-notification.save = Save
+push-notification.send-for-approval = Send for approval
+push-notification.save-as-draft = Save as draft
+push-notification.create-one-time-notification = Create One-Time Push Notification
+push-notification.create-automated-notification = Create Automated Push Notification
+push-notification.create-transactional-notification = Create API Push Notification
+push-notification.notification-name = Notification Name
+push-notification.notification-name-description = Set the name of push notification (optional).
+push-notification.enter-notification-name = Enter Notification Name
+push-notification.platforms = Platforms
+push-notification.android = Android
+push-notification.ios = iOS
+push-notification.targeting = Targeting
+push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
+push-notification.all-push-enabled-users = All push-enabled users
+push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
+push-notification.use-segmentation = Use segmentation
+push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
+push-notification.push-enabled-users = Push-enabled users
+push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
+push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
+push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
+push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
+push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
+push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
+push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
+push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-location = Please select a location
+push-notification.when-to-determine-users = When to determine the users?
+push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
+push-notification.determine-users-before = Determine users right before sending the message
+push-notification.determine-users-now = Determine users now
+push-notification.triggers = Triggers
+push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
+push-notification.cohorts-entry = Cohort(s) entry
+push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
+push-notification.cohorts-exit = Cohort(s) exit
+push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
+push-notification.performed-events = Performed Event(s)
+push-notification.performed-events-description = Triggered when user performs a selected event.
+push-notification.select-event = Please select an event
+push-notification.cohorts = Cohort(s)
+push-notification.geolocations = Geolocation(s)
+push-notification.events = Event(s)
+push-notification.delivery-date-calculation = Delivery date calculation
+push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
+push-notification.start-date = Start date
+push-notification.set-start-date = Set Start Date
+push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
+push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
+push-notification.end-date = End date
+push-notification.set-end-date = Set End Date
+push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
+push-notification.delivery-method = Delivery Method
+push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
+push-notification.capping = Capping
+push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
+push-notification.no-capping = No Capping
+push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
+push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
+push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
+push-notification.send-anyway = Send anyway
+push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
+push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
+push-notification.send-now = Send now
+push-notification.send-now-description = Send the push notification immediately, once composition is complete.
+push-notification.scheduled = Scheduled
+push-notification.schedule-for-later = Schedule for later
+push-notification.delivery-time = Delivery Time
+push-notification.delivery-time-tooltip = Set an optional delivery time for your message
+push-notification.timezone = Timezone
+push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
+push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
+push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
+push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
+push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
+push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
+push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
+push-notification.do-not-send-message = Do not send the message
+push-notification.deliver-next-day = Deliver the message next day
+push-notification.immediately = Immediately
+push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
+push-notification.delayed = Delayed
+push-notification.days = Days
+push-notification.hours = Hours
+push-notification.capped = Capped
+push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
+push-notification.maximum-messages-per-user = Maximum messages per user
+push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
+push-notification.messages = Messages
+push-notification.minimum-time-between-messages = Minimum time between messages
+push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
+push-notification.expiration-time = Expiration Time
+push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
+push-notification.notification-type = NOTIFICATION TYPE
+push-notification.compose-message = Compose Message
+push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
+push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
+push-notification.default-message-is-required = Default message is required
+push-notification.content-message = Content message
+push-notification.silent-message = Silent message
+push-notification.message-title = Message title
+push-notification.add-variable = Add Variable
+push-notification.message-content = Message Content
+push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
+push-notification.buttons = Buttons
+push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
+push-notification.add-first-button = +Add First button
+push-notification.add-second-button = +Add Second button
+push-notification.enter-x-button = Enter xButton
+push-notification.enter-button-url = Enter Button URL or Deeplink
+push-notification.media-url = Media URL
+push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
+push-notification.enter-media-url = Enter Media URL
+push-notification.platform-settings = Platform Settings
+push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
+push-notification.sound-file-name = Sound File Name
+push-notification.enter-sound-file-name = Enter sound file name
+push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
+push-notification.add-badge-number = Add Badge Number
+push-notification.enter-badge-number = Enter badge number
+push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
+push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
+push-notification.subtitle = Subtitle
+push-notification.enter-your-subtitle = Enter your subtitle
+push-notification.subtitle-description = Add a subheading for your message.
+push-notification.on-click-url = On Click URL
+push-notification.enter-on-click-url = Enter on click URL
+push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
+push-notification.send-json = Send JSON
+push-notification.enter-json-data = Enter JSON data
+push-notification.send-json-description = Add app-specific JSON data along with standard content.
+push-notification.send-user-data = Send User Data
+push-notification.select-user-data = Select user data
+push-notification.send-user-data-description = Select user properties to send in your notification payload.
+push-notification.icon = Icon
+push-notification.icon-description = Set Android notification icon.
+push-notification.enter-icon = Enter icon
+push-notification.review-message = Review Mesage
+push-notification.review-message-tooltip = Review all the details of you push notification.
+push-notification.message-name = Message name
+push-notification.review-title = Title
+push-notification.content = Content
+push-notification.button-text = Button Text
+push-notification.button-url = Button URL
+push-notification.ios-media-url = iOS Media URL
+push-notification.android-media-url = Android Media URL
+push-notification.ios-badge-number = IOS badge number
+push-notification.ios-json-data = iOS JSON data
+push-notification.ios-user-data = iOS user data
+push-notification.android-badge-number = Android badge number
+push-notification.android-json-data = Android JSON data
+push-notification.android-user-data = Android user data
+push-notification.current-number-of-users = Current number of users
+push-notification.when-to-determine = When to determine
+push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
+push-notification.delivery = Delivery
+push-notification.delivery-description = Select the time you want the notification to be sent to users.
+push-notification.scheduled-for = Scheduled for
+push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
+push-notification.maximum-messages = Maximum {0} messages
+push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
+push-notification.confirmation = Confirmation
+push-notification.testing = TESTING
+push-notification.you-can-send-the-test-message = You can send the test message to test users
+push-notification.testing-tooltip = Sends the push notification to applications' test users
+push-notification.send-to-test-users = Send to test users
+push-notification.confirmation-uppercase = CONFIRMATION
+push-notification.confirmation-uppercase-description = CONFIRMATION description
+push-notification.i-am-ready-to-send = I am ready to send this message to real-users
+push-notification.was-successfully-saved = Push notification message was successfully saved
+push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
+push-notification.was-successfully-approved = Push notification has been successfully approved
+push-notification.was-successfully-rejected = Push notification has been successfully rejected
+push-notification.was-successfully-deleted = Push notification was successfully deleted
+push-notification.was-successfully-started = Push notification was successfully started
+push-notification.was-successfully-stopped = Push notification was successfully stopped
+
+# Add user property
+push-notification.event-properties = Event Properties
+push-notification.user-properties = User Properties
+push-notification.custom-properties = Custom Properties
+push-notification.add-user-property = Add User Property
+push-notification.api-property = Add User Property
+push-notification.search-in-properties = Search in Properties
+push-notification.select-property = Select Property
+push-notification.enter-value = Enter Value
+push-notification.start-with-capital-letter = Make user property start with capital letter
+push-notification.fallback-value = Fallback value
+push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
+push-notification.remove = Remove
+push-notification.confirm = Confirm
+push-notification.internal-properties = Internal Properties
+push-notification.external-properties = External Properties
+push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
+
+
+# Details
+push-notification-details.back-to = Back to Push Notifications
+push-notification-details.localization-filter-label = LOCALIZATION
+push-notification-details.localization-filter-all = All Localizations
+push-notification-details.summary-header = Notification Summary
+push-notification-details.summary-header-description = Overview of the notification message and its details.
+push-notification-details.message-tab = Message Content
+push-notification-details.targeting-tab = Targeting & Delivery
+push-notification-details.errors-tab = Errors
+push-notification-details.users-targeted-chart = Users Targeted
+push-notification-details.sent-messages-chart = Sent Messages
+push-notification-details.and-label = and
+push-notification-details.message-id = Message ID
+push-notification-details.results-for = Results for
+push-notification-details.created = Created
+push-notification-details.created-by = Created {0} by {1}
+
+push-notification-details.message-title = Title
+push-notification-details.message-content = Content
+push-notification-details.message-first-button-label = First Button Text
+push-notification-details.message-first-button-url = First Button URL
+push-notification-details.message-second-button-label = Second Button Text
+push-notification-details.message-second-button-url = Second Button URL
+push-notification-details.message-media-url = Media URL
+push-notification-details.ios-message-media-url = IOS media URL
+push-notification-details.android-message-media-url = Android media URL
+
+push-notification-details.targeting-sub-header = Targeting
+push-notification-details.targeted-users = Targeted users
+push-notification-details.geolocation = Geolocation
+push-notification-details.when-to-determine = When to determine
+push-notification-details.delivery-sub-header = Delivery
+push-notification-details.delivery-type = Delivery type
+push-notification-details.scheduled-for = Scheduled for
+push-notification-details.expiration-time = Expiration time
+push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
+push-notification-details.no-errors-found = No errors were found
+push-notification.users-targeted = Users Targeted
+push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
+push-notification.sent-notifications = Sent Notifications
+push-notification.sent-notifications-description = Total number of notifications sent.
+push-notification.clicked-notifications = Clicked Notifications
+push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
+push-notification.failed = Failed
+push-notification.failed-description = Total number of notifications that failed to get delivered.
+push-notification.no-errors-found = There are no errors found
+push-notification.affected-users = Affected Users
+push-notification.error-description = Description
+push-notification.error-code = Error Code
+push-notification.users = Users
+push-notification.back-to-push-notification-details = Back to push notification
+
+# Mobile Preview Component
+push-notification.mobile-preview-default-app-name = Your application name
+push-notification.mobile-preview-default-title = Your message title
+push-notification.mobile-preview-default-content = Your message content
+
+# Application settings
+push-notification.ios-settings = iOS settings
+push-notification.authentication-type = Authentication type
+push-notification.key-file-p8 = Key file (P8)
+push-notification.key-file-p12 = Sandbox + Production certificate (P12)
+push-notification.key-file-already-uploaded = Key file {0} is already uploaded
+push-notification.choose-file = Choose File
+push-notification.key-id = Key ID
+push-notification.team-id = Team ID
+push-notification.bundle-id = Bundle ID
+push-notification.passphrase = Passphrase
+push-notification.android-settings = Android (Google FCM)
+push-notification.firebase-key = Firebase key
+push-notification.huawei-settings = Android (Huawei Push Kit)
+push-notification.huawei-app-id = App ID
+push-notification.huawei-app-secret = App Secret
+push-notification.rate-limit = Rate limit
+push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
+push-notification.period-in-seconds = Period duration (seconds)
+push-notification.test-users = Test users
+push-notification.test-users-description = Test users description
+push-notification.define-new-user = +Define New User
+push-notification.user-definition = User Definition
+push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
+push-notification.see-user-list = See User List
+push-notification.define-new-user-title = Define New User
+push-notification.add-test-users-label = Add Users
+push-notification.definition-type = Definition Type
+push-notification.define-with-user-id = Define with User ID
+push-notification.define-with-cohort = Define with Cohort
+push-notification.enter-user-id = Enter User ID
+push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
+push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-cohort = Please select a cohort
+push-notification.user-list = User List
+push-notification.username = Username
+push-notification.user-id = User ID
+push-notification.cohort-name = Cohort Name
+push-notification.cancel = Cancel
+push-notification.i-understand-delete-key = I understand, delete this key
+push-notification.delete-key = Delete Key
+push-notification.test-users-were-successfully-removed = Test users have been successfully removed
+push-notification.test-users-were-successfully-added = Test users have been successfully added
+
+#Global settinsg
+push.plugin-title = Push Notifications
+push.proxyhost = Proxy Hostname
+push.proxypass = Proxy Password
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
+push.proxyunauthorized = Do NOT check proxy HTTPS certificate
+push.sendahead = Send notifications scheduled up to this many ms into the future
+push.connection_retries = Number of connection retries
+push.connection_factor = Time factor for exponential backoff between retries
+push.pool_pushes = Number of notifications in stream batches
+push.pool_bytes = Bytes in binary stream batches
+push.pool_concurrency = Maximum number of same type connections
+push.pool_pools = Maximum number of connections in total
+
+#Drawer from other views
+push-notification.send-message-to-users = Send message to users
+push-notification.select-max-two-metrics = Select maximum 2 metrics
+# Error codes
+push-notification.error-code.400.desc = 400 Bad request
+push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
+push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
+push-notification.error-code.405.desc = 405 Bad Method
+push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
+push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
+push-notification.error-code.500.desc = 500 Server error. Please try again later.
+push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
+push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
+push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
+push-notification.error-code.NoApp.desc = App not found when sending the notification.
+push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
+push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
+push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
+push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
+push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
+push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
+push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push-notification.error-code.MissingRegistration.desc = Please contact customer support.
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
+push-notification.error-code.InvalidTtl.desc = Please contact customer support.
+push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
+push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
+push-notification.error-code.NotRegistered.desc = FCM token expired
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
+push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
+push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
+push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
+push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
+push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
+
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.del = Message deleted
+push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
+push-notification.error-code.consent = Consent cancelled
+push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
+push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
+push-notification.error-code.aborted = Aborted
+push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
+push-notification.error-code.ExpiredToken = Expired Token
+push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
+
+# System Logs
+systemlogs.action.push_message_created = Push Notification created
+systemlogs.action.push_message_draft = Draft Push Notification created
+systemlogs.action.push_credentials_update = Push Credentials updated
+systemlogs.action.push_message_deleted = Push Notification deleted
+systemlogs.action.push_message_updated = Push Notification updated
+systemlogs.action.push_message_activated = Push Notification activated
+systemlogs.action.push_message_deactivated = Push Notification deactivated
+systemlogs.action.push_message_test = Test Push Notification sent
diff --git a/plugins/push/frontend/public/localization/push_ro.properties b/plugins/push/frontend/public/localization/push_ro.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_ro.properties
+++ b/plugins/push/frontend/public/localization/push_ro.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_ru.properties b/plugins/push/frontend/public/localization/push_ru.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_ru.properties
+++ b/plugins/push/frontend/public/localization/push_ru.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_sl.properties b/plugins/push/frontend/public/localization/push_sl.properties
new file mode 100644
index 00000000000..0dc7ccf6fab
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_sl.properties
@@ -0,0 +1,577 @@
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
+push.plugin-title = Push Notifications
+push.plugin-description = Increase loyalty, user retention & satisfaction with native iOS and Android push notifications
+push.sidebar.section = Messaging
+push.sidebar.overview = Overview
+push.sidebar.messages = Messages
+
+push.no-message = No message
+push.create = Create Message
+push.create-message-n = Create Message to {0} users
+
+mgmt-plugins.push.here = here
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android (Google FCM)
+mgmt-plugins.push.android.key = Firebase key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from
+mgmt-plugins.push.h = Android (Huawei Push Kit)
+mgmt-plugins.push.h.key = Huawei App ID
+mgmt-plugins.push.h.key.desc = Your numerical Huawei App ID (Client ID)
+mgmt-plugins.push.h.secret = App Secret
+mgmt-plugins.push.h.secret.desc = Huawei App Secret, sign secret of your app can be found in code signing properties or at
+mgmt-plugins.push.h.secret.hds = Huawei developer portal
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.error.h.key = Please enter Huawei App ID
+mgmt-plugins.push.error.h.secret = Please enter Huawei App Secret
+mgmt-plugins.push.error.h.keynum = Huawei App ID can contain only digits
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.p12 = Universal certificate (p12) is already uploaded
+mgmt-plugins.push.uploaded.p8 = Key file (p8) is already uploaded
+mgmt-plugins.push.uploaded.bundle = Bundle id of this certificate:
+mgmt-plugins.push.detected = Detected key type:
+mgmt-plugins.push.rate = Rate limit
+mgmt-plugins.push.rate.rate = Maximum number of notifications scheduled per period
+mgmt-plugins.push.rate.help = Push notifications sent to FCM and APNS will separately be rate limited based on this configuration for each push notification campaign
+mgmt-plugins.push.rate.period = Period duration (seconds)
+mgmt-plugins.push.rate.period.help = Timeframe to apply the rate limit to
+
+systemlogs.action.push_message_created = Push Message Created
+systemlogs.action.push_credentials_update = Push Credentials Updated
+systemlogs.action.push_message_deleted = Push Message Deleted
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM). It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = Total number of messages sent for this application within selected period of time.
+help.dashboard.push.actions = Number of actions performed for this app. Action represents a positive reaction of a user to your message. Please see SDK guide to know how to enable this metric in your app.
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or FCM tokens stored in the database.
+
+pu.po.title = Create Push Notification
+pu.po.desc = Compose your push notification in 4 easy steps
+
+pu.po.view.title = Push Notification
+pu.po.view.desc = Message details
+
+pu.po.preview = Preview
+pu.po.preview.help = Please note that this is a preview screen. What you see here may not be same as what end users see on their smartphones due to varying device sizes.
+
+pu.po.tt.pers = Add personalized content
+pu.po.tt.emoji = Add emoji
+
+pu.po.tab0.title = Apps & Platforms
+pu.po.tab0.title.auto = Platforms
+pu.po.tab0.desc = Destinations
+
+pu.po.tab1.title = Scheduling
+pu.po.tab1.desc = Set message date
+pu.po.tab1.title.auto = Campaign Rules
+pu.po.tab1.desc.auto = Triggers & dates
+
+pu.po.tab1.chr = Cohorts
+pu.po.tab1.chr-desc = Send to the users currently in selected cohorts
+
+pu.po.tab1.aud = Audience Selection
+pu.po.tab1.now.t = Now
+pu.po.tab1.now.d = Select users now
+pu.po.tab1.later.t = Before sending
+pu.po.tab1.later.d = Select users right before sending the message
+
+pu.po.tab2.ddc = Delivery Date Calculation
+pu.po.tab2.ddc.arr = Relative to the date event arrived to the server
+pu.po.tab2.ddc.evt = Relative to the date event occurred on a device
+# pu.po.tab2.ddc.h = In "event occurrence" case Countly only sends notifications within 30 minutes of actual event recording date, discarding any "late" notifications which could be triggered due to event arriving to the server with a delay because of networking issues.
+# pu.po.tab2.ddc.h = Note that larger amount of notifications won't be sent in case of event occurence date since an event might arrive to the server with a delay due to networking issues. On the other hand, accuracy of "event occurence" case is better, since there won't be any late notifications.
+# pu.po.tab2.ddc.arr = Relative to the event arrival to the server date
+# pu.po.tab2.ddc.evt = Relative to the event occurence on the device date
+
+pu.po.tab2.trc = Behaviour when trigger condition is no longer met
+pu.po.tab2.trc.true = Cancel when user exits selected cohort(s)
+pu.po.tab2.trc.false = Cancel when user enters selected cohort(s) back
+pu.po.tab2.trc.dont = Send anyway
+
+pu.po.tab2.title.auto = Message Delivery
+pu.po.tab2.desc.auto = Periodicity & capping
+
+pu.po.compose.title = Message
+pu.po.compose.desc = Compose content
+
+pu.po.review.title = Review
+pu.po.review.desc = Check your message
+
+pu.po.tab0.apps = Apps
+pu.po.tab0.add = Add App
+pu.po.tab0.select-apps = Select Apps
+pu.po.tab0.select-apps-desc = Only apps with APN or FCM credentials are displayed
+pu.po.tab0.select-platforms = Select Platforms
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or FCM credentials
+pu.platform.i = iOS
+pu.platform.a = Android
+pu.po.prev = Previous step
+pu.po.next = Next step
+pu.po.send = Send!
+pu.po.start = Start!
+pu.po.edit = Save
+pu.po.close = Close
+pu.po.duplicate = Duplicate
+pu.po.delete = Delete
+
+pu.po.tab1.testing = Testing
+pu.po.tab1.testing-desc = Send to production users or to test users?
+pu.po.tab1.testing-prod = Production Users
+pu.po.tab1.testing-test = Test Users
+pu.po.tab1.testing-test-desc = Development & test users only
+
+pu.po.tab1.scheduling = Scheduling
+pu.po.tab1.scheduling-desc = Send now or schedule sending for later
+pu.po.tab1.scheduling-now = Send now
+pu.po.tab1.scheduling-auto-now = Start now
+pu.po.tab1.scheduling-now-desc = Sending will start once you click Send
+pu.po.tab1.scheduling-date = Schedule
+pu.po.tab1.scheduling-date-desc = Set specific date & time for this message
+pu.po.tab1.tz = Send according to user's timezone?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = No
+pu.po.tab1.tz-no-desc = Send all notifications at once
+pu.po.tab1.tz-yes = Send in user timezones
+pu.po.tab1.tz-yes-desc = Send each notification in timezone of the user it's for
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = Geolocations
+pu.po.tab1.geos-desc = Filter users by their last known location?
+pu.po.tab1.geos.no = No filtering
+
+
+pu.po.recipients.s = Recipient: {0}
+pu.po.recipients.m = Recipients: {0}
+pu.po.recipients.temporary = Number of users calculation is still running, it can take up to several minutes in tough cases. Feel free to send your message without waiting.
+
+pu.po.tab2.message.type = Message type
+pu.po.tab2.extras = Additional options
+
+pu.type.message = Message
+pu.type.data = Data-only
+pu.type.rich = Rich
+
+pu.po.loading = We're counting your users
+pu.po.loading-desc = Please wait, it will be done soon
+
+pu.po.sending = Saving
+pu.po.sending-desc = Just a moment
+
+pu.po.sent = Saved
+pu.po.sent-desc = All good!
+
+pu.po.tab2.placeholder = Write your message here (default is required, add more localized messages if needed)
+pu.po.tab2.default-message = Your message
+pu.po.tab2.default-message.invalid = Default message is required
+pu.po.tab2.default-button-title.invalid = Default button title is required
+pu.po.tab2.default-button-link.invalid = Default button link is required
+pu.po.tab2.extras.sound = Send sound
+pu.po.tab2.extras.sound.invalid = Sound must be a string
+pu.po.tab2.extras.badge = Add badge
+pu.po.tab2.extras.badge.invalid = Badge must be a valid number
+pu.po.tab2.extras.badge.help = iOS supports badges by default, Android requires additional steps (more details in our Android SDK Guide)
+pu.po.tab2.extras.media = Attachment URL
+pu.po.tab2.extras.media.placeholder = Image URL
+pu.po.tab2.extras.media.invalid = Must be a valid URL to an image (JPG, PNG) or animation (GIF) less than 10MB in size, audio (MP3, WAV, AIF) less than 5MB in size or video (MPEG, MPEG2, MPEG4) less than 50MB in size
+pu.po.tab2.extras.media.toobig = Media attachment must be less than 10MB for images and animations, less than 5MB for audio & 50MB for videos
+pu.po.tab2.extras.media.help = Media attachments are fully supported on iOS 10+. Android supports only images, iOS 9- doesn't support media at all. In case media is not supported, users will only see message text.
+pu.po.tab2.extras.url = On click URL
+pu.po.tab2.extras.url.invalid = URL must be valid
+pu.po.tab2.extras.url.help = Default URL or deeplink which is being open when user taps a message in drawer
+pu.po.tab2.extras.data = Send JSON
+pu.po.tab2.extras.data.invalid = This field must contain valid JSON string
+pu.po.tab2.extras.data.placeholder = JSON string
+pu.po.tab2.extras.data.help = App-specific JSON data can be sent along with standard content
+pu.po.tab2.mtitle = Message title
+pu.po.tab2.mtitle.placeholder = Optional title for your message
+pu.po.tab2.mtext = Message text
+pu.po.tab2.mbtn = Buttons
+pu.po.tab2.mbtns = Number of buttons
+pu.po.tab2.mbtn.urls = Button URLs
+pu.po.tab2.mbtn.req = Button title required
+pu.po.tab2.mbtn.url = Must be a valid URL
+pu.po.tab2.mbtn.0 = Button 0
+pu.po.tab2.mbtn.1 = Button 1
+pu.po.tab2.mbtn.2 = Button 2
+pu.po.tab2.btntext = Button text
+pu.po.tab2.urlordeep = URL or deeplink
+pu.po.tab2.rich = Rich notification options
+pu.po.tab2.mmedia = Media
+pu.po.tab2.mmedia.type.image = Image
+pu.po.tab2.mmedia.type.anima = Animation
+pu.po.tab2.mmedia.type.audio = Audio
+pu.po.tab2.mmedia.type.video = Video
+pu.po.tab2.mmedia.type.warn.android = This type of media is not supported on Android
+pu.po.tab2.mmedia.status = Request status:
+pu.po.tab2.default-message.help = Default localization for all users. You can override default message & button names by setting them for specific locales.
+pu.po.no-users = Sorry, there are no push-enabled users for specified options.
+pu.po.no-users-try-change = Try to change
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = Start over
+pu.po.tab2.variable = Variable
+pu.po.tab2.capital = Make variable value start from capital letter
+pu.po.tab2.fallback = Fallback value
+pu.po.tab2.help = Default value which will be used in case user profile doesn't have this variable
+pu.po.tab2.props = User Properties
+pu.po.tab2.cust = Custom Variables
+pu.po.tab2.varpl = Select variable
+pu.po.tab2.fallpl = Enter fallback value
+pu.po.tab2.tt = User''s "{0}" property which falls back to "{1}"
+
+datepicker.dt.click = Set date & time
+datepicker.tz = Send in user's timezone
+datepicker.clear = Clear
+datepicker.apply = Apply
+datepicker.pick-time = Pick Time
+
+pu.locale.default = Default
+pu.locale.null = Unknown
+pu.po.tab3.review = Review
+pu.po.tab3.apps = Apps
+pu.po.tab3.platforms = Platforms
+pu.po.tab3.date = Date
+pu.po.tab3.date.now = At the time of message creation
+pu.po.tab3.date.intz = ; in user timezones
+pu.po.tab3.unknown = Unknown
+pu.po.tab3.type = Type
+pu.po.tab3.type.message = Text message
+pu.po.tab3.type.data = Data
+pu.po.tab3.type.update = Update (deprecated)
+pu.po.tab3.type.review = Review (deprecated)
+pu.po.tab3.type.category = Category (deprecated)
+pu.po.tab3.type.link = URL (deprecated)
+pu.po.tab3.test = Send to test devices
+pu.po.tab3.test.true = Yes
+pu.po.tab3.test.false = No
+pu.po.tab3.btns = Buttons
+pu.po.tab3.media = Media
+pu.po.tab3.extras = Standard options
+
+pu.po.tab3.extras.sound = Sound
+pu.po.tab3.extras.badge = iOS badge
+pu.po.tab3.extras.url = On click URL
+pu.po.tab3.extras.data = Extra data
+pu.po.tab3.extras.media = Media
+
+pu.po.tab3.date.date = Scheduled to be sent on
+pu.po.tab3.date.sent = Sent on
+pu.po.tab3.date.tz = Sent in user timezone
+
+pu.po.tab3.audience = Recipients
+
+pu.po.tab3.errors = Errors
+pu.po.tab3.errors.code = Code
+pu.po.tab3.errors.message = Error
+pu.po.tab3.errors.count = Count
+
+pu.po.confirm = Confirm sending
+pu.po.confirm.ready = I’m ready to send this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will receive this campaign after it is started.
+pu.po.recipients.message.details = This message will automatically be delivered to app users as they match campaign trigger criteria.
+pu.po.recipients.message.edit = Message modification only affects notifications scheduled after modification takes place.
+
+pu.dash.users = Users
+pu.dash.users.total = Total Users
+pu.dash.users.enabl = Messaging-enabled Users
+pu.dash.totals = Overall
+pu.dash.metrics = Metrics
+pu.dash.metrics.sent = Messages sent
+pu.dash.metrics.acti = Actions performed
+pu.dash.create = Create Message
+pu.dash.monthly = Monthly
+pu.dash.weekly = Weekly
+pu.dash.messages = Messages
+pu.dash.messages.all = All
+pu.dash.messages.api = API
+pu.dash.messages.dash = Dashboard
+pu.dash.actions = Actions
+pu.dash.sent = Sent
+
+
+pu.t.nothing = No records found
+pu.t.search = Search by default message
+pu.t.message = Message
+pu.t.apps = Apps
+pu.t.status = Status
+pu.t.created = Created
+pu.t.sent-scheduled = Date sent / Scheduled
+pu.t.result = Sent / Actioned
+
+push.message.status.initial = Initial
+push.message.status.created = Created
+push.message.status.scheduled = Scheduled
+push.message.status.sending = Sending
+push.message.status.sending-errors = Sending with errors
+push.message.status.aborted = Aborted
+push.message.status.sent = Sent
+push.message.status.sent-errors = Sent with errors
+
+push.message.status.auto.true = Active
+push.message.status.auto.false = Inactive
+
+push.error.econnrefused = Countly cannot connect to APN/FCM. Please check your proxy server settings (if any) and / or server connectivity to APN/FCM servers.
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = Process exited while sending this messsage due to connection being unexpectedly closed by APNS. Some notifications might have been sent twice (up to 500).
+push.error.3-eof = APNS connection error. Possible reasons include: invalid certificate / auth key, firewall block, system root certificates (CA) issues.
+push.error.no-credentials = You don't have credentials for any of selected app-platform combinations.
+push.error.no-app-credentials = This application doesn't have any push notification credentials set.
+push.error.no-cohorts = Automated messages depend on Cohorts and Events, yet you don't have any of those.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+push.error.no.cohorts = No Cohorts or events
+push.error.no.credentials = No credentials
+push.error.i.understand = OK, I understand
+
+
+push.errorCodes.bug = You found a bug! Please contact support.
+push.errorCodes = Errors:
+push.errorCode.i400 = APN 400 Bad request
+push.errorCode.i400+BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse the certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to the Bundle ID of your application
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403 Certificate error
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403 error: InvalidProviderToken. Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push.errorCode.i405 = APN 405 Bad method
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413 Payload too large
+push.errorCode.i413.desc = Message was too large and APN declined to deliver it.
+push.errorCode.i429 = APN 429 Too many requests
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500 Internal error
+push.errorCode.i500.desc = Apple server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.i503 = APN 503 Shutdown
+push.errorCode.i503.desc = Apple server unexpectedly decided to shutdown returning HTTP error 503. Please try again later.
+
+push.errorCode.a200 = FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push.errorCode.a200+InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push.errorCode.a200+MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push.errorCode.a200+InvalidDataKey.desc = Message contains invalid data key, please check:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push.errorCode.a200+TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push.errorCode.a400 = FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = FCM 500 Internal error
+push.errorCode.a500.desc = Google server unexpectedly returned HTTP error 500. Please try again later.
+push.errorCode.a200+Unavailable.desc = Google server unexpectedly returned HTTP error 200+Unavailable. Please try again later.
+push.errorCode.a200+InternalServerError.desc = Google server unexpectedly returned HTTP error 200+InternalServerError. Please try again later.
+push.errorCode.a501 = FCM 501 Error
+push.errorCode.a502 = FCM 502 Error
+push.errorCode.a503 = FCM 503 Error
+push.errorCode.link.i = Apple docs
+push.errorCode.link.a = Google docs
+push.errorCode.skiptz = Too late to send
+push.errorCode.skiptz.desc = This much notifications have been discarded because time of arrival would be at least 60 minutes later than expected (either due to user's timezone, or due to networking issues).
+push.errorCode.del = Message deleted
+push.errorCode.del.desc = This much notifications have been discarded their message has been deleted.
+push.errorCode.aborted = Aborted
+push.errorCode.aborted.desc = This much messages have been removed from queue after an unrecoverable error. Please check error message above or contact support if there's no error message.
+push.errorCode.consent = Consent cancelled
+push.errorCode.consent.desc = This much messages have been removed from queue after user removed push consent.
+
+push.totals.processed = Processed
+push.totals.sent = Accepted
+push.totals.errors = Errors
+
+pu.po.users.s = {0} user
+pu.po.users.m = {0} users
+pu.po.metrics = Metrics
+pu.po.metrics.processed = Processed
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = Sent Successfully
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & FCM
+pu.po.metrics.sent.none = No notifications were sent! Please check message errors
+pu.po.metrics.sent.one = Your notification has been sent successfully!
+pu.po.metrics.sent.all = All notifications have been sent successfully!
+pu.po.metrics.actions = Actioned
+pu.po.metrics.actions.desc = How many users performed push notification action
+pu.po.metrics.actions.all = All users performed action! Good Job!
+pu.po.metrics.actions.performed = performed action.
+pu.po.metrics.actions0.performed = opened default URL.
+pu.po.metrics.actions1.performed = clicked first button.
+pu.po.metrics.actions2.performed = clicked second button.
+pu.po.left.to.send.s = {0} notification left to send
+pu.po.left.to.send.m = {0} notifications left to send
+pu.po.left.to.send.none = All notifications are sent!
+pu.po.left.to.send.batch = next batch will start at {0}
+pu.po.expired.s = {0} token expired
+pu.po.expired.m = {0} tokens expired
+pu.po.unset.s = {0} tokens expired
+pu.po.unset.m = {0} token expired
+pu.po.errors.s = {0} notification wasn\'t sent due to an error
+pu.po.errors.m = {0} notifications weren\'t sent due to an error
+
+pu.apn.uni = Universal Certificate (Production & Sandbox)
+pu.apn.none = None
+
+pu.gcm.gcm = FCM Key
+pu.gcm.none = None
+
+pu.remove = Remove credentials
+pu.validate = Validate
+pu.validating = Validating credentials
+pu.validation.error = Credentials error:
+pu.remove = Remove credentials
+pu.creds.none = None
+pu.creds.type.apn_universal = APN Universal Certificate is set
+pu.creds.type.apn_token = APN Auth Key is set
+pu.creds.type.gcm = FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase Server Key
+pu.creds.cert = P12 Certificate
+pu.creds.pass = Passphrase
+pu.creds.auth_key = P8 Key File
+pu.creds.key_id = Auth Key ID
+pu.creds.team_id = Team ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN Certificate (Sandbox & Production)
+pu.creds.apn.type.apn_token = APN Auth Key
+
+userdata.push = Push tokens
+pu.tk.id = APN Test token (development)
+pu.tk.ia = APN Test token (ad hoc or TestFlight)
+pu.tk.ip = APN Production token
+pu.tk.at = FCM Test token
+pu.tk.ap = FCM Production token
+pu.tk.ht = Huawei Test token
+pu.tk.hp = Huawei Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = Create Message
+pu.dash.btn-group.automated-message = Automated Message
+pu.dash.btn-group.automated-message-desc = Create an automated push campaign to send a message to users when their-in-app behaviour matches defined criteria.
+pu.dash.btn-group.automated-message-link = Learn more about automation
+pu.dash.btn-group.one-time-message = One-time Message
+pu.dash.btn-group.one-time-message-desc = Create a one-time push notification campaign to send right away on in the future.
+pu.dash.btn-group-available-in-enterprise = Available in enterprise edition
+pu.dash.btn.learn-more = Learn more about automation
+
+pu.po.tab1.trigger-type = Trigger Type
+pu.po.tab1.trigger-type.entry = Cohort Entry
+pu.po.tab1.trigger-type.exit = Cohort Exit
+pu.po.tab1.trigger-type.event = Performed Event
+pu.po.tab1.cohort-entry-desc = Triggered when user enters into any of the cohorts you select
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.cohort-event-desc = Triggered when user performs a selected event
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = Recalculation of cohorts above will trigger message sending process automatically
+pu.po.tab1.select-cohort-placeholder = Select cohorts(s)
+pu.po.tab1.select-event = Select one or more events to set a trigger
+pu.po.tab1.select-event-placeholder = Select event(s)
+pu.po.tab1.campaign-start-date = Campaign Start Date
+pu.po.tab1.additional-options = Additional Options
+pu.po.tab1.campaign-end-date = Campaign end date
+
+pu.po.tab2.delivery-method = Delivery method
+pu.po.tab2.delivery-method-desc = Choose when your message should be delivered
+pu.po.tab2.immediately = Immediately
+pu.po.tab2.immediately-desc = Deliver the message as soon as triggering cohort is recalculated
+pu.po.tab2.immediately-desc-event = Deliver the message as soon as triggering event reached the server
+pu.po.tab2.delayed = Delayed
+pu.po.tab2.delivery-time = Delivery time
+pu.po.tab2.delivery-time-desc = Set an optional delivery time for your message
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = Send in users' timezone at
+pu.po.tab2.select-time = Select time
+pu.po.tab2.capping = Capping
+pu.po.tab2.capping-desc = Configure number of messages per user. Enabling this option will limit number of messages sent to the same user.
+pu.po.tab2.capping.no = No capping
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered to or exited from the cohort
+pu.po.tab2.capping.no-desc-event = Message is sent whenever user's event is received by the server
+pu.po.tab2.capping.yes = Capped
+pu.po.tab2.capping.yes-desc = Number of messages is limited
+pu.po.tab2.message-per-user = Maximum messages per user
+pu.po.tab2.message-per-user-desc = Total number of messages individual user can receive from this campaign
+pu.po.tab2.sleep = Minimum time between messages
+pu.po.tab2.sleep-desc = User will be eligible to receive a repetitive message only if she / he triggers the campaign conditions at least configured time after previous message.
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = App
+pu.po.tab4.campaign-rules = Campaign Rules
+pu.po.tab4.trigger-type = Trigger Type
+pu.po.tab4.trigger-cohort-entry = Cohort entry
+pu.po.tab4.trigger-cohort-exit = Cohort exit
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = Cohort
+pu.po.tab4.cohorts.m = Cohorts ({0})
+pu.po.tab4.events.no = Events(s) were deleted
+pu.po.tab4.events.s = Event
+pu.po.tab4.events.m = Events ({0})
+pu.po.tab4.caping = Capping
+pu.po.tab4.caping-message = At most {0} message is going to be sent per user
+pu.po.tab4.message-content = Message Content
+pu.po.tab4.message-title = Title
+pu.po.tab4.message-text = Text
+pu.po.tab4.message-sound = Sound
+pu.po.tab4.message-media = Media
+pu.po.tab4.message-badge = Badge
+
+push.po.one-time-messages = ONE-TIME MESSAGES
+push.po.automated-messages = AUTOMATED MESSAGES
+push.po.table.dublicate = Duplicate
+push.po.table.resend = Resend failed notifications
+push.po.table.edit = Edit
+push.po.table.delete = Delete
+push.po.table.recipients = View recipients
+
+pu.po.progress = Progress
+pu.po.progress.auto = 30 days overview
+pu.never = Never
+pu.days.s = day
+pu.days.m = days
+pu.hours.s = hour
+pu.hours.m =hours
+pu.messages.s = message
+pu.messages.m = messages
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
+
+push.proxyhost = Proxy Hostname
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxypass = Proxy Password
+
+push.note.gcm.t = Your push notifications can't be delivered
+push.note.gcm.m = Following apps have GCM credentials instead of Firebase ones: {0}.
Usage of GCM is no longer possible since Google stopped accepting requests to GCM endpoint.
Please update app credentials to a valid FCM server key.
+
+mail.autopush-error-subject = Countly Automated Push Problem
+mail.autopush-error = Hi {0},
Your automated message cannot be sent due to a repeating error. Please review message status and reactivate the message once the problem is resolved.
Best,
A fellow Countly Admin
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
diff --git a/plugins/push/frontend/public/localization/push_sv.properties b/plugins/push/frontend/public/localization/push_sv.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_sv.properties
+++ b/plugins/push/frontend/public/localization/push_sv.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_tr.properties b/plugins/push/frontend/public/localization/push_tr.properties
index bfb30a21d4f..2b362ae9129 100644
--- a/plugins/push/frontend/public/localization/push_tr.properties
+++ b/plugins/push/frontend/public/localization/push_tr.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Gönderilen
internal-events.[CLY]_push_action = Aksiyonlanan
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_uk.properties b/plugins/push/frontend/public/localization/push_uk.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_uk.properties
+++ b/plugins/push/frontend/public/localization/push_uk.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_vi.properties b/plugins/push/frontend/public/localization/push_vi.properties
index a08fc2a3f7a..0089ddd82fa 100644
--- a/plugins/push/frontend/public/localization/push_vi.properties
+++ b/plugins/push/frontend/public/localization/push_vi.properties
@@ -23,7 +23,6 @@ push-notification.sent-serie-description = Total number of notifications sent in
push-notification.actions-performed-serie-name = Actions Performed
push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
push-notification.table-status = Status
push-notification.table-created = Created
push-notification.table-date-sent = Date Sent/Scheduled
@@ -66,15 +65,16 @@ push-notification.ios-user-data-setting = IOS user data
push-notification.android-badge-number-setting = Android badge number
push-notification.android-json-data-setting = Android JSON data
push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
internal-events.[CLY]_push_sent = Push sent
internal-events.[CLY]_push_action = Push action
push-notification.android = Android
push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
push-notification.save = Save
push-notification.send-for-approval = Send for approval
push-notification.save-as-draft = Save as draft
@@ -84,11 +84,6 @@ push-notification.create-transactional-notification = Create API Push Notificati
push-notification.notification-name = Notification Name
push-notification.notification-name-description = Set the name of push notification (optional).
push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
push-notification.platforms = Platforms
push-notification.android = Android
push-notification.ios = iOS
@@ -125,18 +120,10 @@ push-notification.cohorts = Cohort(s)
push-notification.geolocations = Geolocation(s)
push-notification.events = Event(s)
push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
push-notification.start-date = Start date
push-notification.set-start-date = Set Start Date
push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
push-notification.end-date = End date
push-notification.set-end-date = Set End Date
@@ -157,7 +144,6 @@ push-notification.send-now-description = Send the push notification immediately,
push-notification.scheduled = Scheduled
push-notification.schedule-for-later = Schedule for later
push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
push-notification.delivery-time-tooltip = Set an optional delivery time for your message
push-notification.timezone = Timezone
push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
@@ -173,13 +159,8 @@ push-notification.immediately = Immediately
push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
push-notification.delayed = Delayed
push-notification.days = Days
-push-notification.day = Day
push-notification.hours = Hours
push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
push-notification.maximum-messages-per-user = Maximum messages per user
push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
@@ -187,10 +168,8 @@ push-notification.messages = Messages
push-notification.minimum-time-between-messages = Minimum time between messages
push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
push-notification.compose-message = Compose Message
push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
@@ -206,7 +185,6 @@ push-notification.buttons-tooltip = Set the text for each action button as well
push-notification.add-first-button = +Add First button
push-notification.add-second-button = +Add Second button
push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
push-notification.enter-button-url = Enter Button URL or Deeplink
push-notification.media-url = Media URL
push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
@@ -216,7 +194,6 @@ push-notification.platform-settings-description = Set media and other message sp
push-notification.sound-file-name = Sound File Name
push-notification.enter-sound-file-name = Enter sound file name
push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
push-notification.add-badge-number = Add Badge Number
push-notification.enter-badge-number = Enter badge number
push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
@@ -224,8 +201,6 @@ push-notification.media-url-platform-description = Add the URL for media specifi
push-notification.subtitle = Subtitle
push-notification.enter-your-subtitle = Enter your subtitle
push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
push-notification.on-click-url = On Click URL
push-notification.enter-on-click-url = Enter on click URL
push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
@@ -306,7 +281,6 @@ push-notification-details.summary-header-description = Overview of the notificat
push-notification-details.message-tab = Message Content
push-notification-details.targeting-tab = Targeting & Delivery
push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
push-notification-details.users-targeted-chart = Users Targeted
push-notification-details.sent-messages-chart = Sent Messages
push-notification-details.and-label = and
@@ -324,7 +298,6 @@ push-notification-details.message-second-button-url = Second Button URL
push-notification-details.message-media-url = Media URL
push-notification-details.ios-message-media-url = IOS media URL
push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
push-notification-details.targeting-sub-header = Targeting
push-notification-details.targeted-users = Targeted users
@@ -350,11 +323,6 @@ push-notification.error-description = Description
push-notification.error-code = Error Code
push-notification.users = Users
push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
# Mobile Preview Component
push-notification.mobile-preview-default-app-name = Your application name
@@ -404,7 +372,6 @@ push-notification.i-understand-delete-key = I understand, delete this key
push-notification.delete-key = Delete Key
push-notification.test-users-were-successfully-removed = Test users have been successfully removed
push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
#Global settinsg
push.plugin-title = Push Notifications
@@ -415,57 +382,16 @@ push.proxyuser = Proxy Username
push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
push.proxyunauthorized = Do NOT check proxy HTTPS certificate
push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
push.connection_retries = Number of connection retries
push.connection_factor = Time factor for exponential backoff between retries
push.pool_pushes = Number of notifications in stream batches
push.pool_bytes = Bytes in binary stream batches
push.pool_concurrency = Maximum number of same type connections
push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
#Drawer from other views
push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
# Error codes
push-notification.error-code.400.desc = 400 Bad request
push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
@@ -482,8 +408,6 @@ push-notification.error-code.NoMessage.desc = The message was not found when sen
push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
@@ -495,7 +419,6 @@ push-notification.error-code.MissingRegistration.desc = Please contact customer
push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
push-notification.error-code.InvalidTtl.desc = Please contact customer support.
@@ -511,7 +434,6 @@ push-notification.error-code.MessageBodyTooBig.desc = Message body is too big fo
push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
push-notification.error-code.del = Message deleted
@@ -524,7 +446,6 @@ push-notification.error-code.aborted.desc = Push Notification messages have been
push-notification.error-code.ExpiredToken = Expired Token
push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
# System Logs
systemlogs.action.push_message_created = Push Notification created
systemlogs.action.push_message_draft = Draft Push Notification created
diff --git a/plugins/push/frontend/public/localization/push_zh.properties b/plugins/push/frontend/public/localization/push_zh.properties
index a08fc2a3f7a..70d2fbd94a6 100644
--- a/plugins/push/frontend/public/localization/push_zh.properties
+++ b/plugins/push/frontend/public/localization/push_zh.properties
@@ -1,536 +1,577 @@
-push-notification.title = Push Notifications
-push-notification.description = An overview of all push notifications sent and actions performed in response.
-push-notification.one-time = One-time Notifications
-push-notification.automated = Automated Notifications
-push-notification.transactional = API Notifications
-push-notification.total-app-users = Total App Users
-push-notification.enabled-users = Notification-enabled Users
-push-notification.enabled-users-percentage = Enabled Users Percentage
-push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
-push-notification.platform-filter-label-one-time = One-time notifications for
-push-notification.platform-filter-label-automatic = Automatic notificatons for
-push-notification.platform-filter-label-transactional = Transactional notifications for
-push-notification.platform-filter-all = All Platforms
-push-notification.platform-filter-android = Android
-push-notification.platform-filter-ios = IOS
-push-notification.status-filter-all = All Messages
-push-notification.create-button = New Message
-push-notification.time-period = TIME PERIOD
-push-notification.created-by = Created by
-push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
-push-notification.sent-serie-name = Notifications Sent
-push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
-push-notification.actions-performed-serie-name = Actions Performed
-push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
-push-notification.table-notification-name = Notificaton name
-push-notification.table-campaign-name = Campaign Name
-push-notification.table-status = Status
-push-notification.table-created = Created
-push-notification.table-date-sent = Date Sent/Scheduled
-push-notification.table-sent = Sent
-push-notification.table-actioned = Actioned
-push-notification.table-created-by = Created By
-push-notification.table-message-content = Message Content
-push-notification.duplicate = Duplicate
-push-notification.delete = Delete
-push-notification.resend = Resend
-push-notification.approve = Approve
-push-notification.reject = Reject
-push-notification.start = Start
-push-notification.stop = Stop
-push-notification.edit-draft = Edit Draft
-push-notification.edit = Edit
-push-notification.sent = Sent
-push-notification.sending = Sending
-push-notification.created = Created
-push-notification.draft = Draft
-push-notification.waiting-for-approval = Waiting for approval
-push-notification.aborted = Aborted
-push-notification.failed = Failed
-push-notification.stopped = Stopped
-push-notification.scheduled = Scheduled
-push-notification.rejected = Rejected
-push-notification.time-chart-period-weekly = Weekly
-push-notification.time-chart-period-monthly = Monthly
-push-notification.time-chart-period-daily= Daily
-push-notification.now = Now
-push-notification.right-before-sending-the-message = Right before sending the message
-push-notification.segmented-push-enabled-users = Segmented push-enabled users
-push-notification.delivery-type = Delivery Type
-push-notification.delivery-timeframe = Delivery Timeframe
-push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
-push-notification.trigger-type = Trigger Type
-push-notification.ios-badge-number-setting = IOS badge number
-push-notification.ios-json-data-setting = IOS JSON data
-push-notification.ios-user-data-setting = IOS user data
-push-notification.android-badge-number-setting = Android badge number
-push-notification.android-json-data-setting = Android JSON data
-push-notification.android-user-data-setting = Android user data
-push-notification.drill-section = Push
-internal-events.[CLY]_push_sent = Push sent
-internal-events.[CLY]_push_action = Push action
-push-notification.android = Android
-push-notification.ios = iOS
-push-notification.results-for = Results for
-push-notification.all-notification-types = All Notification Types
-push-notification.json-data = JSON Data
-
-push-notification.save = Save
-push-notification.send-for-approval = Send for approval
-push-notification.save-as-draft = Save as draft
-push-notification.create-one-time-notification = Create One-Time Push Notification
-push-notification.create-automated-notification = Create Automated Push Notification
-push-notification.create-transactional-notification = Create API Push Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
-push-notification.create-new-notification = Create New Notification
-push-notification.update-notification = Update Notification
-push-notification.notification-name = Notification Name
-push-notification.notification-name-description = Set the name of push notification (optional).
-push-notification.enter-notification-name = Enter Notification Name
-push-notification.platforms = Platforms
-push-notification.android = Android
-push-notification.ios = iOS
-push-notification.targeting = Targeting
-push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
-push-notification.all-push-enabled-users = All push-enabled users
-push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
-push-notification.use-segmentation = Use segmentation
-push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
-push-notification.push-enabled-users = Push-enabled users
-push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
-push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
-push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
-push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
-push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
-push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
-push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
-push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
-push-notification.select-location = Please select a location
-push-notification.when-to-determine-users = When to determine the users?
-push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
-push-notification.determine-users-before = Determine users right before sending the message
-push-notification.determine-users-now = Determine users now
-push-notification.triggers = Triggers
-push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
-push-notification.cohorts-entry = Cohort(s) entry
-push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
-push-notification.cohorts-exit = Cohort(s) exit
-push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
-push-notification.performed-events = Performed Event(s)
-push-notification.performed-events-description = Triggered when user performs a selected event.
-push-notification.select-event = Please select an event
-push-notification.cohorts = Cohort(s)
-push-notification.geolocations = Geolocation(s)
-push-notification.events = Event(s)
-push-notification.delivery-date-calculation = Delivery date calculation
-push-notification.delivery-dates = Delivery dates
-push-notification.delivery-dates = Delivery dates
-push-notification.last-day = Last Day
-push-notification.x-day-before-the-last-day = {0} day before the last day
-push-notification.x-days-before-the-last-day = {0} days before the last day
-push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
-push-notification.start-date = Start date
-push-notification.set-start-date = Set Start Date
-push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
-push-notification.delivery-date-description = Select date and time for multiple message sending
-push-notification.add-more = Add More
-push-notification.cannot-remove-last-date = You can not delete the last date
-push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
-push-notification.end-date = End date
-push-notification.set-end-date = Set End Date
-push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
-push-notification.delivery-method = Delivery Method
-push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
-push-notification.capping = Capping
-push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
-push-notification.no-capping = No Capping
-push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
-push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
-push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
-push-notification.send-anyway = Send anyway
-push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
-push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
-push-notification.send-now = Send now
-push-notification.send-now-description = Send the push notification immediately, once composition is complete.
-push-notification.scheduled = Scheduled
-push-notification.schedule-for-later = Schedule for later
-push-notification.delivery-time = Delivery Time
-push-notification.delivery-times = Delivery Times
-push-notification.delivery-time-tooltip = Set an optional delivery time for your message
-push-notification.timezone = Timezone
-push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
-push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
-push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
-push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
-push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
-push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
-push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
-push-notification.do-not-send-message = Do not send the message
-push-notification.deliver-next-day = Deliver the message next day
-push-notification.immediately = Immediately
-push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
-push-notification.delayed = Delayed
-push-notification.days = Days
-push-notification.day = Day
-push-notification.hours = Hours
-push-notification.capped = Capped
-push-notification.daily = Daily
-push-notification.weekly = Weekly
-push-notification.monthly = Monthly
-push-notification.start-date-validation-warning = Start date must be more than 15h in the future
-push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
-push-notification.maximum-messages-per-user = Maximum messages per user
-push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
-push-notification.messages = Messages
-push-notification.minimum-time-between-messages = Minimum time between messages
-push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
-push-notification.expiration-time = Expiration Time
-push-notification.expiration-time-description = Set expiration time for message sending
-push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
-push-notification.notification-type = NOTIFICATION TYPE
-push-notification.notification-format = NOTIFICATION FORMAT
-push-notification.compose-message = Compose Message
-push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
-push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
-push-notification.default-message-is-required = Default message is required
-push-notification.content-message = Content message
-push-notification.silent-message = Silent message
-push-notification.message-title = Message title
-push-notification.add-variable = Add Variable
-push-notification.message-content = Message Content
-push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
-push-notification.buttons = Buttons
-push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
-push-notification.add-first-button = +Add First button
-push-notification.add-second-button = +Add Second button
-push-notification.enter-x-button = Enter xButton
-push-notification.enter-button-text = Enter Button Text
-push-notification.enter-button-url = Enter Button URL or Deeplink
-push-notification.media-url = Media URL
-push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
-push-notification.enter-media-url = Enter Media URL
-push-notification.platform-settings = Platform Settings
-push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
-push-notification.sound-file-name = Sound File Name
-push-notification.enter-sound-file-name = Enter sound file name
-push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
-push-notification.badge-number = Badge Number
-push-notification.add-badge-number = Add Badge Number
-push-notification.enter-badge-number = Enter badge number
-push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
-push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
-push-notification.subtitle = Subtitle
-push-notification.enter-your-subtitle = Enter your subtitle
-push-notification.subtitle-description = Add a subheading for your message.
-push-notification.set-content-available = Set content-available
-push-notification.set-content-available-description = Sets the apns-priority header to 5 and content-available property of request body to 1 for the IOS application to receive notifications while the app is in the background
-push-notification.on-click-url = On Click URL
-push-notification.enter-on-click-url = Enter on click URL
-push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
-push-notification.send-json = Send JSON
-push-notification.enter-json-data = Enter JSON data
-push-notification.send-json-description = Add app-specific JSON data along with standard content.
-push-notification.send-user-data = Send User Data
-push-notification.select-user-data = Select user data
-push-notification.send-user-data-description = Select user properties to send in your notification payload.
-push-notification.icon = Icon
-push-notification.icon-description = Set Android notification icon.
-push-notification.enter-icon = Enter icon
-push-notification.review-message = Review Mesage
-push-notification.review-message-tooltip = Review all the details of you push notification.
-push-notification.message-name = Message name
-push-notification.review-title = Title
-push-notification.content = Content
-push-notification.button-text = Button Text
-push-notification.button-url = Button URL
-push-notification.ios-media-url = iOS Media URL
-push-notification.android-media-url = Android Media URL
-push-notification.ios-badge-number = IOS badge number
-push-notification.ios-json-data = iOS JSON data
-push-notification.ios-user-data = iOS user data
-push-notification.android-badge-number = Android badge number
-push-notification.android-json-data = Android JSON data
-push-notification.android-user-data = Android user data
-push-notification.current-number-of-users = Current number of users
-push-notification.when-to-determine = When to determine
-push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
-push-notification.delivery = Delivery
-push-notification.delivery-description = Select the time you want the notification to be sent to users.
-push-notification.scheduled-for = Scheduled for
-push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
-push-notification.maximum-messages = Maximum {0} messages
-push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
-push-notification.confirmation = Confirmation
-push-notification.testing = TESTING
-push-notification.you-can-send-the-test-message = You can send the test message to test users
-push-notification.testing-tooltip = Sends the push notification to applications' test users
-push-notification.send-to-test-users = Send to test users
-push-notification.confirmation-uppercase = CONFIRMATION
-push-notification.confirmation-uppercase-description = CONFIRMATION description
-push-notification.i-am-ready-to-send = I am ready to send this message to real-users
-push-notification.was-successfully-saved = Push notification message was successfully saved
-push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
-push-notification.was-successfully-approved = Push notification has been successfully approved
-push-notification.was-successfully-rejected = Push notification has been successfully rejected
-push-notification.was-successfully-deleted = Push notification was successfully deleted
-push-notification.was-successfully-started = Push notification was successfully started
-push-notification.was-successfully-stopped = Push notification was successfully stopped
-
-# Add user property
-push-notification.event-properties = Event Properties
-push-notification.user-properties = User Properties
-push-notification.custom-properties = Custom Properties
-push-notification.add-user-property = Add User Property
-push-notification.api-property = Add User Property
-push-notification.search-in-properties = Search in Properties
-push-notification.select-property = Select Property
-push-notification.enter-value = Enter Value
-push-notification.start-with-capital-letter = Make user property start with capital letter
-push-notification.fallback-value = Fallback value
-push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
-push-notification.remove = Remove
-push-notification.confirm = Confirm
-push-notification.internal-properties = Internal Properties
-push-notification.external-properties = External Properties
-push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
-
-
-# Details
-push-notification-details.back-to = Back to Push Notifications
-push-notification-details.localization-filter-label = LOCALIZATION
-push-notification-details.localization-filter-all = All Localizations
-push-notification-details.summary-header = Notification Summary
-push-notification-details.summary-header-description = Overview of the notification message and its details.
-push-notification-details.message-tab = Message Content
-push-notification-details.targeting-tab = Targeting & Delivery
-push-notification-details.errors-tab = Errors
-push-notification-details.stats-tab = Periodic Stats
-push-notification-details.users-targeted-chart = Users Targeted
-push-notification-details.sent-messages-chart = Sent Messages
-push-notification-details.and-label = and
-push-notification-details.message-id = Message ID
-push-notification-details.results-for = Results for
-push-notification-details.created = Created
-push-notification-details.created-by = Created {0} by {1}
-
-push-notification-details.message-title = Title
-push-notification-details.message-content = Content
-push-notification-details.message-first-button-label = First Button Text
-push-notification-details.message-first-button-url = First Button URL
-push-notification-details.message-second-button-label = Second Button Text
-push-notification-details.message-second-button-url = Second Button URL
-push-notification-details.message-media-url = Media URL
-push-notification-details.ios-message-media-url = IOS media URL
-push-notification-details.android-message-media-url = Android media URL
-push-notification-details.message-media-mime = Media Mime
-
-push-notification-details.targeting-sub-header = Targeting
-push-notification-details.targeted-users = Targeted users
-push-notification-details.geolocation = Geolocation
-push-notification-details.when-to-determine = When to determine
-push-notification-details.delivery-sub-header = Delivery
-push-notification-details.delivery-type = Delivery type
-push-notification-details.scheduled-for = Scheduled for
-push-notification-details.expiration-time = Expiration time
-push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
-push-notification-details.no-errors-found = No errors were found
-push-notification.users-targeted = Users Targeted
-push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
-push-notification.sent-notifications = Sent Notifications
-push-notification.sent-notifications-description = Total number of notifications sent.
-push-notification.clicked-notifications = Clicked Notifications
-push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
-push-notification.failed = Failed
-push-notification.failed-description = Total number of notifications that failed to get delivered.
-push-notification.no-errors-found = There are no errors found
-push-notification.affected-users = Affected Users
-push-notification.error-description = Description
-push-notification.error-code = Error Code
-push-notification.users = Users
-push-notification.back-to-push-notification-details = Back to push notification
-push-notification.all-localizations = All Localizations
-push-notification.download-logs = Download Logs
-push-notification.error-detail = Error Detail
-push-notification.user-data = User Data
-push-notification-details-platform-settings = {0} Platform Settings
-
-# Mobile Preview Component
-push-notification.mobile-preview-default-app-name = Your application name
-push-notification.mobile-preview-default-title = Your message title
-push-notification.mobile-preview-default-content = Your message content
-
-# Application settings
-push-notification.ios-settings = iOS settings
-push-notification.authentication-type = Authentication type
-push-notification.key-file-p8 = Key file (P8)
-push-notification.key-file-p12 = Sandbox + Production certificate (P12)
-push-notification.key-file-already-uploaded = Key file {0} is already uploaded
-push-notification.choose-file = Choose File
-push-notification.key-id = Key ID
-push-notification.team-id = Team ID
-push-notification.bundle-id = Bundle ID
-push-notification.passphrase = Passphrase
-push-notification.android-settings = Android (Google FCM)
-push-notification.firebase-key = Firebase key
-push-notification.huawei-settings = Android (Huawei Push Kit)
-push-notification.huawei-app-id = App ID
-push-notification.huawei-app-secret = App Secret
-push-notification.rate-limit = Rate limit
-push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
-push-notification.period-in-seconds = Period duration (seconds)
-push-notification.test-users = Test users
-push-notification.test-users-description = Test users description
-push-notification.define-new-user = +Define New User
-push-notification.user-definition = User Definition
-push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
-push-notification.see-user-list = See User List
-push-notification.define-new-user-title = Define New User
-push-notification.add-test-users-label = Add Users
-push-notification.definition-type = Definition Type
-push-notification.define-with-user-id = Define with User ID
-push-notification.define-with-cohort = Define with Cohort
-push-notification.enter-user-id = Enter User ID
-push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
-push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
-push-notification.select-cohort = Please select a cohort
-push-notification.user-list = User List
-push-notification.username = Username
-push-notification.user-id = User ID
-push-notification.cohort-name = Cohort Name
-push-notification.cancel = Cancel
-push-notification.i-understand-delete-key = I understand, delete this key
-push-notification.delete-key = Delete Key
-push-notification.test-users-were-successfully-removed = Test users have been successfully removed
-push-notification.test-users-were-successfully-added = Test users have been successfully added
-push-notification.next-delivery-dates = Next Delivery Dates
-
-#Global settinsg
-push.plugin-title = Push Notifications
+# DO NOT EDIT THIS FILE AS IT WILL BE OVERRIDEN DURING TRANSLATION SYNC
+# IF YOU WOULD LIKE TO HELP COUNTLY TO BE TRANSLATED INTO YOUR LANGUAGE
+# PLEASE VISIT https://www.transifex.com/osoner/countly
+
+push.plugin-title = 推送通知
+push.plugin-description = 通过iOS和Android推送通知提高忠诚度、用户留存和满意度
+push.sidebar.section = 信息推送
+push.sidebar.overview = 概要
+push.sidebar.messages = 消息
+
+push.no-message = 没有消息
+push.create = 创建消息
+push.create-message-n = Create Message to {0} users
+
+mgmt-plugins.push.here = here
+mgmt-plugins.push.ios = iOS Settings
+mgmt-plugins.push.ios.type = Authentication type
+mgmt-plugins.push.ios.type.desc = Choose between Token-based authentication (P8 file) & Sandbox + Production certificate (P12 file)
+mgmt-plugins.push.ios.apn_token = Key file (P8)
+mgmt-plugins.push.ios.apn_token.desc = Token-based authentication file you downloaded from Apple.
+mgmt-plugins.push.ios.key = Key ID
+mgmt-plugins.push.ios.key.desc = ID of a P8 key, usually it's encoded in P8 filename.
+mgmt-plugins.push.ios.team = Team ID
+mgmt-plugins.push.ios.team.desc = ID of the team your app is registered to. You can get one from
+mgmt-plugins.push.ios.bundle = Bundle ID
+mgmt-plugins.push.ios.bundle.desc = Main ID of your application.
+mgmt-plugins.push.ios.apn_universal = Sandbox + Production certificate (P12)
+mgmt-plugins.push.ios.apn_universal.desc = Your universal certificate file you downloaded from Apple.
+mgmt-plugins.push.ios.pass = Passphrase
+mgmt-plugins.push.ios.pass.desc = Secret password you've set when exporting P12 file from Keychain Access.
+mgmt-plugins.push.android = Android (Google FCM)
+mgmt-plugins.push.android.key = Firebase key
+mgmt-plugins.push.android.key.desc = Your server key, you can get one from
+mgmt-plugins.push.h = Android (Huawei Push Kit)
+mgmt-plugins.push.h.key = Huawei App ID
+mgmt-plugins.push.h.key.desc = Your numerical Huawei App ID (Client ID)
+mgmt-plugins.push.h.secret = App Secret
+mgmt-plugins.push.h.secret.desc = Huawei App Secret, sign secret of your app can be found in code signing properties or at
+mgmt-plugins.push.h.secret.hds = Huawei developer portal
+mgmt-plugins.push.error.nokey = Please enter Key ID
+mgmt-plugins.push.error.noteam = Please enter Team ID
+mgmt-plugins.push.error.nobundle = Please enter application Bundle ID
+mgmt-plugins.push.error.nofile = Please select key or certificate file
+mgmt-plugins.push.error.h.key = Please enter Huawei App ID
+mgmt-plugins.push.error.h.secret = Please enter Huawei App Secret
+mgmt-plugins.push.error.h.keynum = Huawei App ID can contain only digits
+mgmt-plugins.push.uploaded = Download file uploaded previously
+mgmt-plugins.push.uploaded.p12 = Universal certificate (p12) is already uploaded
+mgmt-plugins.push.uploaded.p8 = Key file (p8) is already uploaded
+mgmt-plugins.push.uploaded.bundle = Bundle id of this certificate:
+mgmt-plugins.push.detected = Detected key type:
+mgmt-plugins.push.rate = Rate limit
+mgmt-plugins.push.rate.rate = Maximum number of notifications scheduled per period
+mgmt-plugins.push.rate.help = Push notifications sent to FCM and APNS will separately be rate limited based on this configuration for each push notification campaign
+mgmt-plugins.push.rate.period = Period duration (seconds)
+mgmt-plugins.push.rate.period.help = Timeframe to apply the rate limit to
+
+systemlogs.action.push_message_created = 已创建的推送消息
+systemlogs.action.push_credentials_update = 已更新的推送凭据
+systemlogs.action.push_message_deleted = 已删除的推送消息
+
+# Help
+help.manage-apps.push-gcm-key = Server API Key for Firebase Cloud Messaging (FCM). It's required if you're going to send push notifications to your Android app users. You can get one from Firebase Console.
+help.mgmt-plugins.push.ios.type = Countly supports 2 types of authentication with APN: Token-based (p8 file, JWT) & Sandbox + Production certificate (p12 file).
+
+help.dashboard.push.sent = 在选定的时间段内发送此应用的累计信息。
+help.dashboard.push.actions = 此应用的操作数。操作表示用户对发送信息有反应。请参阅SDK指南,了解如何在应用中启用此指标。
+help.dashboard.total-users-push = Total number of users of this app.
+help.dashboard.messaging-users = A number of users who agreed to receive push notifications, that is a number of users with APN or FCM tokens stored in the database.
+
+pu.po.title = 创建推送通知
+pu.po.desc = 以4个简单的步骤撰写您的推送通知
+
+pu.po.view.title = 推送通知
+pu.po.view.desc = 消息详细信息
+
+pu.po.preview = Preview
+pu.po.preview.help = Please note that this is a preview screen. What you see here may not be same as what end users see on their smartphones due to varying device sizes.
+
+pu.po.tt.pers = Add personalized content
+pu.po.tt.emoji = Add emoji
+
+pu.po.tab0.title = 应用和平台
+pu.po.tab0.title.auto = 平台
+pu.po.tab0.desc = 抵达站
+
+pu.po.tab1.title = 计划中
+pu.po.tab1.desc = 设置消息日期
+pu.po.tab1.title.auto = 活动规则
+pu.po.tab1.desc.auto = 触发器和日期
+
+pu.po.tab1.chr = Cohorts
+pu.po.tab1.chr-desc = Send to the users currently in selected cohorts
+
+pu.po.tab1.aud = Audience Selection
+pu.po.tab1.now.t = Now
+pu.po.tab1.now.d = Select users now
+pu.po.tab1.later.t = Before sending
+pu.po.tab1.later.d = Select users right before sending the message
+
+pu.po.tab2.ddc = Delivery Date Calculation
+pu.po.tab2.ddc.arr = Relative to the date event arrived to the server
+pu.po.tab2.ddc.evt = Relative to the date event occurred on a device
+# pu.po.tab2.ddc.h = In "event occurrence" case Countly only sends notifications within 30 minutes of actual event recording date, discarding any "late" notifications which could be triggered due to event arriving to the server with a delay because of networking issues.
+# pu.po.tab2.ddc.h = Note that larger amount of notifications won't be sent in case of event occurence date since an event might arrive to the server with a delay due to networking issues. On the other hand, accuracy of "event occurence" case is better, since there won't be any late notifications.
+# pu.po.tab2.ddc.arr = Relative to the event arrival to the server date
+# pu.po.tab2.ddc.evt = Relative to the event occurence on the device date
+
+pu.po.tab2.trc = Behaviour when trigger condition is no longer met
+pu.po.tab2.trc.true = Cancel when user exits selected cohort(s)
+pu.po.tab2.trc.false = Cancel when user enters selected cohort(s) back
+pu.po.tab2.trc.dont = Send anyway
+
+pu.po.tab2.title.auto = 消息发送
+pu.po.tab2.desc.auto = 周期性与限制
+
+pu.po.compose.title = 消息
+pu.po.compose.desc = 创建内容
+
+pu.po.review.title = 回顾
+pu.po.review.desc = 检查您的消息
+
+pu.po.tab0.apps = 应用
+pu.po.tab0.add = 添加应用
+pu.po.tab0.select-apps = 筛选APP
+pu.po.tab0.select-apps-desc = Only apps with APN or FCM credentials are displayed
+pu.po.tab0.select-platforms = 选择平台
+pu.po.tab0.select-platforms-no = Selected app doesn't have APN or FCM credentials
+pu.platform.i = iOS
+pu.platform.a = Android
+pu.po.prev = 上一步
+pu.po.next = 下一步
+pu.po.send = 发送!
+pu.po.start = 开始
+pu.po.edit = Save
+pu.po.close = 关闭
+pu.po.duplicate = 重复
+pu.po.delete = 删除
+
+pu.po.tab1.testing = 测试
+pu.po.tab1.testing-desc = 发送给生产用户或测试用户?
+pu.po.tab1.testing-prod = 生产用户
+pu.po.tab1.testing-test = 测试用户
+pu.po.tab1.testing-test-desc = 仅限开发和测试用户
+
+pu.po.tab1.scheduling = 计划中
+pu.po.tab1.scheduling-desc = 立即发送或安排发送以供日后使用
+pu.po.tab1.scheduling-now = 立刻发送
+pu.po.tab1.scheduling-auto-now = 现在启动
+pu.po.tab1.scheduling-now-desc = 一旦点击按钮,推送将立即开始
+pu.po.tab1.scheduling-date = 预定
+pu.po.tab1.scheduling-date-desc = 为此邮件设置特定的日期和时间
+pu.po.tab1.tz = 安装用户的时区发送?
+pu.po.tab1.tz-desc = Message can either be sent to all users at once using date and time you specified or it can be sent to each user in their timezones.
+pu.no = 否
+pu.po.tab1.tz-no-desc = 立即发送所有通知
+pu.po.tab1.tz-yes = 在用户时区发送
+pu.po.tab1.tz-yes-desc = 按照用户的时区发送每个通知
+pu.po.tab1.tz-yes-help = Only SDK 16.12+ (iOS & Android native SDKs, check documentation for others) sends timezone information to the server. Server will use default app timezone in case SDK haven't reported timezone yet.
+
+pu.po.tab1.geos = 地缘位置
+pu.po.tab1.geos-desc = 按照用户上次已知的位置过滤用户?
+pu.po.tab1.geos.no = 无过滤
+
+
+pu.po.recipients.s = 收件人: {0}
+pu.po.recipients.m = 收件人: {0}
+pu.po.recipients.temporary = 用户数计算仍在运行,在极端情况下可能需要几分钟的时间。随时发送您的消息,不用等待。
+
+pu.po.tab2.message.type = 消息类型
+pu.po.tab2.extras = 其他选项
+
+pu.type.message = 消息
+pu.type.data = 仅数据
+pu.type.rich = 丰富
+
+pu.po.loading = 我们正在统计您的用户
+pu.po.loading-desc = 请稍候,很快就会完成
+
+pu.po.sending = 保存进行
+pu.po.sending-desc = 一会儿
+
+pu.po.sent = 已保存
+pu.po.sent-desc = 都好!
+
+pu.po.tab2.placeholder = 请填写信息(默认是必填的,如果需要添加更多本地化的消息)
+pu.po.tab2.default-message = 你的消息
+pu.po.tab2.default-message.invalid = 默认消息是必填
+pu.po.tab2.default-button-title.invalid = 默认按钮标题是必填
+pu.po.tab2.default-button-link.invalid = 默认按钮网链是必填
+pu.po.tab2.extras.sound = 发送声音
+pu.po.tab2.extras.sound.invalid = 声音必须是字符串
+pu.po.tab2.extras.badge = 添加徽章
+pu.po.tab2.extras.badge.invalid = 徽章必须是有效的号码
+pu.po.tab2.extras.badge.help = 默认情况下,iOS支持徽章。Android需要额外的步骤(请查看Android SDK指南获取更多详细信息)
+pu.po.tab2.extras.media = 附件网链
+pu.po.tab2.extras.media.placeholder = 图像网链
+pu.po.tab2.extras.media.invalid = 必须使用有效URL而且小于10MB的图像(JPG、PNG)或动画(GIF)的尺寸小于5MB、音频(MP3、WAV、AIF)小于5MB或小于50MB的视频(MPEG、MPEG2、MPEG4)
+pu.po.tab2.extras.media.toobig = 媒体图像和动画附件必须小于10MB、音频小于5MB和视频小于50MB
+pu.po.tab2.extras.media.help = iOS 10+支持音像附件,但iOS 9完全不支持音像。Android只支持图像。如果不支持音像,用户只看到信息文本
+pu.po.tab2.extras.url = 点击网址上
+pu.po.tab2.extras.url.invalid = 网址必须有效
+pu.po.tab2.extras.url.help = 当用户点击消息时,默认URL或深层链将显示
+pu.po.tab2.extras.data = 发送JSON
+pu.po.tab2.extras.data.invalid = 此字段必须包含有效的JSON字符串
+pu.po.tab2.extras.data.placeholder = JSON字符串
+pu.po.tab2.extras.data.help = 应用相关的JSON数据可以与标准内容一起发送
+pu.po.tab2.mtitle = 消息标题
+pu.po.tab2.mtitle.placeholder = 信息的可选标题
+pu.po.tab2.mtext = 消息文本
+pu.po.tab2.mbtn = 按钮
+pu.po.tab2.mbtns = 按钮数量
+pu.po.tab2.mbtn.urls = 按钮的URLs
+pu.po.tab2.mbtn.req = 按钮标题是必填
+pu.po.tab2.mbtn.url = 网址必须有效
+pu.po.tab2.mbtn.0 = 按钮0
+pu.po.tab2.mbtn.1 = 按钮1
+pu.po.tab2.mbtn.2 = 按钮2
+pu.po.tab2.btntext = 按钮文本
+pu.po.tab2.urlordeep = 网链或深层链接
+pu.po.tab2.rich = 丰富的推送选项
+pu.po.tab2.mmedia = 多媒体
+pu.po.tab2.mmedia.type.image = 图像
+pu.po.tab2.mmedia.type.anima = 动画
+pu.po.tab2.mmedia.type.audio = 声音
+pu.po.tab2.mmedia.type.video = 视频
+pu.po.tab2.mmedia.type.warn.android = Android不支持这种音像
+pu.po.tab2.mmedia.status = 请求状态:
+pu.po.tab2.default-message.help = 所有用户的默认本地化。 您可以通过为特定区域设置自定义消息和按钮名称。
+pu.po.no-users = 很抱歉,指定的选项没有推送功能的使用者。
+pu.po.no-users-try-change = 尝试更改
+pu.po.no-users-try-change-apps = platforms or production-test switch
+pu.po.no-users-start-over = 重来
+pu.po.tab2.variable = Variable
+pu.po.tab2.capital = Make variable value start from capital letter
+pu.po.tab2.fallback = Fallback value
+pu.po.tab2.help = Default value which will be used in case user profile doesn't have this variable
+pu.po.tab2.props = User Properties
+pu.po.tab2.cust = Custom Variables
+pu.po.tab2.varpl = Select variable
+pu.po.tab2.fallpl = Enter fallback value
+pu.po.tab2.tt = User''s "{0}" property which falls back to "{1}"
+
+datepicker.dt.click = 设置日期和时间
+datepicker.tz = 发送用户的时区
+datepicker.clear = 清除
+datepicker.apply = 应用
+datepicker.pick-time = 挑选时间
+
+pu.locale.default = 默认
+pu.locale.null = 未知
+pu.po.tab3.review = 评论
+pu.po.tab3.apps = 应用
+pu.po.tab3.platforms = 平台
+pu.po.tab3.date = 日期
+pu.po.tab3.date.now = 编写信息的时段
+pu.po.tab3.date.intz = :用户时区
+pu.po.tab3.unknown = Unknown
+pu.po.tab3.type = 类型
+pu.po.tab3.type.message = 正文消息
+pu.po.tab3.type.data = 数据
+pu.po.tab3.type.update = 更新(已弃用)
+pu.po.tab3.type.review = 评论(已弃用)
+pu.po.tab3.type.category = 类别(已弃用)
+pu.po.tab3.type.link = 网址(已弃用)
+pu.po.tab3.test = 发送到测试设备
+pu.po.tab3.test.true = 肯定
+pu.po.tab3.test.false = 否
+pu.po.tab3.btns = 按钮
+pu.po.tab3.media = 音像
+pu.po.tab3.extras = 标准选项
+
+pu.po.tab3.extras.sound = 声音
+pu.po.tab3.extras.badge = iOS徽章
+pu.po.tab3.extras.url = 点击网址上
+pu.po.tab3.extras.data = 额外数据
+pu.po.tab3.extras.media = 音像
+
+pu.po.tab3.date.date = Scheduled to be sent on
+pu.po.tab3.date.sent = 发送
+pu.po.tab3.date.tz = 在用户的时区发送
+
+pu.po.tab3.audience = 收件人
+
+pu.po.tab3.errors = 错误
+pu.po.tab3.errors.code = 码
+pu.po.tab3.errors.message = 错误
+pu.po.tab3.errors.count = 计数
+
+pu.po.confirm = 确认发送
+pu.po.confirm.ready = I’m ready to send this message
+pu.po.confirm.s = to {0} receipient
+pu.po.confirm.m = to {0} receipients
+pu.po.recipients.message = {0} users will receive this campaign after it is started.
+pu.po.recipients.message.details = 这条消息将在应用程序用户匹配到活动条件时自动发送给他们。
+pu.po.recipients.message.edit = Message modification only affects notifications scheduled after modification takes place.
+
+pu.dash.users = 用户
+pu.dash.users.total = 累计用户
+pu.dash.users.enabl = 可启用消息传递功能的用户
+pu.dash.totals = 总体
+pu.dash.metrics = 指标
+pu.dash.metrics.sent = 已发送邮件
+pu.dash.metrics.acti = 执行的操作
+pu.dash.create = 创建消息
+pu.dash.monthly = 每月
+pu.dash.weekly = 每周
+pu.dash.messages = 消息
+pu.dash.messages.all = 全部
+pu.dash.messages.api = API
+pu.dash.messages.dash = 仪表盘
+pu.dash.actions = 动作
+pu.dash.sent = 发送
+
+
+pu.t.nothing = 没有找到记录
+pu.t.search = 按默认消息搜索
+pu.t.message = 消息
+pu.t.apps = 应用
+pu.t.status = 状态
+pu.t.created = 已创建
+pu.t.sent-scheduled = 发送日期/预定
+pu.t.result = 发送/已行动
+
+push.message.status.initial = Initial
+push.message.status.created = Created
+push.message.status.scheduled = Scheduled
+push.message.status.sending = Sending
+push.message.status.sending-errors = Sending with errors
+push.message.status.aborted = Aborted
+push.message.status.sent = Sent
+push.message.status.sent-errors = Sent with errors
+
+push.message.status.auto.true = 活跃的
+push.message.status.auto.false = 暂停的
+
+push.error.econnrefused = Countly cannot connect to APN/FCM. Please check your proxy server settings (if any) and / or server connectivity to APN/FCM servers.
+push.error.timeout = Connection timed out. Please ensure that server has stable connection to APN and/or FCM.
+push.error.crash = Process crashed while sending this messsage. Please contact support.
+push.error.exited = Process exited while sending this messsage. Please contact support.
+push.error.exited-sent = 由于APNS意外关闭连接,发送此消息时进程退出。有些通知可能已经发送了两次(最多500个)。
+push.error.3-eof = APN连接错误。可能的原因包括:无效的证书/ 权限密钥,防火墙,系统根证书(CA)问题。
+push.error.no-credentials = 您没有任何应用平台组合的凭据。
+push.error.no-app-credentials = This application doesn't have any push notification credentials set.
+push.error.no-cohorts = Automated messages depend on Cohorts and Events, yet you don't have any of those.
+push.error.cohorts-deleted = This message cannot be activated since some of cohorts used it have been deleted.
+push.error.no.cohorts = No Cohorts or events
+push.error.no.credentials = No credentials
+push.error.i.understand = OK, I understand
+
+
+push.errorCodes.bug = 你发现了一个错误!请与支持人员联系。
+push.errorCodes = 错误:
+push.errorCode.i400 = APN 400错误请求
+push.errorCode.i400+BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push.errorCode.i400+MissingTopic.desc = Server failed to parse the certificate, please ensure you use universal certificate and contact support if you do
+push.errorCode.i400+DeviceTokenNotForTopic.desc = Probably APNS certificate doesn't correspond to the Bundle ID of your application
+push.errorCode.i400+TopicDisallowed.desc = Sending notifications to this topic is not allowed. Apple rejects sending notifications to this topic, most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push.errorCode.i403 = APN 403证书错误
+push.errorCode.i403.desc = Authentication error, please generate and upload new certificate from a Mac used to make this particual app build
+push.errorCode.i403+InvalidProviderToken.desc = APN 403错误:错误的密钥提供。请检查你的Auth key文件, Team ID & Bundle ID - 其中有部分是错误的值。
+push.errorCode.i405 = APN 405错误的方法
+push.errorCode.i405.desc = push.errorCodes.bug
+push.errorCode.i413 = APN 413有效负载太大
+push.errorCode.i413.desc = 邮件过大,APN拒绝提供。
+push.errorCode.i429 = APN 429请求过多
+push.errorCode.i429.desc = push.errorCodes.bug
+push.errorCode.i500 = APN 500内部错误
+push.errorCode.i500.desc = Apple服务器意外返回HTTP错误500.请稍后再试。
+push.errorCode.i503 = APN 503关闭
+push.errorCode.i503.desc = Apple服务器意外地决定关闭返回HTTP错误503.请稍后再试。
+
+push.errorCode.a200 = FCM 200 message error
+push.errorCode.a200+MissingRegistration.desc = push.errorCodes.bug
+push.errorCode.a200+InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push.errorCode.a200+InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push.errorCode.a200+MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app. Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push.errorCode.a200+MessageTooBig.desc = 讯息太大,Google拒绝放送。
+push.errorCode.a200+InvalidDataKey.desc = 邮件包含无效的数据密钥,请检查:
+push.errorCode.a200+InvalidTtl.desc = push.errorCodes.bug
+push.errorCode.a200+DeviceMessageRateExceeded.desc = 您发送邮件的频率比Google允许的频率更高,请不要太频繁。
+push.errorCode.a200+TopicsMessageRateExceeded.desc = 您发送邮件的频率与Google允许的频率相同,请不要太频繁。
+push.errorCode.a400 = FCM 400 JSON error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a401 = FCM 401 Authentication error
+push.errorCode.a400.desc = push.errorCodes.bug
+push.errorCode.a500 = FCM 500 Internal error
+push.errorCode.a500.desc = Google服务器意外地传回了HTTP错误500.请稍后再试。
+push.errorCode.a200+Unavailable.desc = Google服务器意外地传回HTTP错误200 +不可用。请稍后再试。
+push.errorCode.a200+InternalServerError.desc = Google服务器意外地传回HTTP错误200 + InternalServerError。请稍后再试。
+push.errorCode.a501 = FCM 501 Error
+push.errorCode.a502 = FCM 502 Error
+push.errorCode.a503 = FCM 503 Error
+push.errorCode.link.i = 苹果文档
+push.errorCode.link.a = 谷歌文档
+push.errorCode.skiptz = Too late to send
+push.errorCode.skiptz.desc = This much notifications have been discarded because time of arrival would be at least 60 minutes later than expected (either due to user's timezone, or due to networking issues).
+push.errorCode.del = Message deleted
+push.errorCode.del.desc = This much notifications have been discarded their message has been deleted.
+push.errorCode.aborted = Aborted
+push.errorCode.aborted.desc = This much messages have been removed from queue after an unrecoverable error. Please check error message above or contact support if there's no error message.
+push.errorCode.consent = Consent cancelled
+push.errorCode.consent.desc = This much messages have been removed from queue after user removed push consent.
+
+push.totals.processed = 已处理
+push.totals.sent = 已接受
+push.totals.errors = 错误
+
+pu.po.users.s = {0}用户
+pu.po.users.m = {0}用户
+pu.po.metrics = 指标
+pu.po.metrics.processed = 已处理
+pu.po.metrics.processed.desc = How many notifications have been processed so far
+pu.po.metrics.sent = 成功发送
+pu.po.metrics.sent.desc = How many notifications have been accepted by APNS & FCM
+pu.po.metrics.sent.none = 没有发送通知!请检查邮件错误
+pu.po.metrics.sent.one = 你的通知已发送!
+pu.po.metrics.sent.all = 所有通知都会发送!
+pu.po.metrics.actions = 已行动
+pu.po.metrics.actions.desc = 有多少用户执行推送通知操作
+pu.po.metrics.actions.all = 所有用户执行操作!做得好!
+pu.po.metrics.actions.performed = 执行操作
+pu.po.metrics.actions0.performed = 点击默认网链。
+pu.po.metrics.actions1.performed = 点击第一按钮
+pu.po.metrics.actions2.performed = 点击第二按钮
+pu.po.left.to.send.s = {0}通知要发送
+pu.po.left.to.send.m = 还有{0}个通知要发送
+pu.po.left.to.send.none = 所有通知都会发送!
+pu.po.left.to.send.batch = 下一批将从{0}开始。
+pu.po.expired.s = {0}令牌已过期
+pu.po.expired.m = {0}令牌已过期
+pu.po.unset.s = {0}令牌已过期
+pu.po.unset.m = {0}令牌已过期
+pu.po.errors.s = 由于错误,未能发送{0}通知
+pu.po.errors.m = {0}个通知由于错误而未发送
+
+pu.apn.uni = 通用证书(生产和沙盒)
+pu.apn.none = 没有
+
+pu.gcm.gcm = FCM Key
+pu.gcm.none = 没有
+
+pu.remove = 删除凭据
+pu.validate = 验证
+pu.validating = 验证凭据
+pu.validation.error = 凭证错误:
+pu.remove = 删除凭据
+pu.creds.none = 没有
+pu.creds.type.apn_universal = APN通用证书已定
+pu.creds.type.apn_token = 设置了APN 权限密钥
+pu.creds.type.gcm = FCM Server API Key is set
+pu.creds.set.gcm = Enter Firebase Server Key
+pu.creds.cert = P12证书
+pu.creds.pass = 密码
+pu.creds.auth_key = P8密钥文件
+pu.creds.key_id = 权限密钥ID
+pu.creds.team_id = 团队ID
+pu.creds.bundle_id = Bundle ID
+pu.creds.apn.type.apn_universal = APN证书(沙箱及生产)
+pu.creds.apn.type.apn_token = APN 权限密钥
+
+userdata.push = 推送令牌
+pu.tk.id = APN测试令牌(开发)
+pu.tk.ia = APN测试令牌(特设或TestFlight)
+pu.tk.ip = APN生产今牌
+pu.tk.at = FCM Test token
+pu.tk.ap = FCM Production token
+pu.tk.ht = Huawei Test token
+pu.tk.hp = Huawei Production token
+
+#Automated Push
+pu.dash.btn-group.create-message = 新建信息
+pu.dash.btn-group.automated-message = 自动消息
+pu.dash.btn-group.automated-message-desc = 创建一个自动推送活动,当用户的应用程序使用行为符合既定标准时向用户发送一条消息。
+pu.dash.btn-group.automated-message-link = Learn more about automation
+pu.dash.btn-group.one-time-message = 一次性的消息
+pu.dash.btn-group.one-time-message-desc = 创建一个一次性的通知推送活动在将来某一时间发送。
+pu.dash.btn-group-available-in-enterprise = 企业版可用
+pu.dash.btn.learn-more = 了解更多关于自动操作的信息
+
+pu.po.tab1.trigger-type = 触发类型
+pu.po.tab1.trigger-type.entry = 进入群组
+pu.po.tab1.trigger-type.exit = 退出群组
+pu.po.tab1.trigger-type.event = Performed Event
+pu.po.tab1.cohort-entry-desc = 当用户进入你选择的任何群组时触发
+pu.po.tab1.cohort-exit-desc = Triggered when user exits from any of the cohorts you select
+pu.po.tab1.cohort-event-desc = Triggered when user performs a selected event
+pu.po.tab1.select-cohort = Select one or more cohorts to set a trigger
+pu.po.tab1.select-cohort-desc = 重新计算以上群组将触发自动发送消息设置
+pu.po.tab1.select-cohort-placeholder = 选择群组
+pu.po.tab1.select-event = Select one or more events to set a trigger
+pu.po.tab1.select-event-placeholder = Select event(s)
+pu.po.tab1.campaign-start-date = 活动开始时间
+pu.po.tab1.additional-options = 附加选项
+pu.po.tab1.campaign-end-date = 活动结束日期
+
+pu.po.tab2.delivery-method = 发送方式
+pu.po.tab2.delivery-method-desc = 当您的信息要发送的时候选择
+pu.po.tab2.immediately = 立即
+pu.po.tab2.immediately-desc = 当触发群组重新计算时,立即发送消息
+pu.po.tab2.immediately-desc-event = Deliver the message as soon as triggering event reached the server
+pu.po.tab2.delayed = 延时的
+pu.po.tab2.delivery-time = 发送时间
+pu.po.tab2.delivery-time-desc = 为您的消息设置一个可选择的发送时间
+pu.po.tab2.delivery-end-desc = Optional date when server should stop sending messages
+pu.po.tab2.send-in-user-tz = 依据用户所处时区在 发送
+pu.po.tab2.select-time = 选择时间
+pu.po.tab2.capping = 上限
+pu.po.tab2.capping-desc = 为每个用户配置消息数量。启用此选项将限制发送给同一用户的消息数量。
+pu.po.tab2.capping.no = 未折叠
+pu.po.tab2.capping.no-desc = Message is sent whenever user entered to or exited from the cohort
+pu.po.tab2.capping.no-desc-event = Message is sent whenever user's event is received by the server
+pu.po.tab2.capping.yes = 受限
+pu.po.tab2.capping.yes-desc = 消息数量被限制
+pu.po.tab2.message-per-user = 每个用户的最多消息量
+pu.po.tab2.message-per-user-desc = 个人用户可以从本次活动中获得的全部消息数量
+pu.po.tab2.sleep = 消息间隔的最短时间
+pu.po.tab2.sleep-desc = 用户可以收到一个重复的消息,除非她/他在条件设置里设定了不接收重复的消息之间的最短间隔
+
+pu.po.tab4.apps-platforms = Platforms
+pu.po.tab4.app = 应用程序
+pu.po.tab4.campaign-rules = 活动规则
+pu.po.tab4.trigger-type = 触发类型
+pu.po.tab4.trigger-cohort-entry = 进入群组
+pu.po.tab4.trigger-cohort-exit = 退出群组
+pu.po.tab4.cohorts.no = Cohort(s) were deleted
+pu.po.tab4.cohorts.s = 群组
+pu.po.tab4.cohorts.m = 群组({ 0 })
+pu.po.tab4.events.no = Events(s) were deleted
+pu.po.tab4.events.s = Event
+pu.po.tab4.events.m = Events ({0})
+pu.po.tab4.caping = 上限
+pu.po.tab4.caping-message = 给每个用户发送的最多消息量
+pu.po.tab4.message-content = 信息内容
+pu.po.tab4.message-title = 标题
+pu.po.tab4.message-text = 文本
+pu.po.tab4.message-sound = 声音
+pu.po.tab4.message-media = 媒体
+pu.po.tab4.message-badge = 证章
+
+push.po.one-time-messages = 一次性的信息
+push.po.automated-messages = 自动消息
+push.po.table.dublicate = 副本
+push.po.table.resend = Resend failed notifications
+push.po.table.edit = Edit
+push.po.table.delete = 删除
+push.po.table.recipients = View recipients
+
+pu.po.progress = 进展
+pu.po.progress.auto = 30天概览
+pu.never = 从不
+pu.days.s = 天
+pu.days.m = 天数
+pu.hours.s = 小时
+pu.hours.m =时长
+pu.messages.s = 消息
+pu.messages.m = 消息
+pu.messages.between = between messages
+pu.min = Minimum
+pu.max = Maximum
+pu.enable = Enable
+pu.ended = Campaign ended
+pu.send-message = Send a Message
+pu.send-message-desc = Send a push notification to all users matching your query criteria
+
push.proxyhost = Proxy Hostname
-push.proxypass = Proxy Password
push.proxyport = Proxy Port
push.proxyuser = Proxy Username
-push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
-push.proxyunauthorized = Do NOT check proxy HTTPS certificate
-push.sendahead = Send notifications scheduled up to this many ms into the future
-push.deduplicate = Ensure no duplicate notifications sent when scheduling messages
-push.connection_retries = Number of connection retries
-push.connection_factor = Time factor for exponential backoff between retries
-push.pool_pushes = Number of notifications in stream batches
-push.pool_bytes = Bytes in binary stream batches
-push.pool_concurrency = Maximum number of same type connections
-push.pool_pools = Maximum number of connections in total
-push.message_timeout = Timeout of a message to be send
-push.default_content_available = Set content-available to 1 by default for IOS
-
-#Drawer from other views
-push-notification.send-message-to-users = Send message to users
-push-notification.send-message-to-users-tooltip = Push notifications plugin is not active in your application
-push-notification.select-max-two-metrics = Select maximum 2 metrics
-
-#Drawer
-push-notification-drawer.campaign-name = Campaign Name
-push-notification-drawer.step-one = Type
-push-notification-drawer.step-two = Targeting
-push-notification-drawer.step-three = Delivery
-push-notification-drawer.step-four = Content
-push-notification-drawer.step-five = Review
-push-notification-drawer.one-time = One-Time
-push-notification-drawer.one-time-description = Send a notification on a particular date and time.
-push-notification-drawer.automated = Automated
-push-notification-drawer.automated-description = Allows you to send notifications per user request periodically.
-push-notification-drawer.recurring = Recurring
-push-notification-drawer.recurring-description = Send a notification on a recurring basis.
-push-notification-drawer.multiple-days = Multiple Days
-push-notification-drawer.multiple-days-description = Schedule a notification to be sent on multiple dates and times.
-push-notification-drawer.api = API
-push-notification-drawer.api-description = Send a transactional notification via API
-push-notification-drawer.notification-type = Notification Type
-push-notification-drawer.notification-type-tooltip = Choose the one that suits you best from the options below
-push-notification-drawer.all-push-enabled-users-tooltip = Send to all users who have enabled receiving notifications.
-push-notification-drawer.rec-push-start-date = Recurring Push Start Date
-push-notification-drawer.notification-frequency = Notification Frequency
-push-notification-drawer.notification-frequency-tooltip = Select the frequency with which you want the notification to be sent.
-push-notification-drawer.repetition-for-every = Repetition for every
-push-notification-drawer.repetition-for-every-tooltip = Select the number of {0} between each notification.
-push-notification-drawer.repeat-at = Repeat at
-push-notification-drawer.repeat-on = Repeat on
-push-notification-drawer.repeat-at-tooltip = The default timezone will be user time zone
-push-notification-drawer.repetition-daily = day
-push-notification-drawer.repetitions-daily = days
-push-notification-drawer.repetition-weekly = week
-push-notification-drawer.repetitions-weekly = weeks
-push-notification-drawer.repetition-monthly = month
-push-notification-drawer.repetitions-monthly = months
-push-notification-drawer.date-validation = Start date can not be later than the end date.
-
-# Error codes
-push-notification.error-code.400.desc = 400 Bad request
-push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
-push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
-push-notification.error-code.405.desc = 405 Bad Method
-push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
-push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
-push-notification.error-code.500.desc = 500 Server error. Please try again later.
-push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
-push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
-push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
-push-notification.error-code.NoApp.desc = App not found when sending the notification.
-push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
-push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
-push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
-push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
-push-notification.error-code.ProxyTimeout.desc = Connection to proxy server timed out while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.ProxyError.desc = Connection to proxy server resulted in an error while while sending push notifications. Please check proxy server availability.
-push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
-push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
-push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
-push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
-push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
-push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
-push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
-push-notification.error-code.MissingRegistration.desc = Please contact customer support.
-push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
-push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
-push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
-push-notification.error-code.Blacklisted.desc = FCM Token has been blacklisted by Firebase, it's removed from Countly and won't be used in the future.
-push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
-push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
-push-notification.error-code.InvalidTtl.desc = Please contact customer support.
-push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
-push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
-push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
-push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
-push-notification.error-code.NotRegistered.desc = FCM token expired
-push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
-push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
-push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
-push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
-push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
-push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
-push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
-push-notification.error-code.SessionClosedOrDestroyed.desc = APN Session was closed by APN. This many notifications has been discarded because of that. Please check connectivity to APN servers and check Countly logs for exact error messages.
-
-push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
-push-notification.error-code.del = Message deleted
-push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
-push-notification.error-code.consent = Consent cancelled
-push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
-push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
-push-notification.error-code.aborted = Aborted
-push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
-push-notification.error-code.ExpiredToken = Expired Token
-push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
-
-
-# System Logs
-systemlogs.action.push_message_created = Push Notification created
-systemlogs.action.push_message_draft = Draft Push Notification created
-systemlogs.action.push_credentials_update = Push Credentials updated
-systemlogs.action.push_message_deleted = Push Notification deleted
-systemlogs.action.push_message_updated = Push Notification updated
-systemlogs.action.push_message_activated = Push Notification activated
-systemlogs.action.push_message_deactivated = Push Notification deactivated
-systemlogs.action.push_message_test = Test Push Notification sent
+push.proxypass = Proxy Password
+
+push.note.gcm.t = Your push notifications can't be delivered
+push.note.gcm.m = Following apps have GCM credentials instead of Firebase ones: {0}.
Usage of GCM is no longer possible since Google stopped accepting requests to GCM endpoint.
Please update app credentials to a valid FCM server key.
+
+mail.autopush-error-subject = Countly Automated Push Problem
+mail.autopush-error = Hi {0},
Your automated message cannot be sent due to a repeating error. Please review message status and reactivate the message once the problem is resolved.
Best,
A fellow Countly Admin
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
diff --git a/plugins/push/frontend/public/localization/push_zh_CN.properties b/plugins/push/frontend/public/localization/push_zh_CN.properties
new file mode 100644
index 00000000000..0089ddd82fa
--- /dev/null
+++ b/plugins/push/frontend/public/localization/push_zh_CN.properties
@@ -0,0 +1,457 @@
+push-notification.title = Push Notifications
+push-notification.description = An overview of all push notifications sent and actions performed in response.
+push-notification.one-time = One-time Notifications
+push-notification.automated = Automated Notifications
+push-notification.transactional = API Notifications
+push-notification.total-app-users = Total App Users
+push-notification.enabled-users = Notification-enabled Users
+push-notification.enabled-users-percentage = Enabled Users Percentage
+push-notification.enabled-users-percentage-description = Number of users who have agreed to receive notifications, expressed as a percentage over the total number of app users.
+push-notification.platform-filter-label-one-time = One-time notifications for
+push-notification.platform-filter-label-automatic = Automatic notificatons for
+push-notification.platform-filter-label-transactional = Transactional notifications for
+push-notification.platform-filter-all = All Platforms
+push-notification.platform-filter-android = Android
+push-notification.platform-filter-ios = IOS
+push-notification.status-filter-all = All Messages
+push-notification.create-button = New Message
+push-notification.time-period = TIME PERIOD
+push-notification.created-by = Created by
+push-notification.unknown-error = Unknown error occurred. Please try again later or contact support team.
+push-notification.sent-serie-name = Notifications Sent
+push-notification.sent-serie-description = Total number of notifications sent in the selected time period.
+push-notification.actions-performed-serie-name = Actions Performed
+push-notification.actions-performed-serie-description = Total number of actions performed by users in response to notifications sent, in the selected time period.
+push-notification.table-notification-name = Notificaton name
+push-notification.table-status = Status
+push-notification.table-created = Created
+push-notification.table-date-sent = Date Sent/Scheduled
+push-notification.table-sent = Sent
+push-notification.table-actioned = Actioned
+push-notification.table-created-by = Created By
+push-notification.table-message-content = Message Content
+push-notification.duplicate = Duplicate
+push-notification.delete = Delete
+push-notification.resend = Resend
+push-notification.approve = Approve
+push-notification.reject = Reject
+push-notification.start = Start
+push-notification.stop = Stop
+push-notification.edit-draft = Edit Draft
+push-notification.edit = Edit
+push-notification.sent = Sent
+push-notification.sending = Sending
+push-notification.created = Created
+push-notification.draft = Draft
+push-notification.waiting-for-approval = Waiting for approval
+push-notification.aborted = Aborted
+push-notification.failed = Failed
+push-notification.stopped = Stopped
+push-notification.scheduled = Scheduled
+push-notification.rejected = Rejected
+push-notification.time-chart-period-weekly = Weekly
+push-notification.time-chart-period-monthly = Monthly
+push-notification.time-chart-period-daily= Daily
+push-notification.now = Now
+push-notification.right-before-sending-the-message = Right before sending the message
+push-notification.segmented-push-enabled-users = Segmented push-enabled users
+push-notification.delivery-type = Delivery Type
+push-notification.delivery-timeframe = Delivery Timeframe
+push-notification.delivery-timeframe-description = Select the time you want the automated notifications to start being sent to users.
+push-notification.trigger-type = Trigger Type
+push-notification.ios-badge-number-setting = IOS badge number
+push-notification.ios-json-data-setting = IOS JSON data
+push-notification.ios-user-data-setting = IOS user data
+push-notification.android-badge-number-setting = Android badge number
+push-notification.android-json-data-setting = Android JSON data
+push-notification.android-user-data-setting = Android user data
+internal-events.[CLY]_push_sent = Push sent
+internal-events.[CLY]_push_action = Push action
+push-notification.android = Android
+push-notification.ios = iOS
+
+# Drawer
+push-notification.drawer-step-one = Info & Targeting
+push-notification.drawer-step-two = Delivery
+push-notification.drawer-step-three = Push Content
+push-notification.drawer-step-four = Review
+push-notification.save = Save
+push-notification.send-for-approval = Send for approval
+push-notification.save-as-draft = Save as draft
+push-notification.create-one-time-notification = Create One-Time Push Notification
+push-notification.create-automated-notification = Create Automated Push Notification
+push-notification.create-transactional-notification = Create API Push Notification
+push-notification.notification-name = Notification Name
+push-notification.notification-name-description = Set the name of push notification (optional).
+push-notification.enter-notification-name = Enter Notification Name
+push-notification.platforms = Platforms
+push-notification.android = Android
+push-notification.ios = iOS
+push-notification.targeting = Targeting
+push-notification.targeting-tooltip = Select how to target the users who will recieve the notification.
+push-notification.all-push-enabled-users = All push-enabled users
+push-notification.all-push-enabled-users-description = Send to all users who have enabled receiving notifications.
+push-notification.use-segmentation = Use segmentation
+push-notification.use-segmentation-description = Send to users based on specific segmentation such as cohorts or locations.
+push-notification.push-enabled-users = Push-enabled users
+push-notification.send-to-users-in-cohorts = Send to the users currently in selected cohorts(s)
+push-notification.send-to-users-in-cohorts-description = Select cohort(s) of users who qualify to receive the notification.
+push-notification.send-to-users-in-locations = Send to the users currently in selected Geolocations
+push-notification.send-to-users-in-locations-description = Select geolocation(s) of users to whom you want to send the notification (e.g. users located in France).
+push-notification.select-event-to-set-trigger = Select one or more events to set the trigger
+push-notification.select-event-to-set-trigger-description = Select one or more events to set the trigger.
+push-notification.select-cohort-to-set-trigger = Select one ore more cohorts to set the trigger
+push-notification.select-cohort-to-set-trigger-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-location = Please select a location
+push-notification.when-to-determine-users = When to determine the users?
+push-notification.when-to-determine-users-tooltip = When to determine the number of push-enabled users who will receive the notification.
+push-notification.determine-users-before = Determine users right before sending the message
+push-notification.determine-users-now = Determine users now
+push-notification.triggers = Triggers
+push-notification.triggers-description = Select the user behavior that will trigger the message sending process automatically.
+push-notification.cohorts-entry = Cohort(s) entry
+push-notification.cohorts-entry-description = Triggered when user enters into any of the cohorts you select.
+push-notification.cohorts-exit = Cohort(s) exit
+push-notification.cohorts-exit-description = Triggered when user exits from any of the cohorts you select.
+push-notification.performed-events = Performed Event(s)
+push-notification.performed-events-description = Triggered when user performs a selected event.
+push-notification.select-event = Please select an event
+push-notification.cohorts = Cohort(s)
+push-notification.geolocations = Geolocation(s)
+push-notification.events = Event(s)
+push-notification.delivery-date-calculation = Delivery date calculation
+push-notification.behavior-trigger-not-met = Behavior when trigger condition is no longer met
+push-notification.start-date = Start date
+push-notification.set-start-date = Set Start Date
+push-notification.set-start-date-tooltip = Select the time you want the notification to be sent to users.
+push-notification.timezone-description = Select whether your push notification needs to adjust for timezone differences.
+push-notification.end-date = End date
+push-notification.set-end-date = Set End Date
+push-notification.set-end-date-tooltip = Select the date when the automatic push notifications will stop being sent.
+push-notification.delivery-method = Delivery Method
+push-notification.delivery-method-description = Select how soon the push notifications will be sent after the user enters a cohort.
+push-notification.capping = Capping
+push-notification.capping-tooltip = Select if there will be a limit in the number of automated push notifications sent to a user.
+push-notification.no-capping = No Capping
+push-notification.no-capping-description = Notification is sent whenever users entered to or exited from cohort.
+push-notification.relative-to-the-date-event-server = Relative to the date event arrived to the server
+push-notification.relative-to-the-date-event-device = Relative to the date event occurred on a device
+push-notification.send-anyway = Send anyway
+push-notification.cancel-when-user-exits-cohort = Cancel when user exits selected cohort(s)
+push-notification.cancel-when-user-exits-cohort-description = Stops the message from being sent if the user is no longer in the selected cohort(s).
+push-notification.send-now = Send now
+push-notification.send-now-description = Send the push notification immediately, once composition is complete.
+push-notification.scheduled = Scheduled
+push-notification.schedule-for-later = Schedule for later
+push-notification.delivery-time = Delivery Time
+push-notification.delivery-time-tooltip = Set an optional delivery time for your message
+push-notification.timezone = Timezone
+push-notification.timezone-tooltip = Select whether your push notification needs to adjust for timezone differences.
+push-notification.deliver-to-all-users-same-time = Deliver to all users at the same time
+push-notification.deliver-to-all-users-same-time-description = Send to all users at a specific time. This may lead to users in different timezones receiving the notification at different hours of the day or night.
+push-notification.deliver-to-all-users-device-time = Deliver in user's local time as per device timezone
+push-notification.deliver-to-all-users-device-time-description = Send to users at a specific time in their own timezone and on the time settings of the user's device.
+push-notification.what-if-past-scheduled = What if the user is past the scheduled time?
+push-notification.what-if-past-scheduled-tooltip = Select what happens if a user is past the scheduled time of the push notification.
+push-notification.do-not-send-message = Do not send the message
+push-notification.deliver-next-day = Deliver the message next day
+push-notification.immediately = Immediately
+push-notification.immediately-description = Deliver this message as soon as triggering cohort is recalculated.
+push-notification.delayed = Delayed
+push-notification.days = Days
+push-notification.hours = Hours
+push-notification.capped = Capped
+push-notification.capped-description = Push notifications will no longer be sent when a certain number of notifications is reached.
+push-notification.maximum-messages-per-user = Maximum messages per user
+push-notification.maximum-messages-per-user-tooltip = Set a limit for the number of automatic push notifications.
+push-notification.messages = Messages
+push-notification.minimum-time-between-messages = Minimum time between messages
+push-notification.minimum-time-between-messages-tooltip = Set the minimum period of time during which notifications will be sent, in order to avoid spamming the user.
+push-notification.expiration-time = Expiration Time
+push-notification.expiration-time-tooltip = Set the number of days after which push notifications that have been undelivered due to device connectivity issues or other errors will stop retrying to be delivered.
+push-notification.notification-type = NOTIFICATION TYPE
+push-notification.compose-message = Compose Message
+push-notification.compose-message-tooltip = Fill in the details of the message you wish to send to your users.
+push-notification.allow-to-set-different-content = Allow to set different message content for different localizations
+push-notification.default-message-is-required = Default message is required
+push-notification.content-message = Content message
+push-notification.silent-message = Silent message
+push-notification.message-title = Message title
+push-notification.add-variable = Add Variable
+push-notification.message-content = Message Content
+push-notification.clear-and-shorter-messages = Clear and shorter messages generally have more conversations...
+push-notification.buttons = Buttons
+push-notification.buttons-tooltip = Set the text for each action button as well as the link or page to which it should lead users.
+push-notification.add-first-button = +Add First button
+push-notification.add-second-button = +Add Second button
+push-notification.enter-x-button = Enter xButton
+push-notification.enter-button-url = Enter Button URL or Deeplink
+push-notification.media-url = Media URL
+push-notification.media-url-description = Add media to your message - put in the URL of the image you would like to include.
+push-notification.enter-media-url = Enter Media URL
+push-notification.platform-settings = Platform Settings
+push-notification.platform-settings-description = Set media and other message specifications specific to the platform on which your users will see the message.
+push-notification.sound-file-name = Sound File Name
+push-notification.enter-sound-file-name = Enter sound file name
+push-notification.sound-file-name-description = Add a custom sound file that will ring with your message.
+push-notification.add-badge-number = Add Badge Number
+push-notification.enter-badge-number = Enter badge number
+push-notification.add-badge-number-description = Android platforms require additional steps. Please refer to Android SDK.
+push-notification.media-url-platform-description = Add the URL for media specific to the platform. This will override the media included in the previous drawer.
+push-notification.subtitle = Subtitle
+push-notification.enter-your-subtitle = Enter your subtitle
+push-notification.subtitle-description = Add a subheading for your message.
+push-notification.on-click-url = On Click URL
+push-notification.enter-on-click-url = Enter on click URL
+push-notification.on-click-url-description = Add URL link that is opened when user taps a message in drawer.
+push-notification.send-json = Send JSON
+push-notification.enter-json-data = Enter JSON data
+push-notification.send-json-description = Add app-specific JSON data along with standard content.
+push-notification.send-user-data = Send User Data
+push-notification.select-user-data = Select user data
+push-notification.send-user-data-description = Select user properties to send in your notification payload.
+push-notification.icon = Icon
+push-notification.icon-description = Set Android notification icon.
+push-notification.enter-icon = Enter icon
+push-notification.review-message = Review Mesage
+push-notification.review-message-tooltip = Review all the details of you push notification.
+push-notification.message-name = Message name
+push-notification.review-title = Title
+push-notification.content = Content
+push-notification.button-text = Button Text
+push-notification.button-url = Button URL
+push-notification.ios-media-url = iOS Media URL
+push-notification.android-media-url = Android Media URL
+push-notification.ios-badge-number = IOS badge number
+push-notification.ios-json-data = iOS JSON data
+push-notification.ios-user-data = iOS user data
+push-notification.android-badge-number = Android badge number
+push-notification.android-json-data = Android JSON data
+push-notification.android-user-data = Android user data
+push-notification.current-number-of-users = Current number of users
+push-notification.when-to-determine = When to determine
+push-notification.when-to-determine-description = When to determine the number of push-enabled users who will receive the notification.
+push-notification.delivery = Delivery
+push-notification.delivery-description = Select the time you want the notification to be sent to users.
+push-notification.scheduled-for = Scheduled for
+push-notification.message-will-expire-after = Message will expire after {0} days and {1} hours
+push-notification.maximum-messages = Maximum {0} messages
+push-notification.minimum-days-and-hours = Minimum {0} days and {1} hours between messages
+push-notification.confirmation = Confirmation
+push-notification.testing = TESTING
+push-notification.you-can-send-the-test-message = You can send the test message to test users
+push-notification.testing-tooltip = Sends the push notification to applications' test users
+push-notification.send-to-test-users = Send to test users
+push-notification.confirmation-uppercase = CONFIRMATION
+push-notification.confirmation-uppercase-description = CONFIRMATION description
+push-notification.i-am-ready-to-send = I am ready to send this message to real-users
+push-notification.was-successfully-saved = Push notification message was successfully saved
+push-notification.was-successfully-sent-to-test-users = Push notification message was successfully sent to test users
+push-notification.was-successfully-approved = Push notification has been successfully approved
+push-notification.was-successfully-rejected = Push notification has been successfully rejected
+push-notification.was-successfully-deleted = Push notification was successfully deleted
+push-notification.was-successfully-started = Push notification was successfully started
+push-notification.was-successfully-stopped = Push notification was successfully stopped
+
+# Add user property
+push-notification.event-properties = Event Properties
+push-notification.user-properties = User Properties
+push-notification.custom-properties = Custom Properties
+push-notification.add-user-property = Add User Property
+push-notification.api-property = Add User Property
+push-notification.search-in-properties = Search in Properties
+push-notification.select-property = Select Property
+push-notification.enter-value = Enter Value
+push-notification.start-with-capital-letter = Make user property start with capital letter
+push-notification.fallback-value = Fallback value
+push-notification.fallback-value-desc = Default value which will be used in case user profile doesn't have this variable
+push-notification.remove = Remove
+push-notification.confirm = Confirm
+push-notification.internal-properties = Internal Properties
+push-notification.external-properties = External Properties
+push-notification-fallback-value-description = User''s \"{0}\" property which falls back to \"{1}\"
+
+
+# Details
+push-notification-details.back-to = Back to Push Notifications
+push-notification-details.localization-filter-label = LOCALIZATION
+push-notification-details.localization-filter-all = All Localizations
+push-notification-details.summary-header = Notification Summary
+push-notification-details.summary-header-description = Overview of the notification message and its details.
+push-notification-details.message-tab = Message Content
+push-notification-details.targeting-tab = Targeting & Delivery
+push-notification-details.errors-tab = Errors
+push-notification-details.users-targeted-chart = Users Targeted
+push-notification-details.sent-messages-chart = Sent Messages
+push-notification-details.and-label = and
+push-notification-details.message-id = Message ID
+push-notification-details.results-for = Results for
+push-notification-details.created = Created
+push-notification-details.created-by = Created {0} by {1}
+
+push-notification-details.message-title = Title
+push-notification-details.message-content = Content
+push-notification-details.message-first-button-label = First Button Text
+push-notification-details.message-first-button-url = First Button URL
+push-notification-details.message-second-button-label = Second Button Text
+push-notification-details.message-second-button-url = Second Button URL
+push-notification-details.message-media-url = Media URL
+push-notification-details.ios-message-media-url = IOS media URL
+push-notification-details.android-message-media-url = Android media URL
+
+push-notification-details.targeting-sub-header = Targeting
+push-notification-details.targeted-users = Targeted users
+push-notification-details.geolocation = Geolocation
+push-notification-details.when-to-determine = When to determine
+push-notification-details.delivery-sub-header = Delivery
+push-notification-details.delivery-type = Delivery type
+push-notification-details.scheduled-for = Scheduled for
+push-notification-details.expiration-time = Expiration time
+push-notification-details.message-expires-after = Message expires after {0} day(s) and {1} hour(s)
+push-notification-details.no-errors-found = No errors were found
+push-notification.users-targeted = Users Targeted
+push-notification.users-targeted-description = Total number of users targeted to receive the selected notification.
+push-notification.sent-notifications = Sent Notifications
+push-notification.sent-notifications-description = Total number of notifications sent.
+push-notification.clicked-notifications = Clicked Notifications
+push-notification.clicked-notifications-description = Total number of notifications clicked on or reacted to.
+push-notification.failed = Failed
+push-notification.failed-description = Total number of notifications that failed to get delivered.
+push-notification.no-errors-found = There are no errors found
+push-notification.affected-users = Affected Users
+push-notification.error-description = Description
+push-notification.error-code = Error Code
+push-notification.users = Users
+push-notification.back-to-push-notification-details = Back to push notification
+
+# Mobile Preview Component
+push-notification.mobile-preview-default-app-name = Your application name
+push-notification.mobile-preview-default-title = Your message title
+push-notification.mobile-preview-default-content = Your message content
+
+# Application settings
+push-notification.ios-settings = iOS settings
+push-notification.authentication-type = Authentication type
+push-notification.key-file-p8 = Key file (P8)
+push-notification.key-file-p12 = Sandbox + Production certificate (P12)
+push-notification.key-file-already-uploaded = Key file {0} is already uploaded
+push-notification.choose-file = Choose File
+push-notification.key-id = Key ID
+push-notification.team-id = Team ID
+push-notification.bundle-id = Bundle ID
+push-notification.passphrase = Passphrase
+push-notification.android-settings = Android (Google FCM)
+push-notification.firebase-key = Firebase key
+push-notification.huawei-settings = Android (Huawei Push Kit)
+push-notification.huawei-app-id = App ID
+push-notification.huawei-app-secret = App Secret
+push-notification.rate-limit = Rate limit
+push-notification.maximum-notifications-per-period = Maximum number of notifications scheduled per period
+push-notification.period-in-seconds = Period duration (seconds)
+push-notification.test-users = Test users
+push-notification.test-users-description = Test users description
+push-notification.define-new-user = +Define New User
+push-notification.user-definition = User Definition
+push-notification.user-definition-description = You can send test notifications to users defined as test users before sending push notifications
+push-notification.see-user-list = See User List
+push-notification.define-new-user-title = Define New User
+push-notification.add-test-users-label = Add Users
+push-notification.definition-type = Definition Type
+push-notification.define-with-user-id = Define with User ID
+push-notification.define-with-cohort = Define with Cohort
+push-notification.enter-user-id = Enter User ID
+push-notification.select-one-or-more-cohorts = Select one or more cohorts to set the trigger
+push-notification.select-one-or-more-cohorts-description = Recalculation of cohorts above will trigger sending process automatically.
+push-notification.select-cohort = Please select a cohort
+push-notification.user-list = User List
+push-notification.username = Username
+push-notification.user-id = User ID
+push-notification.cohort-name = Cohort Name
+push-notification.cancel = Cancel
+push-notification.i-understand-delete-key = I understand, delete this key
+push-notification.delete-key = Delete Key
+push-notification.test-users-were-successfully-removed = Test users have been successfully removed
+push-notification.test-users-were-successfully-added = Test users have been successfully added
+
+#Global settinsg
+push.plugin-title = Push Notifications
+push.proxyhost = Proxy Hostname
+push.proxypass = Proxy Password
+push.proxyport = Proxy Port
+push.proxyuser = Proxy Username
+push.proxyhttp = Do NOT use HTTPS when connecting to proxy server
+push.proxyunauthorized = Do NOT check proxy HTTPS certificate
+push.sendahead = Send notifications scheduled up to this many ms into the future
+push.connection_retries = Number of connection retries
+push.connection_factor = Time factor for exponential backoff between retries
+push.pool_pushes = Number of notifications in stream batches
+push.pool_bytes = Bytes in binary stream batches
+push.pool_concurrency = Maximum number of same type connections
+push.pool_pools = Maximum number of connections in total
+
+#Drawer from other views
+push-notification.send-message-to-users = Send message to users
+push-notification.select-max-two-metrics = Select maximum 2 metrics
+# Error codes
+push-notification.error-code.400.desc = 400 Bad request
+push-notification.error-code.401.desc = 401 Not authorized Please make sure your push notifications credentials are valid.
+push-notification.error-code.403.desc = 403 Not authenticated. Please make sure your push notifications credentials are valid.
+push-notification.error-code.405.desc = 405 Bad Method
+push-notification.error-code.413.desc = 413 Payload too large. Please decrease notification payload size.
+push-notification.error-code.429.desc = 429 Too many requests. Please try again later.
+push-notification.error-code.500.desc = 500 Server error. Please try again later.
+push-notification.error-code.503.desc = 503 Shutdown. Please try again later.
+push-notification.error-code.Rejected.desc = The message was in inactive stated during sending.
+push-notification.error-code.NoAudience.desc = There're no users to send this notification to. Possibly the filters of this message are too strict.
+push-notification.error-code.NoApp.desc = App not found when sending the notification.
+push-notification.error-code.NoMessage.desc = The message was not found when sending the notification.
+push-notification.error-code.NoCredentials.desc = Push notification credentials were not found when sending the notification.
+push-notification.error-code.NoConnection.desc = Failed to connect to push notifications provider, please check APN / FCM / HPK are available from Countly host. In case you use proxy server, please check it's up and running.
+push-notification.error-code.NoProxyConnection.desc = Failed to connect to push notifications provider while using proxy server. Please check proxy server settings.
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.ExpiredCreds.desc = Push Notification credentials have probably expired. Please upload new credentials.
+push-notification.error-code.BadDeviceToken.desc = The push token received from your app by Countly Server was rejected by APNS as invalid. Please make sure you set `pushTestMode` property on the SDK's initial configuration correctly. Also please make sure provisioning profile (Development or Distribution) is valid, bundle ID is correct and entitlements are properly set.
+push-notification.error-code.MissingTopic.desc = The server failed to parse the certificate, please ensure you use universal certificate and contact support if you do.
+push-notification.error-code.DeviceTokenNotForTopic.desc = APNS certificate doesn't correspond to the Bundle ID of your application.
+push-notification.error-code.TopicDisallowed.desc = Sending Push Notifications to this topic is not allowed. Apple rejects sending Push Notifications to this topic. Most probably there is no such app in Certificates, Identifiers & Profiles portal.
+push-notification.error-code.InvalidProviderToken.desc = Please check your Auth key file, Team ID & Bundle ID - some of those is invalid.
+push-notification.error-code.MissingRegistration.desc = Please contact customer support.
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidParameters.desc = Invalid request parameters. Please send server logs to Countly support.
+push-notification.error-code.MismatchSenderId.desc = Invalid Sender ID. Most probably SDK competes for tokens with other Firebase SDK you have in your app.
Please override the way our SDK or another SDK get a token so they would end up using the same token.
+push-notification.error-code.MessageTooBig.desc = Message was too large and Google declined to deliver it.
+push-notification.error-code.InvalidDataKey.desc = Message contains invalid data key, please check:
+push-notification.error-code.InvalidTtl.desc = Please contact customer support.
+push-notification.error-code.DeviceMessageRateExceeded.desc = You send messages to the same device more often than Google allows, please do that less often.
+push-notification.error-code.TopicsMessageRateExceeded.desc = You send messages to the same topic more often than Google allows, please do that less often.
+push-notification.error-code.Unavailable.desc = Google server unexpectedly returned HTTP error 200 Unavailable. Please try again later.
+push-notification.error-code.InternalServerError.desc = Google server unexpectedly returned HTTP error 200 InternalServerError. Please try again later.
+push-notification.error-code.NotRegistered.desc = FCM token expired
+push-notification.error-code.InvalidRegistration.desc = Probably you modified the way SDK handles FCM tokens. Please ensure you do it right or contact support.
+push-notification.error-code.InvalidPackageName.desc = Your application package name doesn't correspond to package name specified in FCM
+push-notification.error-code.IllegalToken.desc = Huawei token is expired or invalid
+push-notification.error-code.MessageBodyTooBig.desc = Message body is too big for a Huawei notification
+push-notification.error-code.TooManyTokens.desc = Too many tokens are being sent to Huawei, please contact Countly support.
+push-notification.error-code.NotAuthorizedPriority.desc = You are not authorized to send high-priority Huawei notifications.
+push-notification.error-code.InternalHuaweiError.desc = Internal Huawei server error.
+
+push-notification.error-code.TooLateToSend.desc = Countly was unable to send these notifications in time (1 hour from scheduled date).
+push-notification.error-code.del = Message deleted
+push-notification.error-code.del.desc = Push Notification messages have been discarded due to the message being deleted.
+push-notification.error-code.consent = Consent cancelled
+push-notification.error-code.consent.desc = Push Notification messages have been removed from the queue because of removed push consent.
+push-notification.error-code.purge.desc = Push Notification messages have been removed from the queue because user data has been purged.
+push-notification.error-code.aborted = Aborted
+push-notification.error-code.aborted.desc = Push Notification messages have been removed from the queue after an nonrecoverable error. Please check our Troubleshooting documentation.
Please read the following instructions if you want to re-send the push notification to users who have not received it.
+push-notification.error-code.ExpiredToken = Expired Token
+push-notification.error-code.ExpiredToken.desc = The token expired for affected number of users.
+
+# System Logs
+systemlogs.action.push_message_created = Push Notification created
+systemlogs.action.push_message_draft = Draft Push Notification created
+systemlogs.action.push_credentials_update = Push Credentials updated
+systemlogs.action.push_message_deleted = Push Notification deleted
+systemlogs.action.push_message_updated = Push Notification updated
+systemlogs.action.push_message_activated = Push Notification activated
+systemlogs.action.push_message_deactivated = Push Notification deactivated
+systemlogs.action.push_message_test = Test Push Notification sent
diff --git a/plugins/push/frontend/public/stylesheets/main.scss b/plugins/push/frontend/public/stylesheets/main.scss
index 76db65bd121..958528634bf 100644
--- a/plugins/push/frontend/public/stylesheets/main.scss
+++ b/plugins/push/frontend/public/stylesheets/main.scss
@@ -380,26 +380,6 @@
}
}
-.cly-vue-push-notification-details-tab-icon {
- width: 15px;
- height: 16px;
- border-radius: 6px;
- background-color: #D23F00;
- display: flex;
- align-items: center;
- justify-content: center;
- color: white;
- font-size: 10px;
- font-weight: bold;
-}
-
-.cly-vue-push-notification-details-expand-row {
- border: 1px solid #ECECEC;
- box-shadow: 0px 2px 0px #EAECEF;
- border-radius:4px;
- width: 100%;
-}
-
.cly-vue-push-notification-drawer {
&__section {
@@ -569,26 +549,6 @@
padding-left: 16px !important;
padding-right: 16px !important;
}
-
- &__date-picker-wrapper {
- width: 200px;
- }
-
- &__radio-button-group {
- .el-radio-group {
- width: 100%;
- }
- .el-radio-button {
- width: 33%;
- }
- .el-radio-button__inner {
- width: 100%;
- }
- }
-
- &__repetition-weekly-select {
- width: 366px;
- }
}
@@ -604,13 +564,12 @@
margin-top: 8px;
}
}
-
- .el-radio__label {
- padding-left: unset !important;
- margin-left: 0.50rem;
- }
}
+ &__button {
+ width:100%;
+ height:100px !important;
+ }
&__title {
display: inline-block;
@@ -624,7 +583,6 @@
font-size: typography.$text-small-size;
white-space: pre-line;
min-width: 200px;
- line-height: 14px;
}
&__content-header{
@@ -872,13 +830,4 @@
.cly-vue-push-notification-details-chart-bars__item-legend-percentage + .text-medium span i{
margin-left: 6px;
cursor: pointer;
-}
-
-.push-notification {
- &__main-tabs {
- .cly-vue-tabs {
- visibility: hidden;
- margin-bottom: 0px !important;
- }
- }
}
\ No newline at end of file
diff --git a/plugins/push/frontend/public/templates/common-components.html b/plugins/push/frontend/public/templates/common-components.html
index 327c9a4dc91..6ab3ee8fec2 100644
--- a/plugins/push/frontend/public/templates/common-components.html
+++ b/plugins/push/frontend/public/templates/common-components.html
@@ -1,25 +1,17 @@
-
\ No newline at end of file
diff --git a/plugins/push/frontend/public/templates/push-notification-details.html b/plugins/push/frontend/public/templates/push-notification-details.html
index a92e88d1390..37f214281ce 100644
--- a/plugins/push/frontend/public/templates/push-notification-details.html
+++ b/plugins/push/frontend/public/templates/push-notification-details.html
@@ -1,9 +1,9 @@