Skip to content

Instantly share code, notes, and snippets.

@colelawrence
Created February 21, 2020 12:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save colelawrence/a928845d7468840dac9bf80668077f27 to your computer and use it in GitHub Desktop.
Save colelawrence/a928845d7468840dac9bf80668077f27 to your computer and use it in GitHub Desktop.
type LanguageKey = keyof Definitions<any>
let currentLanguage: LanguageKey = "en"
/**
* @param namespace most underlying i18n solutions like to have a namespace
*/
function define<T>(namespace: string, definitions: Definitions<T>): Translate<T> {
// ... set up with your existing translation library which supports fallbacks and such...
return key => `Key (${key}) has no definition`
}
type Translate<T> = (key: keyof T, params?: any) => string
/** development type */
type Definitions<T> = {
en: T,
fr: Partial<T>,
}
// greeting.i18n.ts
// separate your translation files based on part of the product being worked on
const greetingI18n = define('greeting', {
en: {
// depending on the way your translation lib works, you could use functions and template strings here, too.
hello$name: "Hello, $name!",
// many libraries use key suffixes to mean special things
cartItems$count: "one item",
cartItems$count_2: "two items",
cartItems$count_plural: "$count items",
},
fr: {
hello$name: "Bonjour, $name!",
cartItems$count: "un article",
cartItems$count_2: "deux articles",
cartItems$count_plural: "$count articles",
}
})
// see how the first argument can be autocompleted
// then, the key itself ("cartItems$count") describes the parameters
// we're expecting. Although not "type-checked", it is simpler, very compatible,
// and gets us 90% of the way there (as far as defining expectations)
console.log(greetingI18n("cartItems$count", { count: 2 }))
https://www.typescriptlang.org/play/#code/C4TwDgpgBAMghgOwOYFc5IgaQiKBeKAaxwHsAzKAEQjIEsFbhaSEBnAHkRAD4AoXgDYRgUAMYoAThIgJg8ZGgwAuWIlTosOfFABEMnfwD0AKmO8oxqAAEwcCXAC2UBI4itbo6A5KsRKBAAmEBICIPRIULQAjAAcCFCsJAIoTCysUAK0xFDAJFAAFnAAbtBwzq7ucJ7mxoa8ZP6iqfFBdAgQ7AAq3AAULg5uHhAqvhLhADRQrfSMzGwq1G2zaV3cAJQqnfZsAnDAHd1QAN7mUIaGUAB01wnCUChgUADujPlQICSSUBAAHrS+4Ry21Yu2aGVoACN7BJcE98rRRG9WA8wCQJMB0mQ4AIBBCqoR0ogAgkUIjrpdTtJgJJ4sRcHhuFAAAbYXA9AAkRzpAF81gU4OkEHlpgxmkzeNz+LxQJAoFtECC9gdGQQenSVHTyHLJrZ7A5WAB+FRcPkMhLAMbIIymKYQEoCEhgAayHLgaC1aVuqg0GbNDiHAgnKDfBCbcanMgSFQABTsTGxq3Dkt45ygSGkwnCl2icUuGJTF1YEF1SvenwkQIVoLmUDoQnSeKLxJYUF1Ii1wHy0DAEhIAVJIghEEBTzRxGbCF4ojSInTEEzyAAkrF4gQRRAegByOcLpCbyZB4MhlSHo9H1NBSCBQEtzvQJ5wXAfL4Wqt7GuZCHPMesSbPsSfAIxIoEWtaNH6UBEjkEAOGAoLQKM4TpF20iTLkJAUmeZ5djiJDsv0wy6AAEhAuGTPhrgAIQ6OGpxYWcFwOFw4JQnYtBuPcoF0iSZB0D8HG5FAAyIAkkCiLQ2I5PCyCsHRWGiHGi77Pq7LTv4wAqDoLDQIwME0XJZ4KeiSkwawqmfLIAD6ABMmnAKOkTKaw+n0cGRnACZKlqVZcGSNimnmepjmmS5R7cuGZ6RieBlHjhDoUQMmkAEIsAAVuW5EEdRtGuWIilOYFsiaf4kHogiQihfR7meWZ3nADZmlBCgPylUwoj1pV8n5aZhX1b59gCAFdWteVbidZKvJGIW84FCQTxSdAdASL4pWoM6IgKfEQ6QSkJDTrBQj7AEBYLQgaFdkQWiMEWAgUD0OjVQVdU6HyQSsKIYxDukd6tnYrj7MtJ1PBAm7SN8PxiUwyCXFAACCAidp8SBvEKIg6DKEAALSIhAojjjRjmROkrC0AdwSTCUMIAbB74QkI4aplBGAYpxUAAJwAAwAKRQB2F0Prgd5gz0Aq1nYkHpCKgK-JD75pGsU5pEkECXA6SA9DuUNIMucT3Y9PXPQeAHqSo1lQLyCtAA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment