🎉 Basic i18n support

This commit is contained in:
Liyas Thomas
2019-11-27 14:15:11 +05:30
parent c4c320da83
commit 2697cce6dd
11 changed files with 153 additions and 36 deletions

View File

@@ -96,7 +96,7 @@ TODO:
<style lang="scss" scoped> <style lang="scss" scoped>
.virtual-list { .virtual-list {
max-height: calc(100vh - 204px); max-height: calc(100vh - 232px);
} }
ul { ul {

View File

@@ -260,7 +260,7 @@
<style scoped lang="scss"> <style scoped lang="scss">
.virtual-list { .virtual-list {
max-height: calc(100vh - 265px); max-height: calc(100vh - 284px);
[readonly] { [readonly] {
cursor: default; cursor: default;

3
lang/en-US.js Normal file
View File

@@ -0,0 +1,3 @@
export default {
send: 'Send'
}

3
lang/es-ES.js Normal file
View File

@@ -0,0 +1,3 @@
export default {
send: 'Enviar'
}

View File

@@ -36,7 +36,7 @@
<i class="material-icons">offline_bolt</i> <i class="material-icons">offline_bolt</i>
</button> </button>
<v-popover> <v-popover>
<button class="tooltip-target icon" v-tooltip="'More'"> <button class="icon" v-tooltip="'More'">
<i class="material-icons">more_vert</i> <i class="material-icons">more_vert</i>
</button> </button>
<template slot="popover"> <template slot="popover">
@@ -198,37 +198,69 @@
</div> </div>
</div> </div>
<footer class="footer"> <footer class="footer">
<!-- Bottom section of footer: version/author information --> <div class="flex-wrap">
<p class="align-center mono"> <!-- Bottom section of footer: version/author information -->
<span v-if="version.name"> <div>
<a <span v-if="version.name" class="mono">
v-bind:href="
'https://github.com/liyasthomas/postwoman/releases/tag/' +
version.name
"
target="_blank"
rel="noopener"
>{{ version.name }}</a
>
<!-- <span v-if="version.hash">
-
<a <a
v-bind:href="'https://github.com/liyasthomas/postwoman/commit/' + version.hash" v-bind:href="
'https://github.com/liyasthomas/postwoman/releases/tag/' +
version.name
"
target="_blank" target="_blank"
rel="noopener" rel="noopener"
>{{version.hash}}</a> >
</span> --> {{ version.name }}
<!-- <span v-if="version.variant">({{version.variant}})</span> --> </a>
&#x2022; &#x2022;
</span> <a
<a href="https://liyasthomas.web.app" target="_blank" rel="noopener" href="https://liyasthomas.web.app"
>🦄</a target="_blank"
> rel="noopener"
&#x2022; >
<a href="https://postwoman.launchaco.com" target="_blank" rel="noopener" 🦄
>Subscribe</a </a>
> <!-- <span v-if="version.hash">
</p> -
<a
v-bind:href="'https://github.com/liyasthomas/postwoman/commit/' + version.hash"
target="_blank"
rel="noopener"
>{{version.hash}}</a>
</span> -->
<!-- <span v-if="version.variant">({{version.variant}})</span> -->
</span>
</div>
<div class="flex-wrap">
<a
href="https://postwoman.launchaco.com"
target="_blank"
rel="noopener"
>
<button class="icon" v-tooltip="'Subscribe'">
<i class="material-icons">email</i>
</button>
</a>
<v-popover>
<button class="icon" v-tooltip="'Choose Language'">
<i class="material-icons">translate</i>
</button>
<template slot="popover">
<nuxt-link
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)"
>
<div>
<button class="icon" v-close-popover>
{{ locale.name }}
</button>
</div>
</nuxt-link>
</template>
</v-popover>
</div>
</div>
</footer> </footer>
<modal v-if="showShortcuts" @close="showShortcuts = false"> <modal v-if="showShortcuts" @close="showShortcuts = false">
<div slot="header"> <div slot="header">
@@ -440,6 +472,12 @@ export default {
$route() { $route() {
this.$toast.clear(); this.$toast.clear();
} }
},
computed: {
availableLocales() {
return this.$i18n.locales.filter(i => i.code !== this.$i18n.locale);
}
} }
}; };
</script> </script>

View File

@@ -228,7 +228,8 @@ export default {
['@nuxtjs/google-tag-manager', { ['@nuxtjs/google-tag-manager', {
id: process.env.GTM_ID || 'GTM-MXWD8NQ' id: process.env.GTM_ID || 'GTM-MXWD8NQ'
}], }],
['@nuxtjs/robots'] ['@nuxtjs/robots'],
['nuxt-i18n']
], ],
pwa: { pwa: {
manifest: { manifest: {
@@ -277,6 +278,24 @@ export default {
Allow: '/', Allow: '/',
Sitemap: 'https://postwoman.io/sitemap.xml' Sitemap: 'https://postwoman.io/sitemap.xml'
}, },
i18n: {
locales: [{
code: 'en',
name: 'English',
iso: 'en-US',
file: 'en-US.js'
},
{
code: 'es',
name: 'Español',
iso: 'es-ES',
file: 'es-ES.js'
}
],
defaultLocale: 'en',
lazy: true,
langDir: 'lang/'
},
/* /*
** Build configuration ** Build configuration
*/ */

46
package-lock.json generated
View File

@@ -910,6 +910,15 @@
"@hapi/hoek": "^8.3.0" "@hapi/hoek": "^8.3.0"
} }
}, },
"@kazupon/vue-i18n-loader": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@kazupon/vue-i18n-loader/-/vue-i18n-loader-0.4.1.tgz",
"integrity": "sha512-hVznmhnyoUKozGY7pwq/UtPL76UDzb+aiN2YksZZIzCY/MkEqih0MSyEmTGw7+HVWzJRPAlDyoRNR4tWKmkCRw==",
"requires": {
"js-yaml": "^3.13.1",
"json5": "^2.1.0"
}
},
"@nuxt/babel-preset-app": { "@nuxt/babel-preset-app": {
"version": "2.10.2", "version": "2.10.2",
"resolved": "https://registry.npmjs.org/@nuxt/babel-preset-app/-/babel-preset-app-2.10.2.tgz", "resolved": "https://registry.npmjs.org/@nuxt/babel-preset-app/-/babel-preset-app-2.10.2.tgz",
@@ -5912,6 +5921,11 @@
"integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==",
"dev": true "dev": true
}, },
"js-cookie": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz",
"integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ=="
},
"js-levenshtein": { "js-levenshtein": {
"version": "1.1.6", "version": "1.1.6",
"resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
@@ -7245,6 +7259,28 @@
"@nuxt/webpack": "2.10.2" "@nuxt/webpack": "2.10.2"
} }
}, },
"nuxt-i18n": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/nuxt-i18n/-/nuxt-i18n-6.4.0.tgz",
"integrity": "sha512-1JQBL0Jn8G7ZialCa8S3HxgokM2Rqa68RtyPB4oT6Og58oN1d2OreZsQhNITLYdPn3hTOqTO+i55cdOs7AW5sw==",
"requires": {
"@babel/parser": "^7.5.5",
"@babel/traverse": "^7.5.5",
"@kazupon/vue-i18n-loader": "^0.4.0",
"cookie": "^0.4.0",
"is-https": "^1.0.0",
"js-cookie": "^2.2.0",
"vue-i18n": "^8.12.0",
"vue-i18n-extensions": "^0.2.1"
},
"dependencies": {
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
}
}
},
"oauth-sign": { "oauth-sign": {
"version": "0.9.0", "version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -10953,6 +10989,16 @@
"resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
"integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==" "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog=="
}, },
"vue-i18n": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.15.0.tgz",
"integrity": "sha512-juJ/avAP39bOMycC+qQDLJ8U9z9LtLF/9PsRoJLBSfsYZo9bqYntyyX5QPicwlb1emJKjgxhZ3YofHiQcXBu0Q=="
},
"vue-i18n-extensions": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/vue-i18n-extensions/-/vue-i18n-extensions-0.2.1.tgz",
"integrity": "sha512-xBrItI7bEwBnG7eAlnyUARP41JYYn2+ABMR8q1Yh5FM9hHCbs4XPZwG+4+FPeIZ6b5gYk4YUP//m+fWiuU9z9A=="
},
"vue-loader": { "vue-loader": {
"version": "15.7.1", "version": "15.7.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.1.tgz", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.7.1.tgz",

View File

@@ -28,6 +28,7 @@
"ace-builds": "^1.4.7", "ace-builds": "^1.4.7",
"graphql": "^14.5.8", "graphql": "^14.5.8",
"nuxt": "^2.10.2", "nuxt": "^2.10.2",
"nuxt-i18n": "^6.4.0",
"v-tooltip": "^2.0.2", "v-tooltip": "^2.0.2",
"vue-virtual-scroll-list": "^1.4.3", "vue-virtual-scroll-list": "^1.4.3",
"vuejs-auto-complete": "^0.9.0", "vuejs-auto-complete": "^0.9.0",

View File

@@ -224,7 +224,7 @@
<style scoped lang="scss"> <style scoped lang="scss">
.tab { .tab {
max-height: calc(100vh - 172px); max-height: calc(100vh - 186px);
overflow: auto; overflow: auto;
} }
</style> </style>

View File

@@ -97,7 +97,7 @@
id="send" id="send"
ref="sendButton" ref="sendButton"
> >
Send {{ $t("send") }}
<span id="hidden-message">Again</span> <span id="hidden-message">Again</span>
<span> <span>
<i class="material-icons">send</i> <i class="material-icons">send</i>

View File

@@ -92,7 +92,12 @@
<i class="material-icons">clear_all</i> <i class="material-icons">clear_all</i>
</button> </button>
</div> </div>
<input id="url" type="url" v-model="settings.PROXY_URL" :disabled="!settings.PROXY_ENABLED"> <input
id="url"
type="url"
v-model="settings.PROXY_URL"
:disabled="!settings.PROXY_ENABLED"
/>
</li> </li>
</ul> </ul>
<ul class="info"> <ul class="info">
@@ -231,7 +236,9 @@ export default {
this.$store.state.postwoman.settings.FRAME_COLORS_ENABLED || false, this.$store.state.postwoman.settings.FRAME_COLORS_ENABLED || false,
PROXY_ENABLED: PROXY_ENABLED:
this.$store.state.postwoman.settings.PROXY_ENABLED || false, this.$store.state.postwoman.settings.PROXY_ENABLED || false,
PROXY_URL: this.$store.state.postwoman.settings.PROXY_URL || "https://postwoman.apollotv.xyz/", PROXY_URL:
this.$store.state.postwoman.settings.PROXY_URL ||
"https://postwoman.apollotv.xyz/",
PROXY_KEY: this.$store.state.postwoman.settings.PROXY_KEY || "" PROXY_KEY: this.$store.state.postwoman.settings.PROXY_KEY || ""
} }
}; };