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:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

2
gaia/build/test/bin/fake-adb Executable file
View file

@ -0,0 +1,2 @@
#!/bin/bash
echo $@ >> ./build/test/integration/result

View 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);
});
});

View 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
View file

@ -0,0 +1 @@
build/test/fixtures/test-shared-css-app

View 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>

View file

@ -0,0 +1,2 @@
entity1=My Entity
entity1=My Entity

View 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"
}

View 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>

View file

@ -0,0 +1 @@
entity1=My Entity

View 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"
}

View 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>

View file

@ -0,0 +1,2 @@
<entity1 "Entity 1">
<entity2 "Entity 2">

View file

@ -0,0 +1 @@
entity1=My Entity

View 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"
}

View 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>

View file

@ -0,0 +1 @@
entity1=My Entity

View 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"
}

View 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>

View file

@ -0,0 +1 @@
entity1=My Entity

View 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"
}

View file

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title>Test Shared CSS Functionalities</title>
</head>
<body>
</body>
</html>

View 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"
}
}

View file

View 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;
}

View 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();
});
});
});

View 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();
});
});
});

View 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();
});
});
});

View 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);
});
});

View 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();
});
});
});

View 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);
});
});

View 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;

View 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();
}
);
});
});

View 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();
});
});
});
});

View 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();
});
});
});

View 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);
});
});

View 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();
}
);
});
});

View 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();
});
});
});

View 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();
});
});
});

View 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();
});
});
});

View file

@ -0,0 +1,5 @@
repo: 106824fa5d90d13980c4f65d67a2c6494bf29d91
node: 77ec1443ef6b40ed2e53dfe61785169792d92ba7
branch: default
latesttag: null
latesttagdistance: 1888

View 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.

View file

@ -0,0 +1,2 @@
name=Bluetooth Transfer
description=Gaia Bluetooth Transfer

View 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

View file

@ -0,0 +1,2 @@
name=Bookmark
description=Bookmark Manager

View 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

View file

@ -0,0 +1,2 @@
name=Browser
description=Gaia Web Browser

View 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

View file

@ -0,0 +1,2 @@
name=Calendar
description=Gaia Calendar

View 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

View file

@ -0,0 +1,2 @@
name=Camera
description=Gaia Camera

View 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

View 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

View file

@ -0,0 +1,2 @@
name=Clock
description=Gaia Clock

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -0,0 +1,4 @@
dialer.name=Phone
dialer.description=Gaia Phone
contacts.name=Contacts
contacts.description=Gaia Contacts

View 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

View file

@ -0,0 +1,2 @@
name=Usage
description=Usage application to see credit and data usage statistics

View 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 }}”

View file

@ -0,0 +1,2 @@
name=E-Mail
description=Gaia E-Mail

View file

@ -0,0 +1,2 @@
name=EmergencyCall
description=Web app template

View file

@ -0,0 +1,2 @@
name=Find My Device
description=Find My Device helps find, lock and erase a lost phone

View 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

View file

@ -0,0 +1,2 @@
name=Purchased Media
description=Download and manage forward locked music, ringtones and wallpaper

View 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

View 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.

View file

@ -0,0 +1,2 @@
name=FM Radio
description=Gaia FM Radio

View 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

View file

@ -0,0 +1,2 @@
name=FTU
description=First Time Experience

View 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

View file

@ -0,0 +1,2 @@
name=Gallery
description=Gaia Gallery

View 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

View file

@ -0,0 +1,2 @@
name=Homescreen
description=Gaia Homescreen

View 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

View file

@ -0,0 +1,4 @@
name=Built-in Keyboard
description=Built-in Keyboard
number.name=Number
number.description=Numeric layout

View file

@ -0,0 +1,2 @@
name=Music
description=Gaia Music

View 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

View file

@ -0,0 +1,2 @@
name=PDF Viewer
description=Portable Document Format (PDF) Viewer

View file

@ -0,0 +1,2 @@
name=Ringtones
description=Gaia Ringtone Picker

View 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

View file

@ -0,0 +1,2 @@
name=Search Results
description=Search Results

View 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 }}

View file

@ -0,0 +1,2 @@
name=Settings
description=Gaia Settings

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
name=Shared Tests
description=Runs shared tests

View file

@ -0,0 +1,2 @@
name=Messages
description=Gaia Messages

View 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

View 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

View file

@ -0,0 +1,2 @@
name=System
description=Main System

View file

@ -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

View 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

View file

@ -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

View file

@ -0,0 +1,2 @@
name=Homescreen
description=Gaia Homescreen

View file

@ -0,0 +1,2 @@
name=Video
description=Gaia Video

View 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

View file

@ -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