i18n: switch to fluent

This commit is contained in:
nkanaev
2026-06-22 20:49:44 +01:00
parent 2de9772e4b
commit 9e46014787
2 changed files with 31 additions and 27 deletions

View File

@@ -555,7 +555,7 @@ var vm = new Vue({
}) })
}, },
moveFeedToNewFolder: function(feed) { moveFeedToNewFolder: function(feed) {
var title = prompt('Enter folder name:') var title = prompt(this.$t('prompt_folder_name'))
if (!title) return if (!title) return
api.folders.create({'title': title}).then(function(folder) { api.folders.create({'title': title}).then(function(folder) {
api.feeds.update(feed.id, {folder_id: folder.id}).then(function() { api.feeds.update(feed.id, {folder_id: folder.id}).then(function() {
@@ -566,7 +566,7 @@ var vm = new Vue({
}) })
}, },
createNewFeedFolder: function() { createNewFeedFolder: function() {
var title = prompt('Enter folder name:') var title = prompt(this.$t('prompt_folder_name'))
if (!title) return if (!title) return
api.folders.create({'title': title}).then(function(result) { api.folders.create({'title': title}).then(function(result) {
vm.refreshFeeds().then(function() { vm.refreshFeeds().then(function() {
@@ -579,7 +579,7 @@ var vm = new Vue({
}) })
}, },
renameFolder: function(folder) { renameFolder: function(folder) {
var newTitle = prompt('Enter new title', folder.title) var newTitle = prompt(this.$t('prompt_new_title'), folder.title)
if (newTitle) { if (newTitle) {
api.folders.update(folder.id, {title: newTitle}).then(function() { api.folders.update(folder.id, {title: newTitle}).then(function() {
folder.title = newTitle folder.title = newTitle
@@ -590,7 +590,7 @@ var vm = new Vue({
} }
}, },
deleteFolder: function(folder) { deleteFolder: function(folder) {
if (confirm('Are you sure you want to delete ' + folder.title + '?')) { if (confirm(this.$t('confirm_delete_folder', {name: folder.title}))) {
api.folders.delete(folder.id).then(function() { api.folders.delete(folder.id).then(function() {
vm.feedSelected = null vm.feedSelected = null
vm.refreshStats() vm.refreshStats()
@@ -599,7 +599,7 @@ var vm = new Vue({
} }
}, },
updateFeedLink: function(feed) { updateFeedLink: function(feed) {
var newLink = prompt('Enter feed link', feed.feed_link) var newLink = prompt(this.$t('prompt_feed_link'), feed.feed_link)
if (newLink) { if (newLink) {
api.feeds.update(feed.id, {feed_link: newLink}).then(function() { api.feeds.update(feed.id, {feed_link: newLink}).then(function() {
feed.feed_link = newLink feed.feed_link = newLink
@@ -607,7 +607,7 @@ var vm = new Vue({
} }
}, },
renameFeed: function(feed) { renameFeed: function(feed) {
var newTitle = prompt('Enter new title', feed.title) var newTitle = prompt(this.$t('prompt_new_title'), feed.title)
if (newTitle) { if (newTitle) {
api.feeds.update(feed.id, {title: newTitle}).then(function() { api.feeds.update(feed.id, {title: newTitle}).then(function() {
feed.title = newTitle feed.title = newTitle
@@ -615,7 +615,7 @@ var vm = new Vue({
} }
}, },
deleteFeed: function(feed) { deleteFeed: function(feed) {
if (confirm('Are you sure you want to delete ' + feed.title + '?')) { if (confirm(this.$t('confirm_delete_feed', {name: feed.title}))) {
api.feeds.delete(feed.id).then(function() { api.feeds.delete(feed.id).then(function() {
vm.feedSelected = null vm.feedSelected = null
vm.refreshStats() vm.refreshStats()

View File

@@ -321,14 +321,14 @@
"ru": "Введите ссылку на ленту" "ru": "Введите ссылку на ленту"
}, },
"confirm_delete_folder": { "confirm_delete_folder": {
"en": "Are you sure you want to delete", "en": "Are you sure you want to delete { $name }?",
"zh": "确定要删除", "zh": "确定要删除{ $name }",
"ru": "Вы уверены, что хотите удалить" "ru": "Вы уверены, что хотите удалить { $name }?"
}, },
"confirm_delete_feed": { "confirm_delete_feed": {
"en": "Are you sure you want to delete", "en": "Are you sure you want to delete { $name }?",
"zh": "确定要删除", "zh": "确定要删除{ $name }",
"ru": "Вы уверены, что хотите удалить" "ru": "Вы уверены, что хотите удалить { $name }?"
}, },
"alert_no_feeds": { "alert_no_feeds": {
"en": "No feeds found at the given url.", "en": "No feeds found at the given url.",
@@ -351,22 +351,26 @@
"ru": "Пароль" "ru": "Пароль"
}, },
}; };
class i18n { function ftlFrom(lang) {
constructor() { return Object.entries(translations)
this.lang = 'en' .map(([key, langs]) => `${key} = ${langs[lang]}`)
} .join('\n')
setLang(lang) {
this.lang = lang
}
$t(code) {
return translations[code][this.lang]
}
} }
exports.i18n = { exports.i18n = {
install(Vue, opts) { install(Vue) {
const x = new i18n(); let bundle = null
Vue.prototype.$t = x.$t Vue.prototype.$setLang = function (lang) {
Vue.prototype.$setLang = x.setLang const ftl = ftlFrom(lang)
const resource = new FluentBundle.FluentResource(ftl)
bundle = new FluentBundle.FluentBundle(lang)
bundle.addResource(resource)
}
Vue.prototype.$t = function (code, args) {
if (!bundle) return
const msg = bundle.getMessage(code)
if (!msg || !msg.value) return
return bundle.formatPattern(msg.value, args)
}
} }
} }
})(window) })(window)