You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
2.7 KiB

6 years ago
  1. /* global languages:false, lang_str:false */
  2. /* eslint camelcase:0 */
  3. var tagTranslations = require('./tagTranslations')
  4. function getPreferredDataLanguage () {
  5. var m = (navigator.language || navigator.userLanguage).match(/^([^-]+)(-.*|)$/)
  6. if (m) {
  7. return m[1].toLocaleLowerCase()
  8. } else {
  9. return ui_lang
  10. }
  11. }
  12. function getAcceptLanguages () {
  13. return navigator.languages || [ navigator.language || navigator.userLanguage ]
  14. }
  15. function getUiLanguages () {
  16. var i, code
  17. var ret = {}
  18. var acceptLanguages = getAcceptLanguages()
  19. for (i = 0; i < acceptLanguages.length; i++) {
  20. code = acceptLanguages[i]
  21. if (languages.indexOf(code) !== -1) {
  22. ret[code] = langName(code)
  23. }
  24. }
  25. for (i = 0; i < languages.length; i++) {
  26. code = languages[i]
  27. if (!(code in ret)) {
  28. ret[code] = langName(code)
  29. }
  30. }
  31. return ret
  32. }
  33. function getDataLanguages () {
  34. var code
  35. var ret = {}
  36. var acceptLanguages = getAcceptLanguages()
  37. for (var i = 0; i < acceptLanguages.length; i++) {
  38. code = acceptLanguages[i]
  39. ret[code] = langName(code)
  40. }
  41. for (var k in lang_str) {
  42. var m = k.match(/^lang:(.*)$/)
  43. if (m) {
  44. code = m[1]
  45. if (code === 'current') {
  46. continue
  47. }
  48. if (!(code in ret)) {
  49. ret[code] = langName(code)
  50. }
  51. }
  52. }
  53. return ret
  54. }
  55. function langName (code) {
  56. var ret = ''
  57. if (('lang_native:' + code) in lang_str && lang_str['lang_native:' + code]) {
  58. ret += lang_str['lang_native:' + code]
  59. } else {
  60. ret += 'Language "' + code + '"'
  61. }
  62. if (('lang:' + code) in lang_str && lang_str['lang:' + code]) {
  63. ret += ' (' + lang_str['lang:' + code] + ')'
  64. }
  65. return ret
  66. }
  67. register_hook('init_callback', function (initState, callback) {
  68. if (!('ui_lang' in options)) {
  69. options.ui_lang = ui_lang
  70. }
  71. if (!('data_lang' in options)) {
  72. options.data_lang = getPreferredDataLanguage()
  73. }
  74. tagTranslations.setTagLanguage(options.data_lang)
  75. callback(null)
  76. })
  77. register_hook('options_form', function (def) {
  78. def.ui_lang = {
  79. 'name': lang('options:ui_lang'),
  80. 'type': 'select',
  81. 'values': getUiLanguages(),
  82. 'req': true,
  83. 'default': ui_lang,
  84. 'reloadOnChange': true
  85. }
  86. def.data_lang = {
  87. 'name': lang('options:data_lang'),
  88. 'desc': lang('options:data_lang:desc'),
  89. 'type': 'select',
  90. 'values': getDataLanguages(),
  91. 'default': getPreferredDataLanguage(),
  92. 'placeholder': lang('options:data_lang:local')
  93. }
  94. })
  95. register_hook('options_save', function (options, old_options) {
  96. if ('data_lang' in options) {
  97. if (old_options.data_lang !== options.data_lang) {
  98. tagTranslations.setTagLanguage(options.data_lang)
  99. baseCategory.recalc()
  100. }
  101. }
  102. })