Fixes for language and scaling

This commit is contained in:
Colin McLeod
2015-09-01 02:20:05 -07:00
parent bf217e7fdd
commit 65f53a3fa4
19 changed files with 696 additions and 568 deletions

View File

@@ -1,6 +1,6 @@
angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable', 'shipyard', 'ngLodash', 'app.templates', 'pascalprecht.translate']) angular.module('app', ['ui.router', 'ct.ui.router.extras.sticky', 'ui.sortable', 'shipyard', 'ngLodash', 'app.templates', 'pascalprecht.translate'])
.run(['$rootScope', '$location', '$window', '$document', '$state', '$translate', 'localeFormat', 'Persist', 'Discounts', .run(['$rootScope', '$location', '$window', '$document', '$state', '$translate', 'localeFormat', 'Persist', 'Discounts', 'Languages',
function($rootScope, $location, $window, $doc, $state, $translate, localeFormat, Persist, Discounts) { function($rootScope, $location, $window, $doc, $state, $translate, localeFormat, Persist, Discounts, Languages) {
// App is running as a standalone web app on tablet/mobile // App is running as a standalone web app on tablet/mobile
var isStandAlone; var isStandAlone;
// This was causing issues on Windows phones ($window.external was causing Angular js to throw an exception). Backup is to try this and set isStandAlone to false if this fails. // This was causing issues on Windows phones ($window.external was causing Angular js to throw an exception). Backup is to try this and set isStandAlone to false if this fails.
@@ -33,16 +33,9 @@ function($rootScope, $location, $window, $doc, $state, $translate, localeFormat,
}); });
$rootScope.language = { $rootScope.language = {
opts: { opts: Languages,
en: 'English', current: Languages[Persist.getLangCode()] ? Persist.getLangCode() : 'en'
de: 'Deutsh',
es: 'Español',
fr: 'Français',
ru: 'ру́сский язы́к'
},
current: Persist.getLangCode()
}; };
$rootScope.localeFormat = d3.locale(localeFormat.get($rootScope.language.current)); $rootScope.localeFormat = d3.locale(localeFormat.get($rootScope.language.current));
updateNumberFormat(); updateNumberFormat();

View File

@@ -1,17 +1,10 @@
/** /**
* Sets up the routes and handlers before the Angular app is kicked off. * Sets up the routes and handlers before the Angular app is kicked off.
*/ */
angular.module('app').config(['$provide', '$stateProvider', '$urlRouterProvider', '$locationProvider', '$translateProvider', 'ShipsDB', function($provide, $stateProvider, $urlRouterProvider, $locationProvider, $translateProvider, ships) { angular.module('app').config(['$provide', '$stateProvider', '$urlRouterProvider', '$locationProvider', 'ShipsDB', function($provide, $stateProvider, $urlRouterProvider, $locationProvider, ships) {
// Use HTML5 push and replace state if possible // Use HTML5 push and replace state if possible
$locationProvider.html5Mode({ enabled: true, requireBase: false }); $locationProvider.html5Mode({ enabled: true, requireBase: false });
// Use English as default/fallback language
$translateProvider
.useSanitizeValueStrategy('escapeParameters')
.useStorage('Persist')
.fallbackLanguage('en')
.determinePreferredLanguage();
/** /**
* Set up all states and their routes. * Set up all states and their routes.
*/ */

View File

@@ -28,7 +28,7 @@ angular.module('app').directive('barChart', ['$window', '$translate', '$rootScop
fmt = null, fmt = null,
unit = null, unit = null,
properties = scope.facet.props, properties = scope.facet.props,
margin = { top: 10, right: 20, bottom: 35, left: 150 }, margin = { top: 10, right: 20, bottom: 40, left: 150 },
y0 = d3.scale.ordinal(), y0 = d3.scale.ordinal(),
y1 = d3.scale.ordinal(), y1 = d3.scale.ordinal(),
x = d3.scale.linear(), x = d3.scale.linear(),
@@ -55,18 +55,12 @@ angular.module('app').directive('barChart', ['$window', '$translate', '$rootScop
var xAxisLbl = vis.append('g') var xAxisLbl = vis.append('g')
.attr('class', 'x axis cap') .attr('class', 'x axis cap')
.append('text') .append('text')
.attr('y', 30) .attr('y', 33)
.attr('dy', '.1em') .attr('dy', '.1em')
.style('text-anchor', 'middle'); .style('text-anchor', 'middle');
updateFormats(); updateFormats();
/**
* Watch for changes in the comparison array (ships added/removed, sorting)
*/
scope.$watchCollection('data', render);
angular.element($window).bind('orientationchange resize render', render);
function render() { function render() {
var data = scope.data, var data = scope.data,
width = element[0].offsetWidth, width = element[0].offsetWidth,
@@ -125,8 +119,9 @@ angular.module('app').directive('barChart', ['$window', '$translate', '$rootScop
render(); render();
} }
angular.element($window).bind('orientationchange resize render', render);
scope.$watchCollection('data', render); // Watch for changes in the comparison array
scope.$on('languageChanged', updateFormats); scope.$on('languageChanged', updateFormats);
scope.$on('$destroy', function() { scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render); angular.element($window).unbind('orientationchange resize render', render);
tip.destroy(); // Remove the tooltip from the DOM tip.destroy(); // Remove the tooltip from the DOM

View File

@@ -82,10 +82,19 @@ angular.module('app').directive('shipyardHeader', ['lodash', '$window', '$rootSc
}); });
scope.textSizeChange = function(size) { scope.textSizeChange = function(size) {
$rootScope.sizeRatio = size; if (size != $rootScope.sizeRatio) {
document.getElementById('main').style.fontSize = size + 'em'; $rootScope.sizeRatio = size;
Persist.setSizeRatio(size); document.getElementById('main').style.fontSize = size + 'em';
win.triggerHandler('resize'); Persist.setSizeRatio(size);
win.triggerHandler('resize');
}
};
scope.resetTextSize = function() {
if ($rootScope.sizeRatio != 1) {
scope.textSizeChange(1);
scope.$broadcast('reset');
}
}; };
scope.$watchCollection('allBuilds', function() { scope.$watchCollection('allBuilds', function() {

View File

@@ -75,12 +75,6 @@ angular.module('app').directive('lineChart', ['$window', '$translate', '$rootSco
updateFormats(); updateFormats();
/**
* Watch for changes in the series data (mass changes, etc)
*/
scope.$watchCollection('series', render);
angular.element($window).bind('orientationchange resize render', render);
function render() { function render() {
var width = element[0].parentElement.offsetWidth, var width = element[0].parentElement.offsetWidth,
height = width * 0.5 * $rootScope.sizeRatio, height = width * 0.5 * $rootScope.sizeRatio,
@@ -193,8 +187,9 @@ angular.module('app').directive('lineChart', ['$window', '$translate', '$rootSco
render(); render();
} }
angular.element($window).bind('orientationchange resize render', render);
scope.$watchCollection('series', render); // Watch for changes in the series data
scope.$on('languageChanged', updateFormats); scope.$on('languageChanged', updateFormats);
scope.$on('$destroy', function() { scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render); angular.element($window).unbind('orientationchange resize render', render);
}); });

View File

@@ -16,10 +16,10 @@ angular.module('app').directive('powerBands', ['$window', '$translate', '$rootSc
depBandsSelected = false, depBandsSelected = false,
wattScale = d3.scale.linear(), wattScale = d3.scale.linear(),
pctScale = d3.scale.linear().domain([0, 1]), pctScale = d3.scale.linear().domain([0, 1]),
wattFmt = d3.format('.2f'), wattFmt,
pctFmt = d3.format('.1%'), pctFmt,
wattAxis = d3.svg.axis().scale(wattScale).outerTickSize(0).orient('top').tickFormat(d3.format('.2r')), wattAxis = d3.svg.axis().scale(wattScale).outerTickSize(0).orient('top'),
pctAxis = d3.svg.axis().scale(pctScale).outerTickSize(0).orient('bottom').tickFormat(d3.format('%')), pctAxis = d3.svg.axis().scale(pctScale).outerTickSize(0).orient('bottom'),
// Create chart // Create chart
svg = d3.select(element[0]).append('svg'), svg = d3.select(element[0]).append('svg'),
vis = svg.append('g'), vis = svg.append('g'),
@@ -40,20 +40,14 @@ angular.module('app').directive('powerBands', ['$window', '$translate', '$rootSc
// Create Y Axis SVG Elements // Create Y Axis SVG Elements
vis.append('g').attr('class', 'watt axis'); vis.append('g').attr('class', 'watt axis');
vis.append('g').attr('class', 'pct axis'); vis.append('g').attr('class', 'pct axis');
var retText = vis.append('text').attr('x', -3).style('text-anchor', 'end').attr('dy', '0.5em').attr('class', 'primary upp');
var depText = vis.append('text').attr('x', -3).style('text-anchor', 'end').attr('dy', '0.5em').attr('class', 'primary upp');
var retLbl = vis.append('text').attr('dy', '0.5em');
var depLbl = vis.append('text').attr('dy', '0.5em');
var retLbl = vis.append('text').attr('x', -35).attr('y', 16).attr('class', 'primary upp'); updateFormats(true);
var depLbl = vis.append('text').attr('x', -35).attr('y', barHeight + 18).attr('class', 'primary upp');
var retVal = vis.append('text').attr('y', 16);
var depVal = vis.append('text').attr('y', barHeight + 18);
// Watch for changes to data and events function dataChange() {
scope.$watchCollection('available', dataChange);
angular.element($window).bind('pwrchange', dataChange);
angular.element($window).bind('orientationchange resize', render);
updateFormats();
function render() {
bands = scope.bands; bands = scope.bands;
available = scope.available; available = scope.available;
maxBand = bands[bands.length - 1]; maxBand = bands[bands.length - 1];
@@ -82,7 +76,7 @@ angular.module('app').directive('powerBands', ['$window', '$translate', '$rootSc
mTop = Math.round(25 * size), mTop = Math.round(25 * size),
mRight = Math.round(130 * size), mRight = Math.round(130 * size),
mBottom = Math.round(25 * size), mBottom = Math.round(25 * size),
mLeft = Math.round(40 * size), mLeft = Math.round(45 * size),
barHeight = Math.round(20 * size), barHeight = Math.round(20 * size),
width = element[0].offsetWidth, width = element[0].offsetWidth,
innerHeight = (barHeight * 2) + 2, innerHeight = (barHeight * 2) + 2,
@@ -107,19 +101,10 @@ angular.module('app').directive('powerBands', ['$window', '$translate', '$rootSc
vis.selectAll('.watt.axis').call(wattAxis); vis.selectAll('.watt.axis').call(wattAxis);
vis.selectAll('.pct.axis').attr('transform', 'translate(0,' + innerHeight + ')').call(pctAxis); vis.selectAll('.pct.axis').attr('transform', 'translate(0,' + innerHeight + ')').call(pctAxis);
for (var b = 0, l = bands.length; b < l; b++) { retText.attr('y', repY);
if (bands[b].retSelected) { depText.attr('y', depY);
retractedSum += bands[b].retracted + bands[b].retOnly; updateLabel(retLbl, w, repY, retBandsSelected, retBandsSelected ? retractedSum : maxBand.retractedSum, available);
retBandsSelected = true; updateLabel(depLbl, w, depY, depBandsSelected, depBandsSelected ? deployedSum : maxBand.deployedSum, available);
}
if (bands[b].depSelected) {
deployedSum += bands[b].deployed + bands[b].retracted;
depBandsSelected = true;
}
}
updateLabel(retVal, w, retBandsSelected, retBandsSelected ? retractedSum : maxBand.retractedSum, available);
updateLabel(depVal, w, depBandsSelected, depBandsSelected ? deployedSum : maxBand.deployedSum, available);
retracted.selectAll('rect').data(bands).enter().append('rect') retracted.selectAll('rect').data(bands).enter().append('rect')
.attr('height', barHeight) .attr('height', barHeight)
@@ -166,7 +151,6 @@ angular.module('app').directive('powerBands', ['$window', '$translate', '$rootSc
dataChange(); dataChange();
}) })
.text(function(d, i) { return bandText(d.deployed + d.retracted, i); }); .text(function(d, i) { return bandText(d.deployed + d.retracted, i); });
} }
function updateLabel(lbl, width, y, selected, sum, avail) { function updateLabel(lbl, width, y, selected, sum, avail) {
@@ -188,18 +172,23 @@ angular.module('app').directive('powerBands', ['$window', '$translate', '$rootSc
return ''; return '';
} }
function updateFormats() { function updateFormats(preventRender) {
retLbl.text($translate.instant('ret')); retText.text($translate.instant('ret'));
depLbl.text($translate.instant('dep')); depText.text($translate.instant('dep'));
wattFmt = $rootScope.localeFormat.numberFormat('.2f'); wattFmt = $rootScope.localeFormat.numberFormat('.2f');
pctFmt = $rootScope.localeFormat.numberFormat('.1%'); pctFmt = $rootScope.localeFormat.numberFormat('.1%');
wattAxis.tickFormat($rootScope.localeFormat.numberFormat('.2r')); wattAxis.tickFormat($rootScope.localeFormat.numberFormat('.2r'));
pctAxis.tickFormat($rootScope.localeFormat.numberFormat('%')); pctAxis.tickFormat($rootScope.localeFormat.numberFormat('%'));
render(); if (!preventRender) {
render();
}
} }
// Watch for changes to data and events
angular.element($window).bind('pwrchange', dataChange);
angular.element($window).bind('orientationchange resize', render);
scope.$watchCollection('available', dataChange);
scope.$on('languageChanged', updateFormats); scope.$on('languageChanged', updateFormats);
scope.$on('$destroy', function() { scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize pwrchange', render); angular.element($window).unbind('orientationchange resize pwrchange', render);
}); });

View File

@@ -7,7 +7,8 @@ angular.module('app').directive('slider', ['$window', function($window) {
def: '=', def: '=',
max: '=', max: '=',
unit: '=', unit: '=',
change: '&onChange' change: '&onChange',
ignoreResize: '='
}, },
link: function(scope, element) { link: function(scope, element) {
var unit = scope.unit, var unit = scope.unit,
@@ -16,7 +17,8 @@ angular.module('app').directive('slider', ['$window', function($window) {
h = height - margin.top, h = height - margin.top,
fmt = d3.format('.2f'), fmt = d3.format('.2f'),
pct = d3.format('.1%'), pct = d3.format('.1%'),
val = scope.def !== undefined ? scope.def : scope.max, def = scope.def !== undefined ? scope.def : scope.max,
val = def,
svg = d3.select(element[0]).append('svg'), svg = d3.select(element[0]).append('svg'),
vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'), vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'),
xAxisContainer = vis.append('g').attr('class', 'x slider-axis').attr('transform', 'translate(0,' + h / 2 + ')'), xAxisContainer = vis.append('g').attr('class', 'x slider-axis').attr('transform', 'translate(0,' + h / 2 + ')'),
@@ -32,16 +34,6 @@ angular.module('app').directive('slider', ['$window', function($window) {
slider.select('.background').attr('height', h); slider.select('.background').attr('height', h);
handle.attr('transform', 'translate(0,' + h / 2 + ')'); handle.attr('transform', 'translate(0,' + h / 2 + ')');
/**
* Watch for changes in the max, window size
*/
scope.$watch('max', function(newMax, oldMax) {
val = newMax * (val / oldMax); // Retain percentage filled
render();
});
//angular.element($window).bind('orientationchange resize', render);
function render() { function render() {
var width = element[0].offsetWidth, w = width - margin.left - margin.right; var width = element[0].offsetWidth, w = width - margin.left - margin.right;
svg.attr('width', width).attr('height', height); svg.attr('width', width).attr('height', height);
@@ -51,16 +43,18 @@ angular.module('app').directive('slider', ['$window', function($window) {
xAxisContainer.call(xAxis.tickValues([0, scope.max / 4, scope.max / 2, (3 * scope.max) / 4, scope.max])); xAxisContainer.call(xAxis.tickValues([0, scope.max / 4, scope.max / 2, (3 * scope.max) / 4, scope.max]));
lbl.attr('x', w + 20); lbl.attr('x', w + 20);
} }
slider.call(brush.extent([val, val])).call(brush.event); slider.call(brush.extent([val, val]));
drawBrush();
slider.selectAll('.extent,.resize').remove(); slider.selectAll('.extent,.resize').remove();
} }
function brushed() { function brushed() {
val = brush.extent()[0]; val = x.invert(d3.mouse(this)[0]);
if (d3.event.sourceEvent) { // not a programmatic event brush.extent([val, val]);
val = x.invert(d3.mouse(this)[0]); drawBrush();
brush.extent([val, val]); }
}
function drawBrush() {
if (unit) { if (unit) {
lbl.text(fmt(val) + ' ' + unit + ' ' + pct(val / scope.max)); lbl.text(fmt(val) + ' ' + unit + ' ' + pct(val / scope.max));
} }
@@ -69,6 +63,23 @@ angular.module('app').directive('slider', ['$window', function($window) {
filled.attr('d', 'M0,0V0H' + x(val) + 'V0'); filled.attr('d', 'M0,0V0H' + x(val) + 'V0');
} }
/**
* Watch for changes in the max, window size
*/
scope.$watch('max', function(newMax, oldMax) {
val = newMax * (val / oldMax); // Retain percentage filled
render();
});
if (!scope.ignoreResize) {
angular.element($window).bind('orientationchange resize', render);
}
scope.$on('reset', function() {
val = def;
render();
});
scope.$on('$destroy', function() { scope.$on('$destroy', function() {
angular.element($window).unbind('orientationchange resize render', render); angular.element($window).unbind('orientationchange resize render', render);
}); });

View File

@@ -1,5 +1,4 @@
angular.module('app').config(['$translateProvider', 'localeFormatProvider', function($translateProvider, localeFormatProvider) { angular.module('app').config(['$translateProvider', 'localeFormatProvider', function($translateProvider, localeFormatProvider) {
// Declare number format settings // Declare number format settings
localeFormatProvider.addFormat('de', { localeFormatProvider.addFormat('de', {
decimal: ',', decimal: ',',
@@ -15,7 +14,6 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
shortMonths: ['Jan', 'Feb', 'Mrz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'] shortMonths: ['Jan', 'Feb', 'Mrz', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']
}); });
$translateProvider.translations('de', { $translateProvider.translations('de', {
PHRASE_EXPORT_DESC: 'Ein detaillierter JSON-Export Ihrer Konfiguration für die Verwendung in anderen Websites und Tools', PHRASE_EXPORT_DESC: 'Ein detaillierter JSON-Export Ihrer Konfiguration für die Verwendung in anderen Websites und Tools',
'A-Rated': 'A-Klasse', 'A-Rated': 'A-Klasse',
@@ -24,7 +22,7 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
added: 'Hinzugefügt', added: 'Hinzugefügt',
Advanced: 'Verbessert', Advanced: 'Verbessert',
'Advanced Discovery Scanner': 'Fortgeschrittener Aufklärungsscanner', 'Advanced Discovery Scanner': 'Fortgeschrittener Aufklärungsscanner',
agility: 'Beweglichkeit', agility: 'Manövrierbarkeit',
ammo: 'Munition', ammo: 'Munition',
PHRASE_CONFIRMATION: 'Sind Sie sicher?', PHRASE_CONFIRMATION: 'Sind Sie sicher?',
armour: 'Panzerung', armour: 'Panzerung',
@@ -44,7 +42,7 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
buy: 'Kaufen', buy: 'Kaufen',
cancel: 'Abbrechen', cancel: 'Abbrechen',
c: 'Kanone', c: 'Kanone',
capital: 'kapital', capital: 'Kapital',
cargo: 'Fracht', cargo: 'Fracht',
'Cargo Hatch': 'Frachtluke', 'Cargo Hatch': 'Frachtluke',
cr: 'Frachtgestell', cr: 'Frachtgestell',
@@ -61,16 +59,15 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
cost: 'Preis', cost: 'Preis',
costs: 'Kosten', costs: 'Kosten',
cm: 'Gegenmaßnahme', cm: 'Gegenmaßnahme',
CR: 'CR',
create: 'Erstellen', create: 'Erstellen',
'create new': 'Neu Erstellen', 'create new': 'Neu Erstellen',
Cytoscrambler: 'Zytostreuer', Cytoscrambler: 'Zytostreuer',
damage: 'Schaden', damage: 'Schaden',
delete: 'Löschen', delete: 'Löschen',
'delete all': 'Alles Löschen', 'delete all': 'Alles Löschen',
dep: 'ausg', dep: 'Ausg',
deployed: 'Ausgefahren', deployed: 'Ausgefahren',
'detailed export': 'Detailiertes Exportieren', 'detailed export': 'Detailierter Export',
'Detailed Surface Scanner': 'Detailoberflächenscanner', 'Detailed Surface Scanner': 'Detailoberflächenscanner',
disabled: 'Deaktiviert', disabled: 'Deaktiviert',
discount: 'Rabatt', discount: 'Rabatt',
@@ -84,7 +81,8 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
Enforcer: 'Vollstrecker', Enforcer: 'Vollstrecker',
ENG: 'ANT', ENG: 'ANT',
'enter name': 'Namen eingeben', 'enter name': 'Namen eingeben',
export: 'exportieren', export: 'Export',
fixed: 'Fixiert',
forum: 'Forum', forum: 'Forum',
fc: 'Splitterkanone', fc: 'Splitterkanone',
fd: 'Frameshiftantrieb', fd: 'Frameshiftantrieb',
@@ -108,11 +106,11 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
import: 'Importieren', import: 'Importieren',
'import all': 'Alles Importieren', 'import all': 'Alles Importieren',
insurance: 'Versicherung', insurance: 'Versicherung',
'Intermediate Discover Scanner': 'Mittlerer Aufklärungsscanner', 'Intermediate Discovery Scanner': 'Mittlerer Aufklärungsscanner',
'internal compartments': 'Innenbereichkabine', 'internal compartments': 'Innenbereichskabine',
'jump range': 'Sprungreichweite', 'jump range': 'Sprungreichweite',
jumps: 'Sprünge', jumps: 'Sprünge',
kw: 'Tötungsbefehlscanner', kw: 'Tötungsbefehl-Scanner',
L: 'G', L: 'G',
laden: 'Beladen', laden: 'Beladen',
language: 'Sprache', language: 'Sprache',
@@ -120,12 +118,9 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
ls: 'Lebenserhaltung', ls: 'Lebenserhaltung',
'Lightweight Alloy': 'Leichte Legierung', 'Lightweight Alloy': 'Leichte Legierung',
'lock factor': 'Massensperrefaktor', 'lock factor': 'Massensperrefaktor',
LS: 'LS', LS: 'Ls',
LY: 'LJ', LY: 'Lj',
M: 'M',
'm/s': 'M/Sec.',
mass: 'Masse', mass: 'Masse',
max: 'max',
'max mass': 'maximale Masse', 'max mass': 'maximale Masse',
medium: 'Mittel', medium: 'Mittel',
'Military Grade Composite': 'Militär-Komposit', 'Military Grade Composite': 'Militär-Komposit',
@@ -140,10 +135,9 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
PHRASE_NO_BUILDS: 'Keine Konfigurationen zum Vergleich ausgewählt!', PHRASE_NO_BUILDS: 'Keine Konfigurationen zum Vergleich ausgewählt!',
PHRASE_NO_RETROCH: 'Keine Umrüständerungen', PHRASE_NO_RETROCH: 'Keine Umrüständerungen',
none: 'Nichts', none: 'Nichts',
'none created': 'Nichts erstellt', 'none created': 'Leer',
off: 'Aus', off: 'Aus',
on: 'An', on: 'An',
optimal: 'optimal',
'optimal mass': 'optimale Masse', 'optimal mass': 'optimale Masse',
'optimize mass': 'Masse optimieren', 'optimize mass': 'Masse optimieren',
overwrite: 'Überschreiben', overwrite: 'Überschreiben',
@@ -164,7 +158,7 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
proceed: 'Fortfahren', proceed: 'Fortfahren',
pc: 'Krallensteuerung: Erzsucher', pc: 'Krallensteuerung: Erzsucher',
pl: 'Impulslaser', pl: 'Impulslaser',
PWR: 'En.', PWR: 'En',
rg: 'Schienenkanone', rg: 'Schienenkanone',
range: 'Reichweite', range: 'Reichweite',
rate: 'Rate', rate: 'Rate',
@@ -179,17 +173,17 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
reset: 'Zurücksetzen', reset: 'Zurücksetzen',
ret: 'Eing', ret: 'Eing',
retracted: 'Eingefahren', retracted: 'Eingefahren',
'retrofit costs': 'Nachrüstkosten', 'retrofit costs': 'Änderungskosten',
'retrofit from': 'Nachrüsten von', 'retrofit from': 'Nachrüsten von',
ROF: 'Kad', ROF: 'Kad',
S: 'K', S: 'K',
save: 'Speichern', save: 'Speichern',
sc: 'Scanner', sc: 'Scanner',
PHRASE_SELECT_BUILDS: 'Wähle Konfigurationen zum Vergleichen', PHRASE_SELECT_BUILDS: 'Ausstattung zum Vergleich auswählen',
sell: 'Verkaufen', sell: 'Verkaufen',
s: 'Sensoren', s: 'Sensoren',
settings: 'Konfigurationen', settings: 'Einstellungen',
sb: 'Schildverstärker', sb: 'Schild-Booster',
scb: 'Schildzellenbank', scb: 'Schildzellenbank',
sg: 'Schildgenerator', sg: 'Schildgenerator',
shields: 'Schilde', shields: 'Schilde',
@@ -203,8 +197,7 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
standard: 'Standard', standard: 'Standard',
'Standard Docking Computer': 'Standard-Landecomputer', 'Standard Docking Computer': 'Standard-Landecomputer',
Stock: 'Standard', Stock: 'Standard',
SYS: 'SYS', T: 't',
T: 'T',
T_LOAD: 'T-Lad', T_LOAD: 'T-Lad',
'The Retributor': 'Retributor', 'The Retributor': 'Retributor',
t: 'Schubdüsen', t: 'Schubdüsen',
@@ -217,14 +210,10 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
U: 'W', U: 'W',
unladen: 'Unbeladen', unladen: 'Unbeladen',
PHRASE_UPDATE_RDY: 'Update verfügbar! Klicken zum Aktualisieren', PHRASE_UPDATE_RDY: 'Update verfügbar! Klicken zum Aktualisieren',
URL: 'URL',
utility: 'Werkzeug', utility: 'Werkzeug',
'utility mounts': 'Werkzeug-Steckplätze', 'utility mounts': 'Werkzeug-Steckplätze',
version: 'Version',
WEP: 'WAF', WEP: 'WAF',
yes: 'Ja', yes: 'Ja',
PHRASE_BACKUP_DESC: 'Sicherung aller Coriolis Daten zu speichern oder auf einen anderen Browser / Gerät' PHRASE_BACKUP_DESC: 'Export aller Coriolis-Daten, um sie zu sichern oder oder um sie zu einem anderen Browser/Gerät zu übertragen.'
}) });
.registerAvailableLanguageKeys(['de'], { 'de_DE': 'de' });
}]); }]);

View File

@@ -51,7 +51,5 @@ angular.module('app').config(['$translateProvider', function($translateProvider)
PHRASE_CONFIRMATION: 'Are You Sure?', PHRASE_CONFIRMATION: 'Are You Sure?',
PHRASE_UPDATE_RDY: 'Update Available! Click to Refresh', PHRASE_UPDATE_RDY: 'Update Available! Click to Refresh',
PHRASE_BACKUP_DESC: 'Backup of all Coriolis data to save or transfer to another browser/device' PHRASE_BACKUP_DESC: 'Backup of all Coriolis data to save or transfer to another browser/device'
}) });
.registerAvailableLanguageKeys(['en'], { 'en_US': 'en', 'en_UK': 'en', 'en_GB': 'en', 'en_CA': 'en' });
}]); }]);

View File

@@ -259,7 +259,5 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
VULTURE: 'Vulture', VULTURE: 'Vulture',
WEP: 'WAF', WEP: 'WAF',
YES: 'Ja' YES: 'Ja'
}) });
.registerAvailableLanguageKeys(['es'], { 'es_ES': 'es' });
}]); }]);

View File

@@ -1,5 +1,4 @@
angular.module('app').config(['$translateProvider', 'localeFormatProvider', function($translateProvider, localeFormatProvider) { angular.module('app').config(['$translateProvider', 'localeFormatProvider', function($translateProvider, localeFormatProvider) {
// Declare number format settings // Declare number format settings
localeFormatProvider.addFormat('fr', { localeFormatProvider.addFormat('fr', {
decimal: ',', decimal: ',',
@@ -15,250 +14,187 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
months: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'], months: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
shortMonths: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'] shortMonths: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.']
}); });
$translateProvider.translations('fr', { $translateProvider.translations('fr', {
PHRASE_EXPORT_DESC: 'Ein detaillierter JSON-Export Ihrer Konfiguration für die Verwendung in anderen Websites und Tools', PHRASE_EXPORT_DESC: 'Un export détaillé en JSON de votre configuration pour l\'utilisation dans d\'autres sites et outils',
A_RATED: 'A-Klasse', 'A-Rated': 'Classe-A ',
ABOUT: 'Über', about: 'à propos',
ACTION: 'Aktion', added: 'ajouté',
ADDED: 'Hinzugefügt', Advanced: 'Avancé',
ADDER: 'Adder', 'Advanced Discovery Scanner': 'Scanner de découverte avancé',
ADVANCED: 'Fortgeschritten', agility: 'agilité',
'Advanced Discovery Scanner': 'Fortgeschrittener Aufklärungsscanner', ammo: 'munition',
'Advanced Plasma Laser': 'Fortgeschrittener Plasma-Laser', PHRASE_CONFIRMATION: 'Êtes-vous sûr?',
AGILITY: 'Beweglichkeit', armour: 'Armure',
ALPHA: 'Alpha', am: 'Unité de réparation automatique',
AMMO: 'Munition', available: 'Disponibilité',
ANACONDA: 'Anaconda', backup: 'sauvegarde',
PHRASE_CONFIRMATION: 'Sind Sie sicher?', 'Basic Discovery Scanner': 'Scanner de découverte de base',
ARMOUR: 'Panzerung', bl: 'Laser rayon',
ASP_EXPLORER: 'Asp Explorer', bins: 'bacs',
am: 'Automatische Feldwartungseinheit', build: 'Configuration',
AVAILABLE: 'Verfügbar', 'build name': 'Nom de la configuration',
BACKUP: 'Sicherungsdatei', builds: 'Configurations',
'Basic Discovery Scanner': 'Einfacher Aufklärungsscanner', bh: 'Coque',
bl: 'Strahlenlaser', ul: 'Laser salves',
BELUGA_LINER: 'Beluga Liner', buy: 'Acheter',
BETA: 'beta', cancel: 'Annuler',
BINS: 'Behälter', c: 'Canon',
BOOST: 'Boost', cargo: 'Soute',
BUILD: 'Konfiguration', 'Cargo Hatch': 'hublot de chargement',
BUILD_NAME: 'Konfigurationsname', cr: 'Compartiment de soute',
BUILDS: 'Konfigurationen', cs: 'Scanner de soute',
BULKHEADS: 'Rumpfhüllenverstärkung', cells: 'Cellule',
ul: 'Salvenlaser', 'Chaff Launcher': 'Lanceur de paillettes',
BUY: 'Kaufen', close: 'fermer',
CANCEL: 'Abbrechen', cc: 'Contrôleur de prospecteur',
c: 'Kanone', compare: 'comparer',
CAPITAL: 'kapital', 'compare all': 'tout comparer',
CARGO: 'Fracht', comparison: 'comparaison',
CARGO_HATCH: 'Frachtluke', comparisons: 'comparaisons',
cr: 'Frachtgestell', component: 'composant',
cs: 'Frachtscanner', cost: 'coût',
CELLS: 'Zellen', costs: 'coûts',
CHAFF_LAUNCHER: 'Düppel-Werfer', cm: 'Contre-mesure',
CLOSE: 'Schließen', create: 'Créer',
COBRA_MK_III: 'Cobra MK III', 'create new': 'Créer nouveau',
COBRA_MK_IV: 'Cobra MK IV', credits: 'crédits',
cc: 'Krallensteuerung: Sammler', damage: 'Dégâts',
COMPARE: 'Vergleichen', delete: 'supprimer',
COMPARE_ALL: 'Alles Vergleichen', 'delete all': 'tout supprimer',
COMPARISON: 'Vergleich', dep: 'depl',
COMPARISONS: 'Vergleiche', deployed: 'déployé',
COMPONENT: 'Komponente', 'detailed export': 'export détaillé',
COST: 'Kostet', 'Detailed Surface Scanner': 'Scanner de surface détaillé',
COSTS: 'Kosten', disabled: 'désactivé',
cm: 'Gegenmaßnahme', discount: 'ristourne',
CR: 'CR', Distruptor: 'Disrupteur',
CREATE: 'Erstellen', dc: 'Ordinateur d\'appontage',
CREATE_NEW: 'Neu Erstellen', done: 'Fait',
CREDITS: 'Credits', 'edit data': 'Editer donnée',
Cytoscrambler: 'Zytostreuer', efficiency: 'efficience',
DAMAGE: 'Schaden', 'Electronic Countermeasure': 'Contre mesure électronique',
DELETE: 'Löschen', empty: 'Vide',
DELETE_ALL: 'Alles Löschen', 'enter name': 'Entrer nom',
DEP: 'Ausg', fixed: 'fixé',
DEPLOYED: 'Ausgefahren', fc: 'Canon à fragmentation',
DETAILED_EXPORT: 'Detailiertes Exportieren', fd: 'Réacteur FSD',
'Detailed Surface Scanner': 'Detailoberflächenscanner', ws: 'Détecteur de sillage FSD',
DIAMONDBACK_EXPLORER: 'Diamondback-Erkunder', fi: 'Intercepteur de réacteur FSD',
DIAMONDBACK_SCOUT: 'Diamondback-Aufklärer', fuel: 'carburant',
DISABLED: 'Deaktiviert', fs: 'Récupérateur de carburant',
DISCOUNT: 'Rabatt', ft: 'Réservoir de carburant',
Distruptor: 'Disruptor', fx: 'Drone de ravitaillement',
dc: 'Standard-Landecomputer', 'full tank': 'Réservoir plein',
DOLPHIN: 'Dolphin', Gimballed: 'Point',
DONE: 'Fertig', hardpoints: 'Points d\'emport',
DPS: 'DPS', hb: 'Contrôle de patelle perce-soute',
EAGLE: 'Eagle', 'Heat Sink Launcher': 'Ejecteur de dissipateur thermique',
EDIT_DATA: 'Bearbeiten', huge: 'Très grand',
EFFICIENCY: 'Effizienz', hull: 'Coque',
'Electronic Countermeasure': 'Elektronische Gegenmaßnahme', hr: 'Renfort de soute',
EMPTY: 'leer', 'Imperial Hammer': 'Marteau impérial',
ENFORCER: 'Vollstrecker', import: 'Importer',
ENG: 'FAH', 'import all': 'Importer tout',
PHRASE_ENTER_BUILD_NAME: '', insurance: 'Assurance',
EPS: 'en/s', 'Intermediate Discovery Scanner': 'Scanner de découverte de portée intermédiaire',
EXPORT: 'Exportieren', 'internal compartments': 'compartiments internes',
FEDERAL_CORVETTE: 'Föderale Korvette', 'jump range': 'Distance de saut',
FEDERAL_DROPSHIP: 'Föderales Abwurfschiff', jumps: 'Sauts',
FEDERAL_DROPSHIP_MK_II: 'Föderales Abwurfschiff Mk II', kw: 'Détecteur d\'avis de recherche',
FEDERAL_GUNSHIP: 'Föderales Kanonenschiff', L: 'Langage',
FER_DE_LANCE: 'Fer-de-Lance', laden: 'chargé',
FIXED: '', language: 'Langage',
FORUM: 'Forum', large: 'grand',
fc: 'Splitterkanone', ls: 'Support vital',
fd: 'Frameshift-Antrieb', 'Lightweight Alloy': 'alliage léger',
ws: 'Sogwolkenscanner', 'lock factor': 'facteur inhibition de masse',
FSD: 'FSA', LS: 'SL',
fi: 'FSA-Unterbrecher', LY: 'AL',
FUEL: 'Treibstoff', mass: 'Masse',
fs: 'Treibstoffsammler', 'max mass': 'masse max',
ft: 'Treibstofftank', 'Military Grade Composite': 'Composite militaire',
fx: 'Krallensteuerung Treibstoffstransfer', nl: 'Lance-mines',
FULL_TANK: 'Tank voll', 'Mining Lance': 'Lance de minage',
GIMBALLED: 'Kardianisch', ml: 'Laser minier',
H: 'H', 'Mirrored Surface Composite': 'Composite à surface mirroir',
HARDPOINTS: 'Waffenaufhängungen', mr: 'Lance missiles',
hb: 'Krallen-Steuereinheit (Ladelukenöffner)', mc: 'Canon multiple',
HAULER: 'Hauler', 'net cost': 'coûts nets',
'Heat Sink Launcher': 'Kühlkörperwerfer', no: 'non',
HUGE: 'Riesig', PHRASE_NO_BUILDS: 'Défaut de configuration pour comparaison',
HULL: 'Hülle', PHRASE_NO_RETROCH: 'configuration non modifiée',
hr: 'Rumpfhüllenverstärkung (Paket)', none: 'aucun',
IMPERIAL_CLIPPER: 'Imperialer Clipper', 'none created': 'Rien de créé',
IMPERIAL_COURIER: 'Imperialer Kurier', off: 'éteint',
IMPERIAL_CUTTER: 'Imperialer Cutter', on: 'allumé',
IMPERIAL_EAGLE: 'Imperialer Eagle', 'optimal mass': 'masse optimale',
IMPERIAL_HAMMER: 'Imperialer Hammer', 'optimize mass': 'optimiser masse',
IMPORT: 'Importieren', overwrite: 'écraser',
IMPORT_ALL: 'Alles Importieren', Pacifier: 'Pacificateur',
INSURANCE: 'Versicherung', PHRASE_IMPORT: 'Coller JSON ou importer ici',
'Intermediate Discover Scanner': 'Mittlerer Aufklärungsscanner', pen: 'pén.',
INTERNAL_COMPARTMENTS: 'Innenbereichkabine', penetration: 'pénétration',
JUMP_RANGE: 'Sprungreichweite', permalink: 'lien durable',
JUMPS: 'Sprünge', pa: 'accélérateur plasma',
kw: 'Tötungsbefehlscanner', 'Point Defence': 'Défense ponctuelle',
KRAIT: 'Krait', power: 'énergie',
L: 'L', pd: 'distributeur d\'énérgie',
LADEN: 'Beladen', pp: 'centrale d\'énergie',
LANGUAGE: 'Sprache', priority: 'priorité',
LARGE: 'Groß', psg: 'générateur de bouclier prisme',
ls: 'Lebenserhaltung', proceed: 'continuer',
'Lightweight Alloy': 'Leichte Legierung', pc: 'Drône de minage',
LOCK_FACTOR: 'Massensperrefaktor', pl: 'Laser à impulsion',
LS: 'LS', PWR: 'Puissance',
LY: 'LJ', rg: 'Canon électromagnétique',
M: 'M', range: 'portée',
'm/s': 'M/Sec.', rate: 'cadence',
MASS: 'Masse', 'Reactive Surface Composite': 'Composite à surface réactive',
MAX: 'max', recharge: 'recharger',
MAX_MASS: 'maximale Masse',
MEDIUM: 'Mittel',
'Military Grade Composite': 'Militär-Komposit',
nl: 'Minenwerfer',
'Mining Lance': 'Lanzenabbaulaser',
ml: 'Abbaulaser',
'Mirrored Surface Composite': 'Gespiegelte-Oberfläche-Komposit',
mr: 'Raketenbatterie',
mc: 'Mehrfachgeschütz',
NET_COST: 'Nettokosten',
NO: 'Nein',
NO_RETROFITTING_CHANGES: 'Keine Umrüständerungen',
NONE: 'Nichts',
NONE_CREATED: 'Nichts erstellt',
OFF: 'Aus',
ON: 'An',
OPTIMAL: 'optimal',
OPTIMAL_MASS: 'optimale Masse',
OPTIMIZE_MASS: 'Masse optimieren',
ORCA: 'Orca',
OVERWRITE: 'Überschreiben',
Pacifier: 'Friedensstifter',
'Pack-Hound': 'Schwarmwerfer',
PANTHER_CLIPPER: 'Panter Clipper',
PHRASE_IMPORT: 'JSON hier einfügen oder hier importieren',
PEN: 'Durchdr',
PENETRATION: 'Durchdringung',
PERMALINK: 'Permalink',
pa: 'Plasmabeschleuniger',
POINT_DEFENCE: 'Punktverteidigung',
POWER: 'Energie',
pd: 'Energieverteiler',
pp: 'Kraftwerk',
PRI: 'Prio',
PRIORITY: 'Priorität',
psg: 'Prismaschildgenerator',
PROCEED: 'Fortfahren',
pc: 'Krallensteuerung: Erzsucher',
pl: 'Impulslaser',
PWR: 'En',
PYTHON: 'Python',
rg: 'Schienenkanone',
RANGE: 'Reichweite',
RATE: 'Rate',
'Reactive Surface Composite': 'Reaktive-Oberfläche-Komposit',
RECHARGE: 'Aufladen',
rf: 'Raffinerie', rf: 'Raffinerie',
REFUEL_TIME: 'Auftankzeit', 'refuel time': 'Temps de remplissage',
'Reinforced Alloy': 'Verstärkte Legierungen', 'Reinforced Alloy': 'alliage renforcé',
RELOAD: 'Aktualisieren', reload: 'recharger',
RENAME: 'Umbenennen', rename: 'renommer',
REPAIR: 'Reparieren', repair: 'parer',
RESET: 'Zurücksetzen', reset: 'Réinitialisation',
RET: 'eing', ret: 'esc',
RETRACTED: 'Eingefahren', retracted: 'escamoté',
RETROFIT_COSTS: 'Nachrüstkosten', 'retrofit costs': 'Valeur de rachat',
RETROFIT_FROM: 'Nachrüsten von', 'retrofit from': 'Racheter de',
ROF: 'Kad', ROF: 'cadence',
S: 'S', save: 'sauvegarder',
SAVE: 'Speichern', sc: 'scanner',
sc: 'Scanner', PHRASE_SELECT_BUILDS: 'Sélectionner configurations à comparer',
PHRASE_SELECT_BUILDS: 'Wähle Konfigurationen zum Vergleichen', sell: 'vendre',
SELL: 'Verkaufen', s: 'détecteurs',
s: 'Sensoren', settings: 'paramètres',
SETTINGS: 'Konfiguration', sb: 'Survolteur de bouclier',
sb: 'Schildverstärker', scb: 'Réserve de cellules d\'énergie',
scb: 'Schildzellenbank', sg: 'Générateur de bouclier',
sg: 'Schildgenerator', shields: 'boucliers',
SHIELDS: 'Schilde', ship: 'vaisseau',
SHIP: 'Schiff', ships: 'vaisseaux',
SHIPS: 'Schiffe', shortened: 'raccourci',
SHORTENED: 'Gekürzt', size: 'taille',
SIDEWINDER: 'Sidewinder', skip: 'Suivant',
SIZE: 'Größe', small: 'petit',
SKIP: 'Überspringen', speed: 'vitesse',
SMALL: 'S', 'Standard Docking Computer': 'ordinateur amarrage standard',
SPEED: 'Geschwindigkeit', Stock: 'de base',
STANDARD: 'Standard', T_LOAD: 'degrés',
STANDARD_DOCKING_COMPUTER: 'Landecomputer', 'The Retributor': 'Le Rétributeur',
STOCK: 'Standard', t: 'propulseurs',
SYS: 'SYS', time: 'temps',
T: 'T', tp: 'Tube lance-torpille',
T_LOAD: 'T-Lad', 'total range': 'Distance maximale',
THE_HUNTER: 'The Hunter', turret: 'tourelle',
'The Retributor': 'Retributor', unladen: 'Non chargé',
t: 'Schubdüsen', PHRASE_UPDATE_RDY: 'Mise à jour disponible ! Cliquez pour rafraichir',
TIME: 'Dauer', utility: 'utilitaire',
tp: 'Torpedoaufhängung', 'utility mounts': 'Support utilitaire',
TOTAL: 'Gesamt', WEP: 'ARM',
TOTAL_RANGE: 'Maximale Reichweite', yes: 'oui',
TURRET: 'Geschützturm', PHRASE_BACKUP_DESC: 'Exportation détaillée des données Coriolis pour l\'utilisation dans d\'autres sites et outils'
TYPE: 'Typ', });
TYPE_6_TRANSPORTER: 'Typ-6 Transporter',
TYPE_7_TRANSPORTER: 'Typ-7 Transporter',
TYPE_9_HEAVY: 'Typ-9 Transporter (schwer)',
U: 'U',
UNLADEN: 'Unbeladen',
UPDATE_NOTIFICATION: 'Update verfügbar! Klicken zum Aktualisieren',
URL: 'URL',
UTILITY: 'Werkzeug',
UTILITY_MOUNTS: 'Werkzeug-Steckplatz',
VERSION: 'Version',
VIPER: 'Viper',
VULTURE: 'Vulture',
WEP: 'WAF',
YES: 'Ja'
})
.registerAvailableLanguageKeys(['fr'], { 'fr_FR': 'fr', 'fr_CA': 'fr' });
}]); }]);

21
app/js/i18n/languages.js Normal file
View File

@@ -0,0 +1,21 @@
angular.module('app').config(['$translateProvider', function($translateProvider) {
$translateProvider
.useSanitizeValueStrategy('escapeParameters')
.useStorage('Persist')
.fallbackLanguage('en') // Use English as default/fallback language
.registerAvailableLanguageKeys(['en', 'de', 'fr', 'ru'], { // TODO: add 'es' to the array when ready
'en*': 'en',
'de*': 'de',
//'es*': 'es',
'fr*': 'fr',
'ru*': 'ru'
})
.determinePreferredLanguage();
}])
.value('Languages', {
en: 'English',
de: 'Deutsh',
//es: 'Español',
fr: 'Français',
ru: 'ру́сский язы́к'
});

View File

@@ -17,241 +17,217 @@ angular.module('app').config(['$translateProvider', 'localeFormatProvider', func
}); });
$translateProvider.translations('ru', { $translateProvider.translations('ru', {
PHRASE_EXPORT_DESC: '', PHRASE_EXPORT_DESC: 'Подробный экспорта JSON вашего телосложения для использования в других местах и инструментов',
A_RATED: 'А-Класса', 'A-Rated': 'А-Класса',
ABOUT: 'О сайте', about: 'О сайте',
ACTION: 'Действие', action: 'Действие',
ADDED: 'Добавлено', added: 'Добавлено',
ADVANCED: 'Продвинутый', Advanced: 'Продвинутый',
'Advanced Discovery Scanner': 'Продвинутый исследовательский сканер', 'Advanced Discovery Scanner': 'Продвинутый астросканер',
'Advanced Plasma Laser': 'Продвинутый плазменный лазер', agility: 'Маневренность',
AGILITY: 'Маневренность', alpha: 'Альфа',
ALPHA: 'Альфа', ammo: 'Боекомплект',
AMMO: 'Боекомплект',
ANACONDA: 'Анаконда',
PHRASE_CONFIRMATION: 'Вы уверены?', PHRASE_CONFIRMATION: 'Вы уверены?',
ARMOUR: 'Броня', armour: 'Броня',
ASP_EXPLORER: 'Асп Эксплорер', am: 'Ремонтный модуль',
am: 'Устройство авторемонта', available: 'доступно',
AVAILABLE: 'доступно', backup: 'бэкап',
BACKUP: 'Поддержка / запас / бэкап', 'Basic Discovery Scanner': 'Стандартный исследовательский сканер',
'Basic Discovery Scanner': 'Базовый исследовательский сканер',
bl: 'Лучевой лазер', bl: 'Лучевой лазер',
BELUGA_LINER: 'Лайнер Белуга', beta: 'Бета',
BETA: 'Бета', bins: 'контейнеры',
BINS: '', boost: 'форсаж',
BOOST: 'форсаж', build: 'cборка',
BUILD: 'cборка', 'build name': 'название сборки',
BUILD_NAME: 'название сборки', builds: 'cборки',
BUILDS: 'cборки', bh: 'Переборки',
BULKHEADS: 'Переборки', ul: 'Мультиимпульсный лазер',
ul: 'пульс-лазер', buy: 'купить',
BUY: 'купить', cancel: 'отменить',
CANCEL: 'отменить', c: 'Крупнокалиберное орудие',
c: 'Пушка', capital: 'Крупный',
CAPITAL: 'Крупный', cargo: 'Груз',
CARGO: 'Груз', 'Cargo Hatch': 'Грузовой люк',
CARGO_HATCH: 'Грузовой трюм', cr: 'Грузовой отсек',
cr: 'Грузовой модуль',
cs: 'Сканер груза', cs: 'Сканер груза',
CELLS: 'Ячейки', cells: 'Ячейки',
'Chaff Launcher': 'Постановщик помех', 'Chaff Launcher': 'Постановщик помех',
CLOSE: 'закрыть', close: 'закрыть',
COBRA_MK_III: 'Кобра МК-III',
COBRA_MK_IV: 'Кобра МК-IV',
cc: 'Контроллер "дрон-сборщик"', cc: 'Контроллер "дрон-сборщик"',
COMPARE: 'сравнить ', compare: 'сравнить ',
COMPARE_ALL: 'сравнить все', 'compare all': 'сравнить все',
COMPARISON: 'сравнение', comparison: 'сравнение',
COMPARISONS: 'сравнения', comparisons: 'сравнения',
COMPONENT: 'Компонент', component: 'Компонент',
COST: 'Стоимость/Цена', cost: 'Стоимость',
COSTS: 'Расходы', costs: 'Расходы',
cm: 'Контрмеры', cm: 'Контрмеры',
CR: 'кр.', CR: 'кр.',
CREATE: 'создать', create: 'создать',
CREATE_NEW: 'Создать снова', 'create new': 'Создать новый',
CREDITS: 'Кредиты', credits: 'Кредиты',
Cytoscrambler: 'Weapon PP - In game name', Cytoscrambler: 'сайтоскрамблер',
DAMAGE: 'Урон', damage: 'Урон',
DELETE: 'Удалить', delete: 'Удалить',
DELETE_ALL: 'Удалить все', 'delete all': 'Удалить все',
DEP: 'Вып.', dep: 'Вып',
DEPLOYED: 'Готово', deployed: 'Готово',
DETAILED_EXPORT: 'Подробный экспорт', 'detailed export': 'Подробный экспорт',
'Detailed Surface Scanner': 'Подробный сканер поверхности', 'Detailed Surface Scanner': 'Подробный сканер поверхности',
DIAMONDBACK_EXPLORER: 'Даймондбэк Эксплорер', disabled: 'Отключено',
DIAMONDBACK_SCOUT: 'Даймондбэк Скаут', discount: 'Скидка',
DISABLED: 'Отключено',
DISCOUNT: 'Скидка',
Distruptor: 'Дисраптор', Distruptor: 'Дисраптор',
dc: 'Стыковочный компьютер', dc: 'Стыковочный компьютер',
DOLPHIN: 'Дельфин', done: 'готово',
DONE: 'готово', DPS: 'ПВС',
DPS: 'Урон в секунду', 'edit data': 'Редактирование',
EAGLE: 'Орел', efficiency: 'Эффективность',
EDIT_DATA: 'Редактирование',
EFFICIENCY: 'Эффективность',
'Electronic Countermeasure': 'Электронное противодействие', 'Electronic Countermeasure': 'Электронное противодействие',
EMPTY: 'пусто', empty: 'пусто',
ENFORCER: 'Weapon PP - In game name', Enforcer: 'Энфорсер',
ENG: 'ДВГ', ENG: 'ДВГ',
PHRASE_ENTER_NAME: '', 'enter name': 'Введите имя',
EPS: 'э/с', EPS: 'э/с',
EXPORT: 'Экспорт', export: 'Экспорт',
FEDERAL_CORVETTE: 'Федеральный Корвет', fixed: 'Фиксированое',
FEDERAL_DROPSHIP: 'Федеральный Десантный Корабль', forum: 'Форум',
FEDERAL_DROPSHIP_MK_II: 'Федеральный Десантный Корабль мод.II',
FEDERAL_GUNSHIP: 'Федеральный Боевой Корабль',
FER_DE_LANCE: 'Фер-де-Ланс',
FIXED: 'Фиксированое',
FORUM: 'Форум',
fc: 'Осколочное Орудие', fc: 'Осколочное Орудие',
fd: 'ФСД', fd: вигатель FSD',
ws: 'Сканер следа', ws: 'FSD Сканнер',
FSD: 'ФСД',
fi: 'ФСД Перехватчик', fi: 'Перехватчик FSD',
FUEL: 'Топливо', fuel: 'Топливо',
fs: 'Топливозаборник', fs: 'Топливозаборник',
ft: 'Топливный бак', ft: 'Топливный бак',
fx: 'Устройство передачи топлива', fx: 'Контроллер Дрона-заправщика',
FULL_TANK: 'Полный бак', 'full tank': 'Полный бак',
GIMBALLED: 'Доводимое', Gimballed: 'Доводимое',
HARDPOINTS: 'точки установки вооружения', H: 'O',
hardpoints: 'Орудийные порты',
hb: 'Контроллер "дрон-взломщик"', hb: 'Контроллер "дрон-взломщик"',
HAULER: 'Хаулер', 'Heat Sink Launcher': 'Теплоотводная ПУ',
'Heat Sink Launcher': 'Охладитель', huge: 'огромный',
HULL: 'Корпус', hull: 'Корпус',
hr: 'Набор усиления корпуса', hr: 'Набор усиления корпуса',
IMPERIAL_CLIPPER: 'Имперский Клипер', 'Imperial Hammer': 'Имперский Молот',
IMPERIAL_COURIER: 'Имперский Курьер', import: 'импортировать ',
IMPERIAL_CUTTER: 'Имперский Куттер', 'import all': 'импортировать все',
IMPERIAL_EAGLE: 'Имперский Орёл', insurance: 'Страховка',
IMPERIAL_HAMMER: 'Имперский Молот', 'Intermediate Discovery Scanner': 'Средний исследовательский сканер',
IMPORT: 'импортировать ', 'internal compartments': 'внутренние отсеки',
IMPORT_ALL: 'импортировать все', 'jump range': 'Дальность прыжка',
INSURANCE: 'Страховка', jumps: 'Прыжков',
'Intermediate Discover Scanner': 'Средний Исследовательский Сканер', kw: 'Полицейский сканер',
INTERNAL_COMPARTMENTS: 'внутренние отсеки', L: 'б',
JUMP_RANGE: 'Дальность прыжка', laden: 'Груженый',
JUMPS: 'Прыжки', language: 'Язык',
kw: 'Сканер преступников', large: 'большой',
KRAIT: 'Крэйт',
LADEN: 'Груженый',
LANGUAGE: 'Язык',
ls: 'Система жизнеобеспечения', ls: 'Система жизнеобеспечения',
'Lightweight Alloy': 'Легкий сплав', 'Lightweight Alloy': 'Легкий сплав',
LOCK_FACTOR: 'Блокирующий Фактор (Фактор массы)', 'lock factor': 'Масс. блок',
LS: 'Св.сек', LS: 'Св.сек',
LY: 'Св.лет', LY: 'Св.лет',
M: 'С',
'm/s': 'м/с', 'm/s': 'м/с',
MASS: 'Масса', mass: 'Масса',
MAX: 'Макс', max: 'Макс',
MAX_MASS: 'Максимальная масса', 'max mass': 'Максимальная масса',
MEDIUM: 'Средний', medium: 'Средний',
'Military Grade Composite': 'Композит боевого класса', 'Military Grade Composite': 'Композит военного класса',
nl: 'Миномет', nl: 'Минный аппарат',
'Mining Lance': 'Бурильная сулица', 'Mining Lance': 'Бурильная сулица',
ml: 'Шахтерский лазер', ml: 'Горный лазер',
'Mirrored Surface Composite': 'Композит с зеркальной поверхностью', 'Mirrored Surface Composite': 'Композит с зеркальной поверхностью',
mr: 'Ракетная установка', mr: 'Ракетная установка',
mc: 'Многоствольная пушка', mc: 'Скорострельное орудие',
NET_COST: 'разница в цене', 'net cost': 'разница в цене',
NO: 'Нет', no: 'Нет',
PHRASE_NO_BUILDS: '', PHRASE_NO_BUILDS: 'Нечего сравнивать',
NO_RETROFITTING_CHANGES: 'нет ранних версий сборки\конфигурации', PHRASE_NO_RETROCH: 'нет ранних версий сборки\конфигурации',
NONE: 'ни один', none: 'ни один',
NONE_CREATED: 'не создано', 'none created': 'не создано',
OFF: 'выкл.', off: 'выкл',
ON: 'вкл.', on: 'вкл',
OPTIMAL: 'Оптимальный', optimal: 'Оптимальный',
OPTIMAL_MASS: 'Оптимальная масса', 'optimal mass': 'Оптимальная масса',
OPTIMIZE_MASS: 'Оптимизировать массу', 'optimize mass': 'Оптимизировать массу',
ORCA: 'Орка', overwrite: 'перезаписать',
OVERWRITE: 'перезаписать',
Pacifier: 'Миротворец', Pacifier: 'Миротворец',
'Pack-Hound': 'Ракеты "Собачья стая" or original name(eng)', 'Pack-Hound': 'Ракеты "Собачья стая" or original name(eng)',
PANTHER_CLIPPER: 'Клипер Пантера',
PHRASE_IMPORT: 'Для импорта вставьте код в эту форму', PHRASE_IMPORT: 'Для импорта вставьте код в эту форму',
PEN: 'Класс бронепробития. short - "прбт."', pen: 'ПБ',
PENETRATION: 'Пробитие', penetration: 'Пробитие',
PERMALINK: 'Постоянная ссылка', permalink: 'Постоянная ссылка',
pa: 'Ускоритель плазмы', pa: 'Ускоритель плазмы',
'Point Defence': 'Противоракетная защита', 'Point Defence': 'Противоракетная защита',
POWER: 'Мощность/сила/энергия', power: 'Мощность',
pd: 'Распределитель энергии', pd: 'Распределитель энергии',
pp: 'Силовая установка / реактор', pp: 'Реактор',
PRI: 'Осн', pri: 'Осн',
PRIORITY: 'Приоритет', priority: 'Приоритет',
psg: 'Генератор призматического щита', psg: 'Генератор призматического щита',
PROCEED: 'продолжить', proceed: 'продолжить',
pc: 'Контроллер "Дрон-исследователь"', pc: 'Контроллер "Дрон-исследователь"',
pl: 'Импульсный лазер', pl: 'Импульсный лазер',
PWR: 'Е', PWR: 'Эн',
PYTHON: 'Питон',
rg: 'Рельсовая пушка', rg: 'Рельсовая пушка',
RANGE: 'Дальность', range: 'Дальность',
RATE: 'скорость', rate: 'скорость',
'Reactive Surface Composite': 'Композитно-реактивная поверхность', 'Reactive Surface Composite': 'Композитно-реактивная поверхность',
RECHARGE: 'Перезарядка', recharge: 'Перезарядка',
rf: 'Переработка', rf: 'Переработка',
REFUEL_TIME: 'Время дозаправки', 'refuel time': 'Время дозаправки',
'Reinforced Alloy': 'Усиленный сплав', 'Reinforced Alloy': 'Усиленный сплав',
RELOAD: 'Перезарядить', reload: 'Перезарядить',
RENAME: 'Переименовать', rename: 'Переименовать',
REPAIR: 'Починка', repair: 'Починка',
RESET: 'Сброс', reset: 'Сброс',
RET: 'сокр', ret: 'Убр.',
RETRACTED: 'Убрано', retracted: 'Убрано',
RETROFIT_COSTS: 'цена модификации', 'retrofit costs': 'цена модификации',
RETROFIT_FROM: 'модификация от', 'retrofit from': 'модификация от',
ROF: 'скорость стрельбы', ROF: 'В/сек',
SAVE: 'Сохранить', S: 'М',
save: 'Сохранить',
sc: 'Сканер', sc: 'Сканер',
PHRASE_SELECT_BUILDS: 'Выберите конфигурацию для сравнения', PHRASE_SELECT_BUILDS: 'Выберите конфигурацию для сравнения',
SELL: 'Продать', sell: 'Продать',
s: 'Сенсоры', s: 'Сенсоры',
SETTINGS: 'Настройки', settings: 'Настройки',
sb: 'Усилитель щита', sb: 'Усилитель щита',
scb: 'Батареи перезарядки щита', scb: 'Батареи перезарядки щита',
sg: 'Генератор щита', sg: 'Генератор щита',
SHIELDS: 'Щиты', shields: 'Щиты',
SHIP: 'Корабль', ship: 'Корабль',
SHIPS: 'Корабли', ships: 'Корабли',
SHORTENED: 'Укороченный', shortened: 'Укороченный',
SIDEWINDER: 'Сайдвиндер', size: 'размер',
SIZE: 'размер', skip: 'пропустить',
SKIP: 'пропустить', small: 'Малый',
SMALL: 'Малый', speed: 'скорость',
SPEED: 'скорость', standard: 'Стандартный',
STANDARD: 'Стандартный',
'Standard Docking Computer': 'Стандартный стыковочный компьютер', 'Standard Docking Computer': 'Стандартный стыковочный компьютер',
STOCK: 'Стандартная комплектация', Stock: 'Стандартная комплектация',
SYS: 'Сис', SYS: 'СИС',
T: 'Т', T: 'Т',
T_LOAD: 'Тепловая нагрузка', T_LOAD: 'Тепл.',
THE_HUNTER: 'Охотник',
'The Retributor': 'Орудие Возмездия', 'The Retributor': 'Орудие Возмездия',
t: 'Ускорители', t: 'Ускорители',
TIME: 'Время', time: 'Время',
tp: 'Торпедная установка', tp: 'Торпедный аппарат',
TOTAL: 'Всего', total: 'Всего',
TOTAL_RANGE: 'Полный радиус', 'total range': 'Общий радиус',
TURRET: 'Туррель', turret: 'Туррель',
TYPE: 'Тип', type: 'Тип',
TYPE_6_TRANSPORTER: 'Перевозчик Тип-6', U: 'В',
TYPE_7_TRANSPORTER: 'Перевозчик Тип-7', unladen: 'Пустой',
TYPE_9_HEAVY: 'Перевозчик Тип-9 Тяжелый', PHRASE_UPDATE_RDY: 'Доступно обновление. Нажмите для обновления.',
UNLADEN: 'Пустой',
UPDATE_NOTIFICATION: 'Доступно обновление. Нажмите для обновления.',
URL: 'Ссылка', URL: 'Ссылка',
UTILITY: '', utility: 'Вспомогательное',
UTILITY_MOUNTS: 'Вспомогательное оборудование', 'utility mounts': 'Вспомогательное оборудование',
VERSION: 'Версия', version: 'Версия',
VIPER: 'Вайпер', WEP: 'ОРУ',
VULTURE: 'Вультура', yes: а',
YES: 'Да' PHRASE_BACKUP_DESC: 'Сохраните все данные перед переносом в другой браузер или устройство'
}) });
.registerAvailableLanguageKeys(['ru'], { 'ru_RU': 'ru' });
}]); }]);

View File

@@ -45,7 +45,7 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
}; };
this.getLangCode = function() { this.getLangCode = function() {
return this.lsEnabled ? localStorage.getItem(LS_KEY_LANG) : 'en'; return this.lsEnabled ? localStorage.getItem(LS_KEY_LANG) : null;
}; };
/** /**
@@ -287,7 +287,7 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
if (this.lsEnabled) { if (this.lsEnabled) {
var ratio = localStorage.getItem('sizeRatio'); var ratio = localStorage.getItem('sizeRatio');
if (!isNaN(ratio) && ratio > 0.6) { if (!isNaN(ratio) && ratio > 0.6) {
return ratio return ratio;
} }
} }
return 1; return 1;

View File

@@ -65,7 +65,7 @@ header {
.menu-item-label { .menu-item-label {
margin-left: 1em; margin-left: 1em;
.largePhone({ .smallTablet({
display: none; display: none;
}); });
} }

View File

@@ -63,6 +63,8 @@ select {
padding-left: 5px; padding-left: 5px;
border-top: 1px solid @primary-disabled; border-top: 1px solid @primary-disabled;
border-bottom: 1px solid @primary-disabled; border-bottom: 1px solid @primary-disabled;
overflow: hidden;
text-overflow: ellipsis;
} }
@optionSpacing: 2em; @optionSpacing: 2em;
@@ -114,6 +116,7 @@ select {
} }
.lc { .lc {
overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
@@ -130,6 +133,7 @@ select {
display: inline-block; display: inline-block;
text-align: left; text-align: left;
min-width: 16em; min-width: 16em;
max-width: 100%;
margin: 0 auto; margin: 0 auto;
padding: 0; padding: 0;
list-style: none; list-style: none;

View File

@@ -52,7 +52,7 @@
border-right: 1px solid @primary-disabled; border-right: 1px solid @primary-disabled;
box-sizing: border-box; box-sizing: border-box;
padding-top: 0.2em; padding-top: 0.2em;
padding-left: 0.1em; padding-left: 0.05em;
} }
.empty { .empty {

View File

@@ -76,11 +76,12 @@
<table style="width: 300px;background-color:transparent"> <table style="width: 300px;background-color:transparent">
<tr> <tr>
<td style="width: 20px"><u>A</u></td> <td style="width: 20px"><u>A</u></td>
<td slider min="0.65" def="sizeRatio" max="1.2" on-change="textSizeChange(val)"></td> <td slider min="0.65" def="sizeRatio" max="1.2" on-change="textSizeChange(val)" ignore-resize="true"></td>
<!-- <td slider min="0.65" max="1.2" def="1" init="sizeRatio" on-change="textSizeChange(val)" reset="'resetSize'" ignore-events="true"></td> -->
<td style="width: 20px"><span style="font-size: 30px">A</span></td> <td style="width: 20px"><span style="font-size: 30px">A</span></td>
</tr> </tr>
<tr> <tr>
<td></td><td style="text-align:center" class="primary-disabled" ng-click="textSizeChange(1)">Reset</td><td></td> <td></td><td style="text-align:center" class="primary-disabled cap" ng-click="resetTextSize()" translate="reset"></td><td></td>
</tr> </tr>
</table> </table>
<hr /> <hr />

View File

@@ -0,0 +1,220 @@
{
"$schema": "http://cdn.coriolis.io/schemas/ship-loadout/1.json#",
"name": "Test",
"ship": "Anaconda",
"references": [
{
"name": "Coriolis.io",
"url": "http://localhost:3300/outfit/anaconda/48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b?bn=Test",
"code": "48A6A6A5A8A8A5C2c0o0o0o1m1m0q0q0404-0l0b0100034k5n052d04--0303326b",
"shipId": "anaconda"
}
],
"components": {
"standard": {
"bulkheads": "Reactive Surface Composite",
"powerPlant": {
"class": 8,
"rating": "A"
},
"thrusters": {
"class": 6,
"rating": "A"
},
"frameShiftDrive": {
"class": 6,
"rating": "A"
},
"lifeSupport": {
"class": 5,
"rating": "A"
},
"powerDistributor": {
"class": 8,
"rating": "A"
},
"sensors": {
"class": 8,
"rating": "A"
},
"fuelTank": {
"class": 5,
"rating": "C"
}
},
"hardpoints": [
{
"class": 4,
"rating": "A",
"group": "Plasma Accelerator",
"mount": "Fixed"
},
{
"class": 3,
"rating": "D",
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 3,
"rating": "D",
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 3,
"rating": "D",
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 2,
"rating": "E",
"group": "Cannon",
"mount": "Turret"
},
{
"class": 2,
"rating": "E",
"group": "Cannon",
"mount": "Turret"
},
{
"class": 1,
"rating": "F",
"group": "Beam Laser",
"mount": "Turret"
},
{
"class": 1,
"rating": "F",
"group": "Beam Laser",
"mount": "Turret"
}
],
"utility": [
{
"class": 0,
"rating": "A",
"group": "Shield Booster"
},
{
"class": 0,
"rating": "A",
"group": "Shield Booster"
},
null,
{
"class": 0,
"rating": "C",
"group": "Kill Warrant Scanner"
},
{
"class": 0,
"rating": "C",
"group": "Cargo Scanner"
},
{
"class": 0,
"rating": "F",
"group": "Countermeasure",
"name": "Electronic Countermeasure"
},
{
"class": 0,
"rating": "I",
"group": "Countermeasure",
"name": "Chaff Launcher"
},
{
"class": 0,
"rating": "I",
"group": "Countermeasure",
"name": "Point Defence"
}
],
"internal": [
{
"class": 7,
"rating": "A",
"group": "Shield Generator"
},
{
"class": 6,
"rating": "A",
"group": "Shield Cell Bank"
},
{
"class": 6,
"rating": "E",
"group": "Cargo Rack"
},
{
"class": 5,
"rating": "D",
"group": "Hull Reinforcement Package"
},
{
"class": 5,
"rating": "E",
"group": "Cargo Rack"
},
null,
null,
{
"class": 4,
"rating": "E",
"group": "Cargo Rack"
},
{
"class": 4,
"rating": "E",
"group": "Cargo Rack"
},
{
"class": 4,
"rating": "A",
"group": "Fuel Scoop"
},
{
"class": 2,
"rating": "A",
"group": "FSD Interdictor"
}
]
},
"stats": {
"class": 3,
"hullCost": 141889932,
"speed": 180,
"boost": 240,
"boostEnergy": 29,
"agility": 2,
"baseShieldStrength": 350,
"baseArmour": 945,
"hullMass": 400,
"masslock": 23,
"shipCostMultiplier": 1,
"componentCostMultiplier": 1,
"fuelCapacity": 32,
"cargoCapacity": 128,
"ladenMass": 1339.2,
"armour": 2078,
"armourAdded": 240,
"armourMultiplier": 1.95,
"shieldMultiplier": 1.4,
"totalCost": 882362049,
"unladenMass": 1179.2,
"totalDps": 29,
"powerAvailable": 36,
"powerRetracted": 23.93,
"powerDeployed": 35.56,
"unladenRange": 18.49,
"fullTankRange": 18.12,
"ladenRange": 16.39,
"unladenTotalRange": 73.21,
"ladenTotalRange": 66.15,
"maxJumpCount": 4,
"shieldStrength": 833
}
}