Как включить установку многоязычного Angular PWA с одним сервисным работником?

Я подготовил приложения с локализованными языковыми версиями. Для этого я использовал нативный модуль Angular i18n, который подготовил два пакета приложений с соответствующим языком в каждом.

Каждая версия приложения доступна в отдельном месте на моем сервере nginx:

  • myapp.com/ru/...
  • myapp.com/pl/...

Я хочу, чтобы мое приложение было установлено один раз как PWA и предоставляло обе языковые версии с помощью (одного?) работника службы.

К сожалению, все, что я могу сейчас сделать с модулем @angular/pwa, — это предоставить отдельный сервис-воркер для каждого приложения, что требует отдельной установки каждой языковой версии моего приложения.

Мой вопрос: есть ли способ заставить приложение работать так, как я описал, используя @angular/pwa или Workbox?

// Кстати, немного удивительно, что создатели Angular не выделили интеграцию @angular/localize с @angular/pwa.


person Jelly    schedule 30.04.2020    source источник
comment
какую версию angular-cli вы используете?   -  person ninjadev1030    schedule 09.05.2020
comment
Я не думаю, что это реально. Дело в том, что все ваши переводы являются частью кода JS, поэтому разные l18ns будут иметь разный код. Таким образом, вы не можете объединить их с помощью одного работника. В конце концов, это разные приложения. Возможно, вы могли бы обойти это, используя ngx-translate, что потребовало бы изменения архитектуры перевода. Однако его переводы не зависят от приложения, поэтому вы можете кэшировать их все в одной установке приложения.   -  person Sergey    schedule 10.05.2020
comment
@Сергей Спасибо за ответ. Да, у приложений разный код js, но Angular хэширует имена файлов, поэтому они имеют разные имена в каждом языковом приложении. Теоретически, если бы можно было кэшировать файлы, указанные в двух index.html, это решило бы проблему. Знаете ли вы, можно ли этого добиться с помощью любой библиотеки SW или собственной реализации? Я знаю библиотеку ngx-translate, но это в крайнем случае, потому что приложение действительно большое, поэтому менять архитектуру пришлось бы долго.   -  person Jelly    schedule 11.05.2020
comment
@Jelly Я думаю, что ты можешь сделать это вручную двумя способами. Либо создайте конфиг со всеми языками и соответствующими им JS-файлами, либо сделайте парсер для index.html. Затем вам нужно создать свой собственный воркер, который будет вставлять нужные скрипты при загрузке страницы (вы не можете делать это на ходу, так как код JS уже загружен). Это загрузит соответствующее приложение. И там у вас есть рабочие для каждого приложения, я думаю   -  person Sergey    schedule 11.05.2020
comment
Кроме того, почему вы хотите установить оба приложения в одном месте? Ваши фактические приложения размещены на разных URL-адресах, поэтому для переключения между ними требуется перезагрузка страницы. Таким образом, разумно устанавливать каждую версию отдельно.   -  person Sergey    schedule 11.05.2020
comment
Итак, завершая сказанное выше. У вас есть N приложений для каждого языка. Они размещены на разных доменах. На самом деле это разные приложения. Поэтому, даже если вы установите их все по одному URL-адресу, вы сможете установить все их.   -  person Sergey    schedule 11.05.2020
comment
@Sergey Вы правы, моя идея установить два приложения сразу немного странная ;), но следующий шаг - разместить это в магазине Google. В этом случае я не хочу разбивать его на два приложения PWA, потому что мне придется дублировать свой продукт в магазине.   -  person Jelly    schedule 11.05.2020
comment
Вы дали несколько хороших идей, можете ли вы подытожить свои комментарии в качестве ответа? Тогда я смогу предоставить вам награду.   -  person Jelly    schedule 11.05.2020


Ответы (2)


У вас есть N приложений для каждого языка. Они размещены на разных доменах. На самом деле это разные приложения. Поэтому, даже если вы установите их все по одному URL-адресу, вы сможете установить их все.

В качестве варианта использования одного домена с разными приложениями вы можете либо создать конфигурацию со всеми языками и соответствующими им JS-файлами, либо сделать парсер для index.html. Затем вам нужно создать свой собственный воркер, который будет вставлять нужные скрипты при загрузке страницы (вы не можете делать это на ходу, так как код JS уже загружен). Это загрузит соответствующее приложение. И там у вас есть рабочие для каждого приложения, я думаю.

Вы можете рассмотреть возможность переключения своего инструмента i18n, если вы собираетесь опубликовать его в Google Store как гибридное приложение.

В качестве другого варианта вы можете предоставить слой для своего WebView и загрузить другой URL-адрес в зависимости от выбранного пользователем языка.

person Sergey    schedule 11.05.2020

У меня была такая же проблема. Мое приложение никогда не будет в общедоступной сети, поэтому есть такая же проблема. Хотя у меня была проблема с поиском работника службы PWA. Он жаловался, что сервисный работник не был найден, даже если он был. Я решил эту проблему, изменив файл манифеста. Раньше у меня было

"start_url": "/",

Затем я изменил его на

"start_url": "./",

Затем он правильно нашел сервисворкера.

person Janne Harju    schedule 15.04.2021