@cuppet/core 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +355 -183
- package/features/app/appiumManager.js +58 -58
- package/features/app/browserManager.js +54 -54
- package/features/app/commonComponents/commonFields.js +18 -0
- package/features/app/commonComponents/commonPaths.js +17 -0
- package/features/app/hooks.js +95 -95
- package/features/app/multilingualStrings/multilingualStrings.js +288 -0
- package/features/app/stepDefinitions/accessibilitySteps.js +17 -17
- package/features/app/stepDefinitions/apiSteps.js +52 -52
- package/features/app/stepDefinitions/lighthouseSteps.js +17 -17
- package/features/app/stepDefinitions/visualRegressionSteps.js +26 -26
- package/features/app/world.js +2 -0
- package/features/tests/example.feature +17 -0
- package/index.js +43 -43
- package/package.json +72 -57
- package/src/accessibilityTesting.js +44 -44
- package/src/apiFunctions.js +290 -290
- package/src/appiumTesting.js +79 -79
- package/src/visualRegression.js +67 -67
- package/stepDefinitions.js +17 -17
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
const puppeteer = require('puppeteer');
|
|
2
|
-
|
|
3
|
-
class BrowserManager {
|
|
4
|
-
constructor(config, args, credentials) {
|
|
5
|
-
this.config = config;
|
|
6
|
-
this.args = args;
|
|
7
|
-
this.credentials = credentials;
|
|
8
|
-
this.browser = null;
|
|
9
|
-
this.page = null;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async initialize() {
|
|
13
|
-
// Launch the browser with the provided arguments and configuration
|
|
14
|
-
this.browser = await puppeteer.launch({
|
|
15
|
-
headless: false,
|
|
16
|
-
args: this.args,
|
|
17
|
-
defaultViewport: null,
|
|
18
|
-
w3c: false,
|
|
19
|
-
});
|
|
20
|
-
// Check if the browser was launched successfully and a page is available
|
|
21
|
-
const pages = await this.browser.pages();
|
|
22
|
-
if (pages.length > 0) {
|
|
23
|
-
this.page = pages[0];
|
|
24
|
-
} else {
|
|
25
|
-
this.page = await this.browser.newPage();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Set the viewport for headless mode
|
|
29
|
-
if (Array.isArray(this.args)) {
|
|
30
|
-
const isHeadless = this.args.includes('--headless=new');
|
|
31
|
-
if (isHeadless) {
|
|
32
|
-
await this.page.setViewport({
|
|
33
|
-
width: Number(this.config.width),
|
|
34
|
-
height: Number(this.config.height),
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Pass basic authentication credentials if provided
|
|
40
|
-
if (this.credentials) {
|
|
41
|
-
await this.page.authenticate(this.credentials);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async stop() {
|
|
46
|
-
if (this.browser) {
|
|
47
|
-
await this.browser.close();
|
|
48
|
-
this.browser = null;
|
|
49
|
-
this.page = null;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
module.exports = BrowserManager;
|
|
1
|
+
const puppeteer = require('puppeteer');
|
|
2
|
+
|
|
3
|
+
class BrowserManager {
|
|
4
|
+
constructor(config, args, credentials) {
|
|
5
|
+
this.config = config;
|
|
6
|
+
this.args = args;
|
|
7
|
+
this.credentials = credentials;
|
|
8
|
+
this.browser = null;
|
|
9
|
+
this.page = null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async initialize() {
|
|
13
|
+
// Launch the browser with the provided arguments and configuration
|
|
14
|
+
this.browser = await puppeteer.launch({
|
|
15
|
+
headless: false,
|
|
16
|
+
args: this.args,
|
|
17
|
+
defaultViewport: null,
|
|
18
|
+
w3c: false,
|
|
19
|
+
});
|
|
20
|
+
// Check if the browser was launched successfully and a page is available
|
|
21
|
+
const pages = await this.browser.pages();
|
|
22
|
+
if (pages.length > 0) {
|
|
23
|
+
this.page = pages[0];
|
|
24
|
+
} else {
|
|
25
|
+
this.page = await this.browser.newPage();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Set the viewport for headless mode
|
|
29
|
+
if (Array.isArray(this.args)) {
|
|
30
|
+
const isHeadless = this.args.includes('--headless=new');
|
|
31
|
+
if (isHeadless) {
|
|
32
|
+
await this.page.setViewport({
|
|
33
|
+
width: Number(this.config.width),
|
|
34
|
+
height: Number(this.config.height),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Pass basic authentication credentials if provided
|
|
40
|
+
if (this.credentials) {
|
|
41
|
+
await this.page.authenticate(this.credentials);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async stop() {
|
|
46
|
+
if (this.browser) {
|
|
47
|
+
await this.browser.close();
|
|
48
|
+
this.browser = null;
|
|
49
|
+
this.page = null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = BrowserManager;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const commonFields = {
|
|
2
|
+
Submit: '[id^="edit-submit"]',
|
|
3
|
+
Delete: '#edit-delete',
|
|
4
|
+
Run: '#edit-run',
|
|
5
|
+
Cancel: '#edit-cancel',
|
|
6
|
+
Deploy: '#edit-deploy',
|
|
7
|
+
Apply: '#edit-submit-admin-views-user',
|
|
8
|
+
Index50: '#edit-cron',
|
|
9
|
+
SubmitFilters: '#edit-filters-submit',
|
|
10
|
+
Confirm: '#edit-confirm',
|
|
11
|
+
Recipe: '#btn_continue',
|
|
12
|
+
Finish: '#edit-return',
|
|
13
|
+
Name: '#edit-name',
|
|
14
|
+
Pass: '#edit-pass',
|
|
15
|
+
TextBox: '.show #item-0',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
module.exports = commonFields;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const commonPaths = {
|
|
2
|
+
Content: '/admin/content',
|
|
3
|
+
CreateUser: '/admin/people/create',
|
|
4
|
+
User: '/user',
|
|
5
|
+
People: '/admin/people',
|
|
6
|
+
NodeAdd: '/node/add',
|
|
7
|
+
Terms: '/admin/structure/taxonomy',
|
|
8
|
+
Media: '/admin/content/media',
|
|
9
|
+
Menus: '/admin/structure/menu',
|
|
10
|
+
Config: '/admin/config',
|
|
11
|
+
CacheClear: '/admin/config/development/performance',
|
|
12
|
+
Cron: '/admin/config/system/cron/jobs',
|
|
13
|
+
BasicSettings: '/admin/config/system/site-information',
|
|
14
|
+
Redirects: '/admin/config/search/redirect',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
module.exports = commonPaths;
|
package/features/app/hooks.js
CHANGED
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
const { BeforeAll, AfterAll, Before, After, AfterStep, Status } = require('@cucumber/cucumber');
|
|
2
|
-
const BrowserManager = require('./browserManager');
|
|
3
|
-
const AppiumManager = require('./appiumManager');
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const config = require('config');
|
|
6
|
-
const dataStore = require('../../src/dataStorage');
|
|
7
|
-
const profile = process.env.NODE_CONFIG_ENV;
|
|
8
|
-
|
|
9
|
-
let screenshotPath = config.get('screenshotsPath').toString() ?? 'screenshots/';
|
|
10
|
-
|
|
11
|
-
// ==== BeforeAll and AfterAll do not have access to test scope 'this'
|
|
12
|
-
// ==== Before and After do
|
|
13
|
-
|
|
14
|
-
// executed once before any test
|
|
15
|
-
BeforeAll(async function () {
|
|
16
|
-
await dataStore.createFile();
|
|
17
|
-
console.log(`Tests started at: ${new Date()}`);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
AfterStep(async function (testCase) {
|
|
21
|
-
/**
|
|
22
|
-
* If the test is not passed or the test is not tagged with @api, take a screenshot
|
|
23
|
-
*/
|
|
24
|
-
const arrayTags = testCase.pickle.tags;
|
|
25
|
-
const found = arrayTags.find((item) => item.name === '@api');
|
|
26
|
-
if (testCase.result.status !== Status.PASSED && found === undefined) {
|
|
27
|
-
let stepName = testCase.pickle.uri;
|
|
28
|
-
const name = stepName.replace(/[/\\.]/g, '_');
|
|
29
|
-
const baseScreenshotPath = `${screenshotPath}${profile}`;
|
|
30
|
-
if (!fs.existsSync(baseScreenshotPath)) {
|
|
31
|
-
fs.mkdirSync(baseScreenshotPath, { recursive: true });
|
|
32
|
-
}
|
|
33
|
-
let path = `${baseScreenshotPath}/screenshot_${name}.png`;
|
|
34
|
-
let screenshot = await this.page.screenshot({ path: path, fullPage: true });
|
|
35
|
-
console.log(`Screenshot taken: ${name}`);
|
|
36
|
-
// Convert Uint8Array to Buffer because Cucumber cannot work directly with Uint8Arrays
|
|
37
|
-
const buffer = Buffer.from(screenshot.buffer, screenshot.byteOffset, screenshot.byteLength);
|
|
38
|
-
this.attach(buffer, 'image/png');
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
// executed once after all tests
|
|
43
|
-
AfterAll(async function () {
|
|
44
|
-
const date = new Date();
|
|
45
|
-
console.log(`Tests completed at: ${date.toString()}`);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// executed before every test
|
|
49
|
-
Before(async function (testCase) {
|
|
50
|
-
// Get Browser config arguments array
|
|
51
|
-
const browserArgs = config.get('browserOptions.args');
|
|
52
|
-
// Get default browser viewport
|
|
53
|
-
const browserViewport = config.get('browserOptions.viewport.default');
|
|
54
|
-
// Check for basic auth credentials in config
|
|
55
|
-
let credentials;
|
|
56
|
-
if (config.has('basicAuth')) {
|
|
57
|
-
credentials = {
|
|
58
|
-
username: config.get('basicAuth.authUser').toString(),
|
|
59
|
-
password: config.get('basicAuth.authPass').toString(),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
// Get Appium capabilities from config
|
|
63
|
-
const appiumCapabilities = config.get('appiumCapabilities');
|
|
64
|
-
|
|
65
|
-
// Check if the test is tagged with @appium to either use Appium or Chromium
|
|
66
|
-
const arrayTags = testCase.pickle.tags;
|
|
67
|
-
const found = arrayTags.find((item) => item.name === '@appium');
|
|
68
|
-
if (!found) {
|
|
69
|
-
const browserManager = new BrowserManager(browserViewport, browserArgs, credentials);
|
|
70
|
-
await browserManager.initialize();
|
|
71
|
-
|
|
72
|
-
// Assign created browser, page, and scenario name to global variables
|
|
73
|
-
this.browserManager = browserManager;
|
|
74
|
-
this.browser = browserManager.browser;
|
|
75
|
-
this.page = browserManager.page;
|
|
76
|
-
this.scenarioName = testCase.pickle.name;
|
|
77
|
-
} else {
|
|
78
|
-
const appiumManager = new AppiumManager(appiumCapabilities);
|
|
79
|
-
await appiumManager.initialize();
|
|
80
|
-
this.appiumManager = appiumManager;
|
|
81
|
-
this.appiumDriver = appiumManager.appiumDriver;
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
// executed after every test
|
|
86
|
-
After(async function (testCase) {
|
|
87
|
-
if (testCase.result.status === Status.FAILED) {
|
|
88
|
-
console.log(`Scenario: '${testCase.pickle.name}' - has failed...\r\n`);
|
|
89
|
-
}
|
|
90
|
-
if (this.browser) {
|
|
91
|
-
await this.browserManager.stop();
|
|
92
|
-
} else if (this.appiumDriver) {
|
|
93
|
-
await this.appiumManager.stop();
|
|
94
|
-
}
|
|
95
|
-
});
|
|
1
|
+
const { BeforeAll, AfterAll, Before, After, AfterStep, Status } = require('@cucumber/cucumber');
|
|
2
|
+
const BrowserManager = require('./browserManager');
|
|
3
|
+
const AppiumManager = require('./appiumManager');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const config = require('config');
|
|
6
|
+
const dataStore = require('../../src/dataStorage');
|
|
7
|
+
const profile = process.env.NODE_CONFIG_ENV;
|
|
8
|
+
|
|
9
|
+
let screenshotPath = config.get('screenshotsPath').toString() ?? 'screenshots/';
|
|
10
|
+
|
|
11
|
+
// ==== BeforeAll and AfterAll do not have access to test scope 'this'
|
|
12
|
+
// ==== Before and After do
|
|
13
|
+
|
|
14
|
+
// executed once before any test
|
|
15
|
+
BeforeAll(async function () {
|
|
16
|
+
await dataStore.createFile();
|
|
17
|
+
console.log(`Tests started at: ${new Date()}`);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
AfterStep(async function (testCase) {
|
|
21
|
+
/**
|
|
22
|
+
* If the test is not passed or the test is not tagged with @api, take a screenshot
|
|
23
|
+
*/
|
|
24
|
+
const arrayTags = testCase.pickle.tags;
|
|
25
|
+
const found = arrayTags.find((item) => item.name === '@api');
|
|
26
|
+
if (testCase.result.status !== Status.PASSED && found === undefined) {
|
|
27
|
+
let stepName = testCase.pickle.uri;
|
|
28
|
+
const name = stepName.replace(/[/\\.]/g, '_');
|
|
29
|
+
const baseScreenshotPath = `${screenshotPath}${profile}`;
|
|
30
|
+
if (!fs.existsSync(baseScreenshotPath)) {
|
|
31
|
+
fs.mkdirSync(baseScreenshotPath, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
let path = `${baseScreenshotPath}/screenshot_${name}.png`;
|
|
34
|
+
let screenshot = await this.page.screenshot({ path: path, fullPage: true });
|
|
35
|
+
console.log(`Screenshot taken: ${name}`);
|
|
36
|
+
// Convert Uint8Array to Buffer because Cucumber cannot work directly with Uint8Arrays
|
|
37
|
+
const buffer = Buffer.from(screenshot.buffer, screenshot.byteOffset, screenshot.byteLength);
|
|
38
|
+
this.attach(buffer, 'image/png');
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// executed once after all tests
|
|
43
|
+
AfterAll(async function () {
|
|
44
|
+
const date = new Date();
|
|
45
|
+
console.log(`Tests completed at: ${date.toString()}`);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// executed before every test
|
|
49
|
+
Before(async function (testCase) {
|
|
50
|
+
// Get Browser config arguments array
|
|
51
|
+
const browserArgs = config.get('browserOptions.args');
|
|
52
|
+
// Get default browser viewport
|
|
53
|
+
const browserViewport = config.get('browserOptions.viewport.default');
|
|
54
|
+
// Check for basic auth credentials in config
|
|
55
|
+
let credentials;
|
|
56
|
+
if (config.has('basicAuth')) {
|
|
57
|
+
credentials = {
|
|
58
|
+
username: config.get('basicAuth.authUser').toString(),
|
|
59
|
+
password: config.get('basicAuth.authPass').toString(),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Get Appium capabilities from config
|
|
63
|
+
const appiumCapabilities = config.get('appiumCapabilities');
|
|
64
|
+
|
|
65
|
+
// Check if the test is tagged with @appium to either use Appium or Chromium
|
|
66
|
+
const arrayTags = testCase.pickle.tags;
|
|
67
|
+
const found = arrayTags.find((item) => item.name === '@appium');
|
|
68
|
+
if (!found) {
|
|
69
|
+
const browserManager = new BrowserManager(browserViewport, browserArgs, credentials);
|
|
70
|
+
await browserManager.initialize();
|
|
71
|
+
|
|
72
|
+
// Assign created browser, page, and scenario name to global variables
|
|
73
|
+
this.browserManager = browserManager;
|
|
74
|
+
this.browser = browserManager.browser;
|
|
75
|
+
this.page = browserManager.page;
|
|
76
|
+
this.scenarioName = testCase.pickle.name;
|
|
77
|
+
} else {
|
|
78
|
+
const appiumManager = new AppiumManager(appiumCapabilities);
|
|
79
|
+
await appiumManager.initialize();
|
|
80
|
+
this.appiumManager = appiumManager;
|
|
81
|
+
this.appiumDriver = appiumManager.appiumDriver;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// executed after every test
|
|
86
|
+
After(async function (testCase) {
|
|
87
|
+
if (testCase.result.status === Status.FAILED) {
|
|
88
|
+
console.log(`Scenario: '${testCase.pickle.name}' - has failed...\r\n`);
|
|
89
|
+
}
|
|
90
|
+
if (this.browser) {
|
|
91
|
+
await this.browserManager.stop();
|
|
92
|
+
} else if (this.appiumDriver) {
|
|
93
|
+
await this.appiumManager.stop();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
multilingualStrings: function (lang, property) {
|
|
3
|
+
const translations = {
|
|
4
|
+
de: {
|
|
5
|
+
Submit: 'Einreichen',
|
|
6
|
+
Delete: 'Löschen',
|
|
7
|
+
Run: 'Laufen',
|
|
8
|
+
everywhere: 'nachgesehen',
|
|
9
|
+
'use current location': 'Standort nutzen',
|
|
10
|
+
'advanced search': 'Erweiterte Suche',
|
|
11
|
+
'we looked': 'Wir haben überall',
|
|
12
|
+
'but could not find your page.': 'aber die gewünsche Seite nicht gefunden',
|
|
13
|
+
'03 March 2021': '03 März 2021',
|
|
14
|
+
apply: 'jetzt bewerben',
|
|
15
|
+
"You haven't applied recently.": 'Sie haben sich in letzter Zeit nicht beworben.',
|
|
16
|
+
'my applications': 'Meine Bewerbungen',
|
|
17
|
+
'you have not saved any jobs yet': 'Sie haben sich bisher keine Stellenanzeigen gemerkt',
|
|
18
|
+
'you are applying for this job:': 'Bewerbung',
|
|
19
|
+
},
|
|
20
|
+
nl: {
|
|
21
|
+
'we looked': 'we zochten',
|
|
22
|
+
everywhere: 'overal',
|
|
23
|
+
'but could not find your page.': 'maar konden de pagina niet vinden.',
|
|
24
|
+
'Page not found': 'Pagina niet gevonden',
|
|
25
|
+
'03 March 2021': '03 maart 2021',
|
|
26
|
+
},
|
|
27
|
+
pt: {
|
|
28
|
+
'03 March 2021': '03 março 2021',
|
|
29
|
+
},
|
|
30
|
+
ar: {
|
|
31
|
+
'advanced search': 'búsqueda avanzada',
|
|
32
|
+
'use current location': 'usar ubicación actual',
|
|
33
|
+
'we looked': 'buscamos por',
|
|
34
|
+
everywhere: 'todas partes',
|
|
35
|
+
'but could not find your page.': 'pero no pudimos encontrar tu página',
|
|
36
|
+
'03 March 2021': '03 marzo 2021',
|
|
37
|
+
},
|
|
38
|
+
pl: {
|
|
39
|
+
'advanced search': 'wyszukiwanie zaawansowane',
|
|
40
|
+
'use current location': 'użyj aktualnej lokalizacji',
|
|
41
|
+
'we looked': 'szukaliśmy',
|
|
42
|
+
everywhere: 'wszędzie',
|
|
43
|
+
'but could not find your page.': 'ale nie mogliśmy znaleźć tej strony.',
|
|
44
|
+
'03 March 2021': '03 Marzec 2021',
|
|
45
|
+
'work from home jobs': 'tylko praca zdalna',
|
|
46
|
+
'remote jobs found for you': 'zdalne oferty pracy znalezione dla Ciebie',
|
|
47
|
+
},
|
|
48
|
+
cs: {
|
|
49
|
+
'advanced search': 'podrobné vyhledávání',
|
|
50
|
+
'use current location': 'použít současnou polohu',
|
|
51
|
+
'we looked': 'Hledali jsme',
|
|
52
|
+
everywhere: 'všude,',
|
|
53
|
+
'but could not find your page.': 'ale danou stránku jsme bohužel nenašli.',
|
|
54
|
+
'03 March 2021': '03 Březen 2021',
|
|
55
|
+
},
|
|
56
|
+
cl: {
|
|
57
|
+
'advanced search': 'búsqueda avanzada',
|
|
58
|
+
'use current location': 'usar ubicación actual',
|
|
59
|
+
'we looked': 'buscamos por',
|
|
60
|
+
everywhere: 'todas partes',
|
|
61
|
+
'but could not find your page.': 'pero no pudimos encontrar tu página',
|
|
62
|
+
'03 March 2021': '03 marzo 2021',
|
|
63
|
+
'work from home jobs': 'solo empleos por teletrabajo',
|
|
64
|
+
'remote jobs found for you': 'teletrabajo trabajos para ti',
|
|
65
|
+
},
|
|
66
|
+
ro: {
|
|
67
|
+
'advanced search': 'căutare avansată',
|
|
68
|
+
'use current location': 'utilizați locația curentă',
|
|
69
|
+
'we looked': 'ne-am uitat',
|
|
70
|
+
everywhere: 'pretutindeni',
|
|
71
|
+
'but could not find your page.': 'dar nu v-am putut găsi pagina.',
|
|
72
|
+
'03 March 2021': '03 Martie 2021',
|
|
73
|
+
apply: 'aplică',
|
|
74
|
+
},
|
|
75
|
+
hu: {
|
|
76
|
+
'advanced search': 'haladó keresés',
|
|
77
|
+
'use current location': 'használja a jelenlegi helyszínt',
|
|
78
|
+
'we looked': 'mindenhol',
|
|
79
|
+
everywhere: 'kerestük',
|
|
80
|
+
'but could not find your page.': 'de nem sikerült betölteni a keresett oldalt',
|
|
81
|
+
'03 March 2021': '03 március 2021',
|
|
82
|
+
apply: 'jelentkezem',
|
|
83
|
+
},
|
|
84
|
+
es: {
|
|
85
|
+
'advanced search': 'búsqueda avanzada',
|
|
86
|
+
'use current location': 'usar ubicación actual',
|
|
87
|
+
'we looked': 'buscamos por',
|
|
88
|
+
everywhere: 'todas partes',
|
|
89
|
+
'but could not find your page.': 'pero no pudimos encontrar tu página',
|
|
90
|
+
'03 March 2021': '03 Marcha 2021',
|
|
91
|
+
},
|
|
92
|
+
it: {
|
|
93
|
+
'advanced search': 'ricerca avanzata',
|
|
94
|
+
'use current location': 'usa la posizione attuale',
|
|
95
|
+
'we looked': 'abbiamo guardato',
|
|
96
|
+
everywhere: 'da tutte le parti',
|
|
97
|
+
'but could not find your page.': 'ma non sono riuscito a trovare la tua pagina.',
|
|
98
|
+
'03 March 2021': '03 Marzo 2021',
|
|
99
|
+
"You haven't applied recently.": 'Non hai candidature recenti.',
|
|
100
|
+
'my applications': 'le mie candidature',
|
|
101
|
+
'you have not saved any jobs yet': 'non hai ancora salvato le tue offerte preferite',
|
|
102
|
+
'you are applying for this job:': 'ti stai candidando a questa offerta',
|
|
103
|
+
},
|
|
104
|
+
'de-ch': {
|
|
105
|
+
'advanced search': 'fortgeschrittene Suche',
|
|
106
|
+
'use current location': 'Standort verwenden',
|
|
107
|
+
'we looked': 'wir haben nachgeschaut',
|
|
108
|
+
everywhere: 'überall',
|
|
109
|
+
'but could not find your page.': 'aber konnten deine Seite nicht finden',
|
|
110
|
+
'03 March 2021': '03 März 2021',
|
|
111
|
+
apply: 'bewerben',
|
|
112
|
+
},
|
|
113
|
+
'pt-br': {
|
|
114
|
+
'advanced search': 'pesquisa avançada',
|
|
115
|
+
'use current location': 'usar localização atual',
|
|
116
|
+
'we looked': 'nós procuramos',
|
|
117
|
+
everywhere: 'em todo os lugares',
|
|
118
|
+
'but could not find your page.': 'mas não conseguimos encontrar o que está sendo buscado',
|
|
119
|
+
'03 March 2021': '03 Marchar 2021',
|
|
120
|
+
},
|
|
121
|
+
nb: {
|
|
122
|
+
'advanced search': 'utvidet søk',
|
|
123
|
+
'use current location': 'bruk stedet du befinner deg på nå',
|
|
124
|
+
'we looked': 'vi har lett',
|
|
125
|
+
everywhere: 'over alt',
|
|
126
|
+
'but could not find your page.': 'men vi kunne dessverre ikke finne siden du leter etter',
|
|
127
|
+
'03 March 2021': '03 mars 2021',
|
|
128
|
+
},
|
|
129
|
+
el: {
|
|
130
|
+
'advanced search': 'σύνθετη αναζήτηση',
|
|
131
|
+
'use current location': 'χρησιμοποίησε την τρέχουσα τοποθεσία μου',
|
|
132
|
+
'we looked': 'ψάξαμε',
|
|
133
|
+
everywhere: 'παντού',
|
|
134
|
+
'but could not find your page.': 'αλλά δεν μπορέσαμε να βρούμε τη σελίδα που αναζητάς.',
|
|
135
|
+
'03 March 2021': '03 Μαρτίου 2021',
|
|
136
|
+
apply: 'κάνε την αίτησή σου',
|
|
137
|
+
'work from home jobs': 'αποκλειστικά εξ αποστάσεως εργασία',
|
|
138
|
+
'remote jobs found for you': 'remote θέσεις εργασίας βρέθηκαν για σένα',
|
|
139
|
+
},
|
|
140
|
+
fr: {
|
|
141
|
+
'advanced search': 'recherche avancée',
|
|
142
|
+
'use current location': 'à proximité',
|
|
143
|
+
'we looked': 'nous avons regardé',
|
|
144
|
+
everywhere: 'partout',
|
|
145
|
+
'but could not find your page.': 'mais nous ne trouvons pas cette page.',
|
|
146
|
+
'03 March 2021': '3 mars 2021',
|
|
147
|
+
apply: 'postuler',
|
|
148
|
+
"You haven't applied recently.": 'aucune candidature à ce jour',
|
|
149
|
+
'my applications': 'candidatures',
|
|
150
|
+
'you have not saved any jobs yet': "pour l'instant, aucune offre sélectionnée",
|
|
151
|
+
'you are applying for this job:': 'vous postulez à cette offre:',
|
|
152
|
+
},
|
|
153
|
+
cn: {
|
|
154
|
+
'advanced search': '高级搜索',
|
|
155
|
+
'use current location': '使用当前位置',
|
|
156
|
+
'we looked': '我们搜索了',
|
|
157
|
+
everywhere: '所有类目',
|
|
158
|
+
'but could not find your page.': '但未查到您要找的页面',
|
|
159
|
+
'03 March 2021': '03 三月 2021',
|
|
160
|
+
},
|
|
161
|
+
tr: {
|
|
162
|
+
'advanced search': 'gelişmiş arama',
|
|
163
|
+
'use current location': 'mevcut konumu kullan',
|
|
164
|
+
'we looked': 'her yere',
|
|
165
|
+
everywhere: 'baktık',
|
|
166
|
+
'but could not find your page.': 'ama bulamadık',
|
|
167
|
+
'03 March 2021': '03 mart 2021',
|
|
168
|
+
apply: 'başvur',
|
|
169
|
+
},
|
|
170
|
+
da: {
|
|
171
|
+
'advanced search': 'avanceret søgning',
|
|
172
|
+
'use current location': 'brug nuværende lokalitet',
|
|
173
|
+
'we looked': 'vi har ledt',
|
|
174
|
+
everywhere: 'overalt',
|
|
175
|
+
'but could not find your page.': 'men kunne ikke finde din side.',
|
|
176
|
+
'03 March 2021': '03 marts 2021',
|
|
177
|
+
apply: 'ansøg',
|
|
178
|
+
'my applications': 'mine ansøgninger',
|
|
179
|
+
'you have not saved any jobs yet': 'du har ingen gemte job endnu',
|
|
180
|
+
'you are applying for this job:': 'du ansøger nu dette job',
|
|
181
|
+
},
|
|
182
|
+
sv: {
|
|
183
|
+
'advanced search': 'avancerat sök',
|
|
184
|
+
'use current location': 'använd nuvarande plats',
|
|
185
|
+
'we looked': 'vi har sökt ',
|
|
186
|
+
everywhere: 'överallt',
|
|
187
|
+
'but could not find your page.': 'men kan inte hitta sidan.',
|
|
188
|
+
'03 March 2021': '03 Mars 2021',
|
|
189
|
+
"You haven't applied recently.": 'Du har inte ansökt till något jobb ännu',
|
|
190
|
+
'my applications': 'mina ansökningar',
|
|
191
|
+
'you have not saved any jobs yet': 'du har inte sparat några jobb ännu.',
|
|
192
|
+
'view 3 more': 'se 3 till',
|
|
193
|
+
'view 6 more': 'se 6 till',
|
|
194
|
+
'thank you for your application': 'tack för din ansökan',
|
|
195
|
+
'the application process.': 'ansökningsprocessen.',
|
|
196
|
+
'See what comes ahead in the application process': 'Se vad som händer härnäst i ansökningsprocessen',
|
|
197
|
+
'applying is easy.': 'att ansöka är enkelt.',
|
|
198
|
+
'you get a confirmation email.': 'du får ett bekräftelsemejl.',
|
|
199
|
+
"We'll now evaluate your application": 'Nu kommer vi snart att utvärdera hur',
|
|
200
|
+
'your profile matches the job': 'din profil passar för jobbet.',
|
|
201
|
+
"We'll contact you for some additional information.":
|
|
202
|
+
'Vi kommer att kontakta dig för kompletterande information.',
|
|
203
|
+
'unsupported file type': 'filtypen stöds ej',
|
|
204
|
+
'we only allow files up to 3 mb, please try again':
|
|
205
|
+
'vi tillåter endast filer upp till 3 mb, vänligen prova igen',
|
|
206
|
+
'You have successfully updated your resume details': 'Ditt CV är uppdaterat',
|
|
207
|
+
'add files': 'lägg till filer',
|
|
208
|
+
'Log out': 'Logga ut',
|
|
209
|
+
'login to your account': 'logga in',
|
|
210
|
+
'You removed the job from your saved jobs': 'Du tog bort jobbet från dina sparade jobb',
|
|
211
|
+
'delete account': 'radera konto',
|
|
212
|
+
'You have successfully deleted your account. A confirmation email has been sent.':
|
|
213
|
+
'Du har raderat ditt konto. Ett bekräftelsemail har skickats.',
|
|
214
|
+
'We do not recognize the combination of this e-mail address':
|
|
215
|
+
'Vi känner inte igen den här kombinationen av e-postadress och lösenord',
|
|
216
|
+
'We are taking action to delete your data from our system.':
|
|
217
|
+
'We are taking action to delete your data from our system.',
|
|
218
|
+
'show job alerts': 'visa jobbvarningar',
|
|
219
|
+
daily: 'dagligen',
|
|
220
|
+
'You have successfully updated your job alert.': 'Jobbevakningen har uppdaterats.',
|
|
221
|
+
'yes, delete': 'ja, radera',
|
|
222
|
+
'You have successfully deleted your job alert.': 'Jobbevakningen är raderad.',
|
|
223
|
+
'continue as guest': 'fortsätt som gäst',
|
|
224
|
+
"You'll start receiving emails": 'u kommer att börja få e-postmeddelanden',
|
|
225
|
+
'manage your job alerts': 'hantera dina jobbevakningar',
|
|
226
|
+
weekly: 'varje vecka',
|
|
227
|
+
'notification by email': 'notifieras via email',
|
|
228
|
+
'clear all': 'rensa allt',
|
|
229
|
+
'be the first to know about interesting jobs': 'be the first to know about interesting jobs',
|
|
230
|
+
'phone numbers': 'telefonnummer',
|
|
231
|
+
'You can add up to two phone numbers to your profile': 'Du kan lägga till upp till två telefonnummer',
|
|
232
|
+
'add phone number': 'lägg till telefonnummer',
|
|
233
|
+
'You have successfully updated your phone number': 'du har uppdaterat dina telefonuppgifter',
|
|
234
|
+
primary: 'primär',
|
|
235
|
+
Mobile: 'Mobile',
|
|
236
|
+
Landline: 'Landline',
|
|
237
|
+
'You have successfully deleted your phone number': 'du har raderat dina telefonuppgifter',
|
|
238
|
+
'phone number is invalid': 'number är ogiltigt.',
|
|
239
|
+
address: 'adress',
|
|
240
|
+
'successfully updated your address details': 'successfully updated your address details',
|
|
241
|
+
'You can add up to two addresses to your profile': 'Du kan lägga till upp till två adresser',
|
|
242
|
+
'add address': 'lägg till adress',
|
|
243
|
+
Primary: 'primär',
|
|
244
|
+
Bulgaria: 'Bulgarien',
|
|
245
|
+
secondary: 'sekundär',
|
|
246
|
+
'no results': 'inget resultat',
|
|
247
|
+
'You have successfully updated your name details': 'Dina uppgifter är uppdaterade',
|
|
248
|
+
Albania: 'Albanien',
|
|
249
|
+
'add education': 'lägg till utbildning',
|
|
250
|
+
'You have successfully updated your education details': 'Din utbildningsinformation är uppdaterad',
|
|
251
|
+
'please fill in the degree name': 'ange utbildningsnamn',
|
|
252
|
+
'please fill in the degree type': 'ange utbildningstyp',
|
|
253
|
+
'please fill in the institution / training facility / school': 'ange utbildningsinstans',
|
|
254
|
+
'please fill in the city': 'ange ort',
|
|
255
|
+
'please fill in the country': 'ange land',
|
|
256
|
+
'please fill in the start date': 'ange startdatum',
|
|
257
|
+
'please fill in the end date': 'ange slutdatum',
|
|
258
|
+
'You have successfully deleted your education details': 'Din utbildningsinformation är borttagen',
|
|
259
|
+
'add new work experience': 'lägg till ny arbetslivserfarenhet',
|
|
260
|
+
'You have successfully updated your work experience details': 'Din arbetslivserfarenhet är uppdaterad',
|
|
261
|
+
'You have successfully deleted your work experience details': 'Din arbetslivserfarenhet är borttagen',
|
|
262
|
+
'add certifications': 'lägg till certifiering',
|
|
263
|
+
'You have successfully updated your certification details':
|
|
264
|
+
'Dina certifieringar och intyg är uppdaterade',
|
|
265
|
+
'You have successfully deleted your certification details':
|
|
266
|
+
'Dina certifieringsinställningar har raderats',
|
|
267
|
+
'You have successfully updated your skills details': 'Din kompetens är uppdaterad',
|
|
268
|
+
'You have successfully deleted your skills details': 'Din kompetens är borttagen',
|
|
269
|
+
'You have successfully updated your links details.': 'Länkar är uppdaterade',
|
|
270
|
+
other: 'annat',
|
|
271
|
+
'You have successfully deleted your link record': 'Länken är borttagen',
|
|
272
|
+
'email address': 'e-postadress',
|
|
273
|
+
'United Kingdom of Great Britain and Northern Ireland': 'Bulgarien',
|
|
274
|
+
march: 'mars',
|
|
275
|
+
French: 'Swedish',
|
|
276
|
+
work: 'jobb',
|
|
277
|
+
Monthly: 'Månadsvis',
|
|
278
|
+
'I prefer remote work': 'Jag föredrar att arbeta på distans',
|
|
279
|
+
'Work preferences have successfully been updated': 'Jobbpreferenser är uppdaterade',
|
|
280
|
+
'$ 2500 per month': 'SEK 2500 per month',
|
|
281
|
+
'Value unspecified': 'välj',
|
|
282
|
+
select: 'välj',
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
// the ?. is used to not throw error for languages which do not have added translations
|
|
286
|
+
return translations[lang]?.[property];
|
|
287
|
+
},
|
|
288
|
+
};
|