UNPKG

@nextcloud/l10n

Version:

Nextcloud localization and translation helpers for apps and libraries

1 lines 5.42 kB
{"version":3,"file":"gettext.cjs","sources":["../lib/gettext.ts"],"sourcesContent":["/*!\n * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\n/**\n * This module provides functionality to translate applications independent from Nextcloud\n *\n * @packageDocumentation\n * @module @nextcloud/l10n/gettext\n * @example\n * ```js\nimport { getGettextBuilder } from '@nextcloud/l10n/gettext'\nconst gt = getGettextBuilder()\n\t\t\t.detectLocale() // or use setLanguage()\n\t\t\t.addTranslation(/* ... *\\/)\n\t\t\t.build()\ngt.gettext('some string to translate')\n```\n */\nimport type { AppTranslations } from './registry.ts'\nimport { getLanguage, getPlural, translate, translatePlural } from './index.ts'\n\nexport interface GettextTranslation {\n\tmsgid: string\n\tmsgid_plural?: string\n\tmsgstr: string[]\n}\n\nexport interface GettextTranslationContext {\n\t[msgid: string]: GettextTranslation\n}\n\nexport interface GettextTranslationBundle {\n\theaders: {\n\t\t[headerName: string]: string\n\t},\n\ttranslations: {\n\t\t[context: string]: GettextTranslationContext\n\t}\n}\n\nclass GettextBuilder {\n\n\tprivate debug = false\n\tprivate language = 'en'\n\tprivate translations = {} as Record<string, GettextTranslationBundle>\n\n\tsetLanguage(language: string): this {\n\t\tthis.language = language\n\t\treturn this\n\t}\n\n\t/**\n\t * Try to detect locale from context with `en` as fallback value\n\t * This only works within a Nextcloud page context.\n\t *\n\t * @deprecated use `detectLanguage` instead.\n\t */\n\tdetectLocale(): this {\n\t\treturn this.detectLanguage()\n\t}\n\n\t/**\n\t * Try to detect locale from context with `en` as fallback value.\n\t * This only works within a Nextcloud page context.\n\t */\n\tdetectLanguage(): this {\n\t\treturn this.setLanguage(getLanguage().replace('-', '_'))\n\t}\n\n\taddTranslation(language: string, data: GettextTranslationBundle): this {\n\t\tthis.translations[language] = data\n\t\treturn this\n\t}\n\n\tenableDebugMode(): this {\n\t\tthis.debug = true\n\t\treturn this\n\t}\n\n\tbuild(): GettextWrapper {\n\t\tif (this.debug) {\n\t\t\tconsole.debug(`Creating gettext instance for language ${this.language}`)\n\t\t}\n\n\t\tconst translations = Object.values(this.translations[this.language]?.translations[''] ?? {})\n\t\t\t.map(({ msgid, msgid_plural: msgidPlural, msgstr }) => {\n\t\t\t\tif (msgidPlural !== undefined) {\n\t\t\t\t\treturn [`_${msgid}_::_${msgidPlural}_`, msgstr]\n\t\t\t\t}\n\t\t\t\treturn [msgid, msgstr[0]]\n\t\t\t})\n\n\t\tconst bundle: AppTranslations = {\n\t\t\tpluralFunction: (n: number) => getPlural(n, this.language),\n\t\t\ttranslations: Object.fromEntries(translations),\n\t\t}\n\n\t\treturn new GettextWrapper(bundle)\n\t}\n\n}\n\nclass GettextWrapper {\n\n\tconstructor(\n\t\tprivate bundle: AppTranslations,\n\t) {\n\t}\n\n\t/**\n\t * Get translated string (singular form), optionally with placeholders\n\t *\n\t * @param original original string to translate\n\t * @param placeholders map of placeholder key to value\n\t */\n\tgettext(original: string, placeholders: Record<string, string | number> = {}): string {\n\t\treturn translate('', original, placeholders, undefined, { bundle: this.bundle })\n\t}\n\n\t/**\n\t * Get translated string with plural forms\n\t *\n\t * @param singular Singular text form\n\t * @param plural Plural text form to be used if `count` requires it\n\t * @param count The number to insert into the text\n\t * @param placeholders optional map of placeholder key to value\n\t */\n\tngettext(singular: string, plural: string, count: number, placeholders: Record<string, string | number> = {}): string {\n\t\treturn translatePlural('', singular, plural, count, placeholders, { bundle: this.bundle })\n\t}\n\n}\n\n/**\n * Create a new GettextBuilder instance\n */\nexport function getGettextBuilder() {\n\treturn new GettextBuilder()\n}\n\nexport type {\n\tGettextBuilder,\n\tGettextWrapper,\n}\n"],"names":["getLanguage","getPlural","translate","translatePlural"],"mappings":";;;AAAA;AAAA;AAAA;AAAA;AA0CA,MAAM,eAAe;AAAA,EAEZ,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe,CAAC;AAAA,EAExB,YAAY,UAAwB;AACnC,SAAK,WAAW;AACT,WAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASR,eAAqB;AACpB,WAAO,KAAK,eAAe;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5B,iBAAuB;AACtB,WAAO,KAAK,YAAYA,YAAA,YAAA,EAAc,QAAQ,KAAK,GAAG,CAAC;AAAA,EAAA;AAAA,EAGxD,eAAe,UAAkB,MAAsC;AACjE,SAAA,aAAa,QAAQ,IAAI;AACvB,WAAA;AAAA,EAAA;AAAA,EAGR,kBAAwB;AACvB,SAAK,QAAQ;AACN,WAAA;AAAA,EAAA;AAAA,EAGR,QAAwB;AACvB,QAAI,KAAK,OAAO;AACf,cAAQ,MAAM,0CAA0C,KAAK,QAAQ,EAAE;AAAA,IAAA;AAGlE,UAAA,eAAe,OAAO,OAAO,KAAK,aAAa,KAAK,QAAQ,GAAG,aAAa,EAAE,KAAK,CAAE,CAAA,EACzF,IAAI,CAAC,EAAE,OAAO,cAAc,aAAa,aAAa;AACtD,UAAI,gBAAgB,QAAW;AAC9B,eAAO,CAAC,IAAI,KAAK,OAAO,WAAW,KAAK,MAAM;AAAA,MAAA;AAE/C,aAAO,CAAC,OAAO,OAAO,CAAC,CAAC;AAAA,IAAA,CACxB;AAEF,UAAM,SAA0B;AAAA,MAC/B,gBAAgB,CAAC,MAAcC,YAAAA,UAAU,GAAG,KAAK,QAAQ;AAAA,MACzD,cAAc,OAAO,YAAY,YAAY;AAAA,IAC9C;AAEO,WAAA,IAAI,eAAe,MAAM;AAAA,EAAA;AAGlC;AAEA,MAAM,eAAe;AAAA,EAEpB,YACS,QACP;AADO,SAAA,SAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUT,QAAQ,UAAkB,eAAgD,IAAY;AAC9E,WAAAC,YAAA,UAAU,IAAI,UAAU,cAAc,QAAW,EAAE,QAAQ,KAAK,QAAQ;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhF,SAAS,UAAkB,QAAgB,OAAe,eAAgD,CAAA,GAAY;AAC9G,WAAAC,4BAAgB,IAAI,UAAU,QAAQ,OAAO,cAAc,EAAE,QAAQ,KAAK,QAAQ;AAAA,EAAA;AAG3F;AAKO,SAAS,oBAAoB;AACnC,SAAO,IAAI,eAAe;AAC3B;;"}