index.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. import * as dates from '@common/i18n/dates'
  3. import { TranslationMap, Translator } from '@common/i18n/translator'
  4. import { reactive, ref } from 'vue'
  5. const reactiveNow = ref(new Date())
  6. window.setInterval(() => {
  7. reactiveNow.value = new Date()
  8. }, 1000)
  9. export class I18N {
  10. private translator = new Translator()
  11. t(source: string | undefined, ...args: Array<string | number>): string {
  12. if (typeof source === 'undefined') return ''
  13. return this.translator.translate(source, ...args)
  14. }
  15. date(dateString: string): string {
  16. const template = this.translator.lookup('FORMAT_DATE') || 'yyyy-mm-dd'
  17. return dates.absoluteDateTime(dateString, template)
  18. }
  19. dateTime(dateTimeString: string): string {
  20. const template =
  21. this.translator.lookup('FORMAT_DATETIME') || 'yyyy-mm-dd HH:MM'
  22. return dates.absoluteDateTime(dateTimeString, template)
  23. }
  24. relativeDateTime(dateTimeString: string, baseDate?: Date): string {
  25. return dates.relativeDateTime(
  26. dateTimeString,
  27. baseDate || reactiveNow.value,
  28. this.translator,
  29. )
  30. }
  31. setTranslationMap(map: TranslationMap): void {
  32. this.translator.setTranslationMap(map)
  33. }
  34. }
  35. export const i18n = reactive(new I18N())
  36. declare module '@vue/runtime-core' {
  37. export interface ComponentCustomProperties {
  38. i18n: I18N
  39. }
  40. }