Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
2
gaia/build/test/bin/fake-adb
Executable file
2
gaia/build/test/bin/fake-adb
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
#!/bin/bash
|
||||
echo $@ >> ./build/test/integration/result
|
||||
38
gaia/build/test/coverage-checker.js
Executable file
38
gaia/build/test/coverage-checker.js
Executable file
|
|
@ -0,0 +1,38 @@
|
|||
'use strict';
|
||||
|
||||
var Mocha = require('mocha');
|
||||
var dive = require('diveSync');
|
||||
|
||||
var mocha = new Mocha({
|
||||
harmony: true,
|
||||
reporter: 'spec',
|
||||
ui: 'tdd',
|
||||
timeout: 0
|
||||
});
|
||||
|
||||
function validFile(file, dir) {
|
||||
if (dir) {
|
||||
return true;
|
||||
}
|
||||
return (file.indexOf('.test.js') !== -1);
|
||||
}
|
||||
|
||||
function run(callback) {
|
||||
dive(process.env.TEST_FILES_DIR, { filter: validFile }, function(err, file) {
|
||||
if (err) {
|
||||
return callback(err);
|
||||
}
|
||||
mocha.addFile(file);
|
||||
});
|
||||
callback();
|
||||
}
|
||||
|
||||
run(function(err) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
mocha.run(function(failures) {
|
||||
process.exit(failures);
|
||||
});
|
||||
});
|
||||
12
gaia/build/test/fixtures/custom-origin/manifest.webapp
vendored
Executable file
12
gaia/build/test/fixtures/custom-origin/manifest.webapp
vendored
Executable file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"name": "Custom origin",
|
||||
"description": "Gaia Test custom origin",
|
||||
"type": "privileged",
|
||||
"developer": {
|
||||
"name": "The Gaia Team",
|
||||
"url": "https://github.com/mozilla-b2g/gaia"
|
||||
},
|
||||
"default_locale": "en-US",
|
||||
"orientation": "default",
|
||||
"origin": "app://test.mozilla.com"
|
||||
}
|
||||
1
gaia/build/test/fixtures/shared_css.list
vendored
Executable file
1
gaia/build/test/fixtures/shared_css.list
vendored
Executable file
|
|
@ -0,0 +1 @@
|
|||
build/test/fixtures/test-shared-css-app
|
||||
14
gaia/build/test/fixtures/test-l10n-duplicates/index.html
vendored
Executable file
14
gaia/build/test/fixtures/test-l10n-duplicates/index.html
vendored
Executable file
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
|
||||
|
||||
<link rel="manifest" href="manifest.webapp">
|
||||
<link rel="localization" href="locales/test.{locale}.properties">
|
||||
<script type="text/javascript" defer src="/shared/js/l10n.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
2
gaia/build/test/fixtures/test-l10n-duplicates/locales/test.en-US.properties
vendored
Executable file
2
gaia/build/test/fixtures/test-l10n-duplicates/locales/test.en-US.properties
vendored
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
entity1=My Entity
|
||||
entity1=My Entity
|
||||
12
gaia/build/test/fixtures/test-l10n-duplicates/manifest.webapp
vendored
Executable file
12
gaia/build/test/fixtures/test-l10n-duplicates/manifest.webapp
vendored
Executable file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"name": "Test L10n Duplicates",
|
||||
"description": "Test L10n: Duplicate string detection",
|
||||
"type": "certified",
|
||||
"launch_path": "/index.html",
|
||||
"developer": {
|
||||
"name": "The Gaia Team",
|
||||
"url": "https://github.com/mozilla-b2g/gaia"
|
||||
},
|
||||
"default_locale": "en-US",
|
||||
"orientation": "default"
|
||||
}
|
||||
16
gaia/build/test/fixtures/test-l10n-missing/index.html
vendored
Executable file
16
gaia/build/test/fixtures/test-l10n-missing/index.html
vendored
Executable file
|
|
@ -0,0 +1,16 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
|
||||
|
||||
<meta name="defaultLanguage" content="en-US">
|
||||
<meta name="availableLanguages" content="en-US">
|
||||
<link rel="localization" href="locales/test.{locale}.properties">
|
||||
<script type="text/javascript" defer src="/shared/js/l10n.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<p data-l10n-id="entity0"></p>
|
||||
</body>
|
||||
</html>
|
||||
1
gaia/build/test/fixtures/test-l10n-missing/locales/test.en-US.properties
vendored
Executable file
1
gaia/build/test/fixtures/test-l10n-missing/locales/test.en-US.properties
vendored
Executable file
|
|
@ -0,0 +1 @@
|
|||
entity1=My Entity
|
||||
12
gaia/build/test/fixtures/test-l10n-missing/manifest.webapp
vendored
Executable file
12
gaia/build/test/fixtures/test-l10n-missing/manifest.webapp
vendored
Executable file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"name": "Test L10n Missing",
|
||||
"description": "Test L10n: Missing string detection",
|
||||
"type": "certified",
|
||||
"launch_path": "/index.html",
|
||||
"developer": {
|
||||
"name": "The Gaia Team",
|
||||
"url": "https://github.com/mozilla-b2g/gaia"
|
||||
},
|
||||
"default_locale": "en-US",
|
||||
"orientation": "default"
|
||||
}
|
||||
16
gaia/build/test/fixtures/test-l10n-optimize-entries/index.html
vendored
Executable file
16
gaia/build/test/fixtures/test-l10n-optimize-entries/index.html
vendored
Executable file
|
|
@ -0,0 +1,16 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
|
||||
|
||||
<meta name="defaultLanguage" content="en-US">
|
||||
<meta name="availableLanguages" content="en-US">
|
||||
<link rel="localization" href="locales/test.{locale}.properties">
|
||||
<link rel="localization" href="locales/test.{locale}.l20n">
|
||||
<script type="text/javascript" defer src="/shared/js/intl/l20n.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
2
gaia/build/test/fixtures/test-l10n-optimize-entries/locales/test.en-US.l20n
vendored
Executable file
2
gaia/build/test/fixtures/test-l10n-optimize-entries/locales/test.en-US.l20n
vendored
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
<entity1 "Entity 1">
|
||||
<entity2 "Entity 2">
|
||||
1
gaia/build/test/fixtures/test-l10n-optimize-entries/locales/test.en-US.properties
vendored
Executable file
1
gaia/build/test/fixtures/test-l10n-optimize-entries/locales/test.en-US.properties
vendored
Executable file
|
|
@ -0,0 +1 @@
|
|||
entity1=My Entity
|
||||
12
gaia/build/test/fixtures/test-l10n-optimize-entries/manifest.webapp
vendored
Executable file
12
gaia/build/test/fixtures/test-l10n-optimize-entries/manifest.webapp
vendored
Executable file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"name": "Test L10n Optimization",
|
||||
"description": "Test L10n Optimization",
|
||||
"type": "certified",
|
||||
"launch_path": "/index.html",
|
||||
"developer": {
|
||||
"name": "The Gaia Team",
|
||||
"url": "https://github.com/mozilla-b2g/gaia"
|
||||
},
|
||||
"default_locale": "en-US",
|
||||
"orientation": "default"
|
||||
}
|
||||
15
gaia/build/test/fixtures/test-l10n-optimize-legacy/index.html
vendored
Executable file
15
gaia/build/test/fixtures/test-l10n-optimize-legacy/index.html
vendored
Executable file
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
|
||||
|
||||
<meta name="defaultLanguage" content="en-US">
|
||||
<meta name="availableLanguages" content="en-US">
|
||||
<link rel="localization" href="locales/test.{locale}.properties">
|
||||
<script type="text/javascript" defer src="/shared/js/l10n.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
1
gaia/build/test/fixtures/test-l10n-optimize-legacy/locales/test.en-US.properties
vendored
Executable file
1
gaia/build/test/fixtures/test-l10n-optimize-legacy/locales/test.en-US.properties
vendored
Executable file
|
|
@ -0,0 +1 @@
|
|||
entity1=My Entity
|
||||
12
gaia/build/test/fixtures/test-l10n-optimize-legacy/manifest.webapp
vendored
Executable file
12
gaia/build/test/fixtures/test-l10n-optimize-legacy/manifest.webapp
vendored
Executable file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"name": "Test L10n Optimization",
|
||||
"description": "Test L10n Optimization",
|
||||
"type": "certified",
|
||||
"launch_path": "/index.html",
|
||||
"developer": {
|
||||
"name": "The Gaia Team",
|
||||
"url": "https://github.com/mozilla-b2g/gaia"
|
||||
},
|
||||
"default_locale": "en-US",
|
||||
"orientation": "default"
|
||||
}
|
||||
15
gaia/build/test/fixtures/test-l10n-optimize-no-fetch/index.html
vendored
Executable file
15
gaia/build/test/fixtures/test-l10n-optimize-no-fetch/index.html
vendored
Executable file
|
|
@ -0,0 +1,15 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1">
|
||||
|
||||
<meta name="defaultLanguage" content="en-US">
|
||||
<meta name="availableLanguages" content="en-US">
|
||||
<link data-no-fetch rel="localization" href="locales/test.{locale}.properties">
|
||||
<script type="text/javascript" defer src="/shared/js/l10n.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
</html>
|
||||
1
gaia/build/test/fixtures/test-l10n-optimize-no-fetch/locales/test.en-US.properties
vendored
Executable file
1
gaia/build/test/fixtures/test-l10n-optimize-no-fetch/locales/test.en-US.properties
vendored
Executable file
|
|
@ -0,0 +1 @@
|
|||
entity1=My Entity
|
||||
12
gaia/build/test/fixtures/test-l10n-optimize-no-fetch/manifest.webapp
vendored
Executable file
12
gaia/build/test/fixtures/test-l10n-optimize-no-fetch/manifest.webapp
vendored
Executable file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"name": "Test L10n Optimization",
|
||||
"description": "Test L10n Optimization",
|
||||
"type": "certified",
|
||||
"launch_path": "/index.html",
|
||||
"developer": {
|
||||
"name": "The Gaia Team",
|
||||
"url": "https://github.com/mozilla-b2g/gaia"
|
||||
},
|
||||
"default_locale": "en-US",
|
||||
"orientation": "default"
|
||||
}
|
||||
9
gaia/build/test/fixtures/test-shared-css-app/index.html
vendored
Executable file
9
gaia/build/test/fixtures/test-shared-css-app/index.html
vendored
Executable file
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test Shared CSS Functionalities</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
9
gaia/build/test/fixtures/test-shared-css-app/manifest.webapp
vendored
Executable file
9
gaia/build/test/fixtures/test-shared-css-app/manifest.webapp
vendored
Executable file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"name": "Test Shared CSS",
|
||||
"description": "Test shared CSS functionalities",
|
||||
"launch_path": "/index.html",
|
||||
"developer": {
|
||||
"name": "Ricky",
|
||||
"url": "http://www.mozilla.org"
|
||||
}
|
||||
}
|
||||
0
gaia/build/test/fixtures/test-shared-css-app/style/empty.css
vendored
Executable file
0
gaia/build/test/fixtures/test-shared-css-app/style/empty.css
vendored
Executable file
20
gaia/build/test/fixtures/test-shared-css-app/style/main.css
vendored
Executable file
20
gaia/build/test/fixtures/test-shared-css-app/style/main.css
vendored
Executable file
|
|
@ -0,0 +1,20 @@
|
|||
/* CSS placed in shared */
|
||||
@import url('../shared/style/action_menu.css');
|
||||
@import url("../shared/style/contacts/contacts_buttons.css");
|
||||
@import url('../shared/style/animations.css') projection, tv;
|
||||
@import '../shared/style/buttons.css';
|
||||
@import "../shared/style/confirm.css" screen, projection;
|
||||
@import url('../shared/style/drawer.css') screen and (orientation:landscape);
|
||||
|
||||
/* CSS not placed in shared */
|
||||
@import 'empty.css';
|
||||
@import "buttons.css";
|
||||
|
||||
/* Commented import */
|
||||
/* @import '../shared/style/layout.css'; */
|
||||
/* @import '../shared/style/lists.css';
|
||||
@import '../shared/style/object_menu.css'; */
|
||||
|
||||
p {
|
||||
color: gray;
|
||||
}
|
||||
34
gaia/build/test/integration/adb_test.js
Executable file
34
gaia/build/test/integration/adb_test.js
Executable file
|
|
@ -0,0 +1,34 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var rmrf = require('rimraf').sync;
|
||||
var helper = require('./helper');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
suite('ADB tests', function() {
|
||||
suiteSetup(function() {
|
||||
helper.cleanupWorkspace();
|
||||
rmrf('build/test/integration/result');
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
helper.cleanupWorkspace();
|
||||
rmrf('build/test/integration/result');
|
||||
});
|
||||
|
||||
test('make install-test-media', function(done) {
|
||||
var expectedCommand = 'push test_media/Pictures /sdcard/DCIM\n' +
|
||||
'push test_media/Movies /sdcard/Movies\n' +
|
||||
'push test_media/Music /sdcard/Music\n';
|
||||
|
||||
helper.exec('ADB=build/test/bin/fake-adb make install-test-media',
|
||||
function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
var presetsContent = fs.readFileSync(path.join(process.cwd(), 'build',
|
||||
'test', 'integration', 'result'));
|
||||
assert.equal(presetsContent, expectedCommand);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
77
gaia/build/test/integration/app_list_test.js
Executable file
77
gaia/build/test/integration/app_list_test.js
Executable file
|
|
@ -0,0 +1,77 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var helper = require('./helper');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
suite('Build GAIA from different app list', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('GAIA_DEVICE_TYPE=tablet make', function(done) {
|
||||
helper.exec('GAIA_DEVICE_TYPE=tablet make', function(err, stdout, stderr) {
|
||||
helper.checkError(err, stdout, stderr);
|
||||
|
||||
// zip path for system app
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'sms.gaiamobile.org', 'application.zip');
|
||||
|
||||
// sms should not exists in Tablet builds
|
||||
assert.isFalse(fs.existsSync(zipPath));
|
||||
|
||||
// vertical homescreen should exist in tablet builds
|
||||
var zipVertHomePath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'verticalhome.gaiamobile.org', 'application.zip');
|
||||
assert.isTrue(fs.existsSync(zipVertHomePath));
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('GAIA_DEVICE_TYPE=phone make', function(done) {
|
||||
helper.exec('GAIA_DEVICE_TYPE=phone make', function(err, stdout, stderr) {
|
||||
helper.checkError(err, stdout, stderr);
|
||||
|
||||
// zip path for sms app
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'sms.gaiamobile.org', 'application.zip');
|
||||
|
||||
// sms should not exists in Tablet builds
|
||||
assert.ok(fs.existsSync(zipPath));
|
||||
|
||||
// vertical homescreen should exists
|
||||
var zipVertHomePath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'verticalhome.gaiamobile.org', 'application.zip');
|
||||
assert.ok(fs.existsSync(zipVertHomePath));
|
||||
|
||||
// Check init.json
|
||||
var initPath = path.join(process.cwd(), 'build_stage',
|
||||
'verticalhome', 'js', 'init.json');
|
||||
assert.ok(fs.existsSync(initPath),
|
||||
'init.json should exist');
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('GAIA_DEVICE_TYPE=tv make', function(done) {
|
||||
helper.exec('GAIA_DEVICE_TYPE=tv make', function(err, stdout, stderr) {
|
||||
helper.checkError(err, stdout, stderr);
|
||||
|
||||
// zip path for homescreen-stingray app
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'smart-home.gaiamobile.org', 'application.zip');
|
||||
|
||||
// smart-home should exist in tv builds
|
||||
assert.ok(fs.existsSync(zipPath));
|
||||
|
||||
// vertical homescreen should not exist
|
||||
var zipVertHomePath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'verticalhome.gaiamobile.org', 'application.zip');
|
||||
assert.isFalse(fs.existsSync(zipVertHomePath));
|
||||
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
153
gaia/build/test/integration/build_test.js
Executable file
153
gaia/build/test/integration/build_test.js
Executable file
|
|
@ -0,0 +1,153 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var AdmZip = require('adm-zip');
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('Integration tests', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
function verifyIncludedFilesFromHtml(appName) {
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
appName + '.gaiamobile.org', 'application.zip');
|
||||
var zip = new AdmZip(zipPath);
|
||||
|
||||
var zipEntries = zip.getEntries();
|
||||
if (zipEntries.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (var f = 0; f < zipEntries.length; f++) {
|
||||
var fileName = zipEntries[f].entryName;
|
||||
var extention =
|
||||
fileName.substr(fileName.lastIndexOf('.') + 1).toLowerCase();
|
||||
if (extention === 'html') {
|
||||
extractSharedFile(zip, zipEntries[f], appName);
|
||||
}
|
||||
}
|
||||
|
||||
function extractSharedFile(zip, file, appName) {
|
||||
var SHARED_USAGE =
|
||||
/<(?:script|link).+=['"]\.?\.?\/?(shared\/[^\/]+\/[^''\s]+)["']/g;
|
||||
var content = zip.readAsText(file);
|
||||
var matches;
|
||||
while((matches = SHARED_USAGE.exec(content))!== null) {
|
||||
var filePathInHtml = matches[1];
|
||||
var fileInZip = zip.readFile(zip.getEntry(filePathInHtml));
|
||||
var fileInApps;
|
||||
if (/\.(png|gif|jpg)$/.test(filePathInHtml)) {
|
||||
continue;
|
||||
}
|
||||
if (filePathInHtml.indexOf('shared/') === 0) {
|
||||
fileInApps = fs.readFileSync(
|
||||
path.join(process.cwd(), filePathInHtml));
|
||||
} else {
|
||||
fileInApps = fs.readFileSync(path.join(process.cwd(),
|
||||
'apps', appName, filePathInHtml));
|
||||
}
|
||||
assert.deepEqual(fileInZip, fileInApps, filePathInHtml);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function verifyIncludedImagesSize(appName, reso, official) {
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
appName + '.gaiamobile.org', 'application.zip');
|
||||
var zip = new AdmZip(zipPath);
|
||||
var zipEntries = zip.getEntries();
|
||||
if (zipEntries.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (var f = 0; f < zipEntries.length; f++) {
|
||||
var fileInZip = zipEntries[f];
|
||||
var fileName = fileInZip.entryName;
|
||||
if (/\.(png|gif|jpg)$/.test(fileName)) {
|
||||
// Manually modify the pathname of the browser branding images as
|
||||
// these are packaged differently than normal images.
|
||||
if (reso !== 1 &&
|
||||
fileName.indexOf('shared/resources/branding/browser_') === -1) {
|
||||
fileName = fileName.replace(
|
||||
/(.*)(\.(png|gif|jpg))$/, '$1@' + reso + 'x$2');
|
||||
}
|
||||
compareWithApps(appName, fileName, fileInZip, reso, official);
|
||||
}
|
||||
}
|
||||
|
||||
function compareWithApps(appName, filePath, fileEntry, reso, official) {
|
||||
var fileInApps;
|
||||
var fileOfZip = zip.readFile(fileEntry);
|
||||
if (filePath.indexOf('/branding/') !== -1) {
|
||||
filePath = filePath.replace('/branding/',
|
||||
official ? '/branding/official/' : '/branding/unofficial/');
|
||||
}
|
||||
if (filePath.indexOf('shared/') === 0) {
|
||||
filePath = path.join(process.cwd(), filePath);
|
||||
} else {
|
||||
filePath = path.join(process.cwd(), 'apps', appName, filePath);
|
||||
}
|
||||
|
||||
if (fs.existsSync(filePath)) {
|
||||
fileInApps = fs.readFileSync(filePath);
|
||||
} else {
|
||||
filePath = filePath.replace('@' + reso + 'x', '');
|
||||
fileInApps = fs.readFileSync(filePath);
|
||||
}
|
||||
assert.deepEqual(fileOfZip, fileInApps, filePath + ' no found');
|
||||
}
|
||||
}
|
||||
|
||||
test('make APP=system, checking all of the files are available',
|
||||
function(done) {
|
||||
helper.exec('make APP=system', function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
verifyIncludedFilesFromHtml('system');
|
||||
verifyIncludedImagesSize('system', 1, false);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('make with GAIA_DEV_PIXELS_PER_PX=1.5', function(done) {
|
||||
helper.exec('GAIA_DEV_PIXELS_PER_PX=1.5 APP=system make ',
|
||||
function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
verifyIncludedImagesSize('system', 1.5, false);
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
test('make app with custom origin', function(done) {
|
||||
// add custom-origin app to apps list
|
||||
var appsListPath = path.join('build', 'config', 'phone',
|
||||
'apps-engineering.list');
|
||||
fs.renameSync(appsListPath, appsListPath + '.bak');
|
||||
fs.writeFileSync(appsListPath,
|
||||
'apps/*\nbuild/test/fixtures/custom-origin\n');
|
||||
|
||||
var extConfigPath = path.join('build', 'config',
|
||||
'additional-extensions.json');
|
||||
var restoreFunc = helper.emptyJsonFile(extConfigPath);
|
||||
|
||||
helper.exec('DEBUG=1 make', function(error, stdout, stderr) {
|
||||
fs.unlinkSync(appsListPath);
|
||||
fs.renameSync(appsListPath + '.bak', appsListPath);
|
||||
|
||||
helper.checkError(error, stdout, stderr);
|
||||
|
||||
var webappsPath = path.join(process.cwd(), 'profile-debug',
|
||||
'webapps', 'webapps.json');
|
||||
var webapps = JSON.parse(fs.readFileSync(webappsPath));
|
||||
|
||||
assert.isNotNull(webapps['test.mozilla.com']);
|
||||
assert.equal(
|
||||
webapps['test.mozilla.com'].origin, 'app://test.mozilla.com');
|
||||
|
||||
restoreFunc();
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
46
gaia/build/test/integration/core_app_location_test.js
Executable file
46
gaia/build/test/integration/core_app_location_test.js
Executable file
|
|
@ -0,0 +1,46 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var vm = require('vm');
|
||||
var helper = require('./helper');
|
||||
var rmrf = require('rimraf').sync;
|
||||
|
||||
suite('Make with desktop custom core apps location', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('make with desktop custom core apps location', function(done) {
|
||||
var coreAppPath = path.join(process.cwd(), 'profile-coreapptest');
|
||||
var coretest = function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
|
||||
var expectedUserPrefs = {
|
||||
'b2g.coreappsdir': coreAppPath
|
||||
};
|
||||
var userjs = fs.readFileSync(
|
||||
path.join('profile', 'user.js'),
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
var sandbox = helper.getPrefsSandbox();
|
||||
vm.runInNewContext(userjs, sandbox);
|
||||
|
||||
helper.checkPrefs(sandbox.userPrefs, expectedUserPrefs);
|
||||
var oldAppPath = path.join(process.cwd(), 'profile', 'webapps');
|
||||
// Make sure we have no webapps directory in the profile, this
|
||||
// will now be created by gecko on start.
|
||||
assert(!fs.existsSync(oldAppPath));
|
||||
var manifestPath = path.join(coreAppPath, 'webapps',
|
||||
'webapps.json');
|
||||
assert(fs.existsSync(manifestPath));
|
||||
var appPath = path.join(coreAppPath, 'webapps',
|
||||
'system.gaiamobile.org', 'application.zip');
|
||||
assert(fs.existsSync(appPath));
|
||||
rmrf(coreAppPath);
|
||||
done();
|
||||
};
|
||||
helper.exec('COREWEBAPPS_DIR=' + coreAppPath +' make ',
|
||||
coretest);
|
||||
});
|
||||
});
|
||||
82
gaia/build/test/integration/debug_test.js
Executable file
82
gaia/build/test/integration/debug_test.js
Executable file
|
|
@ -0,0 +1,82 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var vm = require('vm');
|
||||
var helper = require('./helper');
|
||||
var dive = require('diveSync');
|
||||
|
||||
suite('Make with DEBUG=1', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('make with DEBUG=1', function(done) {
|
||||
// avoid downloading extension from addon website
|
||||
var extConfigPath = path.join('build', 'config',
|
||||
'additional-extensions.json');
|
||||
var restoreFunc = helper.emptyJsonFile(extConfigPath);
|
||||
|
||||
helper.exec('DEBUG=1 make', function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
|
||||
var installedExtsPath = path.join('build_stage', 'additional-extensions',
|
||||
'downloaded.json');
|
||||
var expectedSettings = {
|
||||
'homescreen.manifestURL':
|
||||
'app://homescreen.gaiamobile.org/manifest.webapp',
|
||||
'rocketbar.searchAppURL': 'app://search.gaiamobile.org/index.html'
|
||||
};
|
||||
var expectedUserPrefs = {
|
||||
'image.mozsamplesize.enabled': true,
|
||||
'docshell.device_size_is_page_size': true,
|
||||
'marionette.defaultPrefs.enabled': true,
|
||||
'nglayout.debug.disable_xul_cache': true,
|
||||
'nglayout.debug.disable_xul_fastload': true,
|
||||
'javascript.options.showInConsole': true,
|
||||
'browser.dom.window.dump.enabled': true,
|
||||
'dom.report_all_js_exceptions': true,
|
||||
'dom.w3c_touch_events.enabled': 1,
|
||||
'webgl.verbose': true,
|
||||
'toolkit.identity.debug': true,
|
||||
'extensions.gaia.dir': process.cwd(),
|
||||
'extensions.gaia.domain': 'gaiamobile.org',
|
||||
'extensions.gaia.port': 8080,
|
||||
'extensions.gaia.locales_debug_path': 'locales',
|
||||
'extensions.gaia.official': false,
|
||||
'extensions.gaia.locales_file': 'shared/resources/languages.json',
|
||||
'extensions.gaia.locale_basedir': '',
|
||||
'extensions.gaia.device_pixel_suffix': '',
|
||||
'extensions.autoDisableScopes': 0
|
||||
};
|
||||
var settingsPath = path.join(process.cwd(), 'profile-debug',
|
||||
'settings.json');
|
||||
var settings = JSON.parse(fs.readFileSync(settingsPath));
|
||||
var userjs = fs.readFileSync(
|
||||
path.join('profile-debug', 'user.js'),
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
var sandbox = helper.getPrefsSandbox();
|
||||
vm.runInNewContext(userjs, sandbox);
|
||||
|
||||
var zipCount = 0;
|
||||
dive(path.join(process.cwd(), 'profile-debug'), function(err, file) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
if (file.indexOf('application.zip') !== -1) {
|
||||
zipCount++;
|
||||
}
|
||||
});
|
||||
assert.ok(fs.existsSync(installedExtsPath));
|
||||
helper.checkSettings(settings, expectedSettings);
|
||||
helper.checkPrefs(sandbox.userPrefs, expectedUserPrefs);
|
||||
// expect one zip file for each "external" app.
|
||||
assert.equal(zipCount, 6, 'we should have six zip files in ' +
|
||||
'profile-debug directory');
|
||||
|
||||
restoreFunc();
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
335
gaia/build/test/integration/distribution_test.js
Executable file
335
gaia/build/test/integration/distribution_test.js
Executable file
|
|
@ -0,0 +1,335 @@
|
|||
'use strict';
|
||||
|
||||
/* jshint maxlen: 130 */
|
||||
|
||||
var rmrf = require('rimraf').sync;
|
||||
var AdmZip = require('adm-zip');
|
||||
var helper = require('./helper');
|
||||
var path = require('path');
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var http = require('http');
|
||||
|
||||
suite('Distribution mechanism', function() {
|
||||
var cusDir;
|
||||
var server;
|
||||
var variantPath;
|
||||
var originalVariant;
|
||||
|
||||
setup(function() {
|
||||
rmrf('profile');
|
||||
rmrf('build_stage');
|
||||
|
||||
// Setup local server and handle manifest downloading to avoid remote
|
||||
// server dependency
|
||||
var fakeManifest = {
|
||||
'version': '1.0',
|
||||
'name': 'Fake',
|
||||
'description': 'Fake app'
|
||||
};
|
||||
|
||||
server = http.createServer(function(req, res) {
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||
res.end(JSON.stringify(fakeManifest));
|
||||
});
|
||||
|
||||
// Change manifestURL from
|
||||
// https://mobile.twitter.com/cache/twitter.webapp
|
||||
// to
|
||||
// http://localhost:9999/manifest.webapp
|
||||
cusDir = path.join(process.cwd(), 'customization');
|
||||
variantPath = path.join(cusDir, 'variant.json');
|
||||
var port = 9999;
|
||||
originalVariant = fs.readFileSync(variantPath, { encoding: 'utf8' });
|
||||
var variant = JSON.parse(originalVariant);
|
||||
variant.apps.Twitter.manifestURL = 'http://localhost:' + port +
|
||||
'/manifest.webapp';
|
||||
fs.writeFileSync(variantPath, JSON.stringify(variant));
|
||||
server.listen(port);
|
||||
});
|
||||
|
||||
function validatePreloadSettingDB() {
|
||||
var settingsPath = path.join(process.cwd(), 'profile', 'settings.json');
|
||||
var settings = JSON.parse(fs.readFileSync(settingsPath));
|
||||
var expectedSettings;
|
||||
expectedSettings = JSON.parse(
|
||||
fs.readFileSync(path.join(cusDir, 'settings.json')));
|
||||
|
||||
var keyboardManifestURL = 'app://keyboard.gaiamobile.org/manifest.webapp';
|
||||
var expectedLayouts = {};
|
||||
// For test only, so deliberately makes English map to cs and es layout
|
||||
expectedLayouts[keyboardManifestURL] = {cs: true, es: true};
|
||||
|
||||
expectedSettings = {
|
||||
'wap.push.enabled': true,
|
||||
'keyboard.enabled-layouts': expectedLayouts,
|
||||
'keyboard.default-layouts': expectedLayouts
|
||||
};
|
||||
|
||||
helper.checkSettings(settings, expectedSettings);
|
||||
}
|
||||
|
||||
function validateSettings() {
|
||||
var setingsZipPath = path.join(process.cwd(), 'profile',
|
||||
'webapps', 'settings.gaiamobile.org', 'application.zip');
|
||||
|
||||
helper.checkFileContentByPathInZip(
|
||||
setingsZipPath, 'resources/support.json',
|
||||
path.join(cusDir, 'support.json'), true);
|
||||
|
||||
helper.checkFileContentByPathInZip(
|
||||
setingsZipPath, 'resources/device-features.json',
|
||||
path.join(cusDir, 'device-features.json'), true);
|
||||
}
|
||||
|
||||
function validateOperatorVariant() {
|
||||
var zipPath = path.join(process.cwd(), 'profile',
|
||||
'webapps', 'operatorvariant.gaiamobile.org', 'application.zip');
|
||||
var variantConfig = {
|
||||
'wallpaper':'/resources/wallpaper-7b8d66705b283f474c5892e70ece5890df7f9be2.json',
|
||||
'default_contacts':'/resources/mobizilla_contacts.json',
|
||||
'support_contacts':'/resources/mobizilla_support_contacts.json',
|
||||
'keyboard_settings':'/resources/keyboard-88cf36fbc274369ce1c2bea24dffce3017cc6f69.json',
|
||||
'network_type':'/resources/mobizilla_network_type.json',
|
||||
'known_networks':'/resources/mobizilla_known_networks.json',
|
||||
'nfc':'/resources/nfc-93c047a6d0389e755cacdbd6bb0986fff0576aee.json',
|
||||
'sms':'/resources/mobizilla_sms.json',
|
||||
'ringtone':'/resources/ringtone-8261e854cb494bf7f3a2a25510e595931244292a.json',
|
||||
'power':'/resources/power-0ccc24f04b44aaadc8962735b5f86eabc5bb71e6.json',
|
||||
'data_ftu':true,
|
||||
'search': '/resources/mobizilla_search.json',
|
||||
'topsites':'/resources/mobizilla_topsites.json',
|
||||
'browser': '/resources/mobizilla_bookmarks.json'
|
||||
};
|
||||
var expectedCustom = {
|
||||
'310-260': variantConfig,
|
||||
'311-261': variantConfig
|
||||
};
|
||||
|
||||
helper.checkFileContentInZip(zipPath, 'resources/customization.json',
|
||||
expectedCustom, true);
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/wallpaper-7b8d66705b283f474c5892e70ece5890df7f9be2.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_wallpaper.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_contacts.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_contacts.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_support_contacts.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_support_contacts.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/keyboard-88cf36fbc274369ce1c2bea24dffce3017cc6f69.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_keyboard.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_network_type.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_network_type.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_known_networks.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_known_networks.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/nfc-93c047a6d0389e755cacdbd6bb0986fff0576aee.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_nfc.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_sms.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_sms.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/ringtone-8261e854cb494bf7f3a2a25510e595931244292a.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_ringtone.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/power-0ccc24f04b44aaadc8962735b5f86eabc5bb71e6.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_power.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_search.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_search.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_topsites.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_topsites.json'));
|
||||
helper.checkFileInZip(zipPath,
|
||||
'resources/mobizilla_bookmarks.json',
|
||||
path.join(cusDir, 'mobizilla',
|
||||
'mobizilla_expected_bookmarks.json'));
|
||||
}
|
||||
|
||||
function validateWappush() {
|
||||
var wappushZipPath = path.join(process.cwd(), 'profile',
|
||||
'webapps', 'wappush.gaiamobile.org', 'application.zip');
|
||||
|
||||
helper.checkFileContentByPathInZip(wappushZipPath, 'js/whitelist.json',
|
||||
path.join(cusDir, 'wappush-whitelist.json'), true);
|
||||
}
|
||||
|
||||
function validateWallpaper() {
|
||||
var zipPath = path.join(process.cwd(), 'profile',
|
||||
'webapps', 'wallpaper.gaiamobile.org', 'application.zip');
|
||||
helper.checkFileContentByPathInZip(zipPath, 'resources/list.json',
|
||||
path.join(cusDir, 'wallpapers', 'list.json'), true);
|
||||
|
||||
helper.checkFileContentByPathInZip(zipPath,
|
||||
'resources/customize.png',
|
||||
path.join(cusDir, 'wallpapers', 'customize.png'), false);
|
||||
}
|
||||
|
||||
function validateSystem() {
|
||||
var sysZipPath = path.join(process.cwd(), 'profile',
|
||||
'webapps', 'system.gaiamobile.org', 'application.zip');
|
||||
helper.checkFileContentByPathInZip(sysZipPath, 'resources/icc.json',
|
||||
path.join(cusDir, 'icc.json'), true);
|
||||
helper.checkFileContentByPathInZip(sysZipPath, 'resources/wapuaprof.json',
|
||||
path.join(cusDir, 'wapuaprof.json'), true);
|
||||
helper.checkFileContentByPathInZip(sysZipPath,
|
||||
'resources/power/carrie_power_on.png',
|
||||
path.join(cusDir, 'power', 'carrie_power_on.png'), false);
|
||||
}
|
||||
|
||||
function validateUuid() {
|
||||
var uuidMapping = JSON.parse(fs.readFileSync(
|
||||
path.join(process.cwd(), 'customization','uuid.json')
|
||||
));
|
||||
var webappsPath = path.join(process.cwd(), 'profile', 'webapps');
|
||||
|
||||
for (let appname in uuidMapping) {
|
||||
assert.ok(
|
||||
fs.existsSync(path.join(webappsPath, uuidMapping[appname])),
|
||||
'uuid for directory name in profile/webapps should exists, app name: ' +
|
||||
appname + ', uuid: ' + uuidMapping[appname]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function parseCustimizeImageSetting(appConfig) {
|
||||
if (typeof appConfig !== 'object') {
|
||||
return '';
|
||||
}
|
||||
var expectedContent =
|
||||
'//\n' +
|
||||
'// This file is automatically generated: DO NOT EDIT.\n' +
|
||||
'//\n'+
|
||||
'// The default value of these variables depends on the\n'+
|
||||
'// GAIA_MEMORY_PROFILE environment variable. Set\n'+
|
||||
'// GAIA_MEMORY_PROFILE=low when building Gaia to get default\n'+
|
||||
'// values suitable for low-memory devices.\n'+
|
||||
'//\n'+
|
||||
'// To customize these values, create a gallery.json file in the\n' +
|
||||
'// distribution directory with content like this:\n' + '//\n' +
|
||||
'// {\n' +
|
||||
'// "maxImagePixelSize": 6000000,\n' +
|
||||
'// "maxSnapshotPixelSize": 4000000,\n' +
|
||||
'// "maxPickPixelSize": 480000,\n' +
|
||||
'// "maxEditPixelSize": 480000 }\n' +
|
||||
'// }\n' +
|
||||
'//\n' +
|
||||
'// Optionally, you can also define variables to specify the\n' +
|
||||
'// minimum EXIF preview size that will be displayed as a\n' +
|
||||
'// full-screen preview by adding a property like this:\n' +
|
||||
'//\n' +
|
||||
'// "requiredEXIFPreviewSize": { "width": 640, "height": 480}\n' +
|
||||
'//\n' +
|
||||
'// If you do not specify this property then EXIF previews will only\n' +
|
||||
'// be used if they are big enough to fill the screen in either\n' +
|
||||
'// width or height in both landscape and portrait mode.\n' +
|
||||
'//\n' +
|
||||
'var CONFIG_MAX_IMAGE_PIXEL_SIZE = ' +
|
||||
appConfig.maxImagePixelSize + ';\n' +
|
||||
'var CONFIG_MAX_SNAPSHOT_PIXEL_SIZE = ' +
|
||||
appConfig.maxSnapshotPixelSize + ';\n' +
|
||||
'var CONFIG_MAX_PICK_PIXEL_SIZE = ' +
|
||||
appConfig.maxPickPixelSize + ';\n' +
|
||||
'var CONFIG_MAX_EDIT_PIXEL_SIZE = ' +
|
||||
appConfig.maxEditPixelSize + ';\n';
|
||||
|
||||
if (appConfig.requiredEXIFPreviewSize) {
|
||||
expectedContent +=
|
||||
'var CONFIG_REQUIRED_EXIF_PREVIEW_WIDTH = ' +
|
||||
appConfig.requiredEXIFPreviewSize.width + ';\n' +
|
||||
'var CONFIG_REQUIRED_EXIF_PREVIEW_HEIGHT = ' +
|
||||
appConfig.requiredEXIFPreviewSize.height + ';\n';
|
||||
} else {
|
||||
expectedContent +=
|
||||
'var CONFIG_REQUIRED_EXIF_PREVIEW_WIDTH = 0;\n' +
|
||||
'var CONFIG_REQUIRED_EXIF_PREVIEW_HEIGHT = 0;\n';
|
||||
}
|
||||
return expectedContent;
|
||||
}
|
||||
|
||||
function validateGallery() {
|
||||
var cusPath = path.join(cusDir, 'gallery.json');
|
||||
var cusConfig = JSON.parse(fs.readFileSync(cusPath));
|
||||
var appZip = new AdmZip(path.join(process.cwd(), 'profile',
|
||||
'webapps', 'gallery.gaiamobile.org', 'application.zip'));
|
||||
var presetsContent = appZip.readAsText(appZip.getEntry('js/config.js'));
|
||||
|
||||
var expectContent = parseCustimizeImageSetting(cusConfig);
|
||||
assert.equal(presetsContent, expectContent);
|
||||
}
|
||||
|
||||
function validateHomescreen() {
|
||||
var appZip = new AdmZip(path.join(process.cwd(), 'profile',
|
||||
'webapps', 'homescreen.gaiamobile.org', 'application.zip'));
|
||||
var config = JSON.parse(appZip.readAsText(appZip.getEntry('js/init.json')));
|
||||
|
||||
assert.equal(config.grid[0][0].name, 'Camera');
|
||||
assert.equal(config.grid[0][1].entry_point, 'dialer');
|
||||
assert.equal(config.grid[0][2].name, 'Messages');
|
||||
assert.equal(config.grid[0][3].name, 'Marketplace');
|
||||
|
||||
assert.equal(config.grid[2][0].name, 'Calendar');
|
||||
|
||||
assert.isTrue(fs.existsSync(path.join(process.cwd(), 'profile',
|
||||
'svoperapps', 'Twitter')),
|
||||
'profile/svoperapps/Twitter directory should exist');
|
||||
assert.isTrue(fs.existsSync(path.join(process.cwd(), 'profile',
|
||||
'svoperapps', 'Twitter', 'manifest.webapp')),
|
||||
'manifest for Twitter should exist');
|
||||
}
|
||||
|
||||
function validateVariantSettings() {
|
||||
var expected = {
|
||||
'310-260': ['Twitter'],
|
||||
'311-261': ['Twitter']
|
||||
};
|
||||
var configPath = path.join(process.cwd(), 'profile', 'svoperapps',
|
||||
'singlevariantconf.json');
|
||||
var config = fs.readFileSync(configPath, {encoding: 'utf8'});
|
||||
assert.deepEqual(JSON.parse(config), expected);
|
||||
}
|
||||
|
||||
test('build with GAIA_DISTRIBUTION_DIR', function(done) {
|
||||
cusDir = path.join(process.cwd(), 'customization');
|
||||
var cmd = 'GAIA_DISTRIBUTION_DIR=' + cusDir + ' make';
|
||||
helper.exec(cmd, function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
validatePreloadSettingDB();
|
||||
validateSettings();
|
||||
validateOperatorVariant();
|
||||
validateWappush();
|
||||
validateSystem();
|
||||
validateGallery();
|
||||
validateHomescreen();
|
||||
validateWallpaper();
|
||||
validateVariantSettings();
|
||||
validateUuid();
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
teardown(function() {
|
||||
rmrf('profile');
|
||||
rmrf('build_stage');
|
||||
|
||||
// Close server and restore file to original.
|
||||
server.close();
|
||||
fs.writeFileSync(variantPath, originalVariant);
|
||||
});
|
||||
});
|
||||
174
gaia/build/test/integration/helper.js
Executable file
174
gaia/build/test/integration/helper.js
Executable file
|
|
@ -0,0 +1,174 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var AdmZip = require('adm-zip');
|
||||
var childProcess = require('child_process');
|
||||
var rmrf = require('rimraf').sync;
|
||||
|
||||
function getPrefsSandbox() {
|
||||
var sandbox = {
|
||||
prefs: {},
|
||||
userPrefs: {},
|
||||
|
||||
user_pref: function(key, value) {
|
||||
sandbox.userPrefs[key] = value;
|
||||
},
|
||||
|
||||
pref: function(key, value) {
|
||||
sandbox.prefs[key] = value;
|
||||
}
|
||||
};
|
||||
return sandbox;
|
||||
}
|
||||
|
||||
function checkError(error, stdout, stderr) {
|
||||
if (error) {
|
||||
console.log('stdout: ' + stdout);
|
||||
console.log('stderr: ' + stderr);
|
||||
console.log('error: ' + error);
|
||||
}
|
||||
assert.equal(error, null);
|
||||
}
|
||||
|
||||
function checkSettings(settings, expectedSettings) {
|
||||
Object.keys(expectedSettings).forEach(function(key) {
|
||||
assert.isDefined(settings[key], 'key ' + key + ' is defined');
|
||||
assert.deepEqual(settings[key], expectedSettings[key],
|
||||
'value of settings key ' + key + ' equal ' + expectedSettings[key]);
|
||||
});
|
||||
}
|
||||
|
||||
function checkPrefs(actual, expected) {
|
||||
Object.keys(expected).forEach(function(key) {
|
||||
assert.isDefined(actual[key], 'key ' + key + ' is defined');
|
||||
assert.deepEqual(actual[key], expected[key], 'value of settings key ' +
|
||||
key + ' equal ' + expected[key]);
|
||||
});
|
||||
}
|
||||
|
||||
function checkWebappsScheme(webapps) {
|
||||
var configKeys = ['origin', 'installOrigin', 'receipt', 'installTime',
|
||||
'updateTime', 'manifestURL', 'localId', 'appStatus'];
|
||||
|
||||
Object.keys(webapps).forEach(function(key) {
|
||||
var webapp = webapps[key];
|
||||
configKeys.forEach(function(configKey) {
|
||||
assert.equal((configKey in webapp), true,
|
||||
key + ' of webapps.json has not defined ' + configKey);
|
||||
});
|
||||
var schemes = ['app'];
|
||||
// Allow mochitest apps and hosted apps to use the "http(s)?://" scheme.
|
||||
if (webapp.origin.indexOf('mochi.test') !== -1 ||
|
||||
webapp.appStatus === 1) {
|
||||
schemes.push('http');
|
||||
}
|
||||
assert.isTrue(schemes.some(function(scheme) {
|
||||
return webapp.origin.indexOf(scheme) === 0;
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
function checkFilePathInZip(zipPath, expectedPath) {
|
||||
var zip = new AdmZip(zipPath);
|
||||
var entries = zip.getEntries();
|
||||
var result = entries.some(function(entry) {
|
||||
return entry.entryName.indexOf(expectedPath) !== -1;
|
||||
});
|
||||
assert.ok(result, 'Checking ' + expectedPath + ' in ' + zipPath);
|
||||
}
|
||||
|
||||
function checkFileInZip(zipPath, pathInZip, expectedPath) {
|
||||
var stat = fs.statSync(expectedPath);
|
||||
if (stat && stat.isDirectory()) {
|
||||
var list = fs.readdirSync(expectedPath);
|
||||
list.forEach(function(filename) {
|
||||
checkFileInZip(
|
||||
zipPath, pathInZip + '/' + filename, expectedPath + '/' + filename);
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var expected = fs.readFileSync(expectedPath);
|
||||
checkFileContentInZip(zipPath, pathInZip, expected);
|
||||
}
|
||||
|
||||
function checkFileContentInZip(zipPath, pathInZip, expectedContent, isJSON) {
|
||||
var zip = new AdmZip(zipPath);
|
||||
var entry = zip.getEntry(pathInZip);
|
||||
var actual = isJSON ? JSON.parse(zip.readAsText(entry)) : zip.readFile(entry);
|
||||
assert.deepEqual(actual, expectedContent,
|
||||
'Checking ' + pathInZip + ' in ' + zipPath);
|
||||
}
|
||||
|
||||
function checkFileContentByPathInZip(zipPath, pathInZip,
|
||||
expectedFilePath,isJSON) {
|
||||
var actual;
|
||||
try {
|
||||
actual =
|
||||
isJSON ? JSON.parse(fs.readFileSync(expectedFilePath)) :
|
||||
fs.readFileSync(expectedFilePath);
|
||||
} catch (e) {
|
||||
actual = isJSON ? {} : null;
|
||||
}
|
||||
checkFileContentInZip(zipPath, pathInZip, actual, isJSON);
|
||||
}
|
||||
|
||||
function matchFileContentInZip(zipPath, pathInZip, matchPattern) {
|
||||
var zip = new AdmZip(zipPath);
|
||||
var entry = zip.getEntry(pathInZip);
|
||||
var content = zip.readAsText(entry);
|
||||
assert.ok(matchPattern.test(content));
|
||||
}
|
||||
|
||||
function exec(command, options, callback) {
|
||||
var opts = {
|
||||
maxBuffer: 4096 * 1024
|
||||
};
|
||||
if (typeof options !== 'function') {
|
||||
for (var key in options) {
|
||||
if (options.hasOwnProperty(key)) {
|
||||
opts[key] = options[key];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
callback = options;
|
||||
}
|
||||
|
||||
childProcess.exec(command, opts, callback);
|
||||
}
|
||||
|
||||
function emptyJsonFile(filePath) {
|
||||
var content = fs.readFileSync(filePath);
|
||||
fs.unlinkSync(filePath);
|
||||
fs.writeFileSync(filePath, '{}');
|
||||
|
||||
var restoreFunc = function() {
|
||||
fs.writeFileSync(filePath, content);
|
||||
};
|
||||
|
||||
return restoreFunc;
|
||||
}
|
||||
|
||||
function cleanupWorkspace() {
|
||||
rmrf('profile');
|
||||
rmrf('profile-debug');
|
||||
rmrf('build_stage');
|
||||
rmrf(exports.localesDir);
|
||||
}
|
||||
|
||||
exports.localesDir = 'tmplocales';
|
||||
exports.getPrefsSandbox = getPrefsSandbox;
|
||||
exports.checkError = checkError;
|
||||
exports.checkSettings = checkSettings;
|
||||
exports.checkPrefs = checkPrefs;
|
||||
exports.checkWebappsScheme = checkWebappsScheme;
|
||||
exports.checkFilePathInZip = checkFilePathInZip;
|
||||
exports.checkFileInZip = exports.checkDirInZip = checkFileInZip;
|
||||
exports.checkFileContentInZip = checkFileContentInZip;
|
||||
exports.checkFileContentByPathInZip = checkFileContentByPathInZip;
|
||||
exports.matchFileContentInZip = matchFileContentInZip;
|
||||
exports.emptyJsonFile = emptyJsonFile;
|
||||
exports.exec = exec;
|
||||
exports.cleanupWorkspace = cleanupWorkspace;
|
||||
112
gaia/build/test/integration/l10n_test.js
Executable file
112
gaia/build/test/integration/l10n_test.js
Executable file
|
|
@ -0,0 +1,112 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var AdmZip = require('adm-zip');
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('L10n logic tests', function() {
|
||||
var appsListPath = path.join(
|
||||
'build', 'config', 'phone', 'apps-engineering.list');
|
||||
var apps = [
|
||||
'apps/*',
|
||||
'build/test/fixtures/test-l10n-optimize-entries',
|
||||
'build/test/fixtures/test-l10n-optimize-legacy',
|
||||
'build/test/fixtures/test-l10n-optimize-no-fetch',
|
||||
'build/test/fixtures/test-l10n-missing',
|
||||
'build/test/fixtures/test-l10n-duplicates',
|
||||
'' // a line-break is required at the end of an apps file
|
||||
];
|
||||
|
||||
suiteSetup(function() {
|
||||
helper.cleanupWorkspace();
|
||||
|
||||
// add test-l10n-* apps to the apps list
|
||||
fs.renameSync(appsListPath, appsListPath + '.bak');
|
||||
fs.writeFileSync(appsListPath, apps.join('\n'));
|
||||
});
|
||||
|
||||
suiteTeardown(function() {
|
||||
fs.unlinkSync(appsListPath);
|
||||
fs.renameSync(appsListPath + '.bak', appsListPath);
|
||||
helper.cleanupWorkspace();
|
||||
});
|
||||
|
||||
test('make test-l10n-optimize-entries builds JSON', function(done) {
|
||||
helper.exec('APP=test-l10n-optimize-entries make',
|
||||
function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
var expected = {entity1: 'My Entity', entity2: 'Entity 2'};
|
||||
var testZip = new AdmZip(path.join(
|
||||
process.cwd(), 'profile', 'webapps',
|
||||
'test-l10n-optimize-entries.gaiamobile.org', 'application.zip'));
|
||||
var entries = JSON.parse(
|
||||
testZip.readAsText(
|
||||
testZip.getEntry('locales-obj/index.en-US.json')));
|
||||
assert.deepEqual(entries, expected);
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
test('make test-l10n-optimize-legacy builds legacy JSON', function(done) {
|
||||
helper.exec('APP=test-l10n-optimize-legacy make',
|
||||
function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
var expected = [{'$i':'entity1','$v':'My Entity'}];
|
||||
var testZip = new AdmZip(path.join(
|
||||
process.cwd(), 'profile', 'webapps',
|
||||
'test-l10n-optimize-legacy.gaiamobile.org', 'application.zip'));
|
||||
var entries = JSON.parse(
|
||||
testZip.readAsText(
|
||||
testZip.getEntry('locales-obj/index.en-US.json')));
|
||||
assert.deepEqual(entries, expected);
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
test('make test-l10n-optimize-no-fetch build noFetch file', function(done) {
|
||||
helper.exec('APP=test-l10n-optimize-no-fetch make',
|
||||
function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
|
||||
var expectedScript = '<script type="application/l10n" lang="en-US">\n'+
|
||||
' [{"$i":"entity1","$v":"My Entity"}]\n' +
|
||||
'</script>';
|
||||
var testZip = new AdmZip(path.join(
|
||||
process.cwd(), 'profile', 'webapps',
|
||||
'test-l10n-optimize-no-fetch.gaiamobile.org', 'application.zip'));
|
||||
var indexHtml =
|
||||
testZip.readAsText(testZip.getEntry('index.html'));
|
||||
assert.ok(indexHtml.indexOf(expectedScript) !== -1);
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
test('make test-l10n-missing detects a missing string', function(done) {
|
||||
helper.exec('APP=test-l10n-missing make',
|
||||
function(error, stdout, stderr) {
|
||||
assert.include(
|
||||
stdout,
|
||||
'[Error] L10nError: "entity0" not found in en-US ' +
|
||||
'(app://test-l10n-missing.gaiamobile.org)');
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
test('make test-l10n-duplicates detects a duplicate string', function(done) {
|
||||
helper.exec('APP=test-l10n-duplicates make',
|
||||
function(error, stdout, stderr) {
|
||||
assert.include(
|
||||
stdout,
|
||||
'[Error] L10nError: Duplicate string "entity1" found in en-US ' +
|
||||
'(app://test-l10n-duplicates.gaiamobile.org)');
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
345
gaia/build/test/integration/make_test.js
Executable file
345
gaia/build/test/integration/make_test.js
Executable file
|
|
@ -0,0 +1,345 @@
|
|||
'use strict';
|
||||
|
||||
/* jshint maxlen: 130 */
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var vm = require('vm');
|
||||
var helper = require('./helper');
|
||||
var dive = require('diveSync');
|
||||
var AdmZip = require('adm-zip');
|
||||
|
||||
const MAX_PROFILE_SIZE_MB = 65;
|
||||
const MAX_PROFILE_SIZE = MAX_PROFILE_SIZE_MB * 1024 * 1024;
|
||||
const REBUILD_TEST_FILE = path.join(
|
||||
process.cwd() + '/apps/system/rebuild_test.txt');
|
||||
const WEBAPPS_DIR = path.join(process.cwd() + '/profile/webapps');
|
||||
|
||||
suite('Make and remake tests', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(function() {
|
||||
helper.cleanupWorkspace();
|
||||
cleanTestFiles();
|
||||
});
|
||||
|
||||
var ignoredApps = getCustomizedBuildApp();
|
||||
|
||||
function cleanTestFiles() {
|
||||
if (fs.existsSync(REBUILD_TEST_FILE)) {
|
||||
fs.unlinkSync(REBUILD_TEST_FILE);
|
||||
}
|
||||
}
|
||||
|
||||
function getTimestamp(dirPath, filter) {
|
||||
var timestamp = {};
|
||||
dive(dirPath, { filter: filter }, function(err, file) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
timestamp[file] = fs.statSync(file).mtime.getTime();
|
||||
});
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
function getWebapps() {
|
||||
var file = fs.readFileSync(
|
||||
WEBAPPS_DIR + '/webapps.json', { encoding: 'utf8' });
|
||||
return Object.keys(JSON.parse(file)).filter(function(app) {
|
||||
return (/\{.+\}/.test(app) === -1);
|
||||
});
|
||||
}
|
||||
|
||||
function getCustomizedBuildApp() {
|
||||
var cwd = process.cwd();
|
||||
var apps = [];
|
||||
var filter = function(file, dir) {
|
||||
// There are other folders we could avoid but walking the node_modules
|
||||
// folder can be problematic when using pre-built caches (and it's slow).
|
||||
if (dir && (file.indexOf(cwd + '/node_modules') !== 0)) {
|
||||
return true;
|
||||
}
|
||||
var pattern = new RegExp(
|
||||
'(' + cwd + '/apps|' + cwd + '/dev_apps)\\S+/build/build.js$');
|
||||
return pattern.test(file);
|
||||
};
|
||||
dive(cwd, { filter: filter }, function(err, file) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
var domain = '.gaiamobile.org';
|
||||
apps.push(file.match(/(\S+)\/(\S+)\/build\/build\.js/)[2] + domain);
|
||||
});
|
||||
return apps;
|
||||
}
|
||||
|
||||
test('make without rule & variable', function(done) {
|
||||
helper.exec('make', function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
|
||||
// expected values for prefs and user_prefs
|
||||
var expectedUserPrefs = {
|
||||
'network.http.max-connections-per-server': 15,
|
||||
'dom.mozInputMethod.enabled': true,
|
||||
'ril.debugging.enabled': false,
|
||||
'dom.mms.version': 17,
|
||||
'b2g.wifi.allow_unsafe_wpa_eap': true
|
||||
};
|
||||
var expectedPrefs = {
|
||||
'geo.gps.supl_server': 'supl.izatcloud.net',
|
||||
'geo.gps.supl_port': 22024,
|
||||
'dom.payment.provider.0.name': 'firefoxmarket',
|
||||
'dom.payment.provider.0.description': 'marketplace.firefox.com',
|
||||
'dom.payment.provider.0.uri': 'https://marketplace.firefox.com/mozpay/?req=',
|
||||
'dom.payment.provider.0.type': 'mozilla/payments/pay/v1',
|
||||
'dom.payment.provider.0.requestMethod': 'GET',
|
||||
'dom.payment.skipHTTPSCheck': true,
|
||||
'dom.payment.debug': true,
|
||||
'dom.payment.provider.1.name': 'firefoxmarketdev',
|
||||
'dom.payment.provider.1.description': 'marketplace-dev.allizom.org',
|
||||
'dom.payment.provider.1.uri': 'https://marketplace-dev.allizom.org/mozpay/?req=',
|
||||
'dom.payment.provider.1.type': 'mozilla-dev/payments/pay/v1',
|
||||
'dom.payment.provider.1.requestMethod': 'GET',
|
||||
'dom.payment.provider.2.name': 'firefoxmarketstage',
|
||||
'dom.payment.provider.2.description': 'marketplace.allizom.org',
|
||||
'dom.payment.provider.2.uri': 'https://marketplace.allizom.org/mozpay/?req=',
|
||||
'dom.payment.provider.2.type': 'mozilla-stage/payments/pay/v1',
|
||||
'dom.payment.provider.2.requestMethod': 'GET',
|
||||
'dom.payment.provider.3.name': 'mockpayprovider',
|
||||
'dom.payment.provider.3.description': 'Mock Payment Provider',
|
||||
'dom.payment.provider.3.uri': 'http://ferjm.github.io/gaia-mock-payment-provider/index.html?req=',
|
||||
'dom.payment.provider.3.type': 'tests/payments/pay/v1',
|
||||
'dom.payment.provider.3.requestMethod': 'GET'
|
||||
};
|
||||
|
||||
// expected values for settings.json from build/config/common-settings.json
|
||||
var settingsPath = path.join(process.cwd(), 'profile', 'settings.json');
|
||||
var commonSettingsPath = path.join(process.cwd(), 'build', 'config',
|
||||
'common-settings.json');
|
||||
var settings = JSON.parse(fs.readFileSync(settingsPath));
|
||||
var commonSettings = JSON.parse(fs.readFileSync(commonSettingsPath));
|
||||
|
||||
// we change these settings values in build/settings.js if
|
||||
// TARGET_BUILD_VARIANT is not 'user'
|
||||
var ignoreSettings = [
|
||||
'apz.force-enable',
|
||||
'debug.console.enabled',
|
||||
'developer.menu.enabled'
|
||||
];
|
||||
ignoreSettings.forEach(function(key) {
|
||||
if (commonSettings[key] !== undefined) {
|
||||
delete commonSettings[key];
|
||||
}
|
||||
});
|
||||
|
||||
// path in zip for unofficial branding
|
||||
var pathInZip = 'shared/resources/branding/initlogo.png';
|
||||
// zip path for system app
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'system.gaiamobile.org', 'application.zip');
|
||||
// expected branding file, it should be a unofficial branding if we
|
||||
// execute |make| without rule and variable.
|
||||
var expectedBrandingPath = path.join(process.cwd(),
|
||||
'shared', 'resources', 'branding', 'unofficial', 'initlogo.png');
|
||||
|
||||
// Read user.js and use vm module to execute javascript in user.js
|
||||
var userjs = fs.readFileSync(
|
||||
path.join('profile', 'user.js'),
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
var sandbox = helper.getPrefsSandbox();
|
||||
vm.runInNewContext(userjs, sandbox);
|
||||
|
||||
var webapps = JSON.parse(fs.readFileSync(path.join(process.cwd(),
|
||||
'profile', 'webapps', 'webapps.json')));
|
||||
|
||||
helper.checkSettings(settings, commonSettings);
|
||||
helper.checkPrefs(sandbox.userPrefs, expectedUserPrefs);
|
||||
helper.checkPrefs(sandbox.prefs, expectedPrefs);
|
||||
helper.checkWebappsScheme(webapps);
|
||||
helper.checkFileInZip(zipPath, pathInZip, expectedBrandingPath);
|
||||
|
||||
// Check config.js file of gallery
|
||||
var hsGalleryZip = new AdmZip(path.join(process.cwd(), 'profile',
|
||||
'webapps', 'gallery.gaiamobile.org', 'application.zip'));
|
||||
var hsGalleryConfigJs =
|
||||
hsGalleryZip.readAsText(hsGalleryZip.getEntry('js/config.js'));
|
||||
|
||||
var expectedScript =
|
||||
'//\n' +
|
||||
'// This file is automatically generated: DO NOT EDIT.\n' +
|
||||
'//\n'+
|
||||
'// The default value of these variables depends on the\n'+
|
||||
'// GAIA_MEMORY_PROFILE environment variable. Set\n'+
|
||||
'// GAIA_MEMORY_PROFILE=low when building Gaia to get default\n'+
|
||||
'// values suitable for low-memory devices.\n'+
|
||||
'//\n'+
|
||||
'// To customize these values, create a gallery.json file in the\n' +
|
||||
'// distribution directory with content like this:\n' + '//\n' +
|
||||
'// {\n' +
|
||||
'// "maxImagePixelSize": 6000000,\n' +
|
||||
'// "maxSnapshotPixelSize": 4000000,\n' +
|
||||
'// "maxPickPixelSize": 480000,\n' +
|
||||
'// "maxEditPixelSize": 480000 }\n' +
|
||||
'// }\n' +
|
||||
'//\n' +
|
||||
'// Optionally, you can also define variables to specify the\n' +
|
||||
'// minimum EXIF preview size that will be displayed as a\n' +
|
||||
'// full-screen preview by adding a property like this:\n' +
|
||||
'//\n' +
|
||||
'// "requiredEXIFPreviewSize": { "width": 640, "height": 480}\n' +
|
||||
'//\n' +
|
||||
'// If you do not specify this property then EXIF previews will only\n' +
|
||||
'// be used if they are big enough to fill the screen in either\n' +
|
||||
'// width or height in both landscape and portrait mode.\n' +
|
||||
'//\n' +
|
||||
'var CONFIG_MAX_IMAGE_PIXEL_SIZE = ' +
|
||||
5 * 1024 * 1024 + ';\n' +
|
||||
'var CONFIG_MAX_SNAPSHOT_PIXEL_SIZE = ' +
|
||||
5 * 1024 * 1024 + ';\n' +
|
||||
'var CONFIG_MAX_PICK_PIXEL_SIZE = ' +
|
||||
0 + ';\n' +
|
||||
'var CONFIG_MAX_EDIT_PIXEL_SIZE = ' +
|
||||
0 + ';\n' +
|
||||
'var CONFIG_REQUIRED_EXIF_PREVIEW_WIDTH = 0;\n' +
|
||||
'var CONFIG_REQUIRED_EXIF_PREVIEW_HEIGHT = 0;\n';
|
||||
|
||||
assert.equal(hsGalleryConfigJs, expectedScript,
|
||||
'Gallery config js is not expected');
|
||||
|
||||
var musicMetadataScriptPath = path.join(process.cwd(), 'build_stage',
|
||||
'music', 'js', 'metadata', 'metadata_scripts.js');
|
||||
assert.ok(fs.existsSync(musicMetadataScriptPath), 'metadata_scripts.js ' +
|
||||
'should exist');
|
||||
var galleryMetadataScriptPath = path.join(process.cwd(), 'build_stage',
|
||||
'gallery', 'js', 'metadata_scripts.js');
|
||||
assert.ok(fs.existsSync(galleryMetadataScriptPath),
|
||||
'metadata_scripts.js should exist');
|
||||
assert.ok(fs.existsSync(galleryMetadataScriptPath),
|
||||
'frame_scripts.js should exist');
|
||||
|
||||
var profileSize = 0;
|
||||
dive(path.join(process.cwd(), 'profile'), function(err, file) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
profileSize += fs.statSync(file).size;
|
||||
});
|
||||
assert(profileSize < MAX_PROFILE_SIZE,
|
||||
'profile size should be less than ' + MAX_PROFILE_SIZE_MB +
|
||||
'MB, current is ' + (profileSize / 1024 / 1024).toFixed(2) + 'MB');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
test('make twice without modifying anything', function(done) {
|
||||
var previousOtherAppsTime;
|
||||
var currentOtherAppsTime;
|
||||
var previousUUIDAppsTime;
|
||||
var currentUUIDAppsTime;
|
||||
var previousWebapps;
|
||||
var currentWebapps;
|
||||
var options = {
|
||||
maxBuffer: 400 * 1024,
|
||||
env: {
|
||||
PATH: process.env.PATH,
|
||||
HOME: process.env.HOME
|
||||
}
|
||||
};
|
||||
|
||||
var filterOtherApps = function(file, dir) {
|
||||
if (dir) {
|
||||
return true;
|
||||
}
|
||||
var hasCustomizedBuild = ignoredApps.some(function(domain) {
|
||||
return file.indexOf(domain) !== -1;
|
||||
});
|
||||
return !hasCustomizedBuild && !/(\{.+\}|webapps\.json)/.test(file);
|
||||
};
|
||||
|
||||
var filterUUIDApps = function(file, dir) {
|
||||
if (dir) {
|
||||
return true;
|
||||
}
|
||||
return /\{.+\}/.test(file);
|
||||
};
|
||||
|
||||
helper.exec('make', options, function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
previousOtherAppsTime = getTimestamp(WEBAPPS_DIR, filterOtherApps);
|
||||
previousUUIDAppsTime = getTimestamp(WEBAPPS_DIR, filterUUIDApps);
|
||||
previousWebapps = getWebapps();
|
||||
|
||||
helper.exec('make', options, function(error, stdout, stderr) {
|
||||
var webapps = JSON.parse(fs.readFileSync(path.join(process.cwd(),
|
||||
'profile', 'webapps', 'webapps.json')));
|
||||
helper.checkError(error, stdout, stderr);
|
||||
helper.checkWebappsScheme(webapps);
|
||||
currentOtherAppsTime = getTimestamp(WEBAPPS_DIR, filterOtherApps);
|
||||
currentUUIDAppsTime = getTimestamp(WEBAPPS_DIR, filterUUIDApps);
|
||||
currentWebapps = getWebapps();
|
||||
assert.deepEqual(previousOtherAppsTime, currentOtherAppsTime);
|
||||
assert.sameMembers(previousWebapps, currentWebapps);
|
||||
assert.equal(Object.keys(previousUUIDAppsTime).length,
|
||||
Object.keys(currentUUIDAppsTime).length);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test('make twice with adding a file', function(done) {
|
||||
var previousSystemTime;
|
||||
var currentSystemTime;
|
||||
var previousOtherAppsTime;
|
||||
var currentOtherAppsTime;
|
||||
var previousWebapps;
|
||||
var currentWebapps;
|
||||
var options = {
|
||||
maxBuffer: 400 * 1024,
|
||||
env: {
|
||||
PATH: process.env.PATH,
|
||||
HOME: process.env.HOME
|
||||
}
|
||||
};
|
||||
|
||||
var systemAppfilter = function(file, dir) {
|
||||
if (dir) {
|
||||
return true;
|
||||
}
|
||||
return (file.indexOf('system.gaiamobile.org') !== -1);
|
||||
};
|
||||
|
||||
var otherAppsFilter = function(file, dir) {
|
||||
if (dir) {
|
||||
return true;
|
||||
}
|
||||
var hasCustomizedBuild = ignoredApps.some(function(domain) {
|
||||
return file.indexOf(domain) !== -1;
|
||||
});
|
||||
return !hasCustomizedBuild &&
|
||||
/(\{.+\}|system\.gaiamobile\.org|webapps\.json)/.test(file) === false;
|
||||
};
|
||||
|
||||
helper.exec('make', options, function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
previousSystemTime = getTimestamp(WEBAPPS_DIR, systemAppfilter);
|
||||
previousOtherAppsTime = getTimestamp(WEBAPPS_DIR, otherAppsFilter);
|
||||
previousWebapps = getWebapps();
|
||||
fs.writeFileSync(REBUILD_TEST_FILE, 'test');
|
||||
|
||||
helper.exec('make', options, function(error, stdout, stderr) {
|
||||
var webapps = JSON.parse(fs.readFileSync(path.join(process.cwd(),
|
||||
'profile', 'webapps', 'webapps.json')));
|
||||
helper.checkError(error, stdout, stderr);
|
||||
helper.checkWebappsScheme(webapps);
|
||||
currentSystemTime = getTimestamp(WEBAPPS_DIR, systemAppfilter);
|
||||
currentOtherAppsTime = getTimestamp(WEBAPPS_DIR, otherAppsFilter);
|
||||
currentWebapps = getWebapps();
|
||||
assert.notDeepEqual(previousSystemTime, currentSystemTime);
|
||||
assert.deepEqual(previousOtherAppsTime, currentOtherAppsTime);
|
||||
assert.sameMembers(previousWebapps, currentWebapps);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
26
gaia/build/test/integration/mozilla_offical_test.js
Executable file
26
gaia/build/test/integration/mozilla_offical_test.js
Executable file
|
|
@ -0,0 +1,26 @@
|
|||
'use strict';
|
||||
|
||||
var path = require('path');
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('MOZILLA_OFFICAL=1', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('make with MOZILLA_OFFICIAL=1', function(done) {
|
||||
helper.exec('MOZILLA_OFFICIAL=1 make', function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
|
||||
// path in zip for unofficial branding
|
||||
var pathInZip = 'shared/resources/branding/initlogo.png';
|
||||
// zip path for system app
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'system.gaiamobile.org', 'application.zip');
|
||||
var expectedBrandingPath = path.join(process.cwd(),
|
||||
'shared', 'resources', 'branding', 'official', 'initlogo.png');
|
||||
|
||||
helper.checkFileInZip(zipPath, pathInZip, expectedBrandingPath);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
73
gaia/build/test/integration/multilocale_test.js
Executable file
73
gaia/build/test/integration/multilocale_test.js
Executable file
|
|
@ -0,0 +1,73 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var path = require('path');
|
||||
var AdmZip = require('adm-zip');
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('Multilocale integration tests', function() {
|
||||
var localesDir = 'build/test/resources/locales';
|
||||
var localesFileObj = {'en-US': '', 'zh-CN': ''};
|
||||
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
function makeHelper(localesFilePath, localesDir, concat, done) {
|
||||
var settingsZipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'settings.gaiamobile.org', 'application.zip');
|
||||
var cnPathInZip = 'locales-obj/index.zh-CN.json';
|
||||
var cnSettingsProperties = 'locales/settings.zh-CN.properties';
|
||||
var langPathInZip = 'shared/resources/languages.json';
|
||||
|
||||
var command = 'LOCALES_FILE=' + localesFilePath +
|
||||
' LOCALE_BASEDIR=' + localesDir +
|
||||
' make';
|
||||
|
||||
if (!concat) {
|
||||
command = 'GAIA_CONCAT_LOCALES=0 ' + command;
|
||||
}
|
||||
|
||||
helper.exec(command, function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
var zip = new AdmZip(settingsZipPath);
|
||||
if (concat) {
|
||||
assert.isNotNull(zip.getEntry(cnPathInZip),
|
||||
'concat file ' + cnPathInZip + ' should exist');
|
||||
} else {
|
||||
assert.isNotNull(zip.getEntry(cnSettingsProperties),
|
||||
'properties file ' + cnSettingsProperties + ' should exist');
|
||||
}
|
||||
|
||||
assert.deepEqual(JSON.parse(zip.readAsText(langPathInZip)),
|
||||
localesFileObj);
|
||||
var manifest =
|
||||
JSON.parse(zip.readAsText(zip.getEntry('manifest.webapp')));
|
||||
assert.equal(manifest.locales['en-US'].description, 'Gaia Settings');
|
||||
done();
|
||||
});
|
||||
}
|
||||
|
||||
test('make with relative l10n path', function(done) {
|
||||
var localesFilePath = path.join(localesDir, 'languages.json');
|
||||
makeHelper(localesFilePath, localesDir, true, done);
|
||||
});
|
||||
|
||||
test('make with absolute l10n path', function(done) {
|
||||
var localesFilePath =
|
||||
path.join(process.cwd(), localesDir, 'languages.json');
|
||||
var absoluteLocalesDir = path.join(process.cwd(), localesDir);
|
||||
makeHelper(localesFilePath, absoluteLocalesDir, true, done);
|
||||
});
|
||||
|
||||
test('make with relative l10n path but without concat', function(done) {
|
||||
var localesFilePath = path.join(localesDir, 'languages.json');
|
||||
makeHelper(localesFilePath, localesDir, false, done);
|
||||
});
|
||||
|
||||
test('make with absolute l10n path but without concat', function(done) {
|
||||
var localesFilePath =
|
||||
path.join(process.cwd(), localesDir, 'languages.json');
|
||||
var absoluteLocalesDir = path.join(process.cwd(), localesDir);
|
||||
makeHelper(localesFilePath, absoluteLocalesDir, false, done);
|
||||
});
|
||||
});
|
||||
18
gaia/build/test/integration/optimized_test.js
Executable file
18
gaia/build/test/integration/optimized_test.js
Executable file
|
|
@ -0,0 +1,18 @@
|
|||
'use strict';
|
||||
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('GAIA_OPTIMIZE=1', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('make with GAIA_OPTIMIZE=1 BUILD_DEBUG=1',
|
||||
function(done) {
|
||||
helper.exec('GAIA_OPTIMIZE=1 BUILD_DEBUG=1 make',
|
||||
function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
done();
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
42
gaia/build/test/integration/production_test.js
Executable file
42
gaia/build/test/integration/production_test.js
Executable file
|
|
@ -0,0 +1,42 @@
|
|||
'use strict';
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var vm = require('vm');
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('PRODUCTION=1', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('make with PRODUCTION=1', function(done) {
|
||||
helper.exec('PRODUCTION=1 make', function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
|
||||
var settingsPath = path.join(process.cwd(), 'profile', 'settings.json');
|
||||
var settings = JSON.parse(fs.readFileSync(settingsPath));
|
||||
var expectedSettings = {
|
||||
'feedback.url': 'https://input.mozilla.org/api/v1/feedback/'
|
||||
};
|
||||
var userjs = fs.readFileSync(
|
||||
path.join('profile', 'user.js'),
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
var sandbox = helper.getPrefsSandbox();
|
||||
vm.runInNewContext(userjs, sandbox);
|
||||
|
||||
helper.checkSettings(settings, expectedSettings);
|
||||
assert.isUndefined(sandbox.prefs['dom.payment.skipHTTPSCheck']);
|
||||
|
||||
// zip path for system app
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'uitest.gaiamobile.org', 'application.zip');
|
||||
|
||||
// uitest should not exists in production builds
|
||||
assert.isFalse(fs.existsSync(zipPath));
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
37
gaia/build/test/integration/pseudolocalizations_test.js
Executable file
37
gaia/build/test/integration/pseudolocalizations_test.js
Executable file
|
|
@ -0,0 +1,37 @@
|
|||
'use strict';
|
||||
|
||||
/* jshint node: true, mocha: true */
|
||||
/* global suiteSetup */
|
||||
|
||||
var assert = require('chai').assert;
|
||||
var path = require('path');
|
||||
var AdmZip = require('adm-zip');
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('buildtime pseudolocalizations', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('are included by default', function(done) {
|
||||
helper.exec('make', function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
var zipPath = path.join(process.cwd(), 'profile', 'webapps',
|
||||
'system.gaiamobile.org', 'application.zip');
|
||||
var zip = new AdmZip(zipPath);
|
||||
var enUSFileInZip = zip.getEntry('locales-obj/index.en-US.json');
|
||||
var psaccentPathInZip = 'locales-obj/index.fr-x-psaccent.json';
|
||||
var psaccentFileInZip = zip.getEntry(psaccentPathInZip);
|
||||
|
||||
assert.isNotNull(
|
||||
psaccentFileInZip,
|
||||
'Accented English file ' + psaccentPathInZip + ' should exist');
|
||||
assert.notDeepEqual(
|
||||
JSON.parse(zip.readAsText(psaccentFileInZip)),
|
||||
JSON.parse(zip.readAsText(enUSFileInZip)),
|
||||
'Accented English file should not be identical to regular English');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
18
gaia/build/test/integration/shared_css_test.js
Executable file
18
gaia/build/test/integration/shared_css_test.js
Executable file
|
|
@ -0,0 +1,18 @@
|
|||
'use strict';
|
||||
|
||||
var helper = require('./helper');
|
||||
|
||||
suite('shared CSS', function() {
|
||||
suiteSetup(helper.cleanupWorkspace);
|
||||
teardown(helper.cleanupWorkspace);
|
||||
|
||||
test('make APP=test-shared-css-app, checking shared css are imported',
|
||||
function(done) {
|
||||
var command = 'make APP=test-shared-css-app ' +
|
||||
'GAIA_APP_CONFIG=' + __dirname + '/../fixtures/shared_css.list';
|
||||
helper.exec(command, function(error, stdout, stderr) {
|
||||
helper.checkError(error, stdout, stderr);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
5
gaia/build/test/resources/locales/en-US/.hg_archival.txt
Executable file
5
gaia/build/test/resources/locales/en-US/.hg_archival.txt
Executable file
|
|
@ -0,0 +1,5 @@
|
|||
repo: 106824fa5d90d13980c4f65d67a2c6494bf29d91
|
||||
node: 77ec1443ef6b40ed2e53dfe61785169792d92ba7
|
||||
branch: default
|
||||
latesttag: null
|
||||
latesttagdistance: 1888
|
||||
40
gaia/build/test/resources/locales/en-US/apps/bluetooth/bluetooth.properties
Executable file
40
gaia/build/test/resources/locales/en-US/apps/bluetooth/bluetooth.properties
Executable file
|
|
@ -0,0 +1,40 @@
|
|||
# Bluetooth :: Confirmation Dialog
|
||||
bluetooth = Bluetooth
|
||||
confirmation = Confirmation
|
||||
bluetooth-status-description = Bluetooth is disabled
|
||||
turn-bluetooth-on = Do you want to turn Bluetooth on?
|
||||
cancel = Cancel
|
||||
turn-on = Turn On
|
||||
error-transfer-title = Bluetooth file transfer failed
|
||||
error-transfer-settings = Bluetooth file transfer failed. Check that the Bluetooth settings are correct.
|
||||
ok = OK
|
||||
# Bluetooth :: Devices Panel
|
||||
bluetooth-paired-devices = Paired devices
|
||||
bluetooth-devices-in-area = Devices in the area
|
||||
device-status-tap-connect = Tap to connect
|
||||
device-status-pairing = Pairing with device…
|
||||
device-status-waiting = Waiting for other device…
|
||||
device-status-paired = Paired
|
||||
device-status-connecting = Connecting…
|
||||
device-status-connected = Connected
|
||||
search-for-device = Searching for devices…
|
||||
search-device = Search for devices
|
||||
unnamed-device = Unknown device
|
||||
error-pair-title = Unable to pair devices
|
||||
error-pair-pincode = Unable to pair with the device. Check that the PIN is correct.
|
||||
error-pair-toofast = Unable to pair with the device. Too many requests.
|
||||
# Bluetooth :: Pair View
|
||||
pair=Pair
|
||||
active-pair = Confirm devices to pair
|
||||
active-pair-confirmation = To pair with {{device}}, make sure that both devices currently have the following PIN displayed:
|
||||
active-pair-pincode = To pair with {{device}}, enter the PIN on the device.
|
||||
active-pair-passkey = To pair with {{device}}, enter the passkey on the device.
|
||||
passive-pair = Bluetooth pairing request
|
||||
passive-pair-confirmation = {{device}} would like to pair with this phone. To accept, make sure that both devices currently have the following PIN displayed:
|
||||
passive-pair-pincode = {{device}} would like to pair with this phone. To accept, enter the PIN on the device.
|
||||
passive-pair-passkey = {{device}} would like to pair with this phone. To accept, enter the passkey on the device.
|
||||
pair-view-title = Bluetooth Request From
|
||||
# Bluetooth :: Pair Manager
|
||||
bluetooth-pairing-request-now-title = Bluetooth pairing request
|
||||
pairing-request-timeout-title = Bluetooth Pairing Request
|
||||
pairing-request-timeout-description = Bluetooth pairing request expired. Try to pair again.
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Bluetooth Transfer
|
||||
description=Gaia Bluetooth Transfer
|
||||
19
gaia/build/test/resources/locales/en-US/apps/bookmark/bookmark.properties
Executable file
19
gaia/build/test/resources/locales/en-US/apps/bookmark/bookmark.properties
Executable file
|
|
@ -0,0 +1,19 @@
|
|||
# Add and update bookmark UIs
|
||||
add-bookmark-header=Add link
|
||||
edit-bookmark-header=Edit link
|
||||
|
||||
added-to-home-screen=Added to Home Screen
|
||||
updated-bookmark=Updated bookmark
|
||||
|
||||
website-name=Website name
|
||||
address=Address
|
||||
|
||||
cancel-action=Cancel
|
||||
add-action=Add to Home Screen
|
||||
done-action=Done
|
||||
|
||||
# Remove bookmark UI
|
||||
|
||||
remove-title=Remove {{name}}
|
||||
remove-message=Remove {{name}} from system?
|
||||
remove-action=Remove
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Bookmark
|
||||
description=Bookmark Manager
|
||||
90
gaia/build/test/resources/locales/en-US/apps/browser/browser.properties
Executable file
90
gaia/build/test/resources/locales/en-US/apps/browser/browser.properties
Executable file
|
|
@ -0,0 +1,90 @@
|
|||
# modal-dialog buttons
|
||||
ok=OK
|
||||
cancel=Cancel
|
||||
done=Done
|
||||
|
||||
enter-search-or-address.placeholder=Search or enter address
|
||||
history=History
|
||||
new-tab=New tab
|
||||
open-in-new-tab=Open link in new tab
|
||||
|
||||
# History headings
|
||||
future=Future
|
||||
today=Today
|
||||
yesterday=Yesterday
|
||||
last-7-days=Last 7 days
|
||||
this-month=This month
|
||||
last-6-months=Last 6 months
|
||||
older-than-6-months=Older than 6 months
|
||||
|
||||
# Months
|
||||
month-0=January
|
||||
month-1=February
|
||||
month-2=March
|
||||
month-3=April
|
||||
month-4=May
|
||||
month-5=June
|
||||
month-6=July
|
||||
month-7=August
|
||||
month-8=September
|
||||
month-9=October
|
||||
month-10=November
|
||||
month-11=December
|
||||
|
||||
# Start Page
|
||||
browser={{browserBrandShortName}}
|
||||
start-browsing=Enter a search term or Web address to start browsing.
|
||||
|
||||
# LOCALIZATION NOTE: depending on your locale, you might want to use a more
|
||||
# compact translation for top-sites-tab than for top-sites-startPage.
|
||||
top-sites-startPage = Top sites
|
||||
top-sites-tab = Top sites
|
||||
|
||||
# Settings
|
||||
browser-settings=Settings
|
||||
privacy-and-security=Privacy & Security
|
||||
clear-browsing-history=Clear browsing history
|
||||
confirm-clear-browsing-history=Clear browsing history?
|
||||
clear-cookies-and-stored-data=Clear cookies and stored data
|
||||
confirm-clear-cookies-and-stored-data=Clear cookies and other data stored by sites on this device?
|
||||
search-engines=Search Engines
|
||||
default-search-engine=Default search engine
|
||||
|
||||
# Bookmarks
|
||||
bookmarks=Bookmarks
|
||||
bookmark=Bookmark
|
||||
unbookmark=Unbookmark
|
||||
edit-bookmark=Edit bookmark
|
||||
edit-bookmark-header=Edit bookmark
|
||||
page-title=Page title
|
||||
address=Address
|
||||
add-to-home-screen=Add to home screen
|
||||
|
||||
# HTTP Authentication dialog
|
||||
username=Username
|
||||
password=Password
|
||||
login=Sign in
|
||||
login-to-a-website=Sign in to website
|
||||
http-authentication-message=The website {{host}} requires you to sign in.
|
||||
the-username-or-password-is-incorrect=The username or password is incorrect.
|
||||
|
||||
# Crash screen
|
||||
this-is-embarrassing=Well, this is embarrassing.
|
||||
not-responding=We tried to display this Web page, but it’s not responding.
|
||||
close-tab=Close tab
|
||||
reload-tab=Reload
|
||||
|
||||
# Awesomescreen
|
||||
search-for=Search for
|
||||
|
||||
# Generic save link context menu
|
||||
save-link=Save linked file
|
||||
|
||||
# Image saving context menu
|
||||
save-image=Save Image
|
||||
|
||||
# Video saving context menu
|
||||
save-video=Save Video
|
||||
|
||||
# Audio saving context menu
|
||||
save-audio=Save Audio
|
||||
2
gaia/build/test/resources/locales/en-US/apps/browser/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/browser/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Browser
|
||||
description=Gaia Web Browser
|
||||
247
gaia/build/test/resources/locales/en-US/apps/calendar/calendar.properties
Executable file
247
gaia/build/test/resources/locales/en-US/apps/calendar/calendar.properties
Executable file
|
|
@ -0,0 +1,247 @@
|
|||
# generic
|
||||
back=Back
|
||||
save=Save
|
||||
hide=Hide
|
||||
cancel=Cancel
|
||||
confirm=Confirm
|
||||
done=Done
|
||||
events=Events
|
||||
edit=Edit
|
||||
allday-events=All-day Events
|
||||
no-events=No Events
|
||||
|
||||
# first time use hints
|
||||
hint-swipe-action=Swipe
|
||||
hint-swipe-to-navigate=to navigate between calendar dates.
|
||||
|
||||
# time view selector
|
||||
show-today=Today
|
||||
show-month-view=Month
|
||||
show-week-view=Week
|
||||
show-day-view=Day
|
||||
|
||||
# settings
|
||||
settings-show=Settings
|
||||
settings-hide=Hide settings
|
||||
|
||||
# view/add/edit records
|
||||
add-account=Add an account
|
||||
new-event=Add event
|
||||
view-event-header=Event
|
||||
new-event-header=Add Event
|
||||
edit-event-header=Edit Event
|
||||
|
||||
# account
|
||||
account-header=Account
|
||||
account-list-header=Accounts
|
||||
|
||||
# advanced settings
|
||||
advanced-settings-short=Settings
|
||||
advanced-settings-header=Calendar Settings
|
||||
advanced-settings-personalization=Personalization
|
||||
advanced-settings-reminders=Reminders
|
||||
advanced-settings-add-account=Add Account
|
||||
|
||||
# create account
|
||||
field-user.placeholder=Username
|
||||
field-password.placeholder=Password
|
||||
field-full-url.placeholder=URL
|
||||
modify-account-setting-up=Please wait while your account is set up
|
||||
modify-account-unable-to-sync=Unable to sync
|
||||
modify-account-sign-in=Sign in
|
||||
|
||||
# presets
|
||||
preset-caldav=CalDav
|
||||
preset-yahoo=Yahoo!
|
||||
preset-google=Google
|
||||
preset-local=Offline calendar
|
||||
|
||||
# note this does not need to be localized
|
||||
# it is highly unlikely we will ship with this value.
|
||||
preset-mozilla=Mozilla Zimbra
|
||||
calendar-local=Offline calendar
|
||||
|
||||
# create event
|
||||
event-title.placeholder=Title
|
||||
event-location.placeholder=Where?
|
||||
event-description.placeholder=Notes
|
||||
|
||||
event-is-allday=All day event?
|
||||
event-start-date.placeholder=Start date
|
||||
event-end-date.placeholder=End date
|
||||
event-start-time.placeholder=Start time
|
||||
event-end-time.placeholder=End time
|
||||
event-delete=Delete event
|
||||
|
||||
# remove account
|
||||
remove-account-data=Remove local data
|
||||
remove-account-dialog=Remove account
|
||||
remove-account-dialog-details=Removing this account will also remove your local copy of associated calendars and events.
|
||||
|
||||
# sync button in settings drawer
|
||||
# This sync button uses an icon for display, so this text is only
|
||||
# for accessibility purposes, not visible to the eye.
|
||||
drawer-sync-button=Sync
|
||||
|
||||
# sync
|
||||
sync-frequency=Sync Calendar
|
||||
sync-frequency-15min=15 min
|
||||
sync-frequency-30min=30 min
|
||||
sync-frequency-manual=Manually
|
||||
|
||||
# duration time of events
|
||||
# startDate and endDate use the `longDateFormat` format.
|
||||
# startTime and endTime use the `shortTimeFormat` format.
|
||||
# `<br>` (line break) used for presentation.
|
||||
one-day-duration={{startDate}}<br>from {{startTime}} to {{endTime}}
|
||||
multiple-day-duration=From {{startTime}} {{startDate}}<br>to {{endTime}} {{endDate}}
|
||||
one-all-day-duration=All day<br>{{startDate}}
|
||||
multiple-all-day-duration=All day from {{startDate}}<br>to {{endDate}}
|
||||
|
||||
# alarms for event view/edit
|
||||
none=None
|
||||
reminder=Reminder:
|
||||
remind-me=Remind me
|
||||
alarm-at-event-standard=At time of event
|
||||
alarm-at-event-allday=On day of event
|
||||
|
||||
# alarms
|
||||
alarm-start-notice={{title}} starting {{distance}}
|
||||
alarm-started-notice={{title}} started {{distance}}
|
||||
|
||||
# relative times (before/after)
|
||||
minutes-before={[ plural(value) ]}
|
||||
minutes-before[zero] = 0 minutes before
|
||||
minutes-before[one] = 1 minute before
|
||||
minutes-before[two] = {{value}} minutes before
|
||||
minutes-before[few] = {{value}} minutes before
|
||||
minutes-before[many] = {{value}} minutes before
|
||||
minutes-before[other] = {{value}} minutes before
|
||||
|
||||
hours-before={[ plural(value) ]}
|
||||
hours-before[zero] = 0 hours before
|
||||
hours-before[one] = 1 hour before
|
||||
hours-before[two] = {{value}} hours before
|
||||
hours-before[few] = {{value}} hours before
|
||||
hours-before[many] = {{value}} hours before
|
||||
hours-before[other] = {{value}} hours before
|
||||
|
||||
days-before={[ plural(value) ]}
|
||||
days-before[zero] = 0 days before
|
||||
days-before[one] = 1 day before
|
||||
days-before[two] = {{value}} days before
|
||||
days-before[few] = {{value}} days before
|
||||
days-before[many] = {{value}} days before
|
||||
days-before[other] = {{value}} days before
|
||||
|
||||
weeks-before={[ plural(value) ]}
|
||||
weeks-before[zero] = 0 weeks before
|
||||
weeks-before[one] = 1 week before
|
||||
weeks-before[two] = {{value}} weeks before
|
||||
weeks-before[few] = {{value}} weeks before
|
||||
weeks-before[many] = {{value}} weeks before
|
||||
weeks-before[other] = {{value}} weeks before
|
||||
|
||||
months-before={[ plural(value) ]}
|
||||
months-before[zero] = 0 months before
|
||||
months-before[one] = 1 month before
|
||||
months-before[two] = {{value}} months before
|
||||
months-before[few] = {{value}} months before
|
||||
months-before[many] = {{value}} months before
|
||||
months-before[other] = {{value}} months before
|
||||
|
||||
years-before={[ plural(value) ]}
|
||||
years-before[zero] = 0 years before
|
||||
years-before[one] = 1 year before
|
||||
years-before[two] = {{value}} years before
|
||||
years-before[few] = {{value}} years before
|
||||
years-before[many] = {{value}} years before
|
||||
years-before[other] = {{value}} years before
|
||||
|
||||
minutes-after={[ plural(value) ]}
|
||||
minutes-after[zero] = 0 minutes after
|
||||
minutes-after[one] = 1 minute after
|
||||
minutes-after[two] = {{value}} minutes after
|
||||
minutes-after[few] = {{value}} minutes after
|
||||
minutes-after[many] = {{value}} minutes after
|
||||
minutes-after[other] = {{value}} minutes after
|
||||
|
||||
hours-after={[ plural(value) ]}
|
||||
hours-after[zero] = 0 hours after
|
||||
hours-after[one] = 1 hour after
|
||||
hours-after[two] = {{value}} hours after
|
||||
hours-after[few] = {{value}} hours after
|
||||
hours-after[many] = {{value}} hours after
|
||||
hours-after[other] = {{value}} hours after
|
||||
|
||||
days-after={[ plural(value) ]}
|
||||
days-after[zero] = 0 days after
|
||||
days-after[one] = 1 day after
|
||||
days-after[two] = {{value}} days after
|
||||
days-after[few] = {{value}} days after
|
||||
days-after[many] = {{value}} days after
|
||||
days-after[other] = {{value}} days after
|
||||
|
||||
weeks-after={[ plural(value) ]}
|
||||
weeks-after[zero] = 0 weeks after
|
||||
weeks-after[one] = 1 week after
|
||||
weeks-after[two] = {{value}} weeks after
|
||||
weeks-after[few] = {{value}} weeks after
|
||||
weeks-after[many] = {{value}} weeks after
|
||||
weeks-after[other] = {{value}} weeks after
|
||||
|
||||
months-after={[ plural(value) ]}
|
||||
months-after[zero] = 0 months after
|
||||
months-after[one] = 1 month after
|
||||
months-after[two] = {{value}} months after
|
||||
months-after[few] = {{value}} months after
|
||||
months-after[many] = {{value}} months after
|
||||
months-after[other] = {{value}} months after
|
||||
|
||||
years-after={[ plural(value) ]}
|
||||
years-after[zero] = 0 years after
|
||||
years-after[one] = 1 year after
|
||||
years-after[two] = {{value}} years after
|
||||
years-after[few] = {{value}} years after
|
||||
years-after[many] = {{value}} years after
|
||||
years-after[other] = {{value}} years after
|
||||
|
||||
# Date formatting details (http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html)
|
||||
hour-format=%I %p
|
||||
hour-allday=All Day
|
||||
current-time=%I:%M
|
||||
|
||||
# Default header used in month view / week view
|
||||
multi-month-view-header-format=%b %Y
|
||||
|
||||
# Header format used for in the day view.
|
||||
day-view-header-format=%b %e, %A
|
||||
|
||||
# Header used on month view before the event list (selected day date)
|
||||
months-day-view-header-format=%A, %b %e
|
||||
|
||||
# Date format in the event detail view.
|
||||
longDateFormat=%A, %B %d, %Y
|
||||
|
||||
#errors
|
||||
error-start-after-end=End date must come after start date
|
||||
error-unauthenticated=Wrong login and/or password
|
||||
error-internal-server-error=Server error. Check your login and try again.
|
||||
error-default=Something is wrong. Try again later.
|
||||
error-offline=No connection. Check your network configuration and try again.
|
||||
error-account-exist=This account already exists.
|
||||
|
||||
# notification errors
|
||||
notification-error-sync-title=Calendar sync error
|
||||
notification-error-sync-description=Tap for more info
|
||||
|
||||
# Used in month view as column header, each single char represents a week day
|
||||
# (from 0-Sunday to 6-Saturday)
|
||||
weekday-0-single-char = S
|
||||
weekday-1-single-char = M
|
||||
weekday-2-single-char = T
|
||||
weekday-3-single-char = W
|
||||
weekday-4-single-char = T
|
||||
weekday-5-single-char = F
|
||||
weekday-6-single-char = S
|
||||
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Calendar
|
||||
description=Gaia Calendar
|
||||
79
gaia/build/test/resources/locales/en-US/apps/camera/camera.properties
Executable file
79
gaia/build/test/resources/locales/en-US/apps/camera/camera.properties
Executable file
|
|
@ -0,0 +1,79 @@
|
|||
nospace2-title = Not enough space on memory card
|
||||
nospace2-text = Try freeing up space by deleting media.
|
||||
|
||||
error-saving-title = Picture not saved
|
||||
error-saving-text = An error prevented Camera from saving the picture.
|
||||
|
||||
error-recording-title = Video not recorded
|
||||
error-recording-text = An error prevented Camera from recording the video.
|
||||
|
||||
nocard2-title = No memory card found
|
||||
nocard3-text = Insert a memory card to take pictures.
|
||||
|
||||
pluggedin2-title = Camera can not be used while phone is plugged in
|
||||
pluggedin2-text = Unplug the phone to capture photos and videos
|
||||
|
||||
storage-size-limit-reached = You have run out of media storage space.
|
||||
activity-size-limit-reached = You have reached the maximum file size for this attachment.
|
||||
|
||||
retake-button = Retake
|
||||
select-button = Select
|
||||
close-button = Close
|
||||
|
||||
delete-photo? = Delete photo?
|
||||
delete-video? = Delete video?
|
||||
cancel = Cancel
|
||||
delete = Delete
|
||||
|
||||
# LOCALIZATION NOTE(mp): MP stands for mega-pixels
|
||||
mp = MP
|
||||
|
||||
camera-resolution = Camera Resolution
|
||||
|
||||
# LOCALIZATION NOTE (camera-resolution-header): if you leave the original
|
||||
# en-US value "{{camera-resolution}}" in the following string, the localization
|
||||
# will be automatically picked from the existing string with ID "camera-resolution".
|
||||
# If you need to adapt your localization to the reduced space available in
|
||||
# headers, you can use a shorter string here. The same comment is valid for
|
||||
# all -header strings using a {{variable}}.
|
||||
camera-resolution-header = {{camera-resolution}}
|
||||
|
||||
video-resolution = Video Resolution
|
||||
video-resolution-header = {{video-resolution}}
|
||||
|
||||
scene-mode = Scene Mode
|
||||
scene-mode-header = {{scene-mode}}
|
||||
|
||||
self-timer = Self-Timer
|
||||
self-timer-header = {{self-timer}}
|
||||
self-timer-off = Off
|
||||
self-timer-2-seconds = 2 seconds
|
||||
self-timer-5-seconds = 5 seconds
|
||||
self-timer-10-seconds = 10 seconds
|
||||
|
||||
battery-shutdown-title = Low Battery
|
||||
battery-shutdown-text = The battery is too low to use the camera.
|
||||
battery-critical-text = Critically low battery
|
||||
battery-verylow-text = 10% battery remaining
|
||||
battery-low-text = 15% battery remaining
|
||||
|
||||
hdr = HDR
|
||||
hdr-header = {{hdr}}
|
||||
hdr-on = On
|
||||
hdr-off = Off
|
||||
hdr-deactivated = (HDR deactivated)
|
||||
|
||||
grid = Grid Lines
|
||||
grid-header = {{grid}}
|
||||
grid-on = On
|
||||
grid-off = Off
|
||||
|
||||
flash = Flash
|
||||
flash-on = On
|
||||
flash-off = Off
|
||||
flash-auto = Auto
|
||||
flash-deactivated = (Flash deactivated)
|
||||
|
||||
options = Options
|
||||
open-gallery = Open Gallery
|
||||
preview = Preview
|
||||
2
gaia/build/test/resources/locales/en-US/apps/camera/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/camera/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Camera
|
||||
description=Gaia Camera
|
||||
8
gaia/build/test/resources/locales/en-US/apps/clock/alarms.properties
Executable file
8
gaia/build/test/resources/locales/en-US/apps/clock/alarms.properties
Executable file
|
|
@ -0,0 +1,8 @@
|
|||
ac_classic_clock_alarm_opus = Classic Buzz
|
||||
ac_classic_clock_alarm_prog_opus2 = Pulse Progressive
|
||||
ac_classic_clock_radio_opus = Classic Pulse
|
||||
ac_normal_gem_echoes_opus = Gem Echoes
|
||||
ac_soft_smooth_strings_opus = Smooth Strings
|
||||
ac_soft_humming_waves_opus = Shimmering Waves
|
||||
ac_normal_ringing_strings_opus = Ringing Strings
|
||||
ac_soft_into_the_void_opus = Into the Void
|
||||
122
gaia/build/test/resources/locales/en-US/apps/clock/clock.properties
Executable file
122
gaia/build/test/resources/locales/en-US/apps/clock/clock.properties
Executable file
|
|
@ -0,0 +1,122 @@
|
|||
reset = Reset
|
||||
start = Start
|
||||
stop = Stop
|
||||
cancel = Cancel
|
||||
|
||||
hour = Hour
|
||||
hours = Hours
|
||||
minute = Minute
|
||||
minutes = Minutes
|
||||
|
||||
alarm = Alarm
|
||||
timer = Timer
|
||||
stopwatch = Stopwatch
|
||||
alarmName.placeholder = Alarm name
|
||||
newAlarm = New alarm
|
||||
editAlarm = Edit alarm
|
||||
|
||||
pause = Pause
|
||||
resume = Resume
|
||||
lap = Lap
|
||||
lap-number = Lap {{n}}
|
||||
|
||||
delete = Delete
|
||||
time = Time
|
||||
snooze-label = Snooze
|
||||
snooze-button = Snooze
|
||||
repeat = Repeat
|
||||
vibrate = Vibrate
|
||||
close = Close
|
||||
save = Save
|
||||
done = Done
|
||||
|
||||
closeButton.ariaLabel = Close
|
||||
newAlarmButton.ariaLabel = New alarm
|
||||
|
||||
# The label for a slider that allows the user to change
|
||||
# the System Alarm Volume for all clock alarms.
|
||||
alarm-volume-label = System Alarm Volume
|
||||
|
||||
sound = Sound
|
||||
noSound = No Sound
|
||||
|
||||
everyday = Every day
|
||||
weekdays = Weekdays
|
||||
weekends = Weekends
|
||||
never = Never
|
||||
|
||||
vibrateOn = On
|
||||
vibrateOff = Off
|
||||
|
||||
plusMinute = +1 Min
|
||||
|
||||
# see http://www.cplusplus.com/reference/clibrary/ctime/strftime/
|
||||
dateFormat = %A, %B %e
|
||||
|
||||
countdown-lessThanAnHour = The alarm is set for <strong>{{minutes}}</strong> from now.
|
||||
countdown-moreThanAnHour = The alarm is set for {{hours}} {{minutes}} from now.
|
||||
countdown-moreThanADay = The alarm is set for {{days}} {{hours}} from now.
|
||||
|
||||
nMinutes={[ plural(n) ]}
|
||||
nMinutes[zero] = less than a minute
|
||||
nMinutes[one] = one minute
|
||||
nMinutes[two] = {{n}} minutes
|
||||
nMinutes[few] = {{n}} minutes
|
||||
nMinutes[many] = {{n}} minutes
|
||||
nMinutes[other] = {{n}} minutes
|
||||
|
||||
nHours={[ plural(n) ]}
|
||||
nHours[zero] =
|
||||
nHours[one] = <strong>{{n}} hour</strong>
|
||||
nHours[two] = <strong>{{n}} hours</strong>
|
||||
nHours[few] = <strong>{{n}} hours</strong>
|
||||
nHours[many] = <strong>{{n}} hours</strong>
|
||||
nHours[other] = <strong>{{n}} hours</strong>
|
||||
|
||||
nAndRemainHours={[ plural(n) ]}
|
||||
nAndRemainHours[zero] =
|
||||
nAndRemainHours[one] = and <strong>{{n}} hour</strong>
|
||||
nAndRemainHours[two] = and <strong>{{n}} hours</strong>
|
||||
nAndRemainHours[few] = and <strong>{{n}} hours</strong>
|
||||
nAndRemainHours[many] = and <strong>{{n}} hours</strong>
|
||||
nAndRemainHours[other] = and <strong>{{n}} hours</strong>
|
||||
|
||||
nRemainDays={[ plural(n) ]}
|
||||
nRemainDays[zero] =
|
||||
nRemainDays[one] = <strong>{{n}} day</strong>
|
||||
nRemainDays[two] = <strong>{{n}} days</strong>
|
||||
nRemainDays[few] = <strong>{{n}} days</strong>
|
||||
nRemainDays[many] = <strong>{{n}} days</strong>
|
||||
nRemainDays[other] = <strong>{{n}} days</strong>
|
||||
|
||||
nRemainMinutes={[ plural(n) ]}
|
||||
nRemainMinutes[zero] =
|
||||
nRemainMinutes[one] = and <strong>{{n}} minute</strong>
|
||||
nRemainMinutes[two] = and <strong>{{n}} minutes</strong>
|
||||
nRemainMinutes[few] = and <strong>{{n}} minutes</strong>
|
||||
nRemainMinutes[many] = and <strong>{{n}} minutes</strong>
|
||||
nRemainMinutes[other] = and <strong>{{n}} minutes</strong>
|
||||
|
||||
nSpinnerSeconds={[ plural(n) ]}
|
||||
nSpinnerSeconds[zero] = zero seconds
|
||||
nSpinnerSeconds[one] = one second
|
||||
nSpinnerSeconds[two] = {{n}} seconds
|
||||
nSpinnerSeconds[few] = {{n}} seconds
|
||||
nSpinnerSeconds[many] = {{n}} seconds
|
||||
nSpinnerSeconds[other] = {{n}} seconds
|
||||
|
||||
nSpinnerMinutes={[ plural(n) ]}
|
||||
nSpinnerMinutes[zero] = zero minutes
|
||||
nSpinnerMinutes[one] = one minute
|
||||
nSpinnerMinutes[two] = {{n}} minutes
|
||||
nSpinnerMinutes[few] = {{n}} minutes
|
||||
nSpinnerMinutes[many] = {{n}} minutes
|
||||
nSpinnerMinutes[other] = {{n}} minutes
|
||||
|
||||
nSpinnerHours={[ plural(n) ]}
|
||||
nSpinnerHours[zero] = zero hours
|
||||
nSpinnerHours[one] = {{n}} hour
|
||||
nSpinnerHours[two] = {{n}} hours
|
||||
nSpinnerHours[few] = {{n}} hours
|
||||
nSpinnerHours[many] = {{n}} hours
|
||||
nSpinnerHours[other] = {{n}} hours
|
||||
2
gaia/build/test/resources/locales/en-US/apps/clock/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/clock/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Clock
|
||||
description=Gaia Clock
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
add = Add
|
||||
call = Call
|
||||
edit = Edit
|
||||
cancel = Cancel
|
||||
done = Done
|
||||
ok = OK
|
||||
update = Update
|
||||
retry = Retry
|
||||
|
||||
# Menus and dialog strings
|
||||
contacts = Contacts
|
||||
addContact = Add contact
|
||||
deleteContact = Delete contact
|
||||
selectContact = Select contact
|
||||
selectAll = Select all
|
||||
deselectAll = Deselect all
|
||||
editContact = Edit contact
|
||||
deleteConfirmMsg = Delete contact?
|
||||
remove = Remove
|
||||
delete = Delete
|
||||
comments = Comments
|
||||
no_contact_phones = This contact does not have a phone number
|
||||
no_contact_email = This contact does not have an email address
|
||||
no_contact_data = This contact does not have a phone number and email address
|
||||
removePhotoConfirm = Remove contact picture?
|
||||
loadingContacts = Loading contacts…
|
||||
# LOCALIZATION NOTE(noContactsActivity): Shown when using the context menu to add
|
||||
# a number from your call list to a contact, and your contacts list is empty.
|
||||
noContactsActivity = Cannot add to contact as your contact list is empty
|
||||
|
||||
# Contact fields
|
||||
noName = No name
|
||||
givenName.placeholder = Name
|
||||
familyName.placeholder = Last name
|
||||
tel.placeholder = Phone
|
||||
carrier = Carrier
|
||||
separator = ,
|
||||
carrier.placeholder = Carrier
|
||||
email = Email
|
||||
email.placeholder = Email
|
||||
streetAddress.placeholder = Street
|
||||
postalCode.placeholder = Zip code
|
||||
locality.placeholder = City
|
||||
countryName.placeholder = Country
|
||||
comment.placeholder = Comment
|
||||
org.placeholder = Company
|
||||
date = Date
|
||||
date-span-placeholder = Date
|
||||
date.placeholder = Date
|
||||
|
||||
birthday = Birthday
|
||||
# see http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
|
||||
dateFormat = %B %e
|
||||
dateOutput = {{dayMonthFormatted}} {{year}}
|
||||
|
||||
anniversary = Anniversary
|
||||
|
||||
# Contact action buttons
|
||||
addPhoto = Add Picture
|
||||
addPhone = Add Phone
|
||||
addEmail = Add Email
|
||||
addAddress = Add Address
|
||||
addDate = Add Date
|
||||
addComment = Add Comment
|
||||
addFavorite = Add as Favorite
|
||||
removeFavorite = Remove as Favorite
|
||||
|
||||
# Hidden information, for screen readers
|
||||
exit = Exit
|
||||
expand = Expand
|
||||
labelName = Name:
|
||||
labelLastName = Last name:
|
||||
labelPhoneNumber = Phone number:
|
||||
labelCarrier = Carrier:
|
||||
labelEmail = Email:
|
||||
labelStreet = Street:
|
||||
labelZip = Zip code:
|
||||
labelCity = City:
|
||||
labelCountry = Country:
|
||||
labelComment = Comment:
|
||||
legendTitleMain = Main information
|
||||
legendPhones = Phone numbers
|
||||
legendEmail = Email address
|
||||
legendAddress = Address
|
||||
legendPhoto.ariaLabel = Photo
|
||||
settings = Settings
|
||||
|
||||
# search related
|
||||
search-contact.placeholder = Search
|
||||
noResults = No contacts found
|
||||
|
||||
transferContactsTitle = Transfer Contacts
|
||||
importContactsTitle = Import Contacts
|
||||
importContactsButton = Import Contacts
|
||||
exportContactsTitle = Export Contacts
|
||||
exportContactsButton = Export Contacts
|
||||
|
||||
exportContactsAction = Export
|
||||
|
||||
# Export
|
||||
simExport-title = Export to SIM
|
||||
sdExport-title = Export to SD Card
|
||||
btExport-title = Export to Bluetooth
|
||||
sdUMSEnabled = Cannot use SD Card because USB storage is enabled
|
||||
exportErrorTitle = Export error
|
||||
|
||||
contactsExported2 = {[ plural(exported) ]}
|
||||
contactsExported2[zero] = No contacts exported
|
||||
contactsExported2[one] = {{exported}}/{{total}} contacts exported
|
||||
contactsExported2[two] = {{exported}}/{{total}} contacts exported
|
||||
contactsExported2[few] = {{exported}}/{{total}} contacts exported
|
||||
contactsExported2[many] = {{exported}}/{{total}} contacts exported
|
||||
contactsExported2[other] = {{exported}}/{{total}} contacts exported
|
||||
|
||||
exportError-general = Some error happened while exporting
|
||||
exportError-SD-shared = Can’t access memory card because it’s shared
|
||||
exportError-SD-unavailable = Memory card is not available
|
||||
exportError-SD-noSpace = There’s not enough space on the memory card to export the contacts
|
||||
exportError-SIM-unavailable = SIM card is not available
|
||||
exportError-BT-shared = Can’t access memory card because it’s shared
|
||||
exportError-BT-unavailable = Memory card is not available
|
||||
exportError-BT-noSpace = There’s not enough space on the memory card to export the contacts
|
||||
|
||||
|
||||
# Social networks
|
||||
social-network = Social networks
|
||||
social-link = Link contact
|
||||
social-unlink = Unlink contact
|
||||
social-unlink-confirm-title = Do you want to unlink your friend?
|
||||
social-unlink-confirm-accept = Unlink
|
||||
facebook-import = Import Facebook friends
|
||||
show-fb-profile = View Facebook profile
|
||||
msg-send = Message
|
||||
wall-post = Wall post
|
||||
|
||||
facebook-export-forbidden = The contact cannot be shared due to Facebook constraint.
|
||||
|
||||
otherAccount = Other accounts
|
||||
facebookSwitchMsg = Sync friends
|
||||
|
||||
# value selector
|
||||
select_mobile = Select mobile
|
||||
select_email = Select email
|
||||
select_recipient = Select recipient
|
||||
|
||||
# Settings related
|
||||
contactsOrderBy = Order by last name
|
||||
importSim2 = SIM card
|
||||
importGmail = Gmail
|
||||
bluetooth = Bluetooth
|
||||
importOutlook = Outlook
|
||||
fbUpdateFriends = Update imported friends
|
||||
cleaningFbData = Removing Facebook data
|
||||
loggingOutFb = Logging out from Facebook
|
||||
cleanFbConfirmMsg = Remove all Facebook data?
|
||||
renewPwdMsg = Your password in Facebook has changed. Please, update it.
|
||||
notEnabledYet = Not enabled yet
|
||||
genericNoConnection = To import contacts connect to Wi-Fi or data network
|
||||
# Used for export, just in case the strings will diverge on time
|
||||
simCard = SIM card
|
||||
memoryCard = Memory card
|
||||
|
||||
simNumber = SIM {{number}}
|
||||
|
||||
# No contacts
|
||||
create-new = Create a new contact
|
||||
import-now = Import your contacts from SIM card or Facebook
|
||||
no-contacts = No contacts
|
||||
start-adding = Start adding them now
|
||||
|
||||
notImported = Not imported
|
||||
imported = Imported
|
||||
today = Today
|
||||
yesterday = Yesterday
|
||||
|
||||
messageCanceling = Please hold on. We are canceling the ongoing operation.
|
||||
|
||||
organise-contacts = Organize Contacts
|
||||
find-merge-contacts = Find duplicate contacts
|
||||
|
||||
preparing-contacts = Preparing contacts
|
||||
exportError-SIM-NoFreeRecordFound = SIM Card is full
|
||||
exportError-SIM-CannotAccessPhoneBook = Cannot access SIM card’s phone book
|
||||
|
||||
exportError-SIM-Unavailable = No SIM detected
|
||||
exportError-SIM-GenericError = An error occurred while exporting a contact
|
||||
|
||||
noSimMsgExport = To export contacts insert or unlock your SIM card
|
||||
|
||||
noMemoryCardMsgExport = To export contacts insert a memory card
|
||||
|
||||
ContactManagementTitle = Contacts Management
|
||||
DeleteTitle = Delete
|
||||
bulkDeleteButton = Delete Contacts
|
||||
BulkDelCancel = Contacts delete cancelled
|
||||
DeletedTxt = {[ plural(n) ]}
|
||||
DeletedTxt[zero] = No Contact to Delete
|
||||
DeletedTxt[one] = 1 Contact removed
|
||||
DeletedTxt[two] = {{n}} Contacts removed
|
||||
DeletedTxt[few] = {{n}} Contacts removed
|
||||
DeletedTxt[many] = {{n}} Contacts removed
|
||||
DeletedTxt[other] = {{n}} Contacts removed
|
||||
DeletingContacts = Deleting contacts
|
||||
ContactConfirmDel = {[ plural(n) ]}
|
||||
ContactConfirmDel[zero] = No Contact to Delete
|
||||
ContactConfirmDel[one] = Delete 1 Contact? This cannot be undone.
|
||||
ContactConfirmDel[two] = Delete {{n}} Contacts? This cannot be undone.
|
||||
ContactConfirmDel[few] = Delete {{n}} Contacts? This cannot be undone.
|
||||
ContactConfirmDel[many] = Delete {{n}} Contacts? This cannot be undone.
|
||||
ContactConfirmDel[other] = Delete {{n}} Contacts? This cannot be undone.
|
||||
|
||||
SelectedTxt = {[ plural(n) ]}
|
||||
SelectedTxt[zero] = Contacts
|
||||
SelectedTxt[one] = {{n}} selected
|
||||
SelectedTxt[two] = {{n}} selected
|
||||
SelectedTxt[few] = {{n}} selected
|
||||
SelectedTxt[many] = {{n}} selected
|
||||
SelectedTxt[other] = {{n}} selected
|
||||
|
||||
# WebRTC App
|
||||
video = Video
|
||||
audio = Audio
|
||||
|
||||
# Pick Destination
|
||||
pick_destination = {{ destination }} {{ carrier }}
|
||||
|
||||
# The following strings are spoken by screen readers and not shown on the
|
||||
# screen.
|
||||
removeField.ariaLabel = Remove
|
||||
undo.ariaLabel = Undo
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# Wait
|
||||
waitDuplicateContacts = Looking for duplicate contacts
|
||||
waitMergingDuplicateContacts = Merging duplicate contacts
|
||||
|
||||
# Alert
|
||||
alertNoDuplicateContacts = No duplicate contacts found
|
||||
|
||||
curtainCancel = Cancel
|
||||
merge = Merge
|
||||
close = Ignore
|
||||
|
||||
mergeDuplicateTitle = Merge duplicates
|
||||
suggestedDuplicateContacts = Suggested duplicate contacts for {{name}}
|
||||
mergeActionButtonLabel = {[ plural(n) ]}
|
||||
mergeActionButtonLabel[zero] = No contacts selected
|
||||
mergeActionButtonLabel[one] = Merge with {{n}} contact
|
||||
mergeActionButtonLabel[two] = Merge with {{n}} contacts
|
||||
mergeActionButtonLabel[few] = Merge with {{n}} contacts
|
||||
mergeActionButtonLabel[many] = Merge with {{n}} contacts
|
||||
mergeActionButtonLabel[other] = Merge with {{n}} contacts
|
||||
|
||||
duplicatesFoundTitle = Duplicates found
|
||||
duplicatesFoundMessage = {{name}} duplicates information in the following contacts
|
||||
|
||||
ok = OK
|
||||
|
|
@ -0,0 +1,225 @@
|
|||
addNewNumber=Add new number
|
||||
addToExistingContact=Add to existing contact
|
||||
all=All
|
||||
all.ariaLabel=All
|
||||
callLog=Call log
|
||||
callLogEdit.title=Edit call log
|
||||
callLogEditDialog.ariaLabel=Edit call log dialog
|
||||
connecting=Connecting
|
||||
## LOCALIZATION NOTE cf-async, cf-data, cf-fax, cf-packet, cf-pad, cf-sms, cf-sync and cf-voice are the service the call forwarding is activate/inactive for.
|
||||
## LOCALIZATION NOTE Its variables might be a phone number or cf-inactive.
|
||||
cf-async=Asynchronous: {{ async }}\n
|
||||
cf-data=Data: {{ data }}\n
|
||||
cf-error=An error occurred while retrieving call forwarding status
|
||||
cf-fax=FAX: {{ fax }}\n
|
||||
cf-inactive=Inactive
|
||||
cf-packet=Packet: {{ packet }}\n
|
||||
cf-pad=PAD: {{ pad }}\n
|
||||
cf-sms=SMS: {{ sms }}\n
|
||||
cf-status=Call forwarding status\n
|
||||
cf-sync=Synchronous: {{ sync }}\n
|
||||
cf-voice=Voice: {{ voice }}\n
|
||||
close=Close
|
||||
confirm-deletion=Clear selected calls?
|
||||
contacts.ariaLabel=Contacts
|
||||
createNewContact=Create new contact
|
||||
delete=Delete
|
||||
deselectAll=Deselect all
|
||||
dialerAddContact.ariaLabel=Add contact
|
||||
dialerAddContactDialog.ariaLabel=Add Contact Dialog
|
||||
edit-selected={[ plural(n) ]}
|
||||
edit-selected[one] = {{ n }} selected
|
||||
edit-selected[two] = {{ n }} selected
|
||||
edit-selected[few] = {{ n }} selected
|
||||
edit-selected[many] = {{ n }} selected
|
||||
edit-selected[other] = {{ n }} selected
|
||||
edit=Edit
|
||||
hideKeypad.ariaLabel=Hide keypad
|
||||
ignore=Ignore Call
|
||||
incoming=Incoming
|
||||
keypad.ariaLabel=Keypad
|
||||
makeCall.ariaLabel=Make call
|
||||
merge=Merge
|
||||
missed=Missed
|
||||
missed.ariaLabel=Missed
|
||||
missedCall=Missed call
|
||||
missedCallMultiSims=(SIM {{ n }}) Missed call
|
||||
mmi-error=An error occurred while sending the message
|
||||
mmi-session-expired=Session expired
|
||||
mmi-successfully-sent=Message successfully sent
|
||||
mmi-notification-title-with-sim = ({{sim}}) {{title}}
|
||||
mute.ariaLabel=Mute
|
||||
newCall.ariaLabel=New call
|
||||
no-logs-msg-1=No calls recorded
|
||||
no-logs-msg-3=No missed calls
|
||||
no-logs-msg-4=Start a conversation now
|
||||
recents.ariaLabel=Recent calls
|
||||
reply=Reply
|
||||
selectAll=Select all
|
||||
send=Send
|
||||
switch-calls=Switch calls
|
||||
today=Today
|
||||
withheld-number=Withheld number
|
||||
from-contact=From {{ contact }}
|
||||
from-number=From {{ number }}
|
||||
from-withheld-number=From withheld number
|
||||
yesterday=Yesterday
|
||||
sending=Sending…
|
||||
speakerOption.ariaLabel=Speaker
|
||||
ussd-services={{ operator }} services
|
||||
toggleKeypad.ariaLabel=Toggle keypad
|
||||
type-your-response.placeholder=Type your response…
|
||||
clear-all-text=Clear all text
|
||||
hide=Hide
|
||||
## LOCALIZATION NOTE 'call' is an action verb
|
||||
call=Call
|
||||
hold.ariaLabel=Hold
|
||||
resume=Resume
|
||||
resume.ariaLabel=Resume
|
||||
sendSms=Send Message
|
||||
callEnded=Call Ended
|
||||
via-sim=via SIM{{ n }}
|
||||
sim-number=SIM{{ n }}
|
||||
|
||||
## LOCALIZATION NOTE: these labels aren't displayed but they're used for acessibility
|
||||
hangup-a11y-button.ariaLabel=Hang Up
|
||||
pickup-a11y-button.ariaLabel=Pick up
|
||||
unlock-a11y-button.ariaLabel=Slider
|
||||
roaming={{operator}} (Roaming)
|
||||
|
||||
settings=Settings
|
||||
|
||||
#Call log
|
||||
delete-n-log? = {[ plural(n) ]}
|
||||
delete-n-log?[zero] = Nothing selected
|
||||
delete-n-log?[one] = Delete selected log?
|
||||
delete-n-log?[two] = Delete {{ n }} logs?
|
||||
delete-n-log?[few] = Delete {{ n }} logs?
|
||||
delete-n-log?[many] = Delete {{ n }} logs?
|
||||
delete-n-log?[other] = Delete {{ n }} logs?
|
||||
|
||||
#Call duration units
|
||||
callDurationMinutes={{ m }}:{{ s }}
|
||||
callDurationHours={{ h }}:{{ m }}:{{ s}}
|
||||
|
||||
#Suggestion bar
|
||||
suggestionMatches={[ plural(n) ]}
|
||||
suggestionMatches[one]={{ n }} match for "{{ matchNumber }}"
|
||||
suggestionMatches[two]={{ n }} matches for "{{ matchNumber }}"
|
||||
suggestionMatches[few]={{ n }} matches for "{{ matchNumber }}"
|
||||
suggestionMatches[many]={{ n }} matches for "{{ matchNumber }}"
|
||||
suggestionMatches[other]={{ n }} matches for "{{ matchNumber }}"
|
||||
|
||||
# MMI Service code
|
||||
scCallBarring=Call barring
|
||||
scCallForwarding=Call forwarding
|
||||
scClip=Incoming Caller ID
|
||||
scClir=Outgoing Caller ID
|
||||
scPwd=Password change
|
||||
scCallWaiting=Call waiting
|
||||
scPin=PIN change
|
||||
scPin2=PIN2 change
|
||||
scPuk=Unblock PIN
|
||||
scPuk2=Unblock PIN2
|
||||
scImei=IMEI
|
||||
scUssd=USSD
|
||||
|
||||
# MMI Service class
|
||||
serviceClassVoice=Voice
|
||||
serviceClassData=Data
|
||||
serviceClassFax=FAX
|
||||
serviceClassSms=SMS
|
||||
serviceClassDataSync=Sync
|
||||
serviceClassDataAsync=Async
|
||||
serviceClassPacket=Packet
|
||||
serviceClassPad=PAD
|
||||
|
||||
# MMI Status message
|
||||
smServiceEnabled=Service was enabled
|
||||
smServiceDisabled=Service has been disabled
|
||||
smServiceRegistered=Registration was successful
|
||||
smServiceErased=Erasure was successful
|
||||
smServiceInterrogated=Request was successful
|
||||
smServiceNotProvisioned=Service not provisioned
|
||||
smClirPermanent=You can not change the caller ID setting
|
||||
smClirDefaultOnNextCallOn=Caller ID defaults to restricted. Next call: Restricted
|
||||
smClirDefaultOnNextCallOff=Caller ID defaults to restricted. Next call: Not restricted
|
||||
smClirDefaultOffNextCallOn=Caller ID defaults to not restricted. Next call: Restricted
|
||||
smClirDefaultOffNextCallOff=Caller ID defaults to not restricted. Next call: Not restricted
|
||||
smServiceEnabledFor=Service was enabled for:
|
||||
smPinChanged=PIN successfully changed
|
||||
smPinUnblocked=PIN successfully unblocked
|
||||
smPin2Changed=PIN2 successfully changed
|
||||
smPin2Unblocked=PIN2 successfully unblocked
|
||||
|
||||
# MMI Error message
|
||||
emMmiError=Connection problem or invalid MMI code
|
||||
emMmiErrorPasswordIncorrect=Incorrect Password
|
||||
emMmiErrorNotSupported=Invalid or Unsupported MMI Code
|
||||
emMmiErrorInvalidAction=Invalid action
|
||||
emMmiErrorInvalidScCode=Invalid service code
|
||||
emMmiErrorBadPuk=The PUK you typed is not correct
|
||||
emMmiErrorBadPin=The old PIN you typed is not correct.
|
||||
emMmiErrorNeedPuk2=Type PUK2 to unblock SIM card
|
||||
emMmiErrorMismatchPin=The PINs you typed do not match
|
||||
emMmiErrorInvalidPin=Type a PIN that is 4 to 8 numbers
|
||||
emMmiErrorNeedsPuk=Your SIM card is PUK-locked
|
||||
emMmiErrorEnablePin=Unsuccessful. Enable SIM/RUIM LOCK
|
||||
emMmiErrorMmiFdn=Operation is restricted to fixed dialing numbers only
|
||||
emMmiErrorStkCcUssdDial=USSD request is modified to DIAL request
|
||||
emMmiErrorStkCcUssdSs=USSD request is modified to SS request
|
||||
emMmiErrorStkCcUssdUssd=USSD request is modified to new USSD request
|
||||
emMmiErrorStkCcSsDial=SS request is modified to DIAL request
|
||||
emMmiErrorStkCcSsUssd=SS request is modified to USSD request
|
||||
emMmiErrorStkCcSsSs=SS request is modified to new SS request
|
||||
emMmiErrorPinPukAttempts={[ plural(n) ]}
|
||||
emMmiErrorPinPukAttempts[one] = Only {{ n }} retry left
|
||||
emMmiErrorPinPukAttempts[two] = {{ n }} retries left
|
||||
emMmiErrorPinPukAttempts[few] = {{ n }} retries left
|
||||
emMmiErrorPinPukAttempts[many] = {{ n }} retries left
|
||||
emMmiErrorPinPukAttempts[other] = {{ n }} retries left
|
||||
emMmiErrorSimBlocked=Maximum number of retries exceeded. SIM blocked
|
||||
|
||||
# RIL errno
|
||||
RadioNotAvailable=Radio not available
|
||||
GenericFailure=Generic failure
|
||||
PasswordIncorrect=Password incorrect
|
||||
SimPin2=SIM PIN2
|
||||
SimPuk2=SIM PUK2
|
||||
RequestNotSupported=Request not supported
|
||||
OpNotAllowedDuringVoiceCall=Operation not allowed during voice call
|
||||
SmsSendFailRetry=SMS send fail retry
|
||||
SimAbsent=SIM absent
|
||||
SubscriptionNotAvailable=Subscription not available
|
||||
ModeNotSupported=Mode not supported
|
||||
FdnCheckFailure=Fdn check failure
|
||||
IllegalSimOrMe=Illegal SIM or ME
|
||||
DialModifiedToUssd=Dial modified to USSD
|
||||
DialModifiedToSs=Dial modified to SS
|
||||
DialModifiedToDial=Dial modified to dial
|
||||
UssdModifiedToDial=USSD modified to dial
|
||||
UssdModifiedToSs=USSD modified to SS
|
||||
UssdModifiedToUssd=USSD modified to USSD
|
||||
SsModifiedToDial=SS modified to dial
|
||||
SsModifiedToUssd=SS modified to USSD
|
||||
SsModifiedToSs=SS modified to SS
|
||||
SubscriptionNotSupported=Subscription not supported
|
||||
InvalidParameter=Invalid parameter
|
||||
RejectedByRemote=Rejected by remote
|
||||
|
||||
# Conference call
|
||||
# LOCALIZATION NOTE(conferenceCall): {{n}} represents the number of
|
||||
# participants in the group call.
|
||||
conferenceCall = Conference ({{n}})
|
||||
caller-left-call = {{ caller }} has left the call.
|
||||
conferenceAddError = Unable to merge calls
|
||||
conferenceRemoveError = Unable to unmerge calls
|
||||
|
||||
# date string. see http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
|
||||
longDateFormat=%A, %B %e
|
||||
|
||||
# Bluetooth menu
|
||||
select-audio-sources=Select audio sources
|
||||
bluetooth-handsfree-device=Bluetooth handsfree device
|
||||
receiver=Receiver
|
||||
speaker=Speaker
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
callAirplaneModeMessage=To make a call you need to disable airplane mode in settings.
|
||||
callAirplaneModeBtnOk=OK
|
||||
callAirplaneModeTitle=Airplane mode activated
|
||||
numberIsBusyTitle=Number is busy
|
||||
numberIsBusyMessage=The number is currently busy. Please try again later.
|
||||
fdnIsActiveTitle=FDN active
|
||||
fdnIsActiveMessage=FDN (Fixed Dialing Numbers) is activated and the following number is not in your FDN list: {{ number }}
|
||||
voiceMail=Voicemail
|
||||
emergencyNumber=Emergency number
|
||||
emergencyDialogBodyBadNumber=To make a call, the phone must be connected to a network.
|
||||
emergencyDialogBodyDeviceNotAccepted=Emergency calls are not allowed by the network.
|
||||
emergencyDialogBtnOk=OK
|
||||
emergencyDialogTitle=No network connection
|
||||
invalidNumberToDialTitle=Invalid phone number
|
||||
invalidNumberToDialMessage=The phone number you are calling is not valid.
|
||||
unableToCallTitle=Unable to make a phone call now
|
||||
unableToCallMessage=Cannot make a call. If you are already dialing, please hang up first.
|
||||
otherConnectionInUseTitle=Other connection in use
|
||||
otherConnectionInUseMessage=You have an active call on another connection. You can only use one connection at a time.
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
dialer.name=Phone
|
||||
dialer.description=Gaia Phone
|
||||
contacts.name=Contacts
|
||||
contacts.description=Gaia Contacts
|
||||
177
gaia/build/test/resources/locales/en-US/apps/costcontrol/costcontrol.properties
Executable file
177
gaia/build/test/resources/locales/en-US/apps/costcontrol/costcontrol.properties
Executable file
|
|
@ -0,0 +1,177 @@
|
|||
# Usage
|
||||
# Note: "Usage" is the application name
|
||||
topup-confirmation-title2 = Usage
|
||||
topup-confirmation-message = Top-up confirmed
|
||||
topup-incorrectcode-title2 = Usage
|
||||
topup-incorrectcode-message3 = Incorrect top-up code entered.
|
||||
|
||||
updating = Updating
|
||||
updating-ellipsis = Updating…
|
||||
yesterday = Yesterday
|
||||
today = Today
|
||||
never = Never
|
||||
|
||||
magnitude = {{value}} {{unit}}
|
||||
currency = {{currency}}{{value}}
|
||||
|
||||
# FTE Widget
|
||||
widget = Usage Widget
|
||||
widget-authed-sim2-heading = New {{provider}} SIM card inserted
|
||||
widget-authed-sim2-meta = Tap to track your phone and internet usage.
|
||||
widget-nonauthed-sim2-heading = New SIM card inserted
|
||||
widget-nonauthed-sim2-meta = Tap to track your internet usage.
|
||||
widget-airplane-mode-heading = Airplane Mode
|
||||
widget-airplane-mode-meta = Please, turn off airplane mode to enable Usage.
|
||||
widget-no-sim3-heading = No SIM card
|
||||
widget-no-sim3-meta = Insert a SIM card to enable Usage.
|
||||
widget-sim2-locked-heading = Locked SIM card
|
||||
widget-sim2-locked-meta = Unlock your SIM card to enable Usage.
|
||||
|
||||
# FTE Welcome
|
||||
fte = Usage First Time Experience
|
||||
fte-authed-sim = Save money by keeping track of your phone and internet usage.
|
||||
fte-nonauthed-sim = Save money by keeping track of your internet usage.
|
||||
fte-no-sim = Get clear information about how much internet you’re using.
|
||||
# Here Usage is the name of the application
|
||||
fte-sim-info2 = Information shown on Usage comes directly from this device. Check with your mobile service provider for detailed account information.
|
||||
|
||||
# FTE steps
|
||||
fte-plantype-title = Type of Contract
|
||||
fte-plantype-hint = Select the type of contract you have with your mobile service provider.
|
||||
|
||||
fte-prepaid2-title = Low Balance Alert
|
||||
fte-prepaid2-hint = Set an alert to avoid running out of credit.
|
||||
|
||||
fte-prepaid3-title = Data Report and Alert
|
||||
fte-prepaid3-hint = Receive reports about your Internet usage and set an alert to avoid using too much.
|
||||
|
||||
fte-postpaid2-title = Phone and Data Report
|
||||
fte-postpaid2-hint = Receive reports about your phone and Internet usage.
|
||||
|
||||
fte-postpaid3-title = Data Alert
|
||||
fte-postpaid3-hint = Set an alert to avoid using too much data.
|
||||
|
||||
fte-onlydata2-title = Data Report
|
||||
fte-onlydata2-hint = Receive reports about your internet usage.
|
||||
|
||||
fte-onlydata3-title = Data Alert
|
||||
fte-onlydata3-hint = Set an alert to avoid using too much data.
|
||||
|
||||
# In the HTML
|
||||
phone-activity = Phone Activity
|
||||
|
||||
balance = Balance
|
||||
on-roaming-message2 = Roaming: no automatic balance update. You might be charged for updating manually.
|
||||
balance-error-message2 = Balance didn’t update correctly. Try updating manually.
|
||||
airplane-mode-error-message2 = Turn off airplane mode to update your balance or top up.
|
||||
|
||||
disable-airplane-mode = Do you want to disable Airplane mode to update or top up?
|
||||
no-coverage-error-message2 = You need phone coverage to update your balance or top up.
|
||||
|
||||
top-up = Top Up
|
||||
enter-top-up-code = Enter the top-up code
|
||||
top-up-code-explanation2 = Find it on the scratch card or directly in your receipt.
|
||||
wait-for-confirmation = You will receive a confirmation message
|
||||
incorrect-code2 = Make sure the code is correct and try again.
|
||||
topup-error2 = There was a problem sending the code. Please, try again.
|
||||
|
||||
application-error-title = Service unavailable
|
||||
application-error-message = Contact your company representative
|
||||
service-unavailable-title = Service unavailable
|
||||
service-unavailable-message = Neither update nor top-up is possible at the moment. Please try later.
|
||||
|
||||
data-usage = Data usage
|
||||
update-button = Update
|
||||
topup-button2 = Use top-up code
|
||||
topup-ussd-button2 = Open top-up menu
|
||||
ok = OK
|
||||
|
||||
top-up-in-progress2 = Your top-up is being processed.
|
||||
top-up-timed-out2 = Update your balance to confirm. If balance is unchanged, try topping up again.
|
||||
on-topup-not-confirmed-title = Top-up not confirmed
|
||||
on-topup-not-confirmed-message = Try updating your balance or retry top-up.
|
||||
send = send
|
||||
plantype-setup-title = My phone and Internet plan is
|
||||
prepaid = Prepaid
|
||||
postpaid = Postpaid
|
||||
phoneactivity = Phone activity
|
||||
short-date-format = %b, %d
|
||||
sms-sent = SMS sent
|
||||
call-made = Calls made
|
||||
settings = Settings
|
||||
low-balance-alert = Low balance alert
|
||||
low-balance-explanation2 = When balance is below
|
||||
phone-and-internet-data-report = Phone and Internet data report
|
||||
internet-data-report = Internet data report
|
||||
starting-on = Starting on
|
||||
cancel = Cancel
|
||||
monthly = Monthly
|
||||
weekly = Weekly
|
||||
monday = Monday
|
||||
tuesday = Tuesday
|
||||
wednesday = Wednesday
|
||||
thursday = Thursday
|
||||
friday = Friday
|
||||
saturday = Saturday
|
||||
sunday = Sunday
|
||||
billing-cycle-ends = Billing cycle ends
|
||||
tracking-will-reset = Tracking will reset on this date
|
||||
yes = Yes
|
||||
done = Done
|
||||
confirmation = Confirmation
|
||||
reset-confirmation-warning = All current data will be deleted. Are you sure you want to reset?
|
||||
reset = Reset
|
||||
reset-wifi = Reset Wi-Fi usage
|
||||
reset-mobile = Reset mobile usage
|
||||
reset-all-data-usage = Reset mobile & Wi-Fi data
|
||||
not-set = Not set
|
||||
used = Used
|
||||
limit-passed = Limit passed
|
||||
limit = Limit
|
||||
data-limit-header = Data usage limit
|
||||
data-limit-alert = Data use alert
|
||||
data-limit-value2 = When use is above
|
||||
data-limit-dialog-title2 = Enter a mobile data limit alert
|
||||
data-limit-dialog-explanation2 = Connection speeds reduce after the limit is reached. Check with your data provider to set an appropriate alert level.
|
||||
|
||||
# LOCALIZATION NOTE (wifi-usage, mobile-usage): these strings are displayed in
|
||||
# the main window
|
||||
wifi-usage = Wi-Fi usage
|
||||
mobile-usage = Mobile usage
|
||||
|
||||
# LOCALIZATION NOTE (wifi-usage-settings, mobile-usage-settings): these strings
|
||||
# are displayed in the Settings section
|
||||
wifi-usage-settings = Wi-Fi usage
|
||||
mobile-usage-settings = Mobile usage
|
||||
|
||||
im-prepaid = I’m Pre-paid
|
||||
im-postpaid = I’m Post-paid
|
||||
reset-data-usage = Reset data usage
|
||||
reset-report = Reset report
|
||||
next = Next
|
||||
back = Back
|
||||
lets-go = Let’s go!
|
||||
alert = Alert
|
||||
alert-limit = Alert Limit
|
||||
fte-welcome-title = Welcome
|
||||
data-limit-notification-title2 = {{limit}} of data used
|
||||
data-limit-notification-text2 = You’ve reached the limit you selected
|
||||
low-balance-notification-title = Low balance
|
||||
low-balance-notification-text = {{remaining}} remaining phone credit
|
||||
zero-balance-message = Balance has reached zero, no phone credit remaining.
|
||||
not-available = Not available
|
||||
usage = Usage
|
||||
internet = Internet
|
||||
phone = Phone
|
||||
loading-interface-data = Loading interface data. Please retry in a while.
|
||||
|
||||
verbose-chart-date-format = {{em-month}} {{monthday-number}}
|
||||
|
||||
# Specif format for CC, string in format Today|Yesterday|<WeekDay>, hh:mm
|
||||
day-hour-format = {{day}}, {{time}}
|
||||
|
||||
# Localized units
|
||||
B = B
|
||||
KB = KB
|
||||
MB = MB
|
||||
GB = GB
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Usage
|
||||
description=Usage application to see credit and data usage statistics
|
||||
554
gaia/build/test/resources/locales/en-US/apps/email/email.properties
Executable file
554
gaia/build/test/resources/locales/en-US/apps/email/email.properties
Executable file
|
|
@ -0,0 +1,554 @@
|
|||
setup-app-name-header=Mail
|
||||
|
||||
setup-empty-account-prompt=You are not set up to send or receive email. Would you like to do that now?
|
||||
setup-pick-service=To send and receive email, you will need to set up an account.
|
||||
# Title of the account setup card where the user enters their display name,
|
||||
# e-mail address, and password.
|
||||
setup-account-header3=New Account
|
||||
|
||||
# The placeholder for the display name of the user that will be displayed in the
|
||||
# account setup screen input box for the display name until they enter any text
|
||||
# in the box. When you send an e-mail, the "From" header contains the user's
|
||||
# display name ("John Doe") as well as the e-mail address
|
||||
# ("john.doe@example.com"). In the future this input box will be labeled, but
|
||||
# it is currently unlabeled because of screen real estate concerns.
|
||||
setup-info-name.placeholder=Your name
|
||||
# The placeholder for the user's e-mail address that will be displayed in the
|
||||
# account setup screen input box for the e-mail address until they enter any
|
||||
# text in the box. The value will be used to configure the e-mail account.
|
||||
setup-info-email.placeholder=someone@example.com
|
||||
# The placeholder for the user's password that will be displayed in the account
|
||||
# setup screen input box for the password until they enter any text in the box.
|
||||
# The value will be used to configure the e-mail account and saved for future
|
||||
# usage.
|
||||
setup-info-password.placeholder=Password
|
||||
setup-info-next=Next
|
||||
|
||||
setup-progress-wait-msg=Setting up account
|
||||
|
||||
setup-completed-header=Mail account setup
|
||||
setup-completed-label=All done!
|
||||
setup-add-another-account=Add another account
|
||||
setup-show-mail=Continue to Mail
|
||||
|
||||
# The error for when the user tries to create an account without a network
|
||||
# connection active.
|
||||
setup-error-offline=This device is currently offline. Connect to a network and try again.
|
||||
# The error for either a bad username or a bad password. For security reasons,
|
||||
# servers try not to distinguish between the two which is why we also cannot
|
||||
# tell them apart either. Also, if the user made a typo, they could have made
|
||||
# it in either place.
|
||||
setup-error-bad-user-or-pass2=Invalid username or password. Check for typos.
|
||||
# The error for a bad e-mail address. We tried to send email but
|
||||
# couldn't because the server said it was a bad address.
|
||||
setup-error-bad-address=Invalid e-mail address. Check for typos.
|
||||
# The error for a user having the correct username and password, but the mail
|
||||
# server explicitly indicates they don't have permission to talk to the mail
|
||||
# server. This is currently only expected from ActiveSync servers; situations
|
||||
# like gmail over IMAP indicating that IMAP is disabled for the account or
|
||||
# domain have their own error code: setup-error-imap-disabled.
|
||||
setup-error-not-authorized=The server said you’re not authorized to create an account
|
||||
# The error for when the server is not good enough to be supported
|
||||
# because it is missing the required features.
|
||||
setup-error-pop-server-not-great=Server unsupported. The POP3 server does not implement required features.
|
||||
# The fallback error; if we don't have a better error, we report this.
|
||||
setup-error-unknown2=An unknown error occurred. Check your network connection or try the manual configuration option.
|
||||
# The error for Gmail accounts where 2-factor authentication (where you receive
|
||||
# a text message on your phone or run a special app) is enabled, and so the
|
||||
# user needs to create and use an application specific password to allow us to
|
||||
# talk to the server.
|
||||
setup-error-needs-app-pass=You must use an application specific password for two-factor Gmail accounts
|
||||
# The error for Gmail accounts where IMAP is not enabled. This can occur
|
||||
# for individual users where they have disabled IMAP from the settings UI.
|
||||
# This can also occur for apps-for-domains where the domain is not configured
|
||||
# to support IMAP.
|
||||
setup-error-imap-disabled=You must enable IMAP for your Gmail account
|
||||
# The error for Gmail accounts where POP3 is not enabled. This can occur
|
||||
# for individual users where they have disabled POP3 from the settings UI.
|
||||
# This can also occur for apps-for-domains where the domain is not configured
|
||||
# to support POP3.
|
||||
setup-error-pop3-disabled=You must enable POP3 for your Gmail account
|
||||
# The error for when we are able to contact a server that should be the mail
|
||||
# server but we are unable to establish a secure connection.
|
||||
setup-error-bad-security=Unable to establish a secure connection with "{{server}}". There may be a problem with your network or the server.
|
||||
# The error for when we try to contact a server but see no indication of a
|
||||
# response before we give up because of a timeout.
|
||||
setup-error-unresponsive-server=Unable to establish a connection with "{{server}}". There may be a problem with the network.
|
||||
# The error for when we able to establish a (secure) connection with the server,
|
||||
# but there is some type of failure talking to the server that isn't covered by
|
||||
# other errors. Hopefully this is just a temporary problem on the server, but
|
||||
# it could also be a fundamental incompatibility between our software and the
|
||||
# server's software.
|
||||
setup-error-server-problem=There is a problem with the server "{{server}}". Try again later.
|
||||
# The error for when we are trying to figure out the right server settings for
|
||||
# an account based on the e-mail address the user typed in during configuration,
|
||||
# but we can't find the right settings. This is either because the user made a
|
||||
# typo and so we are looking for configuration data that does not exist, there
|
||||
# were network failures trying to look the information up, or the information is
|
||||
# not available.
|
||||
setup-error-no-config-info=Unable to automatically configure your account. Correct your e-mail address or try the manual configuration option.
|
||||
# The error for when the user is trying to set up an account with a server that
|
||||
# currently indicates it is offline for maintenance.
|
||||
setup-error-server-maintenance=The server "{{server}}" is offline for maintenance. Try again later.
|
||||
# The error when the user trying to register a duplicate account
|
||||
setup-error-account-already-exists=This account is already configured.
|
||||
|
||||
setup-manual-config2=Manual setup
|
||||
|
||||
setup-manual-config-header=Manual Setup
|
||||
setup-manual-account-type=Account type
|
||||
setup-manual-imap-header=IMAP settings
|
||||
setup-manual-pop3-header=POP3 settings
|
||||
setup-manual-smtp-header=SMTP settings
|
||||
setup-manual-activesync-header=ActiveSync settings
|
||||
setup-manual-next=Next
|
||||
|
||||
setup-manual-socket=Socket Type
|
||||
# Technical term, should not be translated
|
||||
setup-manual-socket-ssl=SSL
|
||||
# Technical term, should not be translated
|
||||
setup-manual-socket-starttls=STARTTLS
|
||||
|
||||
setup-manual-hostname.placeholder=Hostname
|
||||
setup-manual-port.placeholder=Port Number
|
||||
setup-manual-username.placeholder=Username
|
||||
# LOCALIZATION NOTE (setup-manual-activesync-username.placeholder):
|
||||
# the double \\ will be displayed as a single \
|
||||
setup-manual-activesync-username.placeholder=Domain\\Username
|
||||
|
||||
setup-bad-password-header=Bad password!
|
||||
setup-bad-password=We could not sign in to the server. Maybe your password is wrong?
|
||||
setup-new-password.placeholder=New password
|
||||
setup-fix-password=Retry with new password
|
||||
setup-gmail-twofactor-header=Two-Factor Enabled
|
||||
setup-gmail-twofactor-message=You need to enter an application-specific password below.
|
||||
setup-gmail-twofactor-fix=Use application password
|
||||
setup-gmail-imap-header=IMAP Disabled
|
||||
setup-gmail-imap-message=You must enable IMAP on your Gmail account
|
||||
setup-gmail-imap-retry=Retry
|
||||
setup-gmail-pop3-header=POP3 Disabled
|
||||
setup-gmail-pop3-message=You must enable POP3 on your Gmail account
|
||||
setup-gmail-pop3-retry=Retry
|
||||
|
||||
settings-main-header=Mail Settings
|
||||
|
||||
# For account settings screen, there are sections of settings, and each
|
||||
#section has a header. One is Account, which shows general information
|
||||
# about the account, like the name.
|
||||
settings-sub-header-account=Account
|
||||
|
||||
# Label in the "Account" sub-section of account settings that shows the
|
||||
# human name, not the email address, for the account.
|
||||
settings-account-name=Your name
|
||||
|
||||
# Label in the "Account" sub-section of account settings for the checkbox
|
||||
# that enables getting phone notifications when new inbox email is found
|
||||
# via periodic sync with the mail server.
|
||||
settings-account-display-notifications=Display notifications for new messages
|
||||
|
||||
# LOCALIZATION NOTE(settings-account-play-sound-onsend): Label in the "Account"
|
||||
# sub-section of account settings for the checkbox that enables playing a sound
|
||||
# after a message is sent.
|
||||
settings-account-play-sound-onsend=Play sound after message is sent
|
||||
|
||||
# For account settings screen, there are sections of settings, and each
|
||||
# section has a header. One is Data, which deals with sync intervals and
|
||||
# time windows for the data that is fetched.
|
||||
settings-sub-header-data=Data
|
||||
|
||||
# Label in the "Data" sub-section of acccount settings for the select box
|
||||
# that allows choosing how often to check the server for new messages in
|
||||
# the inbox. The possible select box options are listed in the
|
||||
# settings-check-every-* properties.
|
||||
settings-account-check-mail=Check for new messages
|
||||
|
||||
# For account settings screen, there are sections of settings, and each
|
||||
# section has a header. One is "Server settings", which deals with the
|
||||
# name/password and server addresses.
|
||||
settings-sub-header-server=Server settings
|
||||
|
||||
# Label in the "Server settings" sub-section of acccount settings for going
|
||||
# to a settings card that shows user name and password used to connect to
|
||||
# the mail server.
|
||||
settings-account-userpass=Username and password
|
||||
|
||||
settings-done=Done
|
||||
settings-account-section=Accounts
|
||||
settings-account-add=Add Account
|
||||
settings-account-delete=Delete account
|
||||
settings-account-delete-prompt=Are you sure you want to delete your {{account}} mail account? You will have to re-download your mail if you re-create the account.
|
||||
settings-account-delete-cancel=Cancel
|
||||
settings-account-delete-confirm=Delete
|
||||
|
||||
|
||||
# When dealing with an account that involves multiple types of
|
||||
# connections, such as IMAP and POP3 which both use SMTP for sending,
|
||||
# we augment the account name in the string with a label to help
|
||||
# clarify to the user which account type they are dealing with. For
|
||||
# most users, the same password will be used for the IMAP server and
|
||||
# the SMTP server, and they will only ever see the IMAP or POP3 label.
|
||||
# But some users with unusual server configurations will also see the
|
||||
# SMTP variant. These unusual users will probably have received
|
||||
# specific instructions from their ISP that involve use of the
|
||||
# protocol names. In general we expect that localizers will want to
|
||||
# leave the protocol names as-is since they are technical protocol
|
||||
# names, but it may make sense to place the name of the protocol
|
||||
# before the account type for certain languages.
|
||||
|
||||
# Note that the account name is displayed as a string that is
|
||||
# displayed in its entirety, so you don't need to worry about clipping
|
||||
# or ellipses.
|
||||
|
||||
settings-account-clarify-imap={{account-name}} (IMAP)
|
||||
settings-account-clarify-pop3={{account-name}} (POP3)
|
||||
settings-account-clarify-smtp={{account-name}} (SMTP)
|
||||
|
||||
settings-general-section=General settings
|
||||
settings-show-images=Always show images
|
||||
settings-download-attachments=Download attachments
|
||||
|
||||
# How often to check the mail server for new mail messages for the inbox.
|
||||
# "Manually" means, do not automatically connect on a periodic sync interval.
|
||||
# User will manually click the refresh button to check for new messages.
|
||||
settings-check-every-5min=Every 5 minutes
|
||||
settings-check-every-10min=Every 10 minutes
|
||||
settings-check-every-15min=Every 15 minutes
|
||||
settings-check-every-30min=Every 30 minutes
|
||||
settings-check-every-60min=Every hour
|
||||
settings-check-every-manual=Manually
|
||||
|
||||
# Dynamically added sync interval checks. These are only added via special
|
||||
# debug/development tools, and are always in seconds. Otherwise, just
|
||||
# the settings-check-every-* options are visible.
|
||||
settings-check-dynamic={[ plural(n) ]}
|
||||
settings-check-dynamic[zero] = seconds
|
||||
settings-check-dynamic[one] = {{ n }} seconds
|
||||
settings-check-dynamic[two] = {{ n }} seconds
|
||||
settings-check-dynamic[few] = {{ n }} seconds
|
||||
settings-check-dynamic[many] = {{ n }} seconds
|
||||
settings-check-dynamic[other] = {{ n }} seconds
|
||||
|
||||
settings-default-account=Set as default email
|
||||
settings-account-type=Account type
|
||||
settings-account-credentials=Credentials
|
||||
|
||||
settings-activesync-label=ActiveSync settings
|
||||
settings-imap-label=IMAP settings
|
||||
settings-pop3-label=POP3 settings
|
||||
settings-smtp-label=SMTP settings
|
||||
settings-hostname=Hostname
|
||||
settings-port=Port
|
||||
settings-username=Username
|
||||
settings-password=Password
|
||||
settings-save=Save
|
||||
settings-password-empty=Password field should not be empty
|
||||
|
||||
# How much email to sync, in smallest unit of days, from the server. Only
|
||||
# valid for ActiveSync mail servers, not shown for other mail server types
|
||||
# like IMAP.
|
||||
settings-account-synchronize-window=Days to sync
|
||||
settings-synchronize-auto=Automatic
|
||||
settings-synchronize-one-day=1 day
|
||||
settings-synchronize-three-days=3 days
|
||||
settings-synchronize-one-week=1 week
|
||||
settings-synchronize-two-weeks=2 weeks
|
||||
settings-synchronize-one-month=1 month
|
||||
settings-synchronize-all=All messages
|
||||
|
||||
envelope-from=From
|
||||
envelope-to=To
|
||||
envelope-cc=Cc
|
||||
envelope-bcc=Bcc
|
||||
|
||||
compose-header=Compose message
|
||||
compose-header-short=Compose
|
||||
compose-send=Send
|
||||
|
||||
compose-to=To
|
||||
compose-cc=cc
|
||||
compose-bcc=bcc
|
||||
|
||||
compose-attachments={[ plural(n) ]}
|
||||
compose-attachments[zero] = Attachments
|
||||
compose-attachments[one] = {{ n }} attachment
|
||||
compose-attachments[two] = {{ n }} attachments
|
||||
compose-attachments[few] = {{ n }} attachments
|
||||
compose-attachments[many] = {{ n }} attachments
|
||||
compose-attachments[other] = {{ n }} attachments
|
||||
|
||||
# Shown when user taps on attachment icon in compose, but the app still
|
||||
# needs a bit more time to finishing the add of the previous attachment.
|
||||
compose-attachment-still-working=One moment, still working on the previous attachment...
|
||||
|
||||
compose-subject=Subject
|
||||
compose-draft-save=Save to Local Drafts
|
||||
compose-discard-message=Discard email?
|
||||
compose-discard-confirm=Discard
|
||||
compose-send-message-failed=Sending email failed
|
||||
composer-attachment-large=Attachment too large
|
||||
composer-attachments-large=Attachments too large
|
||||
compose-attchment-size-exceeded=The selected attachment is too large to send with this message.
|
||||
compose-attchments-size-exceeded=The selected attachments are too large to send with this message. Try selecting fewer files.
|
||||
dialog-button-ok=OK
|
||||
|
||||
# If a file is attached to an email but it does not have a name, this
|
||||
# name is used. There could be multiple ones attached, so a number is
|
||||
# added to the end of the default name to distinguish the files from
|
||||
# each other.
|
||||
default-attachment-filename=attachment{{ n }}
|
||||
|
||||
attachment-size-kib={{kilobytes}}K
|
||||
|
||||
message-attachment-view=View
|
||||
|
||||
message-attachment-too-large=This file is too large to download.
|
||||
|
||||
message-no-subject=(no subject)
|
||||
|
||||
|
||||
# LOCALIZATION NOTE(message-edit-menu-edit):
|
||||
# Displayed in a menu; tapping this item will cause the user to edit the given item.
|
||||
message-edit-menu-edit=Edit
|
||||
message-edit-menu-delete=Delete
|
||||
message-edit-delete-confirm=Delete email message?
|
||||
|
||||
message-send-attachment-disabled-confirm=Attachments can not be forwarded.
|
||||
|
||||
message-multiedit-header={[ plural(n) ]}
|
||||
message-multiedit-header[zero] = Edit
|
||||
message-multiedit-header[one] = {{ n }} selected
|
||||
message-multiedit-header[two] = {{ n }} selected
|
||||
message-multiedit-header[few] = {{ n }} selected
|
||||
message-multiedit-header[many] = {{ n }} selected
|
||||
message-multiedit-header[other] = {{ n }} selected
|
||||
|
||||
browse-to-url-prompt = Browse to URL?: {{ url }}
|
||||
|
||||
message-download-images={[ plural(n) ]}
|
||||
message-download-images[one] = This email contains one image. Click to download.
|
||||
message-download-images[two] = This email contains {{ n }} images. Click to download.
|
||||
message-download-images[few] = This email contains {{ n }} images. Click to download.
|
||||
message-download-images[many] = This email contains {{ n }} images. Click to download.
|
||||
message-download-images[other] = This email contains {{ n }} images. Click to download.
|
||||
|
||||
message-show-external-images=Show external images
|
||||
|
||||
message-multiedit-cancel=Cancel
|
||||
message-multiedit-delete-confirm={[ plural(n) ]}
|
||||
message-multiedit-delete-confirm[one] = Delete this email message?
|
||||
message-multiedit-delete-confirm[two] = Delete {{ n }} email messages?
|
||||
message-multiedit-delete-confirm[few] = Delete {{ n }} email messages?
|
||||
message-multiedit-delete-confirm[many] = Delete {{ n }} email messages?
|
||||
message-multiedit-delete-confirm[other] = Delete {{ n }} email messages?
|
||||
|
||||
message-large-message-cancel=Cancel
|
||||
message-large-message-ok=Continue
|
||||
message-large-message-confirm=This message is large and may take some time to download.
|
||||
|
||||
message-search-from=From
|
||||
message-search-to=To
|
||||
message-search-subject=Subject
|
||||
message-search-body=Body
|
||||
message-search-all=All
|
||||
|
||||
message-search-input.placeholder=Search Mail
|
||||
message-search-cancel=Cancel
|
||||
|
||||
messages-syncing=Loading Messages
|
||||
messages-sync-more=Load more messages from server
|
||||
messages-folder-empty=No mail in this Folder
|
||||
messages-search-empty=No matches in locally cached messages
|
||||
messages-folder-select=Select folder
|
||||
|
||||
message-contact-menu-create=Save new contact
|
||||
message-contact-menu-add-existing=Add to existing contact
|
||||
message-contact-menu-view=View contact
|
||||
message-contact-menu-reply=Reply
|
||||
message-contact-menu-new=Send new mail
|
||||
|
||||
message-reply-menu-reply=Reply
|
||||
message-reply-menu-reply-all=Reply All
|
||||
message-reply-menu-forward=Forward
|
||||
message-reply-menu-cancel=Cancel
|
||||
|
||||
# LOCALIZATION NOTE: do not translate {name}
|
||||
reply-quoting-wrote={name} wrote
|
||||
forward-original-message=Original message
|
||||
|
||||
# L10n note: These are the labels we use when displaying the envelope info for a
|
||||
# message that is forwarded inline. While automatic recovery of this
|
||||
# information by clients is made difficult by these strings regularly being
|
||||
# localized, we attempt to remain consistent with apps such as Thunderbird for
|
||||
# at least English.
|
||||
forward-header-subject=Subject
|
||||
forward-header-date=Date
|
||||
forward-header-from=From
|
||||
# This really wants to have the dash in it for consistency with Thunderbird
|
||||
forward-header-reply-to=Reply-To
|
||||
forward-header-to=To
|
||||
forward-header-cc=Cc
|
||||
|
||||
# Localized folder names for IMAP servers. Because the IMAP standard did not
|
||||
# originally specify a way to express meta-data about folders, folders may be
|
||||
# named in English to express their purpose. Then e-mail clients (or webmail
|
||||
# interfaces) localize these values. We do this too, following in the
|
||||
# footsteps of Thunderbird.
|
||||
folder-inbox=Inbox
|
||||
folder-sent=Sent
|
||||
folder-drafts=Drafts
|
||||
folder-trash=Trash
|
||||
folder-queue=Unsent
|
||||
folder-junk=Junk
|
||||
folder-archives=Archives
|
||||
folder-localdrafts=Local Drafts
|
||||
folder-outbox=Outbox
|
||||
|
||||
# In the folder picker drawer, there is a transparent area for the header,
|
||||
# and a tap region to take the user back to the message list. So this text is
|
||||
# not visible by the user, but could be used for accessibility.
|
||||
drawer-back=Back
|
||||
|
||||
# In the folder picker drawer, the list of email accounts are shown. This is
|
||||
# the header for that section.
|
||||
drawer-accounts-header=Accounts
|
||||
|
||||
# At the bottom of the folder picker drawer, there is an icon link that
|
||||
# goes to the account settings. This string is only used for accessibility
|
||||
# concerns, and is not visible visually.
|
||||
drawer-settings-link=Settings
|
||||
|
||||
# folder-last-synced-label is shown in the message-list, in the
|
||||
# middle of its bottom toolbar, and shows the last sync time for the currently
|
||||
# displayed list of messages in the folder. Since space is tight in that area,
|
||||
# the app code detects if the string will be too long and it will shrink the
|
||||
# font size to fit longer text.
|
||||
folder-last-synced-label=Last sync:
|
||||
|
||||
toaster-undo=Undo
|
||||
toaster-retry=Retry
|
||||
toaster-message-star={[ plural(n) ]}
|
||||
toaster-message-star[one]=1 message flag set
|
||||
toaster-message-star[two]={{ n }} message flags set
|
||||
toaster-message-star[few]={{ n }} message flags set
|
||||
toaster-message-star[many]={{ n }} message flags set
|
||||
toaster-message-star[other]={{ n }} message flags set
|
||||
toaster-message-unstar={[ plural(n) ]}
|
||||
toaster-message-unstar[one]=1 message flag removed
|
||||
toaster-message-unstar[two]={{ n }} message flags removed
|
||||
toaster-message-unstar[few]={{ n }} message flags removed
|
||||
toaster-message-unstar[many]={{ n }} message flags removed
|
||||
toaster-message-unstar[other]={{ n }} message flags removed
|
||||
toaster-message-read={[ plural(n) ]}
|
||||
toaster-message-read[one]=1 message marked as read
|
||||
toaster-message-read[two]={{ n }} messages marked as read
|
||||
toaster-message-read[few]={{ n }} messages marked as read
|
||||
toaster-message-read[many]={{ n }} messages marked as read
|
||||
toaster-message-read[other]={{ n }} messages marked as read
|
||||
toaster-message-unread={[ plural(n) ]}
|
||||
toaster-message-unread[one]=1 message marked as unread
|
||||
toaster-message-unread[two]={{ n }} messages marked as unread
|
||||
toaster-message-unread[few]={{ n }} messages marked as unread
|
||||
toaster-message-unread[many]={{ n }} messages marked as unread
|
||||
toaster-message-unread[other]={{ n }} messages marked as unread
|
||||
toaster-message-move={[ plural(n) ]}
|
||||
toaster-message-move[one]=1 message moved
|
||||
toaster-message-move[two]={{ n }} messages moved
|
||||
toaster-message-move[few]={{ n }} messages moved
|
||||
toaster-message-move[many]={{ n }} messages moved
|
||||
toaster-message-move[other]={{ n }} messages moved
|
||||
toaster-message-delete={[ plural(n) ]}
|
||||
toaster-message-delete[one]=1 message deleted
|
||||
toaster-message-delete[two]={{ n }} messages deleted
|
||||
toaster-message-delete[few]={{ n }} messages deleted
|
||||
toaster-message-delete[many]={{ n }} messages deleted
|
||||
toaster-message-delete[other]={{ n }} messages deleted
|
||||
toaster-retryable-syncfailed=Unable to connect to server
|
||||
|
||||
# LOCALIZATION NOTE(compose-invalid-addresses-title):
|
||||
# A title to be displayed on a warning screen, warning users that
|
||||
# some of the email addresses they typed were incorrect.
|
||||
compose-invalid-addresses-title=Invalid Addresses
|
||||
# LOCALIZATION NOTE(compose-invalid-addresses-description):
|
||||
# A description to be displayed on a warning screen, warning users that
|
||||
# some of the email addresses they typed were incorrect, and that they
|
||||
# must correct the email addresses before sending.
|
||||
compose-invalid-addresses-description=Your message contains one or more invalid email addresses. Please correct them before sending.
|
||||
|
||||
# LOCALIZATION NOTE(background-send-pending):
|
||||
# Brief message to be displayed in a popup, saying that the phone has
|
||||
# no network connection, and that the email has been saved to the outbox.
|
||||
background-send-pending=Network unavailable. Email saved to outbox.
|
||||
# LOCALIZATION NOTE(background-send-sending):
|
||||
# Displayed in a toaster popup message, saying that the email
|
||||
# is currently being sent.
|
||||
background-send-sending=Sending mail…
|
||||
# LOCALIZATION NOTE(background-send-success):
|
||||
# Displayed in a toaster popup message, saying that the email
|
||||
# sent successfully.
|
||||
background-send-success=Email sent.
|
||||
# LOCALIZATION NOTE(background-send-error):
|
||||
# Description to be displayed in a notification, saying that an error
|
||||
# occured while attempting to send an email, and that the email has
|
||||
# been saved to the outbox.
|
||||
background-send-error=Error occurred. Email saved to outbox.
|
||||
# LOCALIZATION NOTE(background-send-error-recipients):
|
||||
# Description to be displayed in a notification, saying that the email
|
||||
# could not be sent because the server rejected one or more of the
|
||||
# email recipients, and that the email has been saved to the outbox.
|
||||
background-send-error-recipients=Recipient error. Email saved to outbox.
|
||||
# LOCALIZATION NOTE(background-send-error-title):
|
||||
# Title to be displayed in a notification, indicating that the
|
||||
# email failed to send for some reason.
|
||||
background-send-error-title=Mail failed to send
|
||||
# LOCALIZATION NOTE(send-failure-recipients):
|
||||
# Message to be displayed when editing a message that failed to send due
|
||||
# to invalid recipients. It should instruct the user to check the addresses
|
||||
# above for spelling.
|
||||
send-failure-recipients=Check the spelling of the addresses above. Your mail server indicated one or more of the addresses above are incorrect.
|
||||
# LOCALIZATION NOTE(send-failure-unknown):
|
||||
# Message to be displayed when editing a message that failed to send for an
|
||||
# unknown reason.
|
||||
send-failure-unknown=The message could not be sent.
|
||||
|
||||
form-clear-input=Remove text
|
||||
confirm-dialog-title=Confirmation
|
||||
|
||||
# senders-separation-sign separates the email accounts of senders.
|
||||
# Notice that we have a space after the comma.
|
||||
senders-separation-sign=,\u0020
|
||||
|
||||
# new-emails refers to the text shown on a notification that users
|
||||
# get when they receive new, unread email. The ui component that utilizes
|
||||
# this lives in apps/email/js/message_list_topbar.js.
|
||||
new-emails={[ plural(n) ]}
|
||||
new-emails[one]=1 New Email
|
||||
new-emails[two]={{ n }} New Emails
|
||||
new-emails[few]={{ n }} New Emails
|
||||
new-emails[many]={{ n }} New Emails
|
||||
new-emails[other]={{ n }} New Emails
|
||||
|
||||
# new-emails-notify-one-account is used when a system notification is generated during
|
||||
# a periodic background sync with the server. Since this goes to the system's
|
||||
# notification area, and user has only one account configured with the email App.
|
||||
new-emails-notify-one-account={[ plural(n) ]}
|
||||
new-emails-notify-one-account[one]=1 New Email
|
||||
new-emails-notify-one-account[two]={{ n }} New Emails
|
||||
new-emails-notify-one-account[few]={{ n }} New Emails
|
||||
new-emails-notify-one-account[many]={{ n }} New Emails
|
||||
new-emails-notify-one-account[other]={{ n }} New Emails
|
||||
|
||||
# new-emails-notify-multiple-accounts is used in the same situation
|
||||
# as new-emails-notify-one-account.
|
||||
# In this case, the user has more than one account configured
|
||||
# with the email app.
|
||||
new-emails-notify-multiple-accounts={[ plural(n) ]}
|
||||
new-emails-notify-multiple-accounts[one]=1 New Email ({{ accountName }})
|
||||
new-emails-notify-multiple-accounts[two]={{ n }} New Emails ({{ accountName }})
|
||||
new-emails-notify-multiple-accounts[few]={{ n }} New Emails ({{ accountName }})
|
||||
new-emails-notify-multiple-accounts[many]={{ n }} New Emails ({{ accountName }})
|
||||
new-emails-notify-multiple-accounts[other]={{ n }} New Emails ({{ accountName }})
|
||||
|
||||
# new-emails-notify-multiple-accounts-body is used in the same situation
|
||||
# as new-emails-notify-multiple-accounts.
|
||||
# This is the body part of the notification.
|
||||
new-emails-notify-multiple-accounts-body={{ from }} “{{ subject }}”
|
||||
2
gaia/build/test/resources/locales/en-US/apps/email/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/email/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=E-Mail
|
||||
description=Gaia E-Mail
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=EmergencyCall
|
||||
description=Web app template
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Find My Device
|
||||
description=Find My Device helps find, lock and erase a lost phone
|
||||
60
gaia/build/test/resources/locales/en-US/apps/fl/download.properties
Executable file
60
gaia/build/test/resources/locales/en-US/apps/fl/download.properties
Executable file
|
|
@ -0,0 +1,60 @@
|
|||
ok = OK
|
||||
download-button = Download
|
||||
install-button = Install
|
||||
cancel-button = Cancel
|
||||
|
||||
download_error = Download Error
|
||||
install_error = Installation Error
|
||||
|
||||
err_descriptor_download_failed = The download failed because of a server error.
|
||||
err_bad_descriptor = The download failed because of a server error.
|
||||
err_too_big = File is too large to download.
|
||||
err_unsupported_type = This type of purchased media is not supported on your phone.
|
||||
err_bad_type = The download failed because of a server error.
|
||||
err_content_download_failed = The download failed because of a server error.
|
||||
err_bad_drm_message = The download failed because of a server error.
|
||||
err_bad_image = The downloaded image cannot be displayed on this device.
|
||||
err_bad_audio = The downloaded file cannot be played on this device.
|
||||
err_no_space = There is not enough storage space on your device to save this song.
|
||||
err_no_sdcard = Cannot save song because there is no memory card.
|
||||
err_sdcard_in_use = Cannot save song because the memory card is in use. Unplug your phone and try downloading again.
|
||||
err_ds_save_failure = Error saving media file.
|
||||
err_db_store_failure = Error saving media file.
|
||||
|
||||
success_song = Song downloaded and installed. Use the Music app to play it.
|
||||
success_ringtone = Ringtone downloaded and installed.
|
||||
success_wallpaper = Wallpaper downloaded and installed.
|
||||
|
||||
ringtone-or-song-question = Do you want to install this audio file as a song or as a ringtone?
|
||||
ringtone-response = Ringtone
|
||||
song-response = Song
|
||||
|
||||
download-confirmation-title-song = Download song?
|
||||
download-confirmation-title-ringtone = Download ringtone?
|
||||
download-confirmation-title-wallpaper = Download wallpaper?
|
||||
|
||||
downloading-song = Downloading song…
|
||||
downloading-ringtone = Downloading ringtone…
|
||||
downloading-wallpaper = Downloading wallpaper…
|
||||
|
||||
locked-content-advisory = {{vendor}} has locked this media file so that it cannot be shared with others or transferred to a new device.
|
||||
|
||||
# This version is like the above, but used when we don't know the name of
|
||||
# the vendor.
|
||||
locked-content-advisory-generic = The seller has locked this media file so that it cannot be shared with others or transferred to a new device.
|
||||
|
||||
download-confirmation-name = Name
|
||||
download-confirmation-type = Type
|
||||
download-confirmation-size = Size
|
||||
download-confirmation-vendor = Vendor
|
||||
download-confirmation-description = Info
|
||||
|
||||
download-progress-title = Downloading
|
||||
|
||||
preview-image-title = Preview image
|
||||
preview-audio-title = Preview audio
|
||||
|
||||
byteUnit-B = bytes
|
||||
byteUnit-KB = KB
|
||||
byteUnit-MB = MB
|
||||
byteUnit-GB = GB
|
||||
2
gaia/build/test/resources/locales/en-US/apps/fl/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/fl/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Purchased Media
|
||||
description=Download and manage forward locked music, ringtones and wallpaper
|
||||
6
gaia/build/test/resources/locales/en-US/apps/fl/pick.properties
Executable file
6
gaia/build/test/resources/locales/en-US/apps/fl/pick.properties
Executable file
|
|
@ -0,0 +1,6 @@
|
|||
done = Done
|
||||
|
||||
pick-ringtone = Select Ringtone
|
||||
pick-wallpaper = Select Wallpaper
|
||||
no-installed-ringtones = No Locked Ringtones Installed
|
||||
no-installed-wallpaper = No Locked Wallpaper Installed
|
||||
4
gaia/build/test/resources/locales/en-US/apps/fm/fm.properties
Executable file
4
gaia/build/test/resources/locales/en-US/apps/fm/fm.properties
Executable file
|
|
@ -0,0 +1,4 @@
|
|||
noAntenna = Plug in a headset
|
||||
noAntennaMsg = FM Radio requires a plugged in headset to receive radio signals.
|
||||
airplaneModeHeader = Airplane mode is on
|
||||
airplaneModeMsg = Turn off Airplane mode to use FM Radio.
|
||||
2
gaia/build/test/resources/locales/en-US/apps/fm/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/fm/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=FM Radio
|
||||
description=Gaia FM Radio
|
||||
337
gaia/build/test/resources/locales/en-US/apps/ftu/ftu.properties
Executable file
337
gaia/build/test/resources/locales/en-US/apps/ftu/ftu.properties
Executable file
|
|
@ -0,0 +1,337 @@
|
|||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Unlock Codes
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
pincode2=Enter PIN code
|
||||
type_pin=Type your PIN code
|
||||
pincodeLabel=SIM {{n}} PIN
|
||||
pinValidation=PIN must have between 4 and 8 characters.
|
||||
pinError=The PIN was incorrect.
|
||||
pinAttemptMsg2={[ plural(n) ]}
|
||||
pinAttemptMsg2[one]=You have one try left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[two]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[few]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[many]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[other]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinLastChanceMsg=This is your last chance to enter the correct PIN. Otherwise, you must enter the PUK code to use this SIM card.
|
||||
|
||||
pukcode=Enter PUK code
|
||||
pukcodeTitle=Enter SIM {{n}} PUK
|
||||
pukcodeLabel=SIM {{n}} PUK
|
||||
type_puk=PUK code
|
||||
pukValidation=PUK code must have exactly 8 characters.
|
||||
pukInfo=You must enter the Personal Unlocking Key (PUK) Code for the SIM card. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukError=The PUK was incorrect.
|
||||
pukAttemptMsg2={[ plural(n) ]}
|
||||
pukAttemptMsg2[one]=You have one try left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[two]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[few]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[many]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[other]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukLastChanceMsg=This is your last chance to enter the correct PUK code. Your SIM card will be permanently unusable if you enter in the wrong PUK code.
|
||||
create_newpin=Create new PIN (4 to 8 digits)
|
||||
confirm_newpin=Confirm new PIN
|
||||
newpinConfirmation=PINs don’t match
|
||||
|
||||
nckcode=Enter NCK code
|
||||
cckcode=Enter CCK code
|
||||
spckcode=Enter SPCK code
|
||||
nck1code=Enter NCK1 code
|
||||
nck2code=Enter NCK2 code
|
||||
hnckcode=Enter HNCK code
|
||||
rcckcode=Enter RCCK code
|
||||
rspckcode=Enter RSPCK code
|
||||
nckcodeTitle=Enter SIM {{n}} NCK
|
||||
cckcodeTitle=Enter SIM {{n}} CCK
|
||||
spckcodeTitle=Enter SIM {{n}} SPCK
|
||||
nck1codeTitle=Enter SIM {{n}} NCK1
|
||||
nck2codeTitle=Enter SIM {{n}} NCK2
|
||||
hnckcodeTitle=Enter SIM {{n}} HNCK
|
||||
rcckcodeTitle=Enter SIM {{n}} RCCK
|
||||
rspckcodeTitle=Enter SIM {{n}} RSPCK
|
||||
nckcodeLabel=SIM {{n}} NCK
|
||||
cckcodeLabel=SIM {{n}} CCK
|
||||
spckcodeLabel=SIM {{n}} SPCK
|
||||
nck1codeLabel=SIM {{n}} NCK1
|
||||
nck2codeLabel=SIM {{n}} NCK2
|
||||
hnckcodeLabel=SIM {{n}} HNCK
|
||||
rcckcodeLabel=SIM {{n}} RCCK
|
||||
rspckcodeLabel=SIM {{n}} RSPCK
|
||||
type_nck=Type your NCK code
|
||||
type_cck=Type your CCK code
|
||||
type_spck=Type your SPCK code
|
||||
type_nck1=Type your NCK1 code
|
||||
type_nck2=Type your NCK2 code
|
||||
type_hnck=Type your HNCK code
|
||||
type_rcck=Type your RCCK code
|
||||
type_rspck=Type your RSPCK code
|
||||
nckValidation=NCK must have between 8 and 16 characters.
|
||||
cckValidation=CCK must have between 8 and 16 characters.
|
||||
spckValidation=SPCK must have between 8 and 16 characters.
|
||||
nck1Validation=NCK1 must have between 8 and 16 characters.
|
||||
nck2Validation=NCK2 must have between 8 and 16 characters.
|
||||
hnckValidation=HNCK must have between 8 and 16 characters.
|
||||
rcckValidation=RCCK must have between 8 and 16 characters.
|
||||
rspckValidation=RSPCK must have between 8 and 16 characters.
|
||||
nckErrorMsg=The NCK code is incorrect.
|
||||
nckAttemptMsg2={[ plural(n) ]}
|
||||
nckAttemptMsg2[one]=Network depersonalization request failure. You have one try left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[two]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[few]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[many]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[other]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckLastChanceMsg=Network depersonalization request failure. Last chance to enter the correct NCK code. Refer to your device documentation or contact your carrier for more information.
|
||||
|
||||
skip=Skip
|
||||
send=Send
|
||||
ok=OK
|
||||
simLocked=The SIM card is locked
|
||||
inputCodeRetriesLeft ={[ plural(n) ]}
|
||||
inputCodeRetriesLeft[one] =Last try.
|
||||
inputCodeRetriesLeft[two] ={{n}} tries left.
|
||||
inputCodeRetriesLeft[few] ={{n}} tries left.
|
||||
inputCodeRetriesLeft[many] ={{n}} tries left.
|
||||
inputCodeRetriesLeft[other] ={{n}} tries left.
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# SIM Manager
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
simManager=SIM Manager
|
||||
simDetail=SIM {{n}}
|
||||
simDefault=(default)
|
||||
simDefaultMessage=Outgoing calls, outgoing messages and data connection are set to SIM 1 as default
|
||||
simSettingsMessage=You can change default settings at Settings > SIM manager
|
||||
simPinLocked=SIM PIN locked
|
||||
noOperator=No operator
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Language
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
language=Language
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# 3g
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
3g = Cellular Data
|
||||
dataConnection = Enable Data
|
||||
dataConnectionInfo = Enabling data connection now will allow you to set up your phone without a Wi-Fi connection. You may also enable it later on in Settings. Just make sure you have a data plan with your carrier to avoid potentially hefty charges.
|
||||
caution = Warning
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Geolocation
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
geolocation = Geolocation
|
||||
geolocationCheckbox = Enable Geolocation
|
||||
geolocationInfo2 = {{brandShortName}} uses data such as GPS, Wi-Fi, and mobile networks near you to help determine your approximate location.
|
||||
geolocationInfoMore = Data is sent to Mozilla and other service providers and will be used in the aggregate to improve those location databases. Data may be stored on your device and data collection may occur even when no apps are running.
|
||||
notice = Notice
|
||||
aboutYourPrivacy = More about your privacy
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Wifi
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
scanningNetworks = Scanning for networks
|
||||
selectNetwork = Select a network
|
||||
shortStatus-connecting = Connecting…
|
||||
shortStatus-associated = Obtaining an IP address…
|
||||
shortStatus-connected = Connected
|
||||
shortStatus-connectingfailed = Connection failed
|
||||
shortStatus-disconnected = Offline
|
||||
securedBy=secured by {{capabilities}}
|
||||
security = Security
|
||||
securityNone = None
|
||||
securityWEP = WEP
|
||||
securityWPA-PSK = WPA-PSK
|
||||
securityWPA-EAP = WPA-EAP
|
||||
securityOpen = Open
|
||||
identity=User
|
||||
identityInput.placeholder=User
|
||||
password=Password
|
||||
passwordInput.placeholder=Password
|
||||
showPassword=Show Password
|
||||
refresh = Refresh
|
||||
noWifiFound3 = No wireless networks found
|
||||
join-hidden-button=Join hidden network
|
||||
authentication=Authentication
|
||||
ssid-name=SSID Network Name
|
||||
# The following strings are spoken by screen readers and not shown on the
|
||||
# screen.
|
||||
# LOCALIZATION NOTE(wifiLevel): {{level}} will be replaced at run-time by a
|
||||
# number ranging from 1 to 4.
|
||||
wifiLevel={{level}} of 4 bars
|
||||
networksList=Networks found
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Date & Time
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
dateAndTime = Date & Time
|
||||
# LOCALIZATION NOTE(timezoneTitle): Parameters in this label will be replaced
|
||||
# at runtime, use this string to reorder elements, translate "UTC", or use
|
||||
# different separator characters.
|
||||
# Example of a resulting string for English: "UTC+01:00 Europe/Paris"
|
||||
timezoneTitle = UTC{{utcOffset}} {{region}}/{{city}}
|
||||
timeZone = Time zone
|
||||
change = Change
|
||||
region.ariaLabel = Region
|
||||
city.ariaLabel = City
|
||||
date.ariaLabel = Date
|
||||
time.ariaLabel = Time
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Import contacts
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
importContacts3 = Import contacts
|
||||
importSim2 = SIM card
|
||||
importFb2 = Facebook
|
||||
importOutlook = Outlook
|
||||
importGmail = Gmail
|
||||
fb-checking = … checking
|
||||
notImportedYet = Not imported yet
|
||||
otherAccount = Other accounts
|
||||
afterFbImport = You can import and edit Facebook friends anytime in Contacts settings
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Fxa Intro
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
firefox-accounts = Firefox Accounts
|
||||
fxa-overview.innerHTML = A Firefox Account lets you use features like Find My Device and apps like the Firefox Marketplace.
|
||||
fxa-create-account-or-sign-in = Create Account or Sign In
|
||||
fxa-email-sent = A verification link has been sent to {{email}}
|
||||
# Copy borrowed fxa-logged-in-text string in settings app
|
||||
fxa-signed-in = Signed in as {{email}}
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# About your rights
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
about-your-rights-0 = {{brandShortName}} is built on free and open source software by a community of thousands from all over the world. There are a few things you should know:
|
||||
about-your-rights-1 = {{brandShortName}} is made available to you under the terms of several open source licenses including the Mozilla Public License. A device running {{brandShortName}} may also contain proprietary software from third parties. Any code provided under open licenses give you the right to modify the source code and distribute your modified versions as long as you comply with their terms.
|
||||
about-your-rights-2 = You are not granted any trademark rights or licenses to the trademarks of the Mozilla Foundation or any party, including without limitation the {{brandShortName}} name or logo.
|
||||
about-your-rights-3 = Some features in {{brandShortName}}, such as the Crash Reporter, give you the option to provide feedback to Mozilla. By choosing to submit feedback, you give Mozilla permission to use the feedback to improve its products, to publish the feedback on its websites, and to distribute the feedback.
|
||||
about-other = Other
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# SIM mandatory
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
SIM_mandatory = SIM Card Warning
|
||||
SIM_mandatory_warm = Please, insert a SIM card and reboot your phone.
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Sharing Performance Data
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
telemetry-sends2 = Telemetry sends Mozilla data about performance, hardware, configurations, customizations and app usage in your {{brandShortName}} device. We use this to make our products better, faster and more responsive.
|
||||
# LOCALIZATION NOTE(learn-more-telemetry.innerHTML, learn-more-information.innerHTML:
|
||||
# {{link}} will be replaced at run-time by an active link, the URL will be
|
||||
# used as text for the link.
|
||||
learn-more-telemetry.innerHTML = Learn more at {{link}}
|
||||
learn-more-information.innerHTML = Learn how Mozilla handles your information at {{link}}
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# OS privacy
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
welcomeBrowser = Welcome to {{brandShortName}}, the free and open source operating system from Mozilla. Our mission is to promote openness, innovation and opportunity by keeping the power of the Web in your hands.
|
||||
# LOCALIZATION NOTE(learn-more-privacy.innerHTML): {{link}} will be replaced at
|
||||
# run-time by an active link, string "learn-more-privacy-link" will be
|
||||
# used as text for the link.
|
||||
learn-more-privacy.innerHTML = Learn how Mozilla handles your information in our {{link}}.
|
||||
learn-more-privacy-link = privacy policy
|
||||
aboutBrowser = About {{brandShortName}}
|
||||
aboutYourPrivacy2 = Your Privacy
|
||||
mozillaCommunity2 = When you use {{brandShortName}}, you become part of a global community helping to build a brighter future for the Web. If you’d like to know more about the Mozilla community, our other products and events near you, please enter your email address below.
|
||||
sharePerformanceAndUsageData = I want to help improve {{brandShortName}} by sharing data about my phone and the way I use it.
|
||||
learnMore = Learn more.
|
||||
emailAddress.placeholder = Email address
|
||||
email-successfully-added=Email successfully added
|
||||
email-loading=Saving your email…
|
||||
privacy-b2g={{brandShortName}}
|
||||
privacy-b2g.title={{brandShortName}}
|
||||
privacy-marketplace=Marketplace
|
||||
# please don't translate the brand name
|
||||
privacy-marketplace.title={{privacy-marketplace}}
|
||||
privacy-e-me=everything.me
|
||||
# please don't translate the brand name
|
||||
privacy-e-me.title={{privacy-e-me}}
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Navigation bar
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
navbar-back=Back
|
||||
navbar-next=Next
|
||||
navbar-join=Join
|
||||
done=Done
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Welcome OS
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
thatsIt = That’s it!
|
||||
startYourPhone = Start your phone tour!
|
||||
startYourTablet = Start your tablet tour!
|
||||
joinTutorial = Join us for a quick tutorial about your new phone.
|
||||
enjoyYourPhone = You’re ready to enjoy your new phone.
|
||||
optionsAvailable = You can change the language, date/time and Wi-Fi connection in settings.
|
||||
letsGo = Let’s go
|
||||
startTour = Start tour
|
||||
|
||||
thatsIt1Tablet-2 = You can always swipe from the bottom edge to enter home screen.
|
||||
thatsIt2Tablet-2 = Let’s do it!
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Tutorial
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
# LOCALIZATION NOTE(tutorial): The following string is spoken by screen readers
|
||||
# and not shown on the screen.
|
||||
tutorial = Tutorial
|
||||
|
||||
tutorial-step1-tiny = Swipe from right to left to browse your apps.
|
||||
tutorial-step2-tiny = Tap and hold on an icon to delete or move it.
|
||||
tutorial-step3-tiny = Enter any keyword or topic and your phone will instantly adapt.
|
||||
tutorial-step4-tiny = Swipe down to access recent notifications, credit information and settings.
|
||||
tutorial-step5-tiny = Tap and hold the home button to browse and close recent apps.
|
||||
tutorial-step6-tiny = Swipe from the side of the screen to move back and forth between recent apps.
|
||||
|
||||
tutorial-step1-large-2 = Swipe down from top to access recent notifications, credit information and settings.
|
||||
tutorial-step2-large-2 = Swipe left or right to discover new apps on home screen.
|
||||
tutorial-step3-large-2 = Tap and hold on an icon to delete or move it.
|
||||
tutorial-step4-large-2 = Two fingers swipe up from the bottom edge to trigger card view.
|
||||
|
||||
tutorial-vertical-scroll-tiny = Swipe up and down to browse your apps. Tap and hold an icon to move or delete it.
|
||||
tutorial-notifications-tiny = Swipe down to access recent notifications, credit information and settings.
|
||||
tutorial-sheets-tiny = Drag from the left edge of your screen to return to recently used apps.
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Offline Error Dialog
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
offline-dialog-title=You must be connected to the Internet to view the page.
|
||||
offline-dialog-text=Please go back and connect to the Internet. You can also view the page later from Settings or by entering {{url}} in any browser.
|
||||
OK=OK
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Newsletter Error Dialogs
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
offline-newsletter-dialog-title=You must be connected to the Internet to subscribe to the newsletter.
|
||||
offline-newsletter-dialog-text=Please go back and connect to the Internet.
|
||||
invalid-email-dialog-title=Your email is not valid
|
||||
invalid-email-dialog-text=Please go back and correct your entry.
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Memory Card Contacts Import Error Dialog
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
retry=Retry
|
||||
|
||||
cancel = Cancel
|
||||
|
||||
# The following strings are spoken by screen readers and not shown on the
|
||||
# screen.
|
||||
progressbar = Step {{step}} of {{total}}
|
||||
progressbar.ariaLabel = First Time Experience
|
||||
2
gaia/build/test/resources/locales/en-US/apps/ftu/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/ftu/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=FTU
|
||||
description=First Time Experience
|
||||
90
gaia/build/test/resources/locales/en-US/apps/gallery/gallery.properties
Executable file
90
gaia/build/test/resources/locales/en-US/apps/gallery/gallery.properties
Executable file
|
|
@ -0,0 +1,90 @@
|
|||
number-selected2 = {[ plural(n) ]}
|
||||
number-selected2[zero] = Select
|
||||
number-selected2[one] = {{ n }} selected
|
||||
number-selected2[two] = {{ n }} selected
|
||||
number-selected2[few] = {{ n }} selected
|
||||
number-selected2[many] = {{ n }} selected
|
||||
number-selected2[other] = {{ n }} selected
|
||||
|
||||
delete-photo? = Delete photo?
|
||||
delete-video? = Delete video?
|
||||
|
||||
# An "item" means a photo or a video
|
||||
# The app currently doesn't use the [zero] case
|
||||
delete-n-items? = {[ plural(n) ]}
|
||||
delete-n-items?[zero] = Nothing selected
|
||||
delete-n-items?[one] = Delete selected item?
|
||||
delete-n-items?[two] = Delete {{ n }} items?
|
||||
delete-n-items?[few] = Delete {{ n }} items?
|
||||
delete-n-items?[many] = Delete {{ n }} items?
|
||||
delete-n-items?[other] = Delete {{ n }} items?
|
||||
|
||||
pickoneimage2 = Select
|
||||
cropimage = Crop
|
||||
|
||||
cancel = Cancel
|
||||
delete = Delete
|
||||
ok = OK
|
||||
edit = Edit
|
||||
save = Save
|
||||
done = Done
|
||||
exposure = Exposure
|
||||
crop = Crop
|
||||
effects = Effects
|
||||
borders = Borders
|
||||
enhance-on = Auto-enhance on
|
||||
enhance-off = Auto-enhance off
|
||||
|
||||
original = Original
|
||||
blackandwhite = B&W
|
||||
sepia = Sepia
|
||||
|
||||
freeform = Freeform
|
||||
portrait = Portrait
|
||||
landscape = Landscape
|
||||
square = Square
|
||||
|
||||
emptygallery2-title = No photos or videos
|
||||
emptygallery2-text = Use the Camera app to get started.
|
||||
emptygallery2-title-pick = No photos
|
||||
|
||||
nocard3-title = No memory card
|
||||
nocard4-text = Insert a memory card to use this app.
|
||||
|
||||
pluggedin2-title = Memory card in use
|
||||
pluggedin2-text = Unplug the phone to use this app.
|
||||
|
||||
scanning-title = Scanning
|
||||
scanning-text = Looking for photos and videos.
|
||||
|
||||
upgrade-title = Database Upgrade
|
||||
upgrade-text = Please wait while Gallery updates its database.
|
||||
|
||||
share-noprovider = Can not share this image file type.
|
||||
|
||||
memorycardfull = Can not edit photos: Memory card is full.
|
||||
|
||||
imagetoobig = Image is too large to display on this device.
|
||||
imageinvalid = Image is invalid or corrupt and cannot be displayed.
|
||||
|
||||
saved = {{filename}} saved to Gallery
|
||||
|
||||
overlay-camera-button = Go to Camera
|
||||
|
||||
name-label = Name
|
||||
size-label = Size
|
||||
image-type-label = Image Type
|
||||
date-taken-label = Date Taken
|
||||
resolution-label = Resolution
|
||||
close-button = Close
|
||||
|
||||
byteUnit-B = Bytes
|
||||
byteUnit-KB = KB
|
||||
byteUnit-MB = MB
|
||||
byteUnit-GB = GB
|
||||
gallery = Gallery
|
||||
preview = Preview
|
||||
|
||||
# Header format used in thumbnail view
|
||||
# see http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
|
||||
date-group-header = %B %Y
|
||||
2
gaia/build/test/resources/locales/en-US/apps/gallery/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/gallery/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Gallery
|
||||
description=Gaia Gallery
|
||||
152
gaia/build/test/resources/locales/en-US/apps/homescreen/homescreen.properties
Executable file
152
gaia/build/test/resources/locales/en-US/apps/homescreen/homescreen.properties
Executable file
|
|
@ -0,0 +1,152 @@
|
|||
# Wrapper
|
||||
wrapper-search-name={{topic}} on {{name}}
|
||||
|
||||
# Dialog that appears when a user long taps on the homescreen
|
||||
contextmenu-add-wallpaper=Change Wallpaper
|
||||
contextmenu-add-smart-collections=Add Smart Collections
|
||||
|
||||
# Prompt that appears when a user tries to delete an app.
|
||||
delete-title=Delete {{name}}
|
||||
delete-body={{name}} and all of its data will be deleted.
|
||||
delete=Delete
|
||||
cancel=Cancel
|
||||
|
||||
# Prompt that appears when a user tries to remove a site saved to the homescreen.
|
||||
remove-title-2=Remove {{name}}
|
||||
remove-body=Remove {{name}} from the homescreen?
|
||||
remove=Remove
|
||||
|
||||
# Landing
|
||||
longDateFormat=%A, %B %e
|
||||
|
||||
# App reinstall
|
||||
download=Download
|
||||
restart-download-title=Restart Download
|
||||
restart-download-body=Do you want to download {{name}}?
|
||||
|
||||
# The following strings are spoken by screen readers and not shown on the
|
||||
# screen.
|
||||
paginationBarText=Page {{current}} of {{total}}
|
||||
paginationScroller.ariaLabel=Homescreen
|
||||
|
||||
# Evme
|
||||
loadingEvme2=Loading…
|
||||
|
||||
#See bug 838634 for why those keys are still here
|
||||
evme-searchbar-default=Everything…
|
||||
evme-searchbar-default2=I’m thinking of…
|
||||
evme-searchbar-default2.placeholder=I’m thinking of…
|
||||
evme-searchbar-clear=Back
|
||||
|
||||
evme-searchbar-default.placeholder=I’m thinking of…
|
||||
evme-searchbar-title=Everything
|
||||
|
||||
# Helper - in search page, under the search bar
|
||||
# See bug 838634 to see why the 2 keys cohabits.
|
||||
evme-helper-default=Enter any topic or search query
|
||||
evme-helper-default2=Enter any topic or keyword
|
||||
|
||||
evme-helper-dismiss=Dismiss
|
||||
evme-helper-no-refine=No options found
|
||||
evme-helper-history-title=History:
|
||||
evme-helper-history-link=History
|
||||
evme-helper-history-clear=Clear history
|
||||
evme-helper-didyoumean-title=Did you mean:
|
||||
evme-helper-refine-title=Did you mean:
|
||||
evme-helper-title-prefix=Everything
|
||||
evme-helper-title-empty=Everything
|
||||
# The following strings are spoken by screen readers and not shown on the
|
||||
# screen.
|
||||
evme-helper-save-search=Add to homescreen
|
||||
evme-helper-unsave-search=Remove from homescreen
|
||||
|
||||
evme-apps-market-download=Download
|
||||
evme-apps-market-more-apps=More Apps
|
||||
|
||||
evme-apps-loading-app=Loading…
|
||||
evme-appsmore-loading=Loading…
|
||||
|
||||
evme-alert-app-install-confirm=Add {{name}} to Home Screen?
|
||||
evme-alert-app-install-exists={{name}} was already added to Home Screen
|
||||
evme-alert-offline-smart-collections-more=Connect to the internet to add more Smart Collections
|
||||
evme-alert-save-wallpaper=Set as wallpaper?
|
||||
evme-alert-no-more-smart-collections=No Smart Collections to add
|
||||
evme-banner-app-install-success={{name}} added to Home Screen
|
||||
evme-banner-save-wallpaper=Wallpaper set successfully
|
||||
|
||||
# Shortcuts - AKA smart collections - evme homepage
|
||||
evme-shortcuts-more=More
|
||||
|
||||
evme-collectionssuggest-loading=Loading…
|
||||
evme-collectionssuggest-loading-cancel=Cancel
|
||||
evme-collectionssuggest-prompt-create-custom=Create your own Smart Collection
|
||||
|
||||
evme-backgroundimage-source-label=Source:
|
||||
|
||||
evme-collection-title-prefix=Everything
|
||||
evme-collection-title-suffix=Phone
|
||||
evme-collection-loading-more=Loading…
|
||||
|
||||
# {{query}} will always be the user's current query from the searchbox
|
||||
evme-connectionmessage-apps=Connect to the internet to get apps for {{query}}
|
||||
evme-connectionmessage-apps-has-installed=Connect to the internet to get even more apps for {{query}}
|
||||
|
||||
# tips are shown throughout the app on certain actions
|
||||
evme-tips-app-explain.innerHTML=Find the things you love with the coolest apps.
|
||||
evme-tips-searchbar-focus.innerHTML=For example, find your favorite singer or band…
|
||||
evme-tips-exact-results.innerHTML=These are the apps for <b>{{query}}</b>,<br /><br /> tap any icon to open it.
|
||||
|
||||
# collection translations
|
||||
evme-shortcut-custom=Custom…
|
||||
evme-shortcut-id-astrology=Astrology
|
||||
evme-shortcut-id-autos=Autos
|
||||
evme-shortcut-id-beauty=Beauty
|
||||
evme-shortcut-id-books=Books
|
||||
evme-shortcut-id-celebs=Celebs
|
||||
evme-shortcut-id-daily-deals=Daily Deals
|
||||
evme-shortcut-id-dating=Dating
|
||||
evme-shortcut-id-electronics=Electronics
|
||||
evme-shortcut-id-email=Email
|
||||
evme-shortcut-id-entertainment=Entertainment
|
||||
evme-shortcut-id-environment=Environment
|
||||
evme-shortcut-id-fashion=Fashion
|
||||
evme-shortcut-id-funny=Funny
|
||||
evme-shortcut-id-games=Games
|
||||
evme-shortcut-id-government=Government
|
||||
evme-shortcut-id-health=Health
|
||||
evme-shortcut-id-jobs=Jobs
|
||||
evme-shortcut-id-local=Local
|
||||
evme-shortcut-id-maps=Maps
|
||||
evme-shortcut-id-movies=Movies
|
||||
evme-shortcut-id-music=Music
|
||||
evme-shortcut-id-new-apps=New Apps
|
||||
evme-shortcut-id-news=News
|
||||
evme-shortcut-id-photography=Photography
|
||||
evme-shortcut-id-recipes=Recipes
|
||||
evme-shortcut-id-restaurants=Restaurants
|
||||
evme-shortcut-id-shopping=Shopping
|
||||
evme-shortcut-id-social=Social
|
||||
evme-shortcut-id-sports=Sports
|
||||
evme-shortcut-id-tech-news=Tech News
|
||||
evme-shortcut-id-top-apps=Top Apps
|
||||
evme-shortcut-id-travel=Travel
|
||||
evme-shortcut-id-tv=TV
|
||||
evme-shortcut-id-video=Video
|
||||
evme-shortcut-id-utilities=Utilities
|
||||
evme-shortcut-id-weather=Weather
|
||||
|
||||
#search contextmenu
|
||||
evme-add-to-top-of-collection=Add to top of collection
|
||||
evme-save-to-homescreen=Save to Homescreen
|
||||
|
||||
# edit dialog
|
||||
edit-dialog-header=Edit
|
||||
edit-dialog-name=Website name
|
||||
edit-dialog-url=Address
|
||||
edit-dialog-cancel=Cancel
|
||||
edit-dialog-done=Done
|
||||
|
||||
# The following strings are spoken by screen readers and not shown on the
|
||||
# screen.
|
||||
evme-close.ariaLabel=Close
|
||||
evme-done.ariaLabel=Save
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Homescreen
|
||||
description=Gaia Homescreen
|
||||
37
gaia/build/test/resources/locales/en-US/apps/keyboard/keyboard.properties
Executable file
37
gaia/build/test/resources/locales/en-US/apps/keyboard/keyboard.properties
Executable file
|
|
@ -0,0 +1,37 @@
|
|||
title=Keyboard
|
||||
|
||||
ok=OK
|
||||
keyboardSettings=Keyboard settings
|
||||
|
||||
vibration=Vibration
|
||||
clickSound=Click sound
|
||||
autoCorrect=Auto correction
|
||||
wordSuggestion=Word suggestion
|
||||
|
||||
# Accessibility strings
|
||||
# LOCALIZATION NOTE (wordSuggestions): The name of the section above the
|
||||
# keyboard where the word suggestions appear. This is read out to screen reader
|
||||
# users when they put a finger in that area.
|
||||
wordSuggestions2.ariaLabel=Word suggestions
|
||||
# LOCALIZATION NOTE (dismiss): The "x" button that closes the word suggestions.
|
||||
dismiss2.ariaLabel=Dismiss
|
||||
|
||||
# Key labels, used by the screen reader to correctly pronounce special and
|
||||
# punctuation keys.
|
||||
alternateLayoutKey2.ariaLabel=more numbers and symbols
|
||||
basicLayoutKey2.ariaLabel=letters
|
||||
upperCaseKey2.ariaLabel=shift
|
||||
backSpaceKey2.ariaLabel=delete
|
||||
spaceKey2.ariaLabel=space
|
||||
returnKey2.ariaLabel=return
|
||||
periodKey2.ariaLabel=period
|
||||
commaKey2.ariaLabel=comma
|
||||
colonKey2.ariaLabel=colon
|
||||
semicolonKey2.ariaLabel=semicolon
|
||||
questionMarkKey2.ariaLabel=question mark
|
||||
exclamationPointKey2.ariaLabel=exclamation point
|
||||
leftBracketKey2.ariaLabel=left bracket
|
||||
rightBracketKey2.ariaLabel=right bracket
|
||||
doubleQuoteKey2.ariaLabel=double quote
|
||||
leftDoubleAngleQuoteKey2.ariaLabel=left double angle quote
|
||||
rightDoubleAngleQuoteKey2.ariaLabel=right double angle quote
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
name=Built-in Keyboard
|
||||
description=Built-in Keyboard
|
||||
number.name=Number
|
||||
number.description=Numeric layout
|
||||
2
gaia/build/test/resources/locales/en-US/apps/music/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/music/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Music
|
||||
description=Gaia Music
|
||||
51
gaia/build/test/resources/locales/en-US/apps/music/music.properties
Executable file
51
gaia/build/test/resources/locales/en-US/apps/music/music.properties
Executable file
|
|
@ -0,0 +1,51 @@
|
|||
music = Music
|
||||
|
||||
mix = Mix
|
||||
playlists = Playlist
|
||||
artists = Artists
|
||||
albums = Albums
|
||||
songs = Songs
|
||||
more = More
|
||||
|
||||
songArtist = Song artist
|
||||
songAlbum = Song album
|
||||
|
||||
unknownArtist = Unknown artist
|
||||
unknownAlbum = Unknown album
|
||||
unknownTitle = Unknown title
|
||||
|
||||
empty-title = Add songs to get started
|
||||
empty-text = Load songs on to the memory card.
|
||||
|
||||
nocard2-title = No memory card found
|
||||
nocard3-text = Insert a memory card to listen to songs.
|
||||
|
||||
pluggedin-title = Music can not be used while phone is plugged in
|
||||
pluggedin-text = Unplug the phone to play music.
|
||||
|
||||
upgrade-title = Database Upgrade
|
||||
upgrade-text = Please wait while Music updates its database.
|
||||
|
||||
search-music.placeholder = Search Music
|
||||
search-cancel = Cancel
|
||||
search-artists = Artists
|
||||
search-albums = Albums
|
||||
search-titles = Tracks
|
||||
search-close = close
|
||||
|
||||
playlists-shuffle-all = Shuffle all
|
||||
playlists-highest-rated = Highest rated
|
||||
playlists-recently-added = Recently added
|
||||
playlists-most-played = Most played
|
||||
playlists-least-played = Least played
|
||||
|
||||
picker-title = Select a track
|
||||
|
||||
save = Save
|
||||
saved = Saved {{title}} to Music
|
||||
|
||||
audioinvalid = Audio cannot be played: format is unsupported or file is invalid.
|
||||
|
||||
overlay-cancel-button = Cancel
|
||||
|
||||
music-paused-notification = Music paused during the call
|
||||
2
gaia/build/test/resources/locales/en-US/apps/pdfjs/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/pdfjs/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=PDF Viewer
|
||||
description=Portable Document Format (PDF) Viewer
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Ringtones
|
||||
description=Gaia Ringtone Picker
|
||||
47
gaia/build/test/resources/locales/en-US/apps/ringtones/ringtones.properties
Executable file
47
gaia/build/test/resources/locales/en-US/apps/ringtones/ringtones.properties
Executable file
|
|
@ -0,0 +1,47 @@
|
|||
##### Ringtone Management ####
|
||||
|
||||
manage-title = Manage Ringtones
|
||||
|
||||
actions-share = Share ringtone
|
||||
actions-delete = Delete ringtone
|
||||
actions-cancel = Cancel
|
||||
|
||||
delete-title = Delete Ringtone
|
||||
delete-desc = Are you sure you want to delete "{{tone}}"?
|
||||
delete-desc-default-ringtone = "{{tone}}" is the current default ringtone.\u000A\u000AAre you sure you want to delete it?
|
||||
delete-desc-default-alerttone = "{{tone}}" is the current default alert.\u000A\u000AAre you sure you want to delete it?
|
||||
delete-cancel = Cancel
|
||||
delete-confirm = Delete
|
||||
deleted-tone = Ringtone deleted.
|
||||
|
||||
created-tone = New ringtone created.
|
||||
set-default-tone = Ringtone set as default.
|
||||
|
||||
##### Ringtone Picking #####
|
||||
|
||||
pick-title = Select Sound
|
||||
pick-done = Done
|
||||
|
||||
##### List Section Headers #####
|
||||
|
||||
list-title-ringtone = Firefox Ringtones
|
||||
list-title-alerttone = Alerts
|
||||
list-title-custom = Custom Ringtones
|
||||
|
||||
#### Ringtone Sharing (creation) #####
|
||||
|
||||
create-title = Create Ringtone
|
||||
create-save = Save
|
||||
create-cancel = Cancel
|
||||
|
||||
play-error-title = Corrupted File
|
||||
play-error-desc = The file is corrupted. It cannot be used to create a ringtone.
|
||||
|
||||
save-error-title = Ringtone Not Created
|
||||
save-error-desc = There was an issue creating the ringtone. Please try again.
|
||||
|
||||
default-label = Use as default ringtone
|
||||
|
||||
ok = OK
|
||||
|
||||
ringtone-untitled = Untitled
|
||||
2
gaia/build/test/resources/locales/en-US/apps/search/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/search/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Search Results
|
||||
description=Search Results
|
||||
15
gaia/build/test/resources/locales/en-US/apps/search/search.properties
Executable file
15
gaia/build/test/resources/locales/en-US/apps/search/search.properties
Executable file
|
|
@ -0,0 +1,15 @@
|
|||
# LOCALIZATION NOTE {{title}} is name of a Marketplace Application to be installed
|
||||
install-marketplace-title = Install {{ title }}
|
||||
history = HISTORY
|
||||
top-sites = TOP SITES
|
||||
suggestions.ariaLabel = Suggestions
|
||||
contacts.ariaLabel = Contacts
|
||||
places.ariaLabel = Places
|
||||
apps.ariaLabel = Apps
|
||||
|
||||
suggestions-notice = Search suggestions are shown as you type. Go to the Homescreen section of Settings to change your search preferences.
|
||||
ok = OK
|
||||
|
||||
add-to-homescreen.label = Add to homescreen
|
||||
|
||||
offline-webresults=Connect to the internet to get apps for {{ searchQuery }}
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Settings
|
||||
description=Gaia Settings
|
||||
1242
gaia/build/test/resources/locales/en-US/apps/settings/settings.properties
Executable file
1242
gaia/build/test/resources/locales/en-US/apps/settings/settings.properties
Executable file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,2 @@
|
|||
name=Shared Tests
|
||||
description=Runs shared tests
|
||||
2
gaia/build/test/resources/locales/en-US/apps/sms/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/sms/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Messages
|
||||
description=Gaia Messages
|
||||
261
gaia/build/test/resources/locales/en-US/apps/sms/sms.properties
Executable file
261
gaia/build/test/resources/locales/en-US/apps/sms/sms.properties
Executable file
|
|
@ -0,0 +1,261 @@
|
|||
# Headers
|
||||
messages = Messages
|
||||
deleteMessages-title = Delete messages
|
||||
|
||||
# Contact title
|
||||
thread-header-text = {[ plural(n) ]}
|
||||
thread-header-text[zero] = {{name}}
|
||||
thread-header-text[one] = {{name}} (+{{n}})
|
||||
thread-header-text[two] = {{name}} (+{{n}})
|
||||
thread-header-text[few] = {{name}} (+{{n}})
|
||||
thread-header-text[many] = {{name}} (+{{n}})
|
||||
thread-header-text[other] = {{name}} (+{{n}})
|
||||
|
||||
# Edit Mode
|
||||
edit = Edit
|
||||
back = Back
|
||||
cancel = Cancel
|
||||
undo = Undo
|
||||
done = Done
|
||||
delete = Delete
|
||||
deleting-messages = Deleting…
|
||||
select-all = Select all
|
||||
deselect-all = Deselect all
|
||||
selected = {[ plural(n) ]}
|
||||
selected[zero] = none selected
|
||||
selected[one] = {{n}} selected
|
||||
selected[two] = {{n}} selected
|
||||
selected[few] = {{n}} selected
|
||||
selected[many] = {{n}} selected
|
||||
selected[other] = {{n}} selected
|
||||
|
||||
# Options menu
|
||||
deleteMessages-label = Delete Messages
|
||||
settings = Settings
|
||||
add-subject = Add subject
|
||||
remove-subject = Remove subject
|
||||
|
||||
# New Message
|
||||
to = To:
|
||||
send = Send
|
||||
new = New
|
||||
message = Message
|
||||
messagesInput_placeholder = Message
|
||||
messagesSubjectInput_placeholder = Subject
|
||||
converted-to-mms = Converting to multimedia message.
|
||||
converted-to-sms = Converting to text message.
|
||||
messages-max-length-text = You’ve reached the maximum length.
|
||||
messages-max-subject-length-text = Maximum length of subject reached.
|
||||
message-exceeded-max-length = You’ve exceeded the maximum size. Remove attachments or shorten the message to send it.
|
||||
newMessage = New message
|
||||
sendMessage = Send message
|
||||
no-recipient = (No recipient)
|
||||
recipient = {[ plural(n) ]}
|
||||
recipient[one] = {{n}} recipient
|
||||
recipient[two] = {{n}} recipients
|
||||
recipient[few] = {{n}} recipients
|
||||
recipient[many] = {{n}} recipients
|
||||
recipient[other] = {{n}} recipients
|
||||
attachmentSize = {{n}} KB
|
||||
attachmentSizeMB = {{n}} MB
|
||||
attachmentOpenError = There is no application available to open this file type.
|
||||
# Dialog to disambiguate in a new message
|
||||
remove = Remove
|
||||
|
||||
# Group participants
|
||||
participant = {[ plural(n) ]}
|
||||
participant[one] = {{n}} participant
|
||||
participant[two] = {{n}} participants
|
||||
participant[few] = {{n}} participants
|
||||
participant[many] = {{n}} participants
|
||||
participant[other] = {{n}} participants
|
||||
|
||||
# Message report
|
||||
message-report = Message report
|
||||
message-type-sms = Text Message (SMS)
|
||||
message-type-mms = Multimedia Message (MMS)
|
||||
sms-report-description = Your Text Message (SMS), was sent on {{datetime}}
|
||||
mms-report-description = Your Multimedia Message (MMS), subject {{subject}}, was sent on {{datetime}}
|
||||
mms-no-subject-report-description = Your Multimedia Message (MMS), was sent on {{datetime}}
|
||||
message-status = Status:
|
||||
message-status-sent = sent
|
||||
message-status-received = received
|
||||
message-status-sending = sending
|
||||
message-status-error = error
|
||||
message-status-not-downloaded = not downloaded
|
||||
message-delivered = Delivered:
|
||||
message-read-title = Read:
|
||||
message-requested = Requested
|
||||
message-size-was = Message size:
|
||||
report-dateTimeFormat = %e %B %Y, {{shortTimeFormat}}
|
||||
report-recipients = Recipients:
|
||||
report-from = From:
|
||||
message-sent = Sent:
|
||||
message-received = Received:
|
||||
message-via = Via:
|
||||
|
||||
# Search functionality
|
||||
search = Search
|
||||
unknown-contact = Unknown
|
||||
|
||||
# LOCALIZATION NOTE(phone-type-separator): used to separate phone type from
|
||||
# the number itself. It should be consistent with the characters used in
|
||||
# "thread- header", \u20 is a blank space (,\u20 is equivalent to ", "). It can
|
||||
# be used together with "phone-carrier-separator" if carrier is available.
|
||||
# Resulting example for en-US: "Mobile, +123456789" or if carrier is available
|
||||
# "Mobile, +123456789 Carrier".
|
||||
phone-type-separator = ,\u20
|
||||
|
||||
# LOCALIZATION NOTE(phone-carrier-separator): used to separate carrier's name
|
||||
# from the number itself. \u20 is a blank space. Resulting example for en-US:
|
||||
# "+123456789 Verizon".
|
||||
phone-carrier-separator = \u20
|
||||
|
||||
# Modal Dialogs
|
||||
replace-draft = Replace existing Draft
|
||||
save-as-draft = Save as Draft
|
||||
discard-message = Discard
|
||||
discard-sms = Are you sure you want to discard this message?
|
||||
discard-new-message = Discard the message you’re composing and open the new message?
|
||||
resend-confirmation = The message could not be sent. Try again?
|
||||
resend-message = Resend this message
|
||||
deleteMessages-confirmation = Delete selected messages?
|
||||
deleteThreads-confirmation2 = Delete selected message threads?
|
||||
new-message-notice-text = New message from
|
||||
new-message-notice-a-text = Read it
|
||||
noMessages-title = No messages
|
||||
noMessages-text = Start communicating now
|
||||
sendDefaultErrorTitle = Message not sent
|
||||
sendDefaultErrorBody = There was a problem sending the message. Please try again.
|
||||
sendDefaultErrorBtnOk = OK
|
||||
sendMissingSimCardTitle = Missing SIM card
|
||||
sendMissingSimCardBody = Insert a valid SIM card to continue.
|
||||
sendMissingSimCardBtnOk = OK
|
||||
sendFlightModeTitle = Airplane mode activated
|
||||
sendFlightModeBody = Turn off airplane mode to send messages.
|
||||
sendFlightModeBtnOk = OK
|
||||
fdnBlocked2Title = FDN active
|
||||
#LOCALIZATION NOTE (fdnBlocked2Body): the English translation does not need the
|
||||
# actual number of phone numbers. If your translation needs it, you can still add it
|
||||
# using the parameter {{ n }}. Also take into account that you could add HTML so be
|
||||
# careful with the content, it may affect to the whole app.
|
||||
fdnBlocked2Body.innerHTML = {[ plural(n) ]}
|
||||
fdnBlocked2Body.innerHTML[one] = FDN (Fixed Dialing Numbers) is activated. Make sure the SMS center and the following recipient are in your FDN list:<br />{{ numbers }}
|
||||
fdnBlocked2Body.innerHTML[two] = FDN (Fixed Dialing Numbers) is activated. Make sure the SMS center and the following recipients are in your FDN list:<br />{{ numbers }}
|
||||
fdnBlocked2Body.innerHTML[few] = FDN (Fixed Dialing Numbers) is activated. Make sure the SMS center and the following recipients are in your FDN list:<br />{{ numbers }}
|
||||
fdnBlocked2Body.innerHTML[many] = FDN (Fixed Dialing Numbers) is activated. Make sure the SMS center and the following recipients are in your FDN list:<br />{{ numbers }}
|
||||
fdnBlocked2Body.innerHTML[other] = FDN (Fixed Dialing Numbers) is activated. Make sure the SMS center and the following recipients are in your FDN list:<br />{{ numbers }}
|
||||
fdnBlocked2BtnOk = OK
|
||||
switchSimToRetrieveTitle = Switch data connection
|
||||
switchSimToRetrieveBody = Switch the data connection to SIM {{ nonActiveSimId }} to retrieve the MMS. The current data transfer on SIM {{ activeSimId }} will be suspended. Continue anyway?
|
||||
switchSimToRetrieveBtnOk = Later
|
||||
switchSimToRetrieveConfirm = OK
|
||||
# no need to retranslate title and buttons if not necessary
|
||||
switchSimToSendTitle = {{switchSimToRetrieveTitle}}
|
||||
switchSimToSendBody = Switch the data connection to SIM {{ nonActiveSimId }} to send the MMS. The current data transfer on SIM {{ activeSimId }} will be suspended. Continue anyway?
|
||||
switchSimToSendBtnOk = {{switchSimToRetrieveBtnOk}}
|
||||
switchSimToSendConfirm = {{switchSimToRetrieveConfirm}}
|
||||
sendNoSignalErrorTitle = No network coverage
|
||||
sendNoSignalErrorBody = Make sure you have a mobile signal and try again.
|
||||
sendNoSignalErrorBtnOk = OK
|
||||
sendNotFoundErrorTitle = Message not found
|
||||
sendNotFoundErrorBody = The message you’re looking for is no longer available.
|
||||
sendNotFoundErrorBtnOk = OK
|
||||
sendInvalidAddressErrorTitle = Invalid number
|
||||
sendInvalidAddressErrorBody = Make sure the mobile number you’re sending to is valid.
|
||||
sendInvalidAddressErrorBtnOk = OK
|
||||
simNotMatchedErrorTitle = Unable to download
|
||||
simNotMatchedErrorBody = Please make sure the SIM card inserted is the one used to receive this message.
|
||||
simNotMatchedErrorBtnOk = OK
|
||||
deleted-sms = This message has already been deleted.
|
||||
view-attachment-image = View
|
||||
view-attachment-audio = Listen
|
||||
view-attachment-video = View
|
||||
view-attachment-other = View
|
||||
remove-attachment-image = Remove image
|
||||
remove-attachment-audio = Remove audio
|
||||
remove-attachment-video = Remove video
|
||||
remove-attachment-other = Remove attachment
|
||||
replace-attachment-image = Replace image
|
||||
replace-attachment-audio = Replace audio
|
||||
replace-attachment-video = Replace video
|
||||
replace-attachment-other = Replace attachment
|
||||
unsent-message-title = Unsent Message
|
||||
unsent-message-description = Your previous message was not sent. Do you want to edit the unsent message or discard it and continue?
|
||||
unsent-message-option-edit = Edit
|
||||
unsent-message-option-discard = Discard
|
||||
message-options = Message options
|
||||
forward = Forward
|
||||
view-message-report = View message report
|
||||
# Labels for contact fields
|
||||
mobile = Mobile
|
||||
home = Home
|
||||
work = Work
|
||||
personal = Personal
|
||||
faxHome = Fax home
|
||||
faxOffice = Fax office
|
||||
faxOther = Fax other
|
||||
another = Another
|
||||
other = Other
|
||||
|
||||
# Date and time
|
||||
today = today
|
||||
yesterday = yesterday
|
||||
incorrectDate = (incorrect date)
|
||||
|
||||
#Phone Context Menu
|
||||
addToExistingContact = Add to an existing contact
|
||||
createNewContact = Create new contact
|
||||
viewContact = View contact
|
||||
call = Call
|
||||
sendEmail = Send email
|
||||
|
||||
# MMS message
|
||||
mms-message = MMS message
|
||||
notDownloaded-title = Message is not downloaded yet.
|
||||
# LOCALIZATION NOTE (not-downloaded-attachment, expired-attachment):
|
||||
# {{date}} is replaced at run-time with a date. The format used to display
|
||||
# this date is specified in the string with ID 'expiry-date-format'.
|
||||
not-downloaded-attachment = Attachment can be downloaded until {{date}}.
|
||||
expired-attachment = Sorry, the message expired on {{date}} and cannot be downloaded.
|
||||
download-attachment = Download
|
||||
downloading-attachment = Downloading…
|
||||
unnamed-attachment = untitled
|
||||
# LOCALIZATION NOTE (mms-label): This label is used to identify MMS in message
|
||||
# composer (above the send button) and in the thread list for the thread with
|
||||
# MMS as the last message.
|
||||
mms-label = MMS
|
||||
|
||||
# LOCALIZATION NOTE (files-too-large): the English translation does not need the
|
||||
# actual number of files. If your translation needs it, you can still add it
|
||||
# using the parameter {{ n }}.
|
||||
files-too-large = {[ plural(n) ]}
|
||||
files-too-large[zero] = The file you have selected is too large.
|
||||
files-too-large[one] = The file you have selected is too large.
|
||||
files-too-large[two] = The files you have selected are too large.
|
||||
files-too-large[few] = The files you have selected are too large.
|
||||
files-too-large[many] = The files you have selected are too large.
|
||||
files-too-large[other] = The files you have selected are too large.
|
||||
resize-image = Resizing the attached image
|
||||
no-attachment-text = There is a problem with the attached file and it cannot be downloaded.
|
||||
|
||||
# Draft Saved
|
||||
message-draft-saved = Message saved as draft
|
||||
|
||||
# some DSDS related localizations
|
||||
sim-id-label = SIM {{id}}
|
||||
dsds-notification-title-with-sim = ({{sim}}) {{sender}}
|
||||
# LOCALIZATION NOTE (send-button-sim-indication): don't localize the
|
||||
# sim-indication itself as we use it to show the SIM number only. Yet obviously,
|
||||
# the "ariaLabel" needs to be localized.
|
||||
send-button-sim-indication = {{n}}
|
||||
send-button-sim-indication.ariaLabel = using SIM {{n}}
|
||||
|
||||
# Date formats specific for SMS app
|
||||
|
||||
# LOCALIZATION NOTE (expiry-date-format): this is a date format.
|
||||
# See http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
|
||||
# %A is the full weekday name from shared/date/date.properties and it might
|
||||
# not be in the correct grammatical case. To work around this issue, you can
|
||||
# use a different format like "%m/%d/%Y".
|
||||
expiry-date-format = %A, %b %e
|
||||
106
gaia/build/test/resources/locales/en-US/apps/system/fxa/fxa.properties
Executable file
106
gaia/build/test/resources/locales/en-US/apps/system/fxa/fxa.properties
Executable file
|
|
@ -0,0 +1,106 @@
|
|||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Navigation
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
firefox-accounts-title = Firefox Accounts
|
||||
fxa-next = Next
|
||||
fxa-back = Back
|
||||
fxa-done = Done
|
||||
fxa-ok = OK
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Errors
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# 'spec' references below refer to the spec attached to bug 960130
|
||||
|
||||
# this is a real error screen (7.2 in spec)
|
||||
fxa-connection-error-title = Unable to Connect
|
||||
fxa-connection-error-message = You can create an account or sign in from Settings.
|
||||
|
||||
# this is a real error screen (5.4 in spec)
|
||||
fxa-reset-password-error-title = Reset Password
|
||||
fxa-reset-password-error-message = You can reset your password from Settings.
|
||||
|
||||
# this is a real error screen (19.4 in spec)
|
||||
fxa-coppa-failure-error-title = Cannot Create Account
|
||||
fxa-coppa-failure-error-message = You must meet certain age requirements to create a Firefox Account. {{learnmore}}
|
||||
# LOCALIZATION NOTE(fxa-learn-more): This string corresponds to the {{learnmore}}
|
||||
# placeholder in fxa-coppa-failure-error-message.
|
||||
fxa-learn-more = Learn more
|
||||
|
||||
# this is a real error screen (13.2 and 17.2 in spec)
|
||||
fxa-offline-error-title = Unable to Connect
|
||||
fxa-offline-error-message = Please connect to a network from Settings.
|
||||
|
||||
# this is a real error screen (3.2 in spec)
|
||||
fxa-invalid-email-title = Error
|
||||
fxa-invalid-email-message = Please enter a valid email.
|
||||
|
||||
# this is a real error screen (5.2 / 11.1 in spec)
|
||||
fxa-invalid-password-title = Invalid Password
|
||||
fxa-invalid-password-message = Please check your password and try again.
|
||||
|
||||
# this is the fallback error
|
||||
fxa-unknown-error-title = Unable to Connect
|
||||
fxa-unknown-error-message = System unavailable, try again soon.
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Interstitial screen
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
fxa-connecting = Connecting
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Enter Email
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
fxa-enter-email-input.placeholder = Enter your email
|
||||
fxa-use-email-to-sign-in = Use your email address to create an account or sign in.
|
||||
fxa-notice = By proceeding, I agree to the {{tos}} and {{pn}} of Firefox cloud services.
|
||||
# LOCALIZATION NOTE(fxa-tos): This string corresponds to the {{tos}} placeholder
|
||||
# in fxa-notice.
|
||||
fxa-tos = Terms of Service
|
||||
# LOCALIZATION NOTE(fxa-pn): This string corresponds to the {{pn}} placeholder
|
||||
# in fxa-notice.
|
||||
fxa-pn = Privacy Notice
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Set & Enter Password
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
fxa-create-password-title = Create a Password
|
||||
fxa-enter-password-title = Enter Your Password
|
||||
fxa-hello-user = Hello, {{email}}
|
||||
fxa-password-refresh = Please enter your Firefox Account password to continue.
|
||||
fxa-password.placeholder = Password
|
||||
fxa-forgot-your-password = Forgot your password?
|
||||
fxa-show-password = Show password
|
||||
fxa-password-length-requirement = Your password must be at least 8 characters long.
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Signin success
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
fxa-success = Success!
|
||||
fxa-ready-to-go = Your Firefox Account is ready to go!
|
||||
fxa-use-features = Now you can use features like Find My Device and apps like the Firefox Marketplace.
|
||||
fxa-access-manage-account-settings = In the future, you can access and manage your account from Settings.
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Signup success
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
fxa-confirm-account = Confirm Your Account
|
||||
fxa-will-send-email = We will send an email to: {{email}}
|
||||
fxa-signup-click-verification-link-in-email = Next time you check your email, click the verification link to confirm your Firefox Account.
|
||||
|
||||
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# COPPA
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
fxa-age-verification = Age Verification
|
||||
fxa-age-1990-earlier = 1990 or earlier
|
||||
fxa-year-of-birth = Year of Birth
|
||||
2
gaia/build/test/resources/locales/en-US/apps/system/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/system/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=System
|
||||
description=Main System
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
# Mobile Identity
|
||||
#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
|
||||
|
||||
# Button status
|
||||
share = Share
|
||||
resend = Resend
|
||||
connecting = Connecting
|
||||
verify = Verify
|
||||
verifying = Verifying
|
||||
verified = Verified
|
||||
|
||||
# Explanation of every step
|
||||
mobileIDExplanation = {{app_name}} would like to know and verify your phone number. Please choose which one you want to share or enter a new one.
|
||||
verificationCodeExplanation = We’ve sent a code to {{phone_number}}. We’ll try to pick it up automatically, but you’ll have to enter it manually if it’s not in use in this device.
|
||||
successMessage = Awesome! Your number {{phone_number}} is now verified and available to {{app_name}}.
|
||||
|
||||
# Errors
|
||||
serverErrorMessage = The verification server is unavailable at this time. Please check your Internet connection, try again or wait a few minutes.
|
||||
timeoutErrorMessage = There seems to be a problem with your verification code. Let's try once again!
|
||||
errorTitle = Mobile identity
|
||||
ok = OK
|
||||
|
||||
# Options when typing a phone number
|
||||
addPhoneNumber = Or add your phone number
|
||||
selectPhoneNumber = Or select a phone number from the list
|
||||
584
gaia/build/test/resources/locales/en-US/apps/system/system.properties
Executable file
584
gaia/build/test/resources/locales/en-US/apps/system/system.properties
Executable file
|
|
@ -0,0 +1,584 @@
|
|||
ok=OK
|
||||
back=Back
|
||||
help=Help
|
||||
cancel=Cancel
|
||||
close=Close
|
||||
skip=Skip
|
||||
clear.ariaLabel=Clear
|
||||
|
||||
# LOCALIZATION NOTE(undo.ariaLabel): The following string is spoken by screen
|
||||
# readers and not shown on the screen.
|
||||
undo.ariaLabel = Undo
|
||||
|
||||
# utility tray mobile states
|
||||
airplaneMode=Airplane mode
|
||||
searching=Searching…
|
||||
noNetwork=No network
|
||||
roaming={{operator}} (Roaming)
|
||||
operator-info={{carrier}} {{region}}
|
||||
emergencyCallsOnly = Emergency calls only
|
||||
emergencyCallsOnly-unknownSIMState = (unknown SIM state)
|
||||
emergencyCallsOnly-noSIM = (no SIM)
|
||||
emergencyCallsOnly-pinRequired = (SIM PIN required)
|
||||
emergencyCallsOnly-pukRequired = (SIM PUK required)
|
||||
emergencyCallsOnly-networkLocked = (network locked)
|
||||
emergencyCallsOnly-serviceProviderLocked = (service provider locked)
|
||||
emergencyCallsOnly-corporateLocked = (corporate locked)
|
||||
emergencyCallsOnly-network1Locked = (network1 locked)
|
||||
emergencyCallsOnly-network2Locked = (network2 locked)
|
||||
emergencyCallsOnly-hrpdNetworkLocked = (hrpd network locked)
|
||||
emergencyCallsOnly-ruimCorporateLocked = (ruim corporate locked)
|
||||
emergencyCallsOnly-ruimServiceProviderLocked = (ruim service provider locked)
|
||||
enterPIN=Enter PIN
|
||||
mediaPlaybackTitle.ariaLabel=Title
|
||||
mediaPlaybackArtist.ariaLabel=Artist
|
||||
mediaPlaybackControls.ariaLabel=Playback controls
|
||||
mediaPlaybackPrevious.ariaLabel=Previous
|
||||
mediaPlaybackPlay=Play
|
||||
mediaPlaybackPause=Pause
|
||||
mediaPlaybackNext.ariaLabel=Next
|
||||
wifiButton-on=Wi-Fi on
|
||||
wifiButton-on-initializing= Wi-Fi on, initializing
|
||||
wifiButton-off=Wi-Fi off
|
||||
dataButton-on=Data {{type}} on
|
||||
dataButton-off=Data {{type}} off
|
||||
bluetoothButton-on=Bluetooth on
|
||||
bluetoothButton-on-initializing= Bluetooth on, initializing
|
||||
bluetoothButton-off=Bluetooth off
|
||||
airplaneMode-on=Airplane mode on
|
||||
airplaneMode-off=Airplane mode off
|
||||
settingsButton.ariaLabel=Settings
|
||||
utilityTrayGrippy.ariaLabel=Close utility tray
|
||||
|
||||
# status bar text label
|
||||
statusbarLabel={{date}}, {{operator}}
|
||||
# see http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
|
||||
statusbarDateFormat=%b %e
|
||||
# The following statusbar messages are for screen reader accessibility.
|
||||
statusbar.ariaLabel=Status Bar
|
||||
statusbarBattery=Battery {{level}} percent
|
||||
statusbarBatteryCharging=Battery {{level}} percent, charging
|
||||
statusbarFlightMode.ariaLabel=Airplane mode on
|
||||
statusbarWiFiConnecting=Wi-Fi: connecting
|
||||
statusbarWiFiConnected=Wi-Fi: {{level}} of 4 bars
|
||||
statusbarSignal={{operator}} network, {{level}} of 5 bars
|
||||
statusbarSignalRoaming={{operator}} network (roaming), {{level}} of 5 bars
|
||||
statusbarSignalNoneSearching=Searching… Emergency calls only
|
||||
statusbarHeadphones.ariaLabel=Headphones on
|
||||
statusbarBluetoothHeadphones.ariaLabel=Bluetooth headphones on
|
||||
statusbarBluetoothTransferring.ariaLabel=Bluetooth transfer active
|
||||
statusbarIconOn-tethering=Tethering on
|
||||
statusbarIconOnActive-tethering=Tethering on, active
|
||||
statusbarAlarm.ariaLabel=Alarm on
|
||||
statusbarIconOn-bluetooth=Bluetooth on
|
||||
statusbarIconOnActive-bluetooth=Bluetooth on, active
|
||||
statusbarIconOn-mute=Mute on
|
||||
statusbarIconOn-vibration=Vibration on
|
||||
statusbarRecording.ariaLabel=Recording on
|
||||
statusbarGeolocation.ariaLabel=Geolocation on
|
||||
statusbarUsb.ariaLabel=USB on
|
||||
statusbarForwarding=Call forwarding on
|
||||
statusbarPlaying.ariaLabel=Media playing
|
||||
statusbarNfc.ariaLabel=NFC on
|
||||
statusbarDownloads.ariaLabel=Downloading…
|
||||
statusbarNetworkActivity.ariaLabel=Networking on
|
||||
statusbarEmergencyCBNotification.ariaLabel=Emergency callback
|
||||
statusbarNotifications={[ plural(n) ]}
|
||||
statusbarNotifications[one]={{n}} notification
|
||||
statusbarNotifications[two]={{n}} notifications
|
||||
statusbarNotifications[few]={{n}} notifications
|
||||
statusbarNotifications[many]={{n}} notifications
|
||||
statusbarNotifications[other]={{n}} notifications
|
||||
statusbarNotifications-unread={[ plural(n) ]}
|
||||
statusbarNotifications-unread[one]={{n}} unread notification
|
||||
statusbarNotifications-unread[two]={{n}} unread notifications
|
||||
statusbarNotifications-unread[few]={{n}} unread notifications
|
||||
statusbarNotifications-unread[many]={{n}} unread notifications
|
||||
statusbarNotifications-unread[other]={{n}} unread notifications
|
||||
|
||||
# notifications
|
||||
notifications=Notifications
|
||||
clear-all=Clear all
|
||||
|
||||
# Attention Screen
|
||||
attentionScreen-tapToShow = Tap to show
|
||||
|
||||
# voice mails
|
||||
newVoicemails={[ plural(n) ]}
|
||||
newVoicemails[zero] = No new voicemail
|
||||
newVoicemails[one] = One new voicemail
|
||||
newVoicemails[two] = {{n}} new voicemails
|
||||
newVoicemails[few] = {{n}} new voicemails
|
||||
newVoicemails[many] = {{n}} new voicemails
|
||||
newVoicemails[other] = {{n}} new voicemails
|
||||
newVoicemailsUnknown = New voicemail
|
||||
dialNumber = Dial {{number}}
|
||||
voicemailNotificationMultiSim = (SIM {{n}}) {{title}}
|
||||
|
||||
# NFC Bluetooth Connect
|
||||
confirmNFCConnectBTenabledNameUnknown = Are you sure you want to connect to the device?
|
||||
confirmNFCConnectBTdisabledNameUnknown = Turn on Bluetooth and connect to the device?
|
||||
confirmNFCConnectBTenabledNameKnown = Are you sure you want to connect to {{deviceName}}?
|
||||
confirmNFCConnectBTdisabledNameKnown = Turn on Bluetooth and connect to {{deviceName}}?
|
||||
confirmNFCConnectBTdisabled = Turn on
|
||||
dismissNFCConnectBTdisabled = Cancel
|
||||
confirmation = Confirmation
|
||||
|
||||
# sleep menu
|
||||
deviceMenu=Phone
|
||||
airplane=Turn on airplane mode
|
||||
airplaneOff=Turn off airplane mode
|
||||
silent=Silence incoming calls
|
||||
normal=Ring incoming calls
|
||||
restart=Restart
|
||||
power=Power off
|
||||
|
||||
# screen reader
|
||||
enableScreenReaderSteps=To enable screen reader, press volume up then volume down buttons three more times
|
||||
disableScreenReaderSteps=To disable screen reader, press volume up then volume down buttons three more times
|
||||
|
||||
# cards view
|
||||
no-recent-apps=No recent apps
|
||||
|
||||
# permissions
|
||||
# LOCALIZATION NOTE: this is displayed in a permission request dialog box,
|
||||
# see shared/permissions/permissions.properties for more context.
|
||||
yes=Yes
|
||||
no=No
|
||||
dontallow=Don’t allow
|
||||
allow=Allow
|
||||
dontshare-geolocation=Don’t Share
|
||||
share-geolocation=Share
|
||||
dontshare-audio-capture=Don’t Share
|
||||
share-audio-capture=Share
|
||||
dontshare-video-capture=Don’t Share
|
||||
share-video-capture=Share
|
||||
dontshare-media-capture=Don’t Share
|
||||
share-media-capture=Share
|
||||
device-front=Front Camera
|
||||
device-back=Back Camera
|
||||
remember-my-choice=Remember my choice
|
||||
more-info=More info…
|
||||
hide-info=Hide info
|
||||
|
||||
# App install
|
||||
install-app=Install {{name}}?
|
||||
size=Size
|
||||
author=Author
|
||||
size-unknown=Unknown
|
||||
author-unknown=Unknown
|
||||
install=Install
|
||||
bytes=bytes
|
||||
kB=KB
|
||||
MB=MB
|
||||
GB=GB
|
||||
TB=TB
|
||||
PB=PB
|
||||
app-install-generic-error={{ appName }} download stopped
|
||||
app-install-download-failed={{ appName }} download failed
|
||||
app-install-install-failed={{ appName }} install failed
|
||||
cancelling-will-not-refund=Cancelling will not refund a purchase. Refunds for paid content are provided by the original seller.
|
||||
apps-can-be-installed-later=Apps can be installed later from the original installation source.
|
||||
are-you-sure-you-want-to-cancel=Are you sure you want to cancel this install?
|
||||
# LOCALIZATION NOTE (cancel-install*): cancel-install is the string used in
|
||||
# the title, cancel-install-button is used in the bottom-left button
|
||||
cancel-install=Cancel Install
|
||||
cancel-install-button=Cancel Install
|
||||
resume=Resume
|
||||
continue=Continue
|
||||
stopDownloading=Stop downloading {{ app }}?
|
||||
app-download-can-be-restarted=The download can be restarted later.
|
||||
app-download-stop-button=Stop Download
|
||||
not-enough-space=Not enough space
|
||||
not-enough-space-message=There is not enough space to install this app. Free up space by deleting old apps or media, and try installing again from the original source.
|
||||
app-install-success={{ appName }} installed
|
||||
|
||||
#setup dialog
|
||||
setup=Setup
|
||||
|
||||
#ime
|
||||
ime-addkeyboards=Add keyboards
|
||||
|
||||
# update manager
|
||||
later=Later
|
||||
download=Download
|
||||
wantToDownload=Download update now?
|
||||
wantToInstall=Install update now?
|
||||
installNow=Install Now
|
||||
notNow=Not Now
|
||||
# the <span> element will be displayed when the download finishes
|
||||
downloadingUpdateMessage.innerHTML=Downloading updates… <span>{{ progress }} downloaded.</span>
|
||||
downloadingAppMessage=Downloading {{ appName }}
|
||||
downloadingAppProgressNoMax={{ progress }} downloaded
|
||||
downloadingAppProgressIndeterminate=Downloading
|
||||
downloadingAppProgress={{ progress }} / {{ max }} downloaded
|
||||
cancelAllDownloads=Cancel all downloads
|
||||
wantToCancelAll=Are you sure you want to cancel all downloads?
|
||||
downloadError=There was an error while downloading the updates.
|
||||
updateAvailableInfo.innerHTML = {[ plural(n) ]}
|
||||
updateAvailableInfo.innerHTML[one] = {{ n }} update available. <span>Tap for more info.</span>
|
||||
updateAvailableInfo.innerHTML[two] = {{ n }} updates available. <span>Tap for more info.</span>
|
||||
updateAvailableInfo.innerHTML[few] = {{ n }} updates available. <span>Tap for more info.</span>
|
||||
updateAvailableInfo.innerHTML[many] = {{ n }} updates available. <span>Tap for more info.</span>
|
||||
updateAvailableInfo.innerHTML[other] = {{ n }} updates available. <span>Tap for more info.</span>
|
||||
numberOfUpdates={[ plural(n) ]}
|
||||
numberOfUpdates[one]={{ n }} update available
|
||||
numberOfUpdates[two]={{ n }} updates available
|
||||
numberOfUpdates[few]={{ n }} updates available
|
||||
numberOfUpdates[many]={{ n }} updates available
|
||||
numberOfUpdates[other]={{ n }} updates available
|
||||
systemUpdate=System update
|
||||
systemUpdateReady=System Update Ready
|
||||
# LOCALIZATION NOTE (systemUpdateLowBatteryThreshold): {{ threshold }} will be
|
||||
# replaced at runtime by the minimum level of the battery needed to update,
|
||||
# resulting for example in "You need at least 40% battery level to install the
|
||||
# update."
|
||||
systemUpdateLowBatteryThreshold=You need at least {{ threshold }}% battery level to install the update.
|
||||
required=Required
|
||||
uncompressingMessage.innerHTML=Uncompressing… <span>This can take a few minutes.</span>
|
||||
downloadNoWifiWarning=Wi-Fi unavailable. Updating over current connection may incur additional charges.
|
||||
downloadOfflineWarning=Connection unavailable. Connect to a network to download updates.
|
||||
downloadDataConnectionWarning=Updates are downloaded via data connection when Wi-Fi is not available. Additional data charges may apply.
|
||||
downloadUpdatesViaDataConnection=Download updates via data connection?
|
||||
downloadUpdatesViaDataConnectionMessage=Updates are downloaded via data connection when Wi-Fi is not available. When using data connection, phone calls may be blocked and additional charges may also apply.
|
||||
|
||||
# screenshots
|
||||
screenshotSaved = Screenshot saved to Gallery
|
||||
screenshotFailed = The screenshot could not be saved
|
||||
screenshotNoSDCard = No memory card found
|
||||
screenshotSDCardInUse = Memory card is in use
|
||||
screenshotSDCardLow = Not enough space on memory card
|
||||
|
||||
# lock screen
|
||||
emergency-call-button=Emergency Call
|
||||
emergency-call=Emergency Call
|
||||
unlock-a11y-button.ariaLabel=Unlock
|
||||
camera-a11y-button.ariaLabel=Camera
|
||||
# see http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
|
||||
longDateFormat=%A, %B %e
|
||||
# LOCALIZATION NOTE(panel-passcode.ariaLabel): The following string is spoken by
|
||||
# screen readers and not shown on the screen.
|
||||
panel-passcode.ariaLabel = Passcode panel
|
||||
lockscreen-sim-id = SIM {{ n }}
|
||||
|
||||
#software buttons
|
||||
softwareHomeButton.ariaLabel=Home
|
||||
|
||||
# system dialogs
|
||||
login=Sign in
|
||||
username=Username
|
||||
password=Password
|
||||
http-authentication-message=A username and password are being requested by {{host}}. The site says: “{{realm}}”
|
||||
error-message={{name}} is not loading properly
|
||||
error-title={{name}} is having problems
|
||||
airplane-is-on=Airplane mode is on
|
||||
airplane-is-turned-on={{name}} requires a network connection. Turn off airplane mode from Settings and connect to a Wi-Fi or mobile data network.
|
||||
server-not-found=Server not found
|
||||
server-not-found-error=Can’t find the server at {{name}}.
|
||||
file-not-found=File not found
|
||||
file-not-found-error=The device can’t display this page because the file cannot be found.
|
||||
connection-failed=Unable to connect
|
||||
connection-failed-error=A network error occurred while trying to reach the site.
|
||||
invalid-connection=Unable to connect
|
||||
invalid-connection-error=A network error occurred while trying to reach the site.
|
||||
malformed-uri=URL not valid
|
||||
malformed-uri-error=The URL entered is not valid and cannot be loaded.
|
||||
redirect-loop=Can’t display page
|
||||
redirect-loop-error=The device can’t display this page because the page is not redirecting properly. Try this page again at a later time.
|
||||
not-cached=Page expired
|
||||
not-cached-error=As a security precaution, this page cannot be displayed by the device because it has expired.
|
||||
is-printing-error=The document cannot change while Printing or in Print Preview.
|
||||
denied-port-access=This address is restricted
|
||||
denied-port-access-error=This address uses a network port which is normally used for purposes other than Web browsing. The device has cancelled the request for your protection.
|
||||
proxy-resolve-failure=Proxy Server Error
|
||||
proxy-resolve-failure-error=The device is configured to use a proxy server that can’t be found.
|
||||
proxy-connect-failure=Proxy Server Error
|
||||
proxy-connect-failure-error=The device is configured to use a proxy server that is refusing connections.
|
||||
content-encoding=Can’t display page
|
||||
content-encoding-error=The device can’t display this page because a content encoding error occurred.
|
||||
remote-xul=Page unsupported
|
||||
remote-xul-error=This page can’t be displayed because it uses a technology that is not supported on the device.
|
||||
phishing-blocked=Warning
|
||||
phishing-blocked-error=The website has been reported as a web forgery designed to trick users into sharing personal or financial information.
|
||||
malware-blocked=Malware attack blocked
|
||||
malware-blocked-error=The site at has been reported as an attack site and has been blocked.
|
||||
unsafe-content-type=Unsafe content
|
||||
unsafe-content-type-error=The page cannot be shown because it may not be safe to open.
|
||||
corrupted-content=Can’t display page
|
||||
corrupted-content-error=The page cannot be shown because an error in the data transmission was detected.
|
||||
network-connection-unavailable=Network connection unavailable
|
||||
network-error={{name}} requires a network connection. Try connecting to a Wi-Fi or mobile data network.
|
||||
network-error-launching={{name}} requires an Internet connection.
|
||||
network-error-in-app=No access to the Internet right now.
|
||||
unable-to-connect=Unable to connect
|
||||
try-again=Try again
|
||||
check-settings=Check settings
|
||||
tap-to-check-settings=Tap to check settings
|
||||
|
||||
# value selector, time/date picker
|
||||
select-time=Select time
|
||||
choose-option=Select
|
||||
choose-options=Select
|
||||
select-day=Select day
|
||||
|
||||
# system overlay
|
||||
battery-almost-empty=Battery almost empty
|
||||
|
||||
# wrapper
|
||||
add-to-home-screen=Add to Home Screen
|
||||
share=Share
|
||||
|
||||
# crash report dialog
|
||||
crash-dialog2-os={{brandShortName}} just recovered from a crash
|
||||
crash-dialog-app={{name}} just crashed
|
||||
crash-dialog-message=Would you like to send Mozilla a report about the crash to help us fix the problem? (Reports are sent over Wi-Fi only.)
|
||||
crash-info-link=What’s in a crash report?
|
||||
crash-always-report=Always send Mozilla a report when a crash occurs.
|
||||
crash-dont-send=Don’t Send
|
||||
crash-end=Send Report
|
||||
|
||||
# "Crash Reports" information page
|
||||
crashReports=Crash Reports
|
||||
done=Done
|
||||
# Localization note (crash-reports-description-*): These strings are also included in settings.properties
|
||||
crash-reports-description-1=A crash report contains some details about the crash and your device, as well as a snapshot of the state of your device when it crashed.
|
||||
crash-reports-description-2=This may include things like open pages and apps, text typed into forms and the content of open messages, recent browsing history, or geolocation used by an open app.
|
||||
# Localization note (crash-reports-description-3-*): These strings are a paragraph, with a "privacy policy"
|
||||
# link in the middle. Include trailing spaces as needed.
|
||||
crash-reports-description-3-start=We use crash reports to try to fix problems and improve our products. We handle your information as we describe in our\u20
|
||||
crash-reports-description-3-privacy=privacy policy
|
||||
crash-reports-description-3-end=.
|
||||
|
||||
# crash notification banner
|
||||
crash-banner-os2={{brandShortName}} just crashed.
|
||||
crash-banner-app={{name}} just crashed.
|
||||
crash-banner-report=Report
|
||||
|
||||
# bluetooth transfer
|
||||
bluetooth-sending-progress=Sending Bluetooth transfer…
|
||||
bluetooth-receiving-progress=Receiving Bluetooth transfer…
|
||||
acceptFileTransfer=Accept Bluetooth file transfer?
|
||||
wantToReceiveFile={{deviceName}} would like to transfer {{fileName}} ({{fileSize}}).
|
||||
transfer-confirmation-title={{deviceName}}
|
||||
transfer-confirmation-description=Review transfer request.
|
||||
byteUnit-B = Bytes
|
||||
byteUnit-KB = KB
|
||||
byteUnit-MB = MB
|
||||
byteUnit-GB = GB
|
||||
byteUnit-TB = TB
|
||||
byteUnit-PB = PB
|
||||
byteUnit-EB = EB
|
||||
byteUnit-ZB = ZB
|
||||
byteUnit-YB = YB
|
||||
# Localization note (fileSize*): The string is a float.
|
||||
fileSize = {{size}} {{unit}}
|
||||
deny=Deny
|
||||
transfer=Transfer
|
||||
cancelFileTransfer=Cancel Bluetooth file transfer?
|
||||
continueFileTransfer=Continue
|
||||
transfer-has-started-title=The transfer has started
|
||||
transfer-has-started-description=Check the progress in Notification center
|
||||
transferFinished-sentSuccessful-title=File sent
|
||||
transferFinished-receivedSuccessful-title=File received
|
||||
transferFinished-sentFailed-title=File could not be sent
|
||||
transferFinished-receivedFailed-title=File could not be received
|
||||
transferReport-title=Transfer report:
|
||||
transferReport-description={{numSuccessful}} files successful, {{numUnsuccessful}} files unsuccessful
|
||||
unknown-file=Unknown file
|
||||
unknown-device=Unknown device
|
||||
cannotOpenFile=Can not open received file
|
||||
unknownMediaTypeToOpen=Can not open unknown media type:
|
||||
cannotReceiveFile=Can not receive file
|
||||
cannotGetStorageState=Can not get device storage state.
|
||||
sdcard-not-exist2=No memory card found. Please insert a memory card.
|
||||
sdcard-in-use=Bluetooth can not be used while phone is plugged in. Please unplug the phone to receive file(s).
|
||||
sdcard-no-space2=Can not complete transfer: memory card is full.
|
||||
unknown-error=Unknown error
|
||||
confirm=Confirm
|
||||
|
||||
# Media Recoding
|
||||
microphone-is-on=Mic is on
|
||||
camera-is-on=Camera is on
|
||||
media-is-on=Camera & Mic are ON
|
||||
|
||||
# Security :: SIM PIN lock
|
||||
noSimCard=No SIM card
|
||||
simPin=SIM PIN
|
||||
pukCode=PUK code
|
||||
nckCode=NCK code
|
||||
cckCode=CCK code
|
||||
spckCode=SPCK code
|
||||
nck1code=NCK1 code
|
||||
nck2code=NCK2 code
|
||||
hnckcode=HNCK code
|
||||
rcckcode=RCCK code
|
||||
rspckcode=RSPCK code
|
||||
whatIsSimPin=What is a SIM PIN?
|
||||
simPinIntro1=A SIM PIN prevents access to the SIM card cellular data networks. When it’s enabled, any device containing the SIM card will request the PIN upon restart.
|
||||
simPinIntro2=A SIM PIN is not the same as the passcode used to unlock the device.
|
||||
changeSimPin=Change PIN
|
||||
pinTitle=Enter SIM PIN
|
||||
multiSIMpinTitle=Enter SIM {{n}} PIN
|
||||
pukTitle=Enter PUK code
|
||||
nckTitle=Enter NCK code
|
||||
cckTitle=Enter CCK code
|
||||
spckTitle=Enter SPCK code
|
||||
nck1Title=Enter NCK1 code
|
||||
nck2Title=Enter NCK2 code
|
||||
hnckTitle=Enter HNCK code
|
||||
rcckTitle=Enter RCCK code
|
||||
rspckTitle=Enter RSPCK code
|
||||
newpinTitle=New PIN
|
||||
inputCodeRetriesLeft={[ plural(n) ]}
|
||||
inputCodeRetriesLeft[one]=Last try.
|
||||
inputCodeRetriesLeft[two]={{n}} tries left.
|
||||
inputCodeRetriesLeft[few]={{n}} tries left.
|
||||
inputCodeRetriesLeft[many]={{n}} tries left.
|
||||
inputCodeRetriesLeft[other]={{n}} tries left.
|
||||
pinErrorMsg=The PIN was incorrect.
|
||||
pinAttemptMsg2={[ plural(n) ]}
|
||||
pinAttemptMsg2[one]=You have one try left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[two]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[few]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[many]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinAttemptMsg2[other]=You have {{n}} tries left to enter the correct code before locking the SIM card.
|
||||
pinLastChanceMsg=This is your last chance to enter the correct PIN. Otherwise, you must enter the PUK code to use this SIM card.
|
||||
simCardLockedMsg=The SIM card is locked.
|
||||
enterPukMsg=You must enter the Personal Unlocking Key (PUK) code for the SIM card. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukErrorMsg=The PUK code is incorrect.
|
||||
pukAttemptMsg2={[ plural(n) ]}
|
||||
pukAttemptMsg2[one]=You have one try left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[two]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[few]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[many]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukAttemptMsg2[other]=You have {{n}} tries left to enter the correct code before this SIM card will be permanently unusable. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
pukLastChanceMsg=Last chance to enter the correct PUK code. Your SIM card will be permanently unusable if you enter in the wrong PUK code. Refer to your SIM card documentation or contact your carrier for more information.
|
||||
newSimPinMsg=Create PIN (must contain 4 to 8 digits)
|
||||
confirmNewSimPinMsg=Confirm new PIN
|
||||
newPinErrorMsg=PINs don’t match.
|
||||
nckErrorMsg=The NCK code is incorrect.
|
||||
nckAttemptMsg2={[ plural(n) ]}
|
||||
nckAttemptMsg2[one]=Network depersonalization request failure. You have one try left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[two]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[few]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[many]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckAttemptMsg2[other]=Network depersonalization request failure. You have {{n}} tries left to enter the correct code. Refer to your device documentation or contact your carrier for more information.
|
||||
nckLastChanceMsg=Network depersonalization request failure. Last chance to enter the correct NCK code. Refer to your device documentation or contact your carrier for more information.
|
||||
|
||||
# Activity selection menu titles
|
||||
activity-pick= Select from:
|
||||
activity-view= View with:
|
||||
activity-test= Test with:
|
||||
activity-share= Share with:
|
||||
activity-new= Create with:
|
||||
activity-open= Open with:
|
||||
activity-save-bookmark=Bookmark to:
|
||||
activity-record=Record from:
|
||||
activity-browse=Browse with:
|
||||
activity-configure=Configure with:
|
||||
activity-dial=Dial from:
|
||||
|
||||
# Persona dialog and Identity
|
||||
persona-signin=Sign In
|
||||
|
||||
# Payment dialog
|
||||
payment-flow=Purchase
|
||||
|
||||
# Remote Debugger Connection Dialog
|
||||
remoteDebuggerMessage=An incoming request to permit remote debugging connection was detected. Allow connection?
|
||||
|
||||
# fullscreen permission
|
||||
# LOCALIZATION NOTE {{origin}} is the origin of the site which has requested fullscreen, e.g. http://example.com is now fullscreen. It includes protocol + hostname.
|
||||
fullscreen-request={{origin}} is now fullscreen.
|
||||
|
||||
#captive wifi
|
||||
captive-wifi-available=The network {{networkName}} was found. Join network?
|
||||
|
||||
# [CE] Volume warning toast
|
||||
ceWarningtitle=Volume warning
|
||||
ceWarningcontent=To prevent possible hearing damage, do not listen at high volume levels for long periods.
|
||||
|
||||
#power saving mode
|
||||
notification-powersaving-mode-on-title=Power Saving Mode
|
||||
notification-powersaving-mode-on-description=Power saving mode is on.
|
||||
|
||||
# Low device storage
|
||||
low-device-storage=Device space low.\n
|
||||
# LOCALIZATION NOTE {{value}} is the amount of remaining free space expressed
|
||||
# in the corresponding unit ({{unit}}), which is one of the byteUnit-* strings
|
||||
# of this same file.
|
||||
free-space={[ plural(value) ]}
|
||||
free-space[zero]=No remaining free space.
|
||||
free-space[one]=Less than {{value}} {{unit}} remaining.
|
||||
free-space[two]=Less than {{value}} {{unit}} remaining.
|
||||
free-space[few]=Less than {{value}} {{unit}} remaining.
|
||||
free-space[many]=Less than {{value}} {{unit}} remaining.
|
||||
free-space[other]=Less than {{value}} {{unit}} remaining.
|
||||
unknown-free-space=Unknown remaining space.
|
||||
|
||||
# Cell Broadcast System
|
||||
system-alert=System Alert
|
||||
cb-channel=Channel {{channel}}
|
||||
cb-etws-warningType-earthquake=Earthquake warning!
|
||||
cb-etws-warningType-tsunami=Tsunami warning!
|
||||
cb-etws-warningType-earthquake-tsunami=Earthquake-tsunami warning!
|
||||
cb-etws-warningType-test=Alert system is being tested.
|
||||
cb-etws-warningType-other=Emergency warning!
|
||||
|
||||
# ICC / STK (= SIM Toolkit)
|
||||
icc-message-maintitle=Operator message
|
||||
icc-message-subtitle=SIM {{id}}
|
||||
icc-confirmCall-defaultmessage=Call {{number}}?
|
||||
icc-alertMessage-defaultmessage=Sending message
|
||||
icc-confirmMessage-defaultmessage=Send message?
|
||||
# LOCALIZATION NOTE: (icc-inputbox-[main|sub]title) = title of SIM Toolkit input dialog panels
|
||||
icc-inputbox-maintitle=STK Query
|
||||
icc-inputbox-subtitle=SIM {{id}}
|
||||
|
||||
# CDMA emergency callback mode
|
||||
emergency-callback-mode=Emergency call back mode
|
||||
emergency-callback-message=You can not make calls, send messages or go online because emergency callback mode is enabled. Would you like to turn it off?
|
||||
|
||||
# CDMA record information
|
||||
cdma-record-info=CDMA record information
|
||||
|
||||
# IME (Keyboard)
|
||||
|
||||
# LOCALIZATION NOTE(ime-switching-title): parameters will be replace at run-
|
||||
# time. Resulting example for English: "Built-in Keyboard: English".
|
||||
ime-switching-title={{appName}}: {{name}}
|
||||
ime-switching-tip=Tap to switch input method
|
||||
|
||||
# Shrinking UI
|
||||
shrinking-tip=Swipe to share
|
||||
|
||||
# Download Manager
|
||||
download_started=Download started
|
||||
download_stopped=Download stopped
|
||||
download_downloading=Downloading…
|
||||
download_succeeded=Download complete
|
||||
download_failed=Download failed
|
||||
|
||||
download_text_by_default={{name}}
|
||||
download_downloading_text_2={{percentage}}% - {{name}}
|
||||
|
||||
# Rocketbar
|
||||
search-or-enter-address=Search or enter address
|
||||
search-or-enter-address.placeholder=Search or enter address
|
||||
|
||||
# Hotspot
|
||||
noSIMCardInHotspot3=Hotspot off: SIM card missing or inserted incorrectly.
|
||||
noHopspotWhenAPMisOn=Turn off airplane mode to use Wi-Fi hotspot
|
||||
apmActivated=Airplane mode activated
|
||||
|
||||
# Browser Context Menu
|
||||
open-in-new-tab=Open link in new tab
|
||||
add-link-to-home-screen=Add link to home screen
|
||||
share-link=Share link
|
||||
save-image=Save Image
|
||||
save-video=Save Video
|
||||
save-audio=Save Audio
|
||||
save-link=Save linked file
|
||||
share-image=Share Image
|
||||
share-video=Share Video
|
||||
share-audio=Share Audio
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# Search
|
||||
search-or-enter-address.placeholder = Search or enter address
|
||||
|
||||
# Prompt that appears when a user tries to delete an app/bookmark.
|
||||
delete-title=Delete {{name}}
|
||||
delete-body={{name}} and all of its data will be deleted.
|
||||
delete=Delete
|
||||
cancel=Cancel
|
||||
|
||||
# Context menu options
|
||||
homescreen-settings=Homescreen Settings
|
||||
change-wallpaper=Change Wallpaper
|
||||
|
||||
edit-mode=Edit
|
||||
edit-done=Done
|
||||
|
||||
# Prompt that appears when a user tries to stop a download.
|
||||
stop-download-title=Stop {{name}}
|
||||
stop-download-body=Do you want to stop the download in progress?
|
||||
stop-download-action=Stop
|
||||
|
||||
# Prompt that appears when a user tries to resume a download.
|
||||
resume-download-title=Restart Download
|
||||
resume-download-body=Do you want to download {{name}}?
|
||||
resume-download-action=Download
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Homescreen
|
||||
description=Gaia Homescreen
|
||||
2
gaia/build/test/resources/locales/en-US/apps/video/manifest.properties
Executable file
2
gaia/build/test/resources/locales/en-US/apps/video/manifest.properties
Executable file
|
|
@ -0,0 +1,2 @@
|
|||
name=Video
|
||||
description=Gaia Video
|
||||
75
gaia/build/test/resources/locales/en-US/apps/video/video.properties
Executable file
75
gaia/build/test/resources/locales/en-US/apps/video/video.properties
Executable file
|
|
@ -0,0 +1,75 @@
|
|||
number-selected2 = {[ plural(n) ]}
|
||||
number-selected2[zero] = Select
|
||||
number-selected2[one] = {{ n }} selected
|
||||
number-selected2[two] = {{ n }} selected
|
||||
number-selected2[few] = {{ n }} selected
|
||||
number-selected2[many] = {{ n }} selected
|
||||
number-selected2[other] = {{ n }} selected
|
||||
|
||||
# An "item" means a video
|
||||
# The app currently doesn't use the [zero] case
|
||||
delete-n-items? = {[ plural(n) ]}
|
||||
delete-n-items?[zero] = Nothing selected
|
||||
delete-n-items?[one] = Delete selected item?
|
||||
delete-n-items?[two] = Delete {{ n }} items?
|
||||
delete-n-items?[few] = Delete {{ n }} items?
|
||||
delete-n-items?[many] = Delete {{ n }} items?
|
||||
delete-n-items?[other] = Delete {{ n }} items?
|
||||
|
||||
share-noprovider = Try sharing one video at a time.
|
||||
|
||||
videos = Videos
|
||||
cancel = Cancel
|
||||
delete-video? = Delete video?
|
||||
|
||||
empty-title = Add videos to get started
|
||||
empty-text = Load videos on to the memory card.
|
||||
|
||||
nocard2-title = No memory card found
|
||||
nocard3-text = Insert a memory card to watch videos.
|
||||
|
||||
pluggedin-title = Video can not be watched while plugged in
|
||||
pluggedin-text = Unplug the phone to watch videos.
|
||||
|
||||
upgrade-title = Database Upgrade
|
||||
upgrade-text = Please wait while Video updates its database.
|
||||
|
||||
confirm-delete = Are you sure you want to delete:
|
||||
|
||||
pick-title = Select a video
|
||||
|
||||
save = Save
|
||||
saved = Saved {{title}} to Video
|
||||
|
||||
error-network = The video could not be downloaded because of a network error.
|
||||
error-unsupported = Video cannot be played: either because the server or network failed or because the format is not supported.
|
||||
error-unknown = An unknown video error occurred.
|
||||
|
||||
overlay-cancel-button = Cancel
|
||||
overlay-camera-button = Go to Camera
|
||||
|
||||
name-label = Name
|
||||
length-label = Length
|
||||
size-label = Size
|
||||
video-type-label = Video Type
|
||||
date-taken-label = Date Taken
|
||||
resolution-label = Resolution
|
||||
close-button = Close
|
||||
|
||||
byteUnit-B = Bytes
|
||||
byteUnit-KB = KB
|
||||
byteUnit-MB = MB
|
||||
byteUnit-GB = GB
|
||||
byteUnit-TB = TB
|
||||
byteUnit-PB = PB
|
||||
byteUnit-EB = EB
|
||||
byteUnit-ZB = ZB
|
||||
byteUnit-YB = YB
|
||||
|
||||
# Header format used in thumbnail view
|
||||
# see http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.html
|
||||
date-group-header = %B %Y
|
||||
|
||||
share = Share
|
||||
more-info = More info
|
||||
delete = Delete
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
name=Wallpaper
|
||||
description=Gaia Wallpaper Picker
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue