mirror of
https://github.com/wkulhanek/bonob.git
synced 2025-12-21 17:33:29 +01:00
Distinguish between supported lang and lang in type system (#29)
This commit is contained in:
22
src/i8n.ts
22
src/i8n.ts
@@ -3,7 +3,8 @@ import { pipe } from "fp-ts/lib/function";
|
|||||||
import { option as O } from "fp-ts";
|
import { option as O } from "fp-ts";
|
||||||
import _ from "underscore";
|
import _ from "underscore";
|
||||||
|
|
||||||
export type LANG = "en-US" | "nl-NL";
|
export type LANG = "en-US" | "da-DK" | "de-DE" | "es-ES" | "fr-FR" | "it-IT" | "ja-JP" | "nb-NO" | "nl-NL" | "pt-BR" | "sv-SE" | "zh-CN"
|
||||||
|
export type SUPPORTED_LANG = "en-US" | "nl-NL";
|
||||||
export type KEY =
|
export type KEY =
|
||||||
| "AppLinkMessage"
|
| "AppLinkMessage"
|
||||||
| "artists"
|
| "artists"
|
||||||
@@ -37,7 +38,7 @@ export type KEY =
|
|||||||
| "loginSuccessful"
|
| "loginSuccessful"
|
||||||
| "loginFailed";
|
| "loginFailed";
|
||||||
|
|
||||||
const translations: Record<LANG, Record<KEY, string>> = {
|
const translations: Record<SUPPORTED_LANG, Record<KEY, string>> = {
|
||||||
"en-US": {
|
"en-US": {
|
||||||
AppLinkMessage: "Linking sonos with $BONOB_SONOS_SERVICE_NAME",
|
AppLinkMessage: "Linking sonos with $BONOB_SONOS_SERVICE_NAME",
|
||||||
artists: "Artists",
|
artists: "Artists",
|
||||||
@@ -107,15 +108,15 @@ const translations: Record<LANG, Record<KEY, string>> = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const translationsLookup = Object.keys(translations).reduce((lookups, lang) => {
|
const translationsLookup = Object.keys(translations).reduce((lookups, lang) => {
|
||||||
lookups.set(lang, translations[lang as LANG]);
|
lookups.set(lang, translations[lang as SUPPORTED_LANG]);
|
||||||
lookups.set(lang.toLocaleLowerCase(), translations[lang as LANG]);
|
lookups.set(lang.toLocaleLowerCase(), translations[lang as SUPPORTED_LANG]);
|
||||||
lookups.set(lang.toLocaleLowerCase().split("-")[0]!, translations[lang as LANG]);
|
lookups.set(lang.toLocaleLowerCase().split("-")[0]!, translations[lang as SUPPORTED_LANG]);
|
||||||
return lookups;
|
return lookups;
|
||||||
}, new Map<string, Record<KEY, string>>())
|
}, new Map<string, Record<KEY, string>>())
|
||||||
|
|
||||||
export const randomLang = () => _.shuffle(["en-US", "nl-NL"])[0]!;
|
export const randomLang = () => _.shuffle(["en-US", "nl-NL"])[0]!;
|
||||||
|
|
||||||
export const asLANGs = (acceptLanguageHeader: string | undefined) =>
|
export const asLANGs = (acceptLanguageHeader: string | undefined): LANG[] =>
|
||||||
pipe(
|
pipe(
|
||||||
acceptLanguageHeader,
|
acceptLanguageHeader,
|
||||||
O.fromNullable,
|
O.fromNullable,
|
||||||
@@ -125,7 +126,8 @@ export const asLANGs = (acceptLanguageHeader: string | undefined) =>
|
|||||||
pipe(
|
pipe(
|
||||||
it.split(","),
|
it.split(","),
|
||||||
A.map((it) => it.trim()),
|
A.map((it) => it.trim()),
|
||||||
A.filter((it) => it != "")
|
A.filter((it) => it != ""),
|
||||||
|
A.map(it => it as LANG)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
O.getOrElseW(() => [])
|
O.getOrElseW(() => [])
|
||||||
@@ -137,12 +139,12 @@ export type Lang = (key: KEY) => string;
|
|||||||
|
|
||||||
export const langs = () => Object.keys(translations);
|
export const langs = () => Object.keys(translations);
|
||||||
|
|
||||||
export const keys = (lang: LANG = "en-US") => Object.keys(translations[lang]);
|
export const keys = (lang: SUPPORTED_LANG = "en-US") => Object.keys(translations[lang]);
|
||||||
|
|
||||||
export default (serviceName: string): I8N =>
|
export default (serviceName: string): I8N =>
|
||||||
(...langs: string[]): Lang => {
|
(...langs: string[]): Lang => {
|
||||||
const langToUse =
|
const langToUse =
|
||||||
langs.map((l) => translationsLookup.get(l as LANG)).find((it) => it) ||
|
langs.map((l) => translationsLookup.get(l as SUPPORTED_LANG)).find((it) => it) ||
|
||||||
translations["en-US"];
|
translations["en-US"];
|
||||||
return (key: KEY) => {
|
return (key: KEY) => {
|
||||||
const value = langToUse[key]?.replace(
|
const value = langToUse[key]?.replace(
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ import logger from "./logger";
|
|||||||
import { SOAP_PATH, STRINGS_ROUTE, PRESENTATION_MAP_ROUTE } from "./smapi";
|
import { SOAP_PATH, STRINGS_ROUTE, PRESENTATION_MAP_ROUTE } from "./smapi";
|
||||||
import qs from "querystring";
|
import qs from "querystring";
|
||||||
import { URLBuilder } from "./url_builder";
|
import { URLBuilder } from "./url_builder";
|
||||||
|
import { LANG } from "./i8n";
|
||||||
|
|
||||||
export const SONOS_LANG = ["en-US", "da-DK", "de-DE", "es-ES", "fr-FR", "it-IT", "ja-JP", "nb-NO", "nl-NL", "pt-BR", "sv-SE", "zh-CN"]
|
export const SONOS_LANG: LANG[] = ["en-US", "da-DK", "de-DE", "es-ES", "fr-FR", "it-IT", "ja-JP", "nb-NO", "nl-NL", "pt-BR", "sv-SE", "zh-CN"]
|
||||||
|
|
||||||
export const PRESENTATION_AND_STRINGS_VERSION = "21";
|
export const PRESENTATION_AND_STRINGS_VERSION = "21";
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import i8n, { langs, LANG, KEY, keys, asLANGs } from "../src/i8n";
|
import i8n, { langs, LANG, KEY, keys, asLANGs, SUPPORTED_LANG } from "../src/i8n";
|
||||||
|
|
||||||
describe("i8n", () => {
|
describe("i8n", () => {
|
||||||
describe("asLANGs", () => {
|
describe("asLANGs", () => {
|
||||||
@@ -41,7 +41,7 @@ describe("i8n", () => {
|
|||||||
describe("validity of translations", () => {
|
describe("validity of translations", () => {
|
||||||
it("all langs should have same keys as US", () => {
|
it("all langs should have same keys as US", () => {
|
||||||
langs().forEach((l) => {
|
langs().forEach((l) => {
|
||||||
expect(keys(l as LANG)).toEqual(keys("en-US"));
|
expect(keys(l as SUPPORTED_LANG)).toEqual(keys("en-US"));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user