Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Методика глобализации (https://javascript.ru/forum/extjs/65209-metodika-globalizacii.html)

Infarch 04.10.2016 11:20

Методика глобализации
 
Здравствуйте.

Хочу посоветоваться с присутствующими специалистами насчет глобализации приложения. Имеем экст пятой версии,билд через ЦМД. Задача: отображать все тексты в зависимости от языка залогиненного пользователя.

Вариант с несколькими билдами под разные языки не подходит. Все тексты сидят в базе данных и могут быть изменены отделом поддержки, а перебилдывать и обновлять веб серверы они не будут. Значит, надо запросить переводы с сервера в стартовавшее приложение, а сервер отдаст то что нужно текущему пользователю.

Подумав, я это решил через вьюмодель. Все локализуемые компоненты имеют конфиг для связывания:

bind: {
		title: '{localtext.heading.projectinfo}'
	}


После старта приложения идет аджакс запрос за текстами, полученные данные передаются во вьюмодель ну и с помощью байнда отображаются в компонентах. Но это решение кажется не очень хорошим с точки зрения производительности, ведь мы получаем 100500 связей которые фактически нужны только один раз, при старте приложения. Потом текст уже меняться не будет.

Может присутствующие гуру посоветуют более изящное решение? Ну или скажите что перформанс не страдает и чтоб я не парился )

Pavel M. 04.10.2016 12:14

простой способ
заведи какую-нибудь глобальную функцию типа
function _(textEn) {
    //...
    return text; 
}

и все строки в приложении пропускай через эту функцию
{
    //...
    text: _('Hello!');
    //...
}

и пусть эта функция, берет замены из нужного файла с переводами

Infarch 04.10.2016 12:28

Да, можно было бы... Но я не знаю как скачать тексты ДО того как фреймворк начнет обрабатывать конфиги классов. Например, у меня есть некий синглтон Localtext и он в своем конструкторе инициирует ajax запрос к текстам. В нем же и функция для раздачи. Но пока он там ждет ответа фреймворк обрабатывает конфиги, а текстов еще нет. И получаем пустые места вместо заголовков и прочего. Такая функция будет работать во время выполнения но плоха для конфигов.

Pavel M. 04.10.2016 14:03

Цитата:

Сообщение от Infarch
ДО того как фреймворк начнет обрабатывать конфиги классов

перемести конфиги компонентов в initComponent,
они они будут выполняться только после инициализации компонента.

Infarch 04.10.2016 15:31

Ой, ну это совсем грубо. Думал о таком варианте, но мешать код и конфиги не хочется. Лучше уж как есть. Однако тестирую возможность задержать выполнение бутстрапа на время загрузки переводов.

nohuhu 04.10.2016 21:43

Цитата:

Сообщение от Infarch (Сообщение 430650)
Вариант с несколькими билдами под разные языки не подходит. Все тексты сидят в базе данных и могут быть изменены отделом поддержки, а перебилдывать и обновлять веб серверы они не будут.

В качестве лирического отступления: перед тем, как перейти на Тёмную Сторону и заняться всякой фигнёйпрограммизмами, я десять лет проработал в бизнес-интеграции, где занимался втюхиванием и впариваниемпроектированием и внедрением всякой развесистой клюквы в крупные компании. Это было, в сущности, уже довольно давно, но у меня до сих пор рефлекторно дёргается колено, когда я слышу ключевую фразу... Да-да, см. выше. Потому что слышал я эту фразу столько раз, в стольких разных вариантах, и от такого количества разных людей, что вы не поверите. ;)

А ещё вы не поверите, что в примерно 95% случаев выяснялось, что "они", оказывается, вполне вменяемые люди и вполне себе всё "будут", если им спокойно и без драмы объяснить, что нужно и зачем. В данном случае, что есть рекомендованная производителем процедура локализации софта, и работает она через сборку отдельных файлов на каждый язык. Рекомендаций по альтернативным подходам производитель не даёт, реализация на свой страх и риск, без гарантированных результатов, но с большой вероятностью срыва сроков внедрения проекта. А теперь будьте добры, объясните пожалуйста, в чём причина технической невозможности обеспечить поддержку пересборки софта с вашей стороны. Возможно, мы сможем предложить варианты решения?

Если всё это обсуждать в письменном виде с копией руководству, то нужный результат практически гарантирован. ;) И вполне может оказаться, что скрипт о 10 строчках для выгрузки данных из БД и запуска сборки ребята из техподдержки даже и сами могут написать...

Infarch 05.10.2016 10:22

nohuhu, я согласен, и медведя можно научить на велосипеде ездить. Но у клиента есть своя процедура обновлений, а мне приходится балансировать между требованиями и здравым смыслом. Вопрос этот уже поднимался, сказали - не надо. Там вообще все сложно. Основной клиент, его кастомеры что купили и поставили сайт себе, везде свои сапорты. И еще ядреная система локализации при которой, например, пользователям из компании А надо в текстах заменять некоторые слова. Так что костыль уже и не совсем костылем начинает казаться.
Да и не только в языках дело. Вот еще свои настройки формата даты и времени у каждого пользователя свои. Их бы тоже было полезно перед обработкой конфигов качнуть и принять во внимание. Сейчас это у меня как и языки, через вьюмодель.
Вот и не хватает мне некоего механизма для подкачки данных ПЕРЕД запуском микролоадера/бутстрапа. Пытаюсь скрестить ежа с павлином...

Infarch 05.10.2016 16:15

Ну вот, накостылил такой вот солюшен:
<!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>


Вроде работает...

Pavel M. 06.10.2016 12:59

а нельзя было просто
перед bootstrap загрузку нужного скрипта прописать
типа

<script src="script-need.js"></script>
<script src="bootstrap.js"></script>

?

Infarch 06.10.2016 13:49

Нельзя, есть шанс что сервер стормозит и на момент запуска бутстрапа данных еще не будет


Часовой пояс GMT +3, время: 09:14.