main.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. 'use strict'
  2. import 'femtocrank/style.css'
  3. import 'femtocrank/dark.css'
  4. import './style.css'
  5. import 'iconify-icon'
  6. import { createClient } from '@connectrpc/connect'
  7. import { createConnectTransport } from '@connectrpc/connect-web'
  8. import { OliveTinApiService } from './resources/scripts/gen/olivetin/api/v1/olivetin_pb'
  9. import { createApp } from 'vue'
  10. import { createI18n } from 'vue-i18n'
  11. import router from './resources/vue/router.js'
  12. import App from './resources/vue/App.vue'
  13. import { initWebsocket } from './js/websocket.js'
  14. import combinedTranslations from '../lang/combined_output.json'
  15. function getSelectedLanguage () {
  16. const storedLanguage = localStorage.getItem('olivetin-language')
  17. if (storedLanguage && storedLanguage !== 'auto') {
  18. return storedLanguage
  19. }
  20. if (storedLanguage === 'auto') {
  21. localStorage.removeItem('olivetin-language')
  22. }
  23. if (navigator.languages && navigator.languages.length > 0) {
  24. const available = Object.keys(combinedTranslations.messages || {})
  25. for (const candidate of navigator.languages) {
  26. const lowerCandidate = candidate.toLowerCase()
  27. const exact = available.find(locale => locale.toLowerCase() === lowerCandidate)
  28. if (exact) {
  29. return exact
  30. }
  31. const prefix = available.find(locale => locale.toLowerCase().startsWith(lowerCandidate.split('-')[0] + '-'))
  32. if (prefix) {
  33. return prefix
  34. }
  35. }
  36. }
  37. return 'en'
  38. }
  39. async function initClient () {
  40. const transport = createConnectTransport({
  41. baseUrl: window.location.protocol + '//' + window.location.host + '/api/'
  42. })
  43. window.client = createClient(OliveTinApiService, transport)
  44. window.initResponse = await window.client.init({})
  45. const i18nSettings = createI18n({
  46. legacy: false,
  47. locale: getSelectedLanguage(),
  48. fallbackLocale: 'en',
  49. messages: combinedTranslations.messages,
  50. postTranslation: (translated) => {
  51. const params = new URLSearchParams(window.location.search)
  52. if (params.has('debug-translations')) {
  53. return '____'
  54. } else {
  55. return translated
  56. }
  57. }
  58. })
  59. return i18nSettings
  60. }
  61. function setupVue (i18nSettings) {
  62. const app = createApp(App)
  63. app.use(router)
  64. app.use(i18nSettings)
  65. window.i18n = i18nSettings.global
  66. app.mount('#app')
  67. }
  68. async function main () {
  69. const i18nSettings = await initClient()
  70. initWebsocket()
  71. setupVue(i18nSettings)
  72. }
  73. main()