From 720c16f3ac249b335c502ce8d9eb0ff8d062f587 Mon Sep 17 00:00:00 2001
From: KDSBrowne <kert.browne85@gmail.com>
Date: Fri, 7 Oct 2016 09:36:27 -0700
Subject: [PATCH] Moved over the previous solution to the server side and
 cleaned up the code

---
 bigbluebutton-html5/client/langprovider.jsx   | 61 -------------
 bigbluebutton-html5/client/main.jsx           | 30 ++++++-
 bigbluebutton-html5/client/services.js        | 90 -------------------
 bigbluebutton-html5/imports/locales/en.json   |  3 -
 bigbluebutton-html5/imports/locales/index.js  |  9 +-
 .../imports/startup/server/index.js           | 49 ++++++++++
 6 files changed, 81 insertions(+), 161 deletions(-)
 delete mode 100755 bigbluebutton-html5/client/langprovider.jsx
 delete mode 100755 bigbluebutton-html5/client/services.js

diff --git a/bigbluebutton-html5/client/langprovider.jsx b/bigbluebutton-html5/client/langprovider.jsx
deleted file mode 100755
index 671cb5ee95..0000000000
--- a/bigbluebutton-html5/client/langprovider.jsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import React, { Component, PropTypes } from 'react';
-import { IntlProvider } from 'react-intl';
-import { loadMessages } from './services';
-import { renderRoutes } from '../imports/startup/client/routes.js';
-import Locales from '../imports/locales';
-
-// Set the defaultLocale below for all <FormattedMessage /> default messages.
-// The corresponding locale must be exported in /imports/locales/index.js
-let defaultLocale = 'en';
-let defaultMsgs;
-let newMsgs;
-let msgsUpdated = false;
-let flag = true;
-
-let browserLang = navigator.language.split('-');
-let langRegion = browserLang[0] + '-' + browserLang[1].toUpperCase();
-let lang = browserLang[0];
-let region = browserLang[1].toUpperCase();
-
-defaultMsgs = Locales[defaultLocale];
-
-if (langRegion == defaultLocale || lang == defaultLocale) {
-  flag = false;
-}
-
-class LangProvider extends Component {
-   constructor(props) {
-     super(props);
-     this.state = {};
-   }
-
-   updateMessages(msgs) {
-     let updatedMsgs = loadMessages(msgs, defaultLocale, lang, langRegion);
-     return updatedMsgs;
-   }
-
-  render() {
-    while (flag) {
-      newMsgs = this.updateMessages(defaultMsgs);
-      flag = false;
-      msgsUpdated = true;
-    }
-
-    let passLocale;
-    let passMsgs;
-
-    if (msgsUpdated) {
-      passLocale = newMsgs[0]; passMsgs = newMsgs[1];
-    }else {
-      passLocale = defaultLocale; passMsgs = defaultMsgs;
-    }
-
-    return (
-      <IntlProvider locale={passLocale} messages={passMsgs}>
-        {renderRoutes()}
-      </IntlProvider>
-    );
-  }
-}
-
-export default LangProvider;
diff --git a/bigbluebutton-html5/client/main.jsx b/bigbluebutton-html5/client/main.jsx
index dc22962247..fa345e0bb1 100755
--- a/bigbluebutton-html5/client/main.jsx
+++ b/bigbluebutton-html5/client/main.jsx
@@ -3,7 +3,29 @@ import { Meteor } from 'meteor/meteor';
 import { render } from 'react-dom';
 import { renderRoutes } from '../imports/startup/client/routes.js';
 import { IntlProvider } from 'react-intl';
-import LangProvider from './langprovider';
+
+let defaultLocale = 'en';
+let browserLanguage = navigator.language;
+let messages;
+
+function LoadMessages(browserLanguage) {
+  $.ajax({
+    type: 'GET',
+    async: false,
+    url: `http://192.168.32.128/html5client/locale?locale=${browserLanguage}`,
+    dataType: 'json',
+    success: SetMessages,
+    error: Err,
+  });
+
+  function SetMessages(data) {
+    messages = data;
+  }
+
+  function Err(data) {
+    console.log('Error : Locale Not Found,  Using Default');
+  }
+}
 
 // Helper to load javascript libraries from the BBB server
 function loadLib(libname, success, fail) {
@@ -36,7 +58,11 @@ Meteor.startup(() => {
   loadLib('verto_extension.js');
   loadLib('jquery.jsonrpcclient.js');
 
+  LoadMessages(browserLanguage);
+
   render((
-    <LangProvider />
+    <IntlProvider  locale={defaultLocale} messages={messages}>
+      {renderRoutes()}
+    </IntlProvider>
   ), document.getElementById('app'));
 });
diff --git a/bigbluebutton-html5/client/services.js b/bigbluebutton-html5/client/services.js
deleted file mode 100755
index 308f9b1b4f..0000000000
--- a/bigbluebutton-html5/client/services.js
+++ /dev/null
@@ -1,90 +0,0 @@
-import { Meteor } from 'meteor/meteor';
-import Locales from '../imports/locales';
-
-var extend = require('util')._extend;
-
-function loadMessages(defaultMsgs, defaultLocale,  lang, langRegion) {
-  let newMessages;
-
-  let langOnly = false;
-
-  let langRegionOnly = false;
-
-  //let localeFound = false;
-  //let attempted = false;
-
-  //pt_BR is used for testing.
-  /*
-  let PT_BR = {
-    "app.home.greeting": "Bem-vindo {name}! Sua aprensentação começará em breve...",
-    "app.userlist.participantsTitle": "Participantes",
-    "app.userlist.messagesTitle": "Mensagens",
-    "app.userlist.presenter": "Apresentador",
-    "app.userlist.you": "Você",
-    "app.chat.submitLabel": "Enviar Mensagem",
-    "app.chat.inputLabel": "Campo de mensagem para conversa {name}",
-    "app.chat.titlePublic": "Conversa Publíca",
-    "app.chat.titlePrivate": "Conversa Privada com {name}",
-    "app.chat.partnerDisconnected": "{name} saiu da sala",
-    "app.chat.moreMessages": "Mais mensagens abaixo",
-    "app.kickMessage": "Você foi expulso da apresentação",
-    "app.failedMessage": "Desculpas, estamos com problemas para se conectar ao servidor.",
-    "app.connectingMessage": "Conectando...",
-    "app.waitingMessage": "Desconectado. Tentando reconectar em {seconds} segundos..."
-  }
-  */
-
-  //TODO: get ajax calls to work, issue is with the url. doesnt have access to locale .json files
-  /*
-  while(!localeFound && !attempted){
-    $.ajax({
-       type: 'GET',
-       url: `http://192.168.32.128/bigbluebutton/${langRegion}.json`,
-       dataType: 'json',
-       success: function (data) {
-         //alert("SUCCESS::>  " + data);
-         newMessages = data;
-         attempted = true;
-         localeFound = true;
-         langRegionOnly = true;
-       },
-       error: function (result) {
-         alert("Error: Not found, Checking backup");
-         $.ajax({
-              type: 'GET',
-              url: `http://192.168.32.128/bigbluebutton/${lang}.json`,
-              dataType: 'json',
-              success: function (data) {
-                //alert("SUCCESS::>  " + data);
-                newMessages = data;
-                attempted = true;
-                localeFound = true;
-                langOnly = true;
-              },
-              error: function (result) {
-                alert("Error: Locale not found, Using Default");
-              },
-          });
-       },
-   });
-   attempted = true;
-  }
-  */
-
-  //var combined = extend(defaultMsgs, pt_BR);
-
-  var combined = extend(defaultMsgs, newMessages);
-
-  let results = [];
-  if (langOnly) {
-    results = [lang, combined];
-  }else if (langRegionOnly) {
-    results = [langRegion, combined];
-  }else {
-    results = [defaultLocale, combined];
-  }
-
-  return results;
-}
-
-export {loadMessages};
diff --git a/bigbluebutton-html5/imports/locales/en.json b/bigbluebutton-html5/imports/locales/en.json
index 4183f0b30e..ee4e0c8e61 100755
--- a/bigbluebutton-html5/imports/locales/en.json
+++ b/bigbluebutton-html5/imports/locales/en.json
@@ -1,6 +1,3 @@
-
-
-
 {
   "app.home.greeting": "Welcome {name}! Your presentation will begin shortly...",
   "app.userlist.participantsTitle": "Participants",
diff --git a/bigbluebutton-html5/imports/locales/index.js b/bigbluebutton-html5/imports/locales/index.js
index 09fa0e0dd7..3891b4704d 100755
--- a/bigbluebutton-html5/imports/locales/index.js
+++ b/bigbluebutton-html5/imports/locales/index.js
@@ -1,9 +1,8 @@
 import en from './en.json';
-
-//import ptBR from './pt-BR.json';
+import ptBR from './pt-BR.json';
 
 export default {
-  en: en,
-
-  //'pt-BR': ptBR,
+  'en': en,
+  'en-US': en,
+  'pt-BR': ptBR,
 };
diff --git a/bigbluebutton-html5/imports/startup/server/index.js b/bigbluebutton-html5/imports/startup/server/index.js
index 1f8488b40a..d7aff4b056 100755
--- a/bigbluebutton-html5/imports/startup/server/index.js
+++ b/bigbluebutton-html5/imports/startup/server/index.js
@@ -3,6 +3,8 @@ import '/server/server';
 import { RedisPubSub } from '/imports/startup/server/RedisPubSub';
 import { EventQueue } from '/imports/startup/server/EventQueue';
 import { clearCollections } from '/imports/api/common/server/helpers';
+import { Meteor } from 'meteor/meteor';
+import  Locales  from '/imports/locales';
 
 Meteor.startup(function () {
   redisPubSub = new RedisPubSub();
@@ -33,6 +35,53 @@ WebApp.connectHandlers.use('/check', (req, res, next) => {
   res.end(JSON.stringify(payload));
 });
 
+WebApp.connectHandlers.use('/locale', (req, res) => {
+  let defaultLocale = 'en';
+  let availableTranslations = ['en', 'en-US', 'pt-BR'];
+  let defaultMessages = {};
+  let newMessages = {};
+  let languageRegion = null;
+  let language = null;
+  let foundl = false;
+  let foundlr = false;
+
+  let browserLang = req.query.locale.split('-');
+
+  if (browserLang[1]) {
+    languageRegion = browserLang[0] + '-' + browserLang[1].toUpperCase();
+    language = browserLang[0];
+  } else {
+    language = browserLang[0];
+  }
+
+  defaultMessages = Locales[defaultLocale];
+
+  for (i = 0; i < availableTranslations.length; i++) {
+    if (languageRegion == availableTranslations[i]) {
+      foundlr = true;
+    } else if (language == availableTranslations[i]) {
+      foundl = true;
+    }
+  }
+
+  if (foundlr) {
+    newMessages = Locales[languageRegion];
+    foundlr = false;
+  }else if (foundl) {
+    newMessages = Locales[language];
+    foundl = false;
+  } else {
+    newMessages = defaultMessages;
+  }
+
+  let merged = {};
+  Object.assign(merged, defaultMessages, newMessages);
+
+  res.setHeader('Content-Type', 'application/json');
+  res.writeHead(200);
+  res.end(JSON.stringify(merged));
+});
+
 export const myQueue = new EventQueue();
 
 export const eventEmitter = new (Npm.require('events').EventEmitter);
-- 
GitLab