Skip to content

Commit 26094c2

Browse files
authored
Merge pull request #2 from ProtocolONE/AUTH-12-internationalization
AUTH-12 provides internationalization setup for the app
2 parents a966135 + 0479e4b commit 26094c2

File tree

13 files changed

+169
-5
lines changed

13 files changed

+169
-5
lines changed

.env

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
VUE_APP_I18N_LOCALE=ru
2+
VUE_APP_I18N_FALLBACK_LOCALE=en

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
# auth-web-sdk-embedded
2+
- `src/main.js` - точка входа для сборки
3+
- `src/i18n.js` - подключение интернационализации
4+
- `src/Root.vue` - входной (рутовый) компонент
5+
- `src/assets/` - jpg, png, css, scss и так далее
6+
- `src/components/` - **плоский** список компонентов приложения
7+
- `src/locales` - интернацианализация приложения в формате json
8+
- `src/store` - файлы vuex-стора
29

310
## Project setup
411
```

package-lock.json

Lines changed: 56 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
},
1313
"dependencies": {
1414
"vue": "^2.5.17",
15+
"vue-i18n": "^8.0.0",
1516
"vuex": "^3.0.1"
1617
},
1718
"devDependencies": {
1819
"@ascendancyy/vue-cli-plugin-stylelint": "^1.1.0",
1920
"@cypress/webpack-preprocessor": "^3.0.0",
21+
"@kazupon/vue-i18n-loader": "^0.3.0",
2022
"@vue/cli-plugin-babel": "^3.1.1",
2123
"@vue/cli-plugin-e2e-cypress": "^3.1.1",
2224
"@vue/cli-plugin-eslint": "^3.1.1",
@@ -32,6 +34,7 @@
3234
"node-sass": "^4.9.0",
3335
"sass-loader": "^7.0.1",
3436
"stylelint-config-standard": "^18.2.0",
37+
"vue-cli-plugin-i18n": "^0.5.1",
3538
"vue-template-compiler": "^2.5.17"
3639
}
3740
}

src/App.vue renamed to src/Root.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div id="app">
2+
<div>
33
<center>
44
<img alt="Vue logo" src="./assets/logo.png">
55
</center>
@@ -11,7 +11,7 @@
1111
import AuthForm from './components/AuthForm.vue';
1212
1313
export default {
14-
name: 'App',
14+
name: 'Root',
1515
components: {
1616
AuthForm,
1717
},

src/components/AuthForm.vue

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
<template>
22
<div class="auth-form">
3+
<LocaleChanger/>
34
<h1>ProtocolONE Auth Form</h1>
45
<p>Авторизируйтесь, граждане!</p>
6+
<HelloI18n/>
57
</div>
68
</template>
79

810
<script>
11+
import HelloI18n from './HelloI18n.vue';
12+
import LocaleChanger from './LocaleChanger.vue';
13+
914
export default {
1015
name: 'AuthForm',
16+
17+
components: {
18+
HelloI18n,
19+
LocaleChanger,
20+
},
1121
};
1222
</script>
1323

14-
<!-- Add "scoped" attribute to limit CSS to this component only -->
1524
<style scoped lang="scss">
1625
.auth-form {
1726
box-shadow: 0 0 50px rgba(0, 0, 0, 0.3);

src/components/HelloI18n.vue

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<template>
2+
<div>
3+
<p>Это из компонента: {{ $t('hello') }}</p>
4+
<p>Это берётся из папки с локалями: {{ $t('message') }}</p>
5+
</div>
6+
</template>
7+
8+
<script>
9+
export default {
10+
name: 'HelloI18n',
11+
};
12+
</script>
13+
14+
<i18n>
15+
{
16+
"ru": {
17+
"hello": "А вот и i18n в SFC!"
18+
},
19+
"en": {
20+
"hello": "Hello i18n in SFC!"
21+
}
22+
}
23+
</i18n>

src/components/LocaleChanger.vue

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<template>
2+
<div class="locale-changer">
3+
<select v-model="$i18n.locale">
4+
<option v-for="(lang, i) in langs" :key="`Lang${i}`" :value="lang">{{ lang }}</option>
5+
</select>
6+
</div>
7+
</template>
8+
9+
<script>
10+
export default {
11+
name: 'locale-changer',
12+
data() {
13+
return { langs: ['ru', 'en'] };
14+
},
15+
};
16+
</script>

src/i18n.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* Подключение модуля интернационализации
3+
*/
4+
5+
import Vue from 'vue';
6+
import VueI18n from 'vue-i18n';
7+
8+
Vue.use(VueI18n);
9+
10+
function loadLocaleMessages() {
11+
const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.json$/i);
12+
const messages = {};
13+
locales.keys().forEach((key) => {
14+
const matched = key.match(/([A-Za-z0-9-_]+)\./i);
15+
if (matched && matched.length > 1) {
16+
const locale = matched[1];
17+
messages[locale] = locales(key);
18+
}
19+
});
20+
return messages;
21+
}
22+
23+
export default new VueI18n({
24+
locale: process.env.VUE_APP_I18N_LOCALE || 'en',
25+
fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || 'en',
26+
messages: loadLocaleMessages(),
27+
});

src/locales/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"message": "hello i18n !!"
3+
}

src/locales/ru.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"message": "дратути i18n !!"
3+
}

src/main.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
1+
/**
2+
* App entry point
3+
* Сборка начинается отсюа
4+
*/
5+
16
import Vue from 'vue';
2-
import App from './App.vue';
7+
import Root from './Root.vue';
38
import store from './store/RootStore';
9+
import i18n from './i18n';
410

511
Vue.config.productionTip = false;
612

713
function mountApp(targetElement) {
814
new Vue({
915
store,
10-
render: h => h(App),
16+
i18n,
17+
render: h => h(Root),
1118
}).$mount(targetElement);
1219
}
1320

@@ -17,6 +24,8 @@ if (process.env.NODE_ENV === 'production') {
1724
mountApp(targetElement);
1825
}
1926
}
27+
// Имя конструктора, который будет доступен в браузере после подключения sdk
28+
// ( new ProtocolOneAuthWebSdk('#app') );
2029
window.ProtocolOneAuthWebSdk = ProtocolOneAuthWebSdk;
2130
} else {
2231
mountApp('#app');

vue.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,11 @@ module.exports = {
3939
pluginOptions: {
4040
lintStyleOnBuild: false,
4141
stylelint: {},
42+
i18n: {
43+
locale: 'ru',
44+
fallbackLocale: 'en',
45+
localeDir: 'locales',
46+
enableInSFC: true
47+
}
4248
},
4349
};

0 commit comments

Comments
 (0)