summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/locale/index.js
blob: 7ba676d6d20aa0d568b29f10d98c5d76317b0d50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import Jed from 'jed';

/**
  This is required to require all the translation folders in the current directory
  this saves us having to do this manually & keep up to date with new languages
**/
function requireAll(requireContext) { return requireContext.keys().map(requireContext); }

const allLocales = requireAll(require.context('./', true, /^(?!.*(?:index.js$)).*\.js$/));
const locales = allLocales.reduce((d, obj) => {
  const data = d;
  const localeKey = Object.keys(obj)[0];

  data[localeKey] = obj[localeKey];

  return data;
}, {});

let lang = document.querySelector('html').getAttribute('lang') || 'en';
lang = lang.replace(/-/g, '_');

const locale = new Jed(locales[lang]);

/**
  Translates `text`

  @param text The text to be translated
  @returns {String} The translated text
**/
const gettext = locale.gettext.bind(locale);

/**
  Translate the text with a number
  if the number is more than 1 it will use the `pluralText` translation.
  This method allows for contexts, see below re. contexts

  @param text Singular text to translate (eg. '%d day')
  @param pluralText Plural text to translate (eg. '%d days')
  @param count Number to decide which translation to use (eg. 2)
  @returns {String} Translated text with the number replaced (eg. '2 days')
**/
const ngettext = (text, pluralText, count) => {
  const translated = locale.ngettext(text, pluralText, count).replace(/%d/g, count).split('|');

  return translated[translated.length - 1];
};

/**
  Translate context based text
  Either pass in the context translation like `Context|Text to translate`
  or allow for dynamic text by doing passing in the context first & then the text to translate

  @param keyOrContext Can be either the key to translate including the context
                      (eg. 'Context|Text') or just the context for the translation
                      (eg. 'Context')
  @param key Is the dynamic variable you want to be translated
  @returns {String} Translated context based text
**/
const pgettext = (keyOrContext, key) => {
  const normalizedKey = key ? `${keyOrContext}|${key}` : keyOrContext;
  const translated = gettext(normalizedKey).split('|');

  return translated[translated.length - 1];
};

export { lang };
export { gettext as __ };
export { ngettext as n__ };
export { pgettext as s__ };
export default locale;