Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions addon/exports/host-services.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export const hostServices = [
'universe',
'intl',
'abilities',
'language',
{ hostRouter: 'router' },
];

Expand Down
1 change: 1 addition & 0 deletions addon/exports/services.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export const services = [
'universe',
'intl',
'abilities',
'language',
];

export default services;
6 changes: 6 additions & 0 deletions addon/services/current-user.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export default class CurrentUserService extends Service.extend(Evented) {
@tracked locale = 'en-us';

@storageFor('user-options') options;
@storageFor('local-cache') cache;
@alias('userSnapshot.id') id;
@alias('userSnapshot.name') name;
@alias('userSnapshot.phone') phone;
Expand Down Expand Up @@ -260,6 +261,11 @@ export default class CurrentUserService extends Service.extend(Evented) {
const whois = this.getOption('whois');

if (!whois || typeof whois !== 'object') {
// Fallback to lookup/whois in local-cache
const cachedWhois = this.cache.get('lookup/whois');
if (cachedWhois) {
return get(cachedWhois, prop);
}
return null;
}

Expand Down
103 changes: 103 additions & 0 deletions addon/services/language.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import Service from '@ember/service';
import { tracked } from '@glimmer/tracking';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { debug } from '@ember/debug';
import { task } from 'ember-concurrency';

export default class LanguageService extends Service {
@service intl;
@service fetch;
@tracked locales = [];
@tracked countries = [];
@tracked currentLocale;
@tracked availableLocales = {};

get languages() {
const availableLanguages = [];
for (let key in this.availableLocales) {
if (!key || !this.availableLocales[key]) continue;

availableLanguages.push({
...this.availableLocales[key],
locale: key,
});
}

return availableLanguages;
}

constructor() {
super(...arguments);

this.locales = this.intl.locales;
this.currentLocale = this.intl.primaryLocale;
this.loadAvailableCountries.perform();

// Check for locale change
this.intl.onLocaleChanged(() => {
this.currentLocale = this.intl.primaryLocale;
});
}

@action changeLocale(selectedLocale) {
this.currentLocale = selectedLocale;
this.intl.setLocale(selectedLocale);
this.saveUserLocale.perform(selectedLocale);
}

@task *loadAvailableCountries() {
try {
this.countries = yield this.fetch.get(
'lookup/countries',
{ columns: ['name', 'cca2', 'flag', 'emoji', 'languages'] },
{ fromCache: true, expirationInterval: 1, expirationIntervalUnit: 'week' }
);
this.availableLocales = this._createAvailableLocaleMap();
} catch (error) {
debug('Locale Error: ' + error.message);
}
}

@task *saveUserLocale(locale) {
try {
yield this.fetch.post('users/locale', { locale });
} catch (err) {
debug('[LanguageService] Unable to save user locale: ' + err.message);
}
}

getLanguage(languageName, options = { prop: 'language' }) {
const { prop } = options;

return this.languages?.find((l) => l[prop] === languageName) ?? null;
}

hasLanguage(languageName, options = { prop: 'language' }) {
return this.getLanguage(languageName, options) !== null;
}

_createAvailableLocaleMap() {
const localeMap = {};

for (let i = 0; i < this.locales.length; i++) {
const locale = this.locales.objectAt(i);

localeMap[locale] = this._findCountryDataForLocale(locale);
}

return localeMap;
}

_findCountryDataForLocale(locale) {
const localeCountry = locale.split('-')[1];
const country = this.countries.find((country) => country.cca2.toLowerCase() === localeCountry);

if (country) {
// get the language
country.language = Object.values(country.languages)[0];
}

return country;
}
}
1 change: 1 addition & 0 deletions app/services/language.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '@fleetbase/ember-core/services/language';
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@fleetbase/ember-core",
"version": "0.3.8",
"version": "0.3.9",
"description": "Provides all the core services, decorators and utilities for building a Fleetbase extension for the Console.",
"keywords": [
"fleetbase-core",
Expand Down
12 changes: 12 additions & 0 deletions tests/unit/services/language-test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { module, test } from 'qunit';
import { setupTest } from 'dummy/tests/helpers';

module('Unit | Service | language', function (hooks) {
setupTest(hooks);

// TODO: Replace this with your real tests.
test('it exists', function (assert) {
let service = this.owner.lookup('service:language');
assert.ok(service);
});
});
Loading