feat: create language picker
This commit is contained in:
parent
ae0a9622c1
commit
90d13d31f5
|
@ -52,13 +52,6 @@ export default class App extends Vue {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
picker.select(tID.Vue, false);
|
picker.select(tID.Vue, false);
|
||||||
|
|
||||||
// change app language
|
|
||||||
if( navigator.language.indexOf('fr') > -1 ){
|
|
||||||
this.$i18n.locale = Locales.FR;
|
|
||||||
} else {
|
|
||||||
this.$i18n.locale = Locales.EN;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 5.1 KiB |
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="4.2333mm" height="2.8687mm" version="1.1" viewBox="0 0 4.2333 2.8687" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><g transform="translate(-129.22 -199.04)"><g transform="matrix(.22857 0 0 .22857 99.684 154.49)" stroke-linejoin="round"><path d="m130.59 194.88c-0.75842 0-1.3689 0.61052-1.3689 1.3689v9.8128c0 0.75839 0.61048 1.3689 1.3689 1.3689h4.8044v-12.551z" fill="#4758a9" stroke-width=".8" style="paint-order:fill markers stroke"/><path d="m141.57 194.88v12.551h4.8044c0.75843 0 1.3694-0.61048 1.3694-1.3689v-9.8128c0-0.75843-0.611-1.3689-1.3694-1.3689z" fill="#ed5565" stroke-width=".8" style="paint-order:fill markers stroke"/><rect x="135.39" y="194.88" width="6.1737" height="12.551" fill="#fff" stroke-width=".81063" style="paint-order:fill markers stroke"/></g></g></svg>
|
After Width: | Height: | Size: 846 B |
|
@ -13,9 +13,10 @@
|
||||||
<img class='logo' src='../assets/home/logo.svg'/>
|
<img class='logo' src='../assets/home/logo.svg'/>
|
||||||
|
|
||||||
<div class='contact'>
|
<div class='contact'>
|
||||||
<span class='tel'>(+33) 06 69 05 19 10</span>
|
<span>xdrm.io</span>
|
||||||
<span class='mail'>xdrm.dev@gmail.com</span>
|
<span>(+33) 06 69 05 19 10</span>
|
||||||
<span class='addr'>Montauban, 82000</span>
|
<span>xdrm.dev@gmail.com</span>
|
||||||
|
<span>Montauban, 82000</span>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
<span class='addr'>Montauban, 82000</span>
|
<span class='addr'>Montauban, 82000</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<LangPicker />
|
||||||
|
|
||||||
<img class='logo' src='../assets/home/logo.svg'/>
|
<img class='logo' src='../assets/home/logo.svg'/>
|
||||||
|
|
||||||
|
@ -40,9 +41,11 @@
|
||||||
import { Component, Vue } from 'vue-property-decorator';
|
import { Component, Vue } from 'vue-property-decorator';
|
||||||
import { go } from '@/service/scroller';
|
import { go } from '@/service/scroller';
|
||||||
import { TypeWriter } from '@/service/typewriter';
|
import { TypeWriter } from '@/service/typewriter';
|
||||||
|
import LangPicker from './LangPicker.vue';
|
||||||
|
LangPicker
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
components: {},
|
components: { LangPicker },
|
||||||
})
|
})
|
||||||
export default class Home extends Vue {
|
export default class Home extends Vue {
|
||||||
protected scrollNext() {
|
protected scrollNext() {
|
||||||
|
@ -147,8 +150,20 @@ export default class Home extends Vue {
|
||||||
color: #9ea6b3;
|
color: #9ea6b3;
|
||||||
font-size: 1.2em;
|
font-size: 1.2em;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lang-picker {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-right: 1em;
|
||||||
|
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
.logo {
|
.logo {
|
||||||
grid-column: 2;
|
grid-column: 2;
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
<template>
|
||||||
|
<div class='lang-picker'>
|
||||||
|
<div @click='current = locales[0]'>
|
||||||
|
<img src='../assets/lang/en-US.svg' :data-active='current == locales[0]'/>
|
||||||
|
</div>
|
||||||
|
<div @click='current = locales[1]'>
|
||||||
|
<img src='../assets/lang/fr-FR.svg' :data-active='current == locales[1]'/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { Component, Vue } from 'vue-property-decorator';
|
||||||
|
import { Locales } from '@/locales';
|
||||||
|
|
||||||
|
// Define the props by using Vue's canonical way.
|
||||||
|
const LangPickerProps = Vue.extend({
|
||||||
|
props: {
|
||||||
|
name: String
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
@Component({})
|
||||||
|
export default class LangPicker extends LangPickerProps {
|
||||||
|
private locales: Locales[] = [Locales.EN, Locales.FR];
|
||||||
|
|
||||||
|
get current(): string {
|
||||||
|
return this.$i18n.locale;
|
||||||
|
}
|
||||||
|
set current(l: string) {
|
||||||
|
localStorage.setItem("lang", l);
|
||||||
|
this.$i18n.locale = l;
|
||||||
|
}
|
||||||
|
|
||||||
|
private mounted() {
|
||||||
|
const ls = localStorage.getItem("lang") as Locales|null;
|
||||||
|
|
||||||
|
// already selected a language, stay with it
|
||||||
|
if( ls != null && this.locales.indexOf(ls) >= 0 ){
|
||||||
|
this.current = ls;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise, go with the navigator's default
|
||||||
|
if( navigator.language.indexOf('fr') > -1 ){
|
||||||
|
this.current = Locales.FR;
|
||||||
|
} else {
|
||||||
|
this.current = Locales.EN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
.lang-picker {
|
||||||
|
display: flex;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
flex: row nowrap;
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: inline-block;
|
||||||
|
width: 2em;
|
||||||
|
margin-right: .5em;
|
||||||
|
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
transition: filter .1s ease-in-out;
|
||||||
|
|
||||||
|
filter: grayscale(70%);
|
||||||
|
|
||||||
|
&[data-active=true]{
|
||||||
|
filter: grayscale(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not([data-active=true]):hover {
|
||||||
|
filter: grayscale(40%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& div:last-child > img {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
Loading…
Reference in New Issue