Language.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <template>
  2. <div class="web-wrapper">
  3. <div v-if="isLoaded" class="container-fluid mt-3">
  4. <div class="row">
  5. <div class="col-md-3 d-md-block">
  6. <sidebar :user="profile" />
  7. </div>
  8. <div class="col-md-6">
  9. <div class="jumbotron shadow-sm bg-white">
  10. <div class="text-center">
  11. <h1 class="font-weight-bold mb-0">Language</h1>
  12. </div>
  13. </div>
  14. <div class="card shadow-sm mb-3">
  15. <div class="card-body">
  16. <div class="locale-changer form-group">
  17. <label>Language</label>
  18. <select class="form-control" v-model="locale">
  19. <option v-for="(lang, i) in langs" :key="`Lang${i}`" :value="lang">
  20. {{ fullName(lang) }}
  21. <template v-if="fullName(lang) != localeName(lang)"> · {{ localeName(lang) }}</template>
  22. </option>
  23. </select>
  24. </div>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. <drawer />
  31. </div>
  32. </template>
  33. <script type="text/javascript">
  34. import Drawer from './partials/drawer.vue';
  35. import Sidebar from './partials/sidebar.vue';
  36. export default {
  37. components: {
  38. "drawer": Drawer,
  39. "sidebar": Sidebar,
  40. },
  41. data() {
  42. return {
  43. isLoaded: false,
  44. profile: undefined,
  45. locale: 'en',
  46. // langs: ["af","ar","ca","cs","cy","da","de","el","en","eo","es","eu","fa","fi","fr","gl","he","hu","id","it","ja","ko","ms","nl","no","oc","pl","pt","ro","ru","sr","sv","th","tr","uk","vi","zh","zh-cn","zh-tw"]
  47. langs: [
  48. "en",
  49. "ar",
  50. "ca",
  51. "de",
  52. "el",
  53. "es",
  54. "eu",
  55. "fr",
  56. "he",
  57. "gd",
  58. "gl",
  59. "id",
  60. "it",
  61. "ja",
  62. "nl",
  63. "pl",
  64. "pt",
  65. "ru",
  66. "uk",
  67. "vi"
  68. ]
  69. }
  70. },
  71. mounted() {
  72. this.profile = window._sharedData.user;
  73. this.isLoaded = true;
  74. this.locale = this.$i18n.locale;
  75. },
  76. watch: {
  77. locale: function(val) {
  78. this.loadLang(val);
  79. }
  80. },
  81. methods: {
  82. fullName(val) {
  83. const factory = new Intl.DisplayNames([val], { type: 'language' });
  84. return factory.of(val);
  85. },
  86. localeName(val) {
  87. const factory = new Intl.DisplayNames([this.$i18n.locale], { type: 'language' });
  88. return factory.of(val);
  89. },
  90. loadLang(lang) {
  91. axios.post('/api/pixelfed/web/change-language.json', {
  92. v: 0.1,
  93. l: lang
  94. })
  95. .then(res => {
  96. this.$i18n.locale = lang;
  97. })
  98. }
  99. }
  100. }
  101. </script>