From 9c45082524278c5af8435ccd66d53a6528baa7eb Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Mon, 13 Aug 2018 23:48:13 +0900 Subject: [PATCH 1/4] refs #151 Switch language in preferences --- src/config/locales/en/translation.json | 4 + src/config/locales/ja/translation.json | 4 + src/constants/language.js | 10 +++ src/main/index.js | 31 ++++++++ src/main/preferences.js | 4 + src/renderer/App.vue | 3 + src/renderer/components/Preferences.vue | 7 ++ .../components/Preferences/Language.vue | 75 +++++++++++++++++++ src/renderer/router/index.js | 5 ++ src/renderer/store/App.js | 22 +++--- src/renderer/store/Preferences.js | 4 +- src/renderer/store/Preferences/Language.js | 41 ++++++++++ 12 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 src/constants/language.js create mode 100644 src/renderer/components/Preferences/Language.vue create mode 100644 src/renderer/store/Preferences/Language.js diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 4c594c95..95076e83 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -102,6 +102,10 @@ "confirm": "Confirm", "cancel": "Cancel", "confirm_message": "Are you sure to remove all associations?" + }, + "language": { + "title": "Language", + "display_language": "language" } }, "modals": { diff --git a/src/config/locales/ja/translation.json b/src/config/locales/ja/translation.json index 66656ccc..36b9be78 100644 --- a/src/config/locales/ja/translation.json +++ b/src/config/locales/ja/translation.json @@ -102,6 +102,10 @@ "confirm": "確認", "cancel": "キャンセル", "confirm_message": "本当に全ての連携を削除しますか?" + }, + "language": { + "title": "言語", + "display_language": "表示言語" } }, "modals": { diff --git a/src/constants/language.js b/src/constants/language.js new file mode 100644 index 00000000..a658d67f --- /dev/null +++ b/src/constants/language.js @@ -0,0 +1,10 @@ +export default { + en: { + name: 'English', + key: 'en' + }, + ja: { + name: '日本語', + key: 'ja' + } +} diff --git a/src/main/index.js b/src/main/index.js index 6fa7c10b..5473c480 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -17,6 +17,7 @@ import Streaming from './streaming' import Preferences from './preferences' import Hashtags from './hashtags' import i18n from '../config/i18n' +import Language from '../constants/language' /** * Context menu @@ -96,6 +97,16 @@ async function changeAccount (account, index) { } } +async function getLanguage () { + try { + const preferences = new Preferences(preferencesDBPath) + const conf = await preferences.load() + return conf.language.language + } catch (err) { + return Language.en.key + } +} + async function createWindow () { /** * List accounts @@ -109,6 +120,12 @@ async function createWindow () { } }) + /** + * Get language + */ + const language = await getLanguage() + i18n.changeLanguage(language) + /** * Set application menu */ @@ -593,6 +610,20 @@ ipcMain.on('get-collapse', (event, _) => { }) }) +ipcMain.on('change-language', (event, value) => { + const preferences = new Preferences(preferencesDBPath) + preferences.update( + { + language: { + language: value + } + }) + .then((conf) => { + i18n.changeLanguage(conf.language.language) + event.sender.send('response-change-language', conf.language.language) + }) +}) + // hashtag ipcMain.on('save-hashtag', (event, tag) => { const hashtags = new Hashtags(hashtagsDB) diff --git a/src/main/preferences.js b/src/main/preferences.js index e6e9fba2..cde25d33 100644 --- a/src/main/preferences.js +++ b/src/main/preferences.js @@ -3,6 +3,7 @@ import objectAssignDeep from 'object-assign-deep' import Visibility from '../constants/visibility' import DisplayStyle from '../constants/displayStyle' import Theme from '../constants/theme' +import Language from '../constants/language' const Base = { general: { @@ -17,6 +18,9 @@ const Base = { }, state: { collapse: false + }, + language: { + language: Language.en.key } } diff --git a/src/renderer/App.vue b/src/renderer/App.vue index 5eae1d5b..9d18baaf 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -31,6 +31,9 @@ export default { created () { this.$store.dispatch('App/watchShortcutsEvents') this.$store.dispatch('App/loadPreferences') + .then((conf) => { + this.$i18n.i18next.changeLanguage(conf.language.language) + }) }, destroyed () { this.$store.dispatch('App/removeShortcutsEvents') diff --git a/src/renderer/components/Preferences.vue b/src/renderer/components/Preferences.vue index 383b8cab..d271d35b 100644 --- a/src/renderer/components/Preferences.vue +++ b/src/renderer/components/Preferences.vue @@ -26,6 +26,10 @@ {{ $t('preferences.account.title') }} + + + {{ $t('preferences.language.title') }} + @@ -56,6 +60,9 @@ export default { }, account () { this.$router.push('/preferences/account') + }, + language () { + this.$router.push('/preferences/language') } } } diff --git a/src/renderer/components/Preferences/Language.vue b/src/renderer/components/Preferences/Language.vue new file mode 100644 index 00000000..1696d4a6 --- /dev/null +++ b/src/renderer/components/Preferences/Language.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/renderer/router/index.js b/src/renderer/router/index.js index 1c3c345e..332db7ac 100644 --- a/src/renderer/router/index.js +++ b/src/renderer/router/index.js @@ -30,6 +30,11 @@ export default new Router({ path: 'account', name: 'account', component: require('@/components/Preferences/Account').default + }, + { + path: 'language', + name: 'language', + component: require('@/components/Preferences/Language').default } ] }, diff --git a/src/renderer/store/App.js b/src/renderer/store/App.js index bf32e74b..1ea357d6 100644 --- a/src/renderer/store/App.js +++ b/src/renderer/store/App.js @@ -44,15 +44,19 @@ const App = { ipcRenderer.removeAllListeners('open-preferences') }, loadPreferences ({ commit }) { - ipcRenderer.send('get-preferences') - ipcRenderer.once('error-get-preferences', (event, err) => { - ipcRenderer.removeAllListeners('response-get-preferences') - }) - ipcRenderer.once('response-get-preferences', (event, conf) => { - ipcRenderer.removeAllListeners('error-get-preferences') - commit('updateTheme', conf.general.theme) - commit('updateDisplayNameStyle', conf.general.displayNameStyle) - commit('updateFontSize', conf.general.fontSize) + return new Promise((resolve, reject) => { + ipcRenderer.send('get-preferences') + ipcRenderer.once('error-get-preferences', (event, err) => { + ipcRenderer.removeAllListeners('response-get-preferences') + reject(err) + }) + ipcRenderer.once('response-get-preferences', (event, conf) => { + ipcRenderer.removeAllListeners('error-get-preferences') + commit('updateTheme', conf.general.theme) + commit('updateDisplayNameStyle', conf.general.displayNameStyle) + commit('updateFontSize', conf.general.fontSize) + resolve(conf) + }) }) } } diff --git a/src/renderer/store/Preferences.js b/src/renderer/store/Preferences.js index c9936a7c..3f11027a 100644 --- a/src/renderer/store/Preferences.js +++ b/src/renderer/store/Preferences.js @@ -1,11 +1,13 @@ import General from './Preferences/General' import Account from './Preferences/Account' +import Language from './Preferences/Language' const Preferences = { namespaced: true, modules: { General, - Account + Account, + Language }, state: { defaultActive: '1' diff --git a/src/renderer/store/Preferences/Language.js b/src/renderer/store/Preferences/Language.js new file mode 100644 index 00000000..e3e04a59 --- /dev/null +++ b/src/renderer/store/Preferences/Language.js @@ -0,0 +1,41 @@ +import { ipcRenderer } from 'electron' +import Language from '~/src/constants/language' + +export default { + namespaced: true, + state: { + language: { + language: Language.en.key + } + }, + mutations: { + updateLanguage (state, conf) { + state.language = conf + }, + changeLanguage (state, key) { + state.language.language = key + } + }, + actions: { + loadLanguage ({ commit }) { + return new Promise((resolve, reject) => { + ipcRenderer.send('get-preferences') + ipcRenderer.once('error-get-preferences', (event, err) => { + ipcRenderer.removeAllListeners('response-get-preferences') + reject(err) + }) + ipcRenderer.once('response-get-preferences', (event, conf) => { + ipcRenderer.removeAllListeners('error-get-preferences') + commit('updateLanguage', conf.language) + resolve(conf) + }) + }) + }, + changeLanguage ({ commit }, key) { + ipcRenderer.send('change-language', key) + ipcRenderer.once('response-change-language', (event, value) => { + commit('changeLanguage', value) + }) + } + } +} From 6143481bfc8fcd7a7be343e4e96caee8991272b3 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Tue, 14 Aug 2018 09:03:52 +0900 Subject: [PATCH 2/4] refs #151 Define i18n key in constants to translate in rendering --- src/constants/displayStyle.js | 8 +++----- src/constants/theme.js | 6 ++---- src/constants/visibility.js | 10 ++++------ src/renderer/components/Preferences/General.vue | 6 +++--- .../components/TimelineSpace/Modals/NewToot.vue | 8 ++++---- 5 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/constants/displayStyle.js b/src/constants/displayStyle.js index efeeaf36..f1aae951 100644 --- a/src/constants/displayStyle.js +++ b/src/constants/displayStyle.js @@ -1,16 +1,14 @@ -import i18n from '../config/i18n' - export default { DisplayNameAndUsername: { - name: i18n.t('preferences.general.display_style.display_name_and_username'), + name: 'preferences.general.display_style.display_name_and_username', value: 0 }, DisplayName: { - name: i18n.t('preferences.general.display_style.display_name'), + name: 'preferences.general.display_style.display_name', value: 1 }, Username: { - name: i18n.t('preferences.general.display_style.username'), + name: 'preferences.general.display_style.username', value: 2 } } diff --git a/src/constants/theme.js b/src/constants/theme.js index e54b8689..eeaa3415 100644 --- a/src/constants/theme.js +++ b/src/constants/theme.js @@ -1,12 +1,10 @@ -import i18n from '../config/i18n' - export default { Light: { - name: i18n.t('preferences.general.theme.light'), + name: 'preferences.general.theme.light', key: 'light' }, Dark: { - name: i18n.t('preferences.general.theme.dark'), + name: 'preferences.general.theme.dark', key: 'dark' } } diff --git a/src/constants/visibility.js b/src/constants/visibility.js index 2fe77498..38a24dfb 100644 --- a/src/constants/visibility.js +++ b/src/constants/visibility.js @@ -1,23 +1,21 @@ -import i18n from '../config/i18n' - export default { Public: { - name: i18n.t('preferences.general.visibility.public'), + name: 'preferences.general.visibility.public', value: 0, key: 'public' }, Unlisted: { - name: i18n.t('preferences.general.visibility.unlisted'), + name: 'preferences.general.visibility.unlisted', value: 1, key: 'unlisted' }, Private: { - name: i18n.t('preferences.general.visibility.private'), + name: 'preferences.general.visibility.private', value: 2, key: 'private' }, Direct: { - name: i18n.t('preferences.general.visibility.direct'), + name: 'preferences.general.visibility.direct', value: 3, key: 'direct' } diff --git a/src/renderer/components/Preferences/General.vue b/src/renderer/components/Preferences/General.vue index 1d444a17..29a76210 100644 --- a/src/renderer/components/Preferences/General.vue +++ b/src/renderer/components/Preferences/General.vue @@ -8,7 +8,7 @@ {{ $t('preferences.general.theme_color') }} - {{ t.name }} + {{ $t(t.name) }} @@ -24,7 +24,7 @@ @@ -44,7 +44,7 @@ diff --git a/src/renderer/components/TimelineSpace/Modals/NewToot.vue b/src/renderer/components/TimelineSpace/Modals/NewToot.vue index ec2e937f..3d54ed7c 100644 --- a/src/renderer/components/TimelineSpace/Modals/NewToot.vue +++ b/src/renderer/components/TimelineSpace/Modals/NewToot.vue @@ -31,19 +31,19 @@ - {{ visibilityList.Public.name }} + {{ $t(visibilityList.Public.name) }} - {{ visibilityList.Unlisted.name }} + {{ $t(visibilityList.Unlisted.name) }} - {{ visibilityList.Private.name }} + {{ $t(visibilityList.Private.name) }} - {{ visibilityList.Direct.name }} + {{ $t(visibilityList.Direct.name) }} From 70ac667fcd61675cbb88a3bf43230fd7a59f0bb0 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Tue, 14 Aug 2018 09:20:37 +0900 Subject: [PATCH 3/4] refs #151 Fix default visibility state --- src/renderer/store/TimelineSpace/Modals/NewToot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/store/TimelineSpace/Modals/NewToot.js b/src/renderer/store/TimelineSpace/Modals/NewToot.js index 6b935c7f..44d88808 100644 --- a/src/renderer/store/TimelineSpace/Modals/NewToot.js +++ b/src/renderer/store/TimelineSpace/Modals/NewToot.js @@ -99,7 +99,7 @@ const NewToot = { }, openModal ({ dispatch, commit, rootState }) { commit('changeModal', true) - commit('changeVisibilityValue', rootState.tootVisibility) + commit('changeVisibilityValue', rootState.App.tootVisibility) }, closeModal ({ commit }) { commit('changeModal', false) From 0cf58d0f27ad2f77b0db296819fe9be775d27f63 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Tue, 14 Aug 2018 10:18:30 +0900 Subject: [PATCH 4/4] refs #151 Restart application when change languages --- src/config/locales/en/translation.json | 9 +++++- src/config/locales/ja/translation.json | 9 +++++- src/main/index.js | 6 ++++ .../components/Preferences/Language.vue | 29 ++++++++++++++++++- src/renderer/store/Preferences/Language.js | 3 ++ 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 95076e83..663f26f9 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -105,7 +105,14 @@ }, "language": { "title": "Language", - "display_language": "language" + "display_language": "language", + "notice": "Require relaunch", + "confirm": { + "title": "Warning", + "message": "You have to restart this application. Continue?", + "ok": "Restart Now", + "cancel": "Cancel" + } } }, "modals": { diff --git a/src/config/locales/ja/translation.json b/src/config/locales/ja/translation.json index 36b9be78..0bc1a61d 100644 --- a/src/config/locales/ja/translation.json +++ b/src/config/locales/ja/translation.json @@ -105,7 +105,14 @@ }, "language": { "title": "言語", - "display_language": "表示言語" + "display_language": "表示言語", + "notice": "再起動が必要です", + "confirm": { + "title": "再起動します", + "message": "設定を有効化するために再起動する必要があります", + "ok": "再起動する", + "cancel": "キャンセル" + } } }, "modals": { diff --git a/src/main/index.js b/src/main/index.js index 5473c480..f2b677da 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -655,6 +655,12 @@ ipcMain.on('remove-hashtag', (event, tag) => { }) }) +// Application control +ipcMain.on('relaunch', (event, _) => { + app.relaunch() + app.exit() +}) + /** * Auto Updater * diff --git a/src/renderer/components/Preferences/Language.vue b/src/renderer/components/Preferences/Language.vue index 1696d4a6..4d483446 100644 --- a/src/renderer/components/Preferences/Language.vue +++ b/src/renderer/components/Preferences/Language.vue @@ -15,6 +15,7 @@ :value="lang.key"> +

{{ $t('preferences.language.notice') }}

@@ -42,12 +43,33 @@ export default { return this.$store.state.Preferences.Language.language.language }, set (value) { - return this.$store.dispatch('Preferences/Language/changeLanguage', value) + this.$store.dispatch('Preferences/Language/changeLanguage', value) + .then(() => { + this.confirm() + }) } } }, created () { this.$store.dispatch('Preferences/Language/loadLanguage') + }, + methods: { + confirm () { + this.$confirm( + this.$t('preferences.language.confirm.message'), + this.$t('preferences.language.confirm.title'), + { + confirmButtonText: this.$t('preferences.language.confirm.ok'), + cancelButtonText: this.$t('preferences.language.confirm.cancel'), + type: 'warning' + } + ) + .then(() => { + this.$store.dispatch('Preferences/Language/relaunch') + }) + .cancel(() => { + }) + } } } @@ -70,6 +92,11 @@ export default { .status { width: 50%; text-align: center; + + .notice { + color: #c0c4cc; + font-size: 12px; + } } } diff --git a/src/renderer/store/Preferences/Language.js b/src/renderer/store/Preferences/Language.js index e3e04a59..1edd74c2 100644 --- a/src/renderer/store/Preferences/Language.js +++ b/src/renderer/store/Preferences/Language.js @@ -36,6 +36,9 @@ export default { ipcRenderer.once('response-change-language', (event, value) => { commit('changeLanguage', value) }) + }, + relaunch () { + ipcRenderer.send('relaunch') } } }