Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b722b3e

Browse files
authored
fix: add unilingual support (#1395)
Updated the app to support a unilingual configuration among the currently supported languages ('EN', 'FR'), for example, if an institution wants to configure the app to be in English only. - Added an environment variable `supportedLanguages` to define which languages are enabled in the system. - Added a condition to the app's language selector to only display it if there are multiple language options to choose from. - Refactored the `UserPreferences` service where language is defined. - Removed some of the unnecessary references to `EN` and `FR` where they were most easy to update. More work will be needed later to completely un-hardcode reliance on these specific languages, for full multilingual support.
1 parent 6f9eec8 commit b722b3e

19 files changed

Lines changed: 243 additions & 258 deletions

env/opal.config.sample.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ const config = {
2323
serviceStatusURL: "./content/service-status.json",
2424
// Boolean: whether to show the app's version and build number on the front page.
2525
showVersionOnInit: true,
26+
// String: comma-separated list of languages supported in the system (ISO 639-1 codes) with the first language being the default
27+
supportedLanguages: 'en,fr',
2628
// Boolean: whether to use real (production-ready) hospitals for login. If false, development-specific hospitals are used instead.
2729
useProductionHospitals: false,
2830
// Boolean: whether to use a sourcemap when building the web code. Should be false in production.

src/js/app.services.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import "./services/appointments.service.js";
66
import "./services/firebase.service.js";
77
import "./services/utility.service";
88
import "./services/notificationsService.js";
9-
import "./services/userPreferencesService.js";
109
import "./services/userAuthorizationInfoService.js";
1110
import "./services/updateUIService.js";
1211
import "./services/documentsService.js";
@@ -45,4 +44,5 @@ import "./services/versionService.js";
4544
import "./services/hospital.service.js";
4645
import "./services/profile-selector.service";
4746
import "./services/user.service";
47+
import "./services/user-preferences.service.js";
4848
import "./services/studiesService.js";

src/js/app.values.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
setPasswordParam: 'PASSWORD',
5252
setLanguageParam: 'LANGUAGE',
5353
setLanguageParamProperCase: 'Language',
54-
settingsLanguageOptions: ['EN', 'FR'],
5554
setFontSizeParam: 'FONTSIZE',
5655
settingFontOptions: [
5756
{size: 'medium', style: 'fontDescMedium', text: 'SMALL'},

src/js/controllers/appointments/calendarController.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@
6161
vm.noAppointments = false;
6262

6363
/**
64-
* The user's preferred language/
65-
* Either 'EN' or 'FR'
64+
* The user's preferred language
6665
* @type {string}
6766
*/
6867
vm.language = '';

src/js/controllers/documents/individualDocumentController.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,10 @@
156156
if (vm.DocumentDescription !== '') {
157157
navigator.pushPage('./views/personal/documents/about-document.html', {'Post': docParams});
158158
} else {
159-
// Check if there is any about link
160-
var link = null;
161-
docParams.hasOwnProperty("URL_EN") ? link = docParams["URL_" + UserPreferences.getLanguage()] : {};
162-
163159
// Set the options to send to the content controller
164160
var contentOptions = {
165161
contentType: docParams.AliasName_EN,
166-
contentLink: link,
162+
contentLink: docParams["URL_" + UserPreferences.getLanguage()],
167163
title: 'INFO',
168164
};
169165

src/js/controllers/home/homeController.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
) {
2323
let vm = this;
2424

25-
vm.language = 'EN';
25+
vm.language = '';
2626
vm.calledApp = null;
2727
$scope.infoModalData = [];
2828

src/js/controllers/init/technical-legal.controller.js

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
let vm = this;
2020
let navigator;
2121

22-
vm.changeLanguage = changeLanguage;
2322
vm.goToFeedback = goToFeedback;
2423
vm.goToLicense = () => navigator.pushPage('views/init/license.html');
2524
vm.goToThirdParty = () => navigator.pushPage('views/init/third-party.html');
@@ -36,21 +35,11 @@
3635
vm.navigatorName = Navigator.getNavigatorName();
3736

3837
vm.authenticated = !!Firebase.getCurrentUser();
39-
vm.languageSwitch = (UserPreferences.getLanguage().toUpperCase() !== 'EN');
4038
vm.currentYear = new Date().getFullYear();
4139
vm.APP_VERSION = Constants.version();
4240
vm.APP_BUILD_NUMBER = Constants.build();
4341
}
4442

45-
function changeLanguage(value) {
46-
47-
if (value) {
48-
UserPreferences.setLanguage('FR');
49-
} else {
50-
UserPreferences.setLanguage('EN');
51-
}
52-
}
53-
5443
function goToFeedback() {
5544
navigator.pushPage('views/general/feedback/feedback.html', {contentType: 'general'});
5645
}

src/js/controllers/settings/accountSettingsController.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
function accountSettingController(UserPreferences, $scope, $timeout, Navigator,
2424
UserHospitalPreferences, LogOutService, User) {
2525

26-
var vm = this;
26+
let vm = this;
27+
vm.multipleLanguageOptions = UserPreferences.getSupportedLanguages().length > 1;
28+
2729
vm.accountDeviceBackButton = () => tabbar.setActiveTab(0);
2830
vm.goToGeneralSettings = goToGeneralSettings;
2931
vm.goToUpdateAccountField = (param, animation) => settingsNavigator.pushPage('views/settings/update-account-field.html', {param:param},{ animation : animation });

src/js/controllers/settings/changeSettingController.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
} else if (parameters === Params.setLanguageParam) {
6767
vm.instruction = "SELECT_LANGUAGE";
6868
vm.pickLanguage = UserPreferences.getLanguage();
69-
vm.settingsLanguageOptions = Params.settingsLanguageOptions;
69+
vm.settingsLanguageOptions = UserPreferences.getSupportedLanguages();
7070
} else if (parameters === Params.setFontSizeParam) {
7171
vm.settingFontOptions = Params.settingFontOptions;
7272
vm.instruction = "SELECT_FONT_SIZE";
@@ -82,11 +82,11 @@
8282

8383
//Function to change the language
8484
function changeLanguage(val) {
85-
var objectToSend = {};
86-
objectToSend.NewValue = val;
87-
objectToSend.FieldToChange = Params.setLanguageParamProperCase;
88-
RequestToServer.sendRequest('AccountChange', objectToSend);
8985
UserPreferences.setLanguage(val, true);
86+
RequestToServer.sendRequest('AccountChange', {
87+
NewValue: val,
88+
FieldToChange: Params.setLanguageParamProperCase,
89+
});
9090
}
9191

9292
/**

src/js/services/announcementsService.js

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -133,25 +133,20 @@
133133
/**
134134
*@ngdoc method
135135
*@name setLanguage
136-
*@param {Array} item Array or object with announcements
136+
*@param {object[]|object} announcements Array of announcements, or single announcement object.
137137
*@description Translates the array parameter containing announcements to appropriate preferred language specified in {@link OpalApp.service:UserPreferences UserPreferences}.
138138
*@returns {Array} Returns array with translated values
139139
**/
140-
function setLanguage(item) {
141-
var language = UserPreferences.getLanguage();
142-
if (Array.isArray( item )) {
143-
for (var i = 0; i < item.length; i++) {
144-
//set language
145-
item[i].Title = (language === 'EN')? item[i].PostName_EN : item[i].PostName_FR;
146-
item[i].Body = (language === 'EN')? item[i].Body_EN : item[i].Body_FR;
147-
}
148-
}else{
149-
//set language if string
150-
item.Title = (language ==='EN')? item.PostName_EN : item.PostName_FR;
151-
item.Body = (language === 'EN')? item.Body_EN: item.Body_FR;
152-
}
140+
function setLanguage(announcements) {
141+
let language = UserPreferences.getLanguage();
142+
let announcementList = Array.isArray(announcements) ? announcements : [announcements];
143+
144+
announcementList.forEach(announcement => {
145+
announcement.Title = announcement[`PostName_${language}`];
146+
announcement.Body = announcement[`Body_${language}`];
147+
});
153148

154-
return item;
149+
return announcements;
155150
}
156151

157152
/**

0 commit comments

Comments
 (0)