summaryrefslogtreecommitdiffstats
path: root/apps/web-shared/src/lib/i18n
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-06-10 00:35:22 +0200
committerivarlovlie <git@ivarlovlie.no>2022-06-10 00:35:22 +0200
commit21764214c257949844d87e445f1a9f2736a20561 (patch)
tree9fb2369ea92a53c6ba19825424693c73aab7c1e1 /apps/web-shared/src/lib/i18n
parentf6156d9137d4c07dd7afc8c3288dc00879db0b73 (diff)
downloadgreatoffice-21764214c257949844d87e445f1a9f2736a20561.tar.xz
greatoffice-21764214c257949844d87e445f1a9f2736a20561.zip
feat: Add translations to stopwatch.svelte
This commit also demonstrates how to do i18n across apps.
Diffstat (limited to 'apps/web-shared/src/lib/i18n')
-rw-r--r--apps/web-shared/src/lib/i18n/en/index.ts13
-rw-r--r--apps/web-shared/src/lib/i18n/formatters.ts11
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-types.ts66
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-util.async.ts27
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-util.sync.ts27
-rw-r--r--apps/web-shared/src/lib/i18n/i18n-util.ts31
-rw-r--r--apps/web-shared/src/lib/i18n/nb/index.ts13
7 files changed, 188 insertions, 0 deletions
diff --git a/apps/web-shared/src/lib/i18n/en/index.ts b/apps/web-shared/src/lib/i18n/en/index.ts
new file mode 100644
index 0000000..65fc0df
--- /dev/null
+++ b/apps/web-shared/src/lib/i18n/en/index.ts
@@ -0,0 +1,13 @@
+import type {BaseTranslation} from "../i18n-types";
+
+const en: BaseTranslation = {
+ stopwatch: {
+ roundUp: "Round up",
+ roundDown: "Round down",
+ createEntry: "Create entry",
+ whatsYourFocus: "What's your focus?",
+ reset: "Reset"
+ }
+};
+
+export default en;
diff --git a/apps/web-shared/src/lib/i18n/formatters.ts b/apps/web-shared/src/lib/i18n/formatters.ts
new file mode 100644
index 0000000..78734f9
--- /dev/null
+++ b/apps/web-shared/src/lib/i18n/formatters.ts
@@ -0,0 +1,11 @@
+import type { FormattersInitializer } from 'typesafe-i18n'
+import type { Locales, Formatters } from './i18n-types'
+
+export const initFormatters: FormattersInitializer<Locales, Formatters> = (locale: Locales) => {
+
+ const formatters: Formatters = {
+ // add your formatter functions here
+ }
+
+ return formatters
+}
diff --git a/apps/web-shared/src/lib/i18n/i18n-types.ts b/apps/web-shared/src/lib/i18n/i18n-types.ts
new file mode 100644
index 0000000..2048802
--- /dev/null
+++ b/apps/web-shared/src/lib/i18n/i18n-types.ts
@@ -0,0 +1,66 @@
+// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
+import type { BaseTranslation as BaseTranslationType, LocalizedString } from 'typesafe-i18n'
+
+export type BaseTranslation = BaseTranslationType
+export type BaseLocale = 'en'
+
+export type Locales =
+ | 'en'
+ | 'nb'
+
+export type Translation = RootTranslation
+
+export type Translations = RootTranslation
+
+type RootTranslation = {
+ stopwatch: {
+ /**
+ * Round up
+ */
+ roundUp: string
+ /**
+ * Round down
+ */
+ roundDown: string
+ /**
+ * Create entry
+ */
+ createEntry: string
+ /**
+ * What's your focus?
+ */
+ whatsYourFocus: string
+ /**
+ * Reset
+ */
+ reset: string
+ }
+}
+
+export type TranslationFunctions = {
+ stopwatch: {
+ /**
+ * Round up
+ */
+ roundUp: () => LocalizedString
+ /**
+ * Round down
+ */
+ roundDown: () => LocalizedString
+ /**
+ * Create entry
+ */
+ createEntry: () => LocalizedString
+ /**
+ * What's your focus?
+ */
+ whatsYourFocus: () => LocalizedString
+ /**
+ * Reset
+ */
+ reset: () => LocalizedString
+ }
+}
+
+export type Formatters = {}
diff --git a/apps/web-shared/src/lib/i18n/i18n-util.async.ts b/apps/web-shared/src/lib/i18n/i18n-util.async.ts
new file mode 100644
index 0000000..90e55a7
--- /dev/null
+++ b/apps/web-shared/src/lib/i18n/i18n-util.async.ts
@@ -0,0 +1,27 @@
+// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
+
+import { initFormatters } from './formatters'
+import type { Locales, Translations } from './i18n-types.js'
+import { loadedFormatters, loadedLocales, locales } from './i18n-util'
+
+const localeTranslationLoaders = {
+ en: () => import('./en/index.js'),
+ nb: () => import('./nb/index.js'),
+}
+
+const updateDictionary = (locale: Locales, dictionary: Partial<Translations>) =>
+ loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary }
+
+export const loadLocaleAsync = async (locale: Locales): Promise<void> => {
+ updateDictionary(
+ locale,
+ (await localeTranslationLoaders[locale]()).default as unknown as Translations
+ )
+ loadFormatters(locale)
+}
+
+export const loadAllLocalesAsync = (): Promise<void[]> => Promise.all(locales.map(loadLocaleAsync))
+
+export const loadFormatters = (locale: Locales): void =>
+ void (loadedFormatters[locale] = initFormatters(locale))
diff --git a/apps/web-shared/src/lib/i18n/i18n-util.sync.ts b/apps/web-shared/src/lib/i18n/i18n-util.sync.ts
new file mode 100644
index 0000000..8909831
--- /dev/null
+++ b/apps/web-shared/src/lib/i18n/i18n-util.sync.ts
@@ -0,0 +1,27 @@
+// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
+
+import { initFormatters } from './formatters'
+import type { Locales, Translations } from './i18n-types.js'
+import { loadedFormatters, loadedLocales, locales } from './i18n-util'
+
+import en from './en/index.js'
+import nb from './nb/index.js'
+
+const localeTranslations = {
+ en,
+ nb,
+}
+
+export const loadLocale = (locale: Locales): void => {
+ if (loadedLocales[locale]) return
+
+ loadedLocales[locale] = localeTranslations[locale] as unknown as Translations
+ loadFormatters(locale)
+}
+
+export const loadAllLocales = (): void => locales.forEach(loadLocale)
+
+export const loadFormatters = (locale: Locales): void => {
+ loadedFormatters[locale] = initFormatters(locale)
+}
diff --git a/apps/web-shared/src/lib/i18n/i18n-util.ts b/apps/web-shared/src/lib/i18n/i18n-util.ts
new file mode 100644
index 0000000..5a9dd0d
--- /dev/null
+++ b/apps/web-shared/src/lib/i18n/i18n-util.ts
@@ -0,0 +1,31 @@
+// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
+/* eslint-disable */
+
+import { i18n as initI18n, i18nObject as initI18nObject, i18nString as initI18nString } from 'typesafe-i18n'
+import type { LocaleDetector } from 'typesafe-i18n/detectors'
+import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors'
+import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types.js'
+
+export const baseLocale: Locales = 'en'
+
+export const locales: Locales[] = [
+ 'en',
+ 'nb'
+]
+
+export const loadedLocales = {} as Record<Locales, Translations>
+
+export const loadedFormatters = {} as Record<Locales, Formatters>
+
+export const i18nString = (locale: Locales) => initI18nString<Locales, Formatters>(locale, loadedFormatters[locale])
+
+export const i18nObject = (locale: Locales) =>
+ initI18nObject<Locales, Translations, TranslationFunctions, Formatters>(
+ locale,
+ loadedLocales[locale],
+ loadedFormatters[locale]
+ )
+
+export const i18n = () => initI18n<Locales, Translations, TranslationFunctions, Formatters>(loadedLocales, loadedFormatters)
+
+export const detectLocale = (...detectors: LocaleDetector[]) => detectLocaleFn<Locales>(baseLocale, locales, ...detectors)
diff --git a/apps/web-shared/src/lib/i18n/nb/index.ts b/apps/web-shared/src/lib/i18n/nb/index.ts
new file mode 100644
index 0000000..d7f557d
--- /dev/null
+++ b/apps/web-shared/src/lib/i18n/nb/index.ts
@@ -0,0 +1,13 @@
+import type {Translation} from "../i18n-types";
+
+const nb: Translation = {
+ stopwatch: {
+ roundUp: "Rund opp",
+ roundDown: "Rund ned",
+ createEntry: "Opprett tidsoppføring",
+ whatsYourFocus: "Hva skal du fokusere på?",
+ reset: "Tilbakestill"
+ }
+};
+
+export default nb;