Методика глобализации
Здравствуйте.
Хочу посоветоваться с присутствующими специалистами насчет глобализации приложения. Имеем экст пятой версии,билд через ЦМД. Задача: отображать все тексты в зависимости от языка залогиненного пользователя. Вариант с несколькими билдами под разные языки не подходит. Все тексты сидят в базе данных и могут быть изменены отделом поддержки, а перебилдывать и обновлять веб серверы они не будут. Значит, надо запросить переводы с сервера в стартовавшее приложение, а сервер отдаст то что нужно текущему пользователю. Подумав, я это решил через вьюмодель. Все локализуемые компоненты имеют конфиг для связывания: bind: { title: '{localtext.heading.projectinfo}' } После старта приложения идет аджакс запрос за текстами, полученные данные передаются во вьюмодель ну и с помощью байнда отображаются в компонентах. Но это решение кажется не очень хорошим с точки зрения производительности, ведь мы получаем 100500 связей которые фактически нужны только один раз, при старте приложения. Потом текст уже меняться не будет. Может присутствующие гуру посоветуют более изящное решение? Ну или скажите что перформанс не страдает и чтоб я не парился ) |
простой способ
заведи какую-нибудь глобальную функцию типа function _(textEn) { //... return text; } и все строки в приложении пропускай через эту функцию { //... text: _('Hello!'); //... } и пусть эта функция, берет замены из нужного файла с переводами |
Да, можно было бы... Но я не знаю как скачать тексты ДО того как фреймворк начнет обрабатывать конфиги классов. Например, у меня есть некий синглтон Localtext и он в своем конструкторе инициирует ajax запрос к текстам. В нем же и функция для раздачи. Но пока он там ждет ответа фреймворк обрабатывает конфиги, а текстов еще нет. И получаем пустые места вместо заголовков и прочего. Такая функция будет работать во время выполнения но плоха для конфигов.
|
Цитата:
они они будут выполняться только после инициализации компонента. |
Ой, ну это совсем грубо. Думал о таком варианте, но мешать код и конфиги не хочется. Лучше уж как есть. Однако тестирую возможность задержать выполнение бутстрапа на время загрузки переводов.
|
Цитата:
А ещё вы не поверите, что в примерно 95% случаев выяснялось, что "они", оказывается, вполне вменяемые люди и вполне себе всё "будут", если им спокойно и без драмы объяснить, что нужно и зачем. В данном случае, что есть рекомендованная производителем процедура локализации софта, и работает она через сборку отдельных файлов на каждый язык. Рекомендаций по альтернативным подходам производитель не даёт, реализация на свой страх и риск, без гарантированных результатов, но с большой вероятностью срыва сроков внедрения проекта. А теперь будьте добры, объясните пожалуйста, в чём причина технической невозможности обеспечить поддержку пересборки софта с вашей стороны. Возможно, мы сможем предложить варианты решения? Если всё это обсуждать в письменном виде с копией руководству, то нужный результат практически гарантирован. ;) И вполне может оказаться, что скрипт о 10 строчках для выгрузки данных из БД и запуска сборки ребята из техподдержки даже и сами могут написать... |
nohuhu, я согласен, и медведя можно научить на велосипеде ездить. Но у клиента есть своя процедура обновлений, а мне приходится балансировать между требованиями и здравым смыслом. Вопрос этот уже поднимался, сказали - не надо. Там вообще все сложно. Основной клиент, его кастомеры что купили и поставили сайт себе, везде свои сапорты. И еще ядреная система локализации при которой, например, пользователям из компании А надо в текстах заменять некоторые слова. Так что костыль уже и не совсем костылем начинает казаться.
Да и не только в языках дело. Вот еще свои настройки формата даты и времени у каждого пользователя свои. Их бы тоже было полезно перед обработкой конфигов качнуть и принять во внимание. Сейчас это у меня как и языки, через вьюмодель. Вот и не хватает мне некоего механизма для подкачки данных ПЕРЕД запуском микролоадера/бутстрапа. Пытаюсь скрестить ежа с павлином... |
Ну вот, накостылил такой вот солюшен:
<!DOCTYPE HTML> <html manifest=""> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <title>SafetyRound</title> <!-- Pre-load all needed resource, like to texts, etc. --> <script type="text/javascript"> function loader(){ var script = document.createElement("script") script.src = "/controller?cmd=sr.assets.localtext&dc_"+(new Date()).getTime(); script.type = "text/javascript"; document.body.appendChild(script); script.onload = function(){ var html = document.getElementById("sp").innerHTML, script2 = document.createElement("script"), attrs; html = html.replace(/<!--<script\s+/, "").replace(/><\/script>-->/, "").replace(/"/g, ""); attrs = html.split(/\s|=/); while( attrs.length ){ script2.setAttribute( attrs.shift(), attrs.shift() ); } document.body.appendChild(script2); }; } </script> </head> <body onload="loader()"> <span id="sp" style="display: none"><!--<script id="microloader" type="text/javascript" src="bootstrap.js"></script>--></span> </body> </html> Вроде работает... |
а нельзя было просто
перед bootstrap загрузку нужного скрипта прописать типа <script src="script-need.js"></script> <script src="bootstrap.js"></script> ? |
Нельзя, есть шанс что сервер стормозит и на момент запуска бутстрапа данных еще не будет
|
Часовой пояс GMT +3, время: 09:14. |