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 @@
+
+
+
{{ $t('preferences.language.title') }}
+
+
+
+
+ {{ $t('preferences.language.display_language') }} |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
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')
}
}
}