import Vue from 'vue';
import VueMatomo from 'vue-matomo';
import VueRouter from 'vue-router';
import VueI18n from 'vue-i18n';
import vueHeadful from 'vue-headful';
import App from './App.vue';
import Home from './views/Home.vue';
import './assets/scss/bootstrap.scss';
import '../node_modules/fork-awesome/css/fork-awesome.css';
import './assets/scss/main.scss';
Vue.use(VueRouter);
Vue.use(VueI18n);
Vue.component('vue-headful', vueHeadful);
const defaultLocale = 'fr';
const locales = [];
const pages = [];
// Import locales list
let req = require.context('./locales/', false, /\.yml$/);
req.keys().forEach((key) => {
locales.push(key.replace(/\.\/(.*)\.yml/, '$1'));
});
// Import pages list
req = require.context('./views', false, /\.vue$/);
req.keys().forEach((key) => {
pages.push(key.replace(/\.\/(.*)\.vue/, '$1'));
});
const lang = window.location.href
.split('/')[(process.env.BASE_URL === '' || (window.location.href.match(/\//g)).length === 3) ? 3 : 4]
.substr(0, 2)
.toLowerCase() || defaultLocale;
document.getElementsByTagName('html')[0].setAttribute('lang', lang);
const userLang = navigator.languages
|| [navigator.language || navigator.userLanguage];
let defaultRouteLang = '';
const messages = {};
messages.locales = require('./lang.yml'); // eslint-disable-line
messages.locales.avalaible = Object.keys(messages.locales).filter(n => locales.indexOf(n) > -1);
// Data import
let data = {};
data = require('./data.yml'); // eslint-disable-line
data['/'] = `/${process.env.BASE_URL.replace(/(.+)/, '$1/')}`;
data.hash = window.location.hash.replace('#', '');
data.txt = data.txt || {};
data.html = data.html || {};
Object.keys(data.color).forEach((k) => {
if (data.txt[k] === undefined) {
const tmp = document.createElement('div');
tmp.innerHTML = data.color[k];
data.txt[k] = tmp.textContent || tmp.innerText;
}
});
Object.keys(data.link).forEach((k) => {
if (data.html[k] === undefined) {
if (data.color[k] !== undefined) {
data.html[k] = `${data.color[k]}`;
} else if (data.txt[k] !== undefined) {
data.html[k] = `${data.txt[k]}`;
}
}
});
const routes = [
{ path: '/', component: Home, meta: { id: 'home', lang: defaultLocale } },
];
for (let i = 0; i < locales.length; i += 1) {
messages[locales[i]] = {};
// Locales import
/* eslint-disable */
import(/* webpackChunkName: "lang-[request]" */`./locales/${locales[i]}.yml`).then((locale) => {
messages[locales[i]] = locale;
messages[locales[i]].data = data;
messages[locales[i]].lang = locales[i];
}).catch((err) => {
console.error(err);
});
/* eslint-enable */
// Localized routes
for (let j = 0; j < pages.length; j += 1) {
const component = require(`./views/${pages[j]}.vue`); // eslint-disable-line
routes.push({
path: `/${locales[i]}${pages[j].toLowerCase().replace(/^/, '/').replace('/home', '')}`,
component: component.default,
meta: { id: pages[j].toLowerCase(), lang: locales[i] },
});
}
}
// define defaultRouteLang
for (let j = 0; j < userLang.length; j += 1) { // check if user locales
for (let i = 0; i < locales.length; i += 1) { // matches with app locales
if (defaultRouteLang === '' && userLang[j].substring(0, 2).toLowerCase() === locales[i]) {
defaultRouteLang = locales[i];
}
}
}
// Home redirection
const currentURL = window.location.href.replace(/\/+$/, '');
if ((currentURL.split('/')[3] === undefined || currentURL.split('/')[3] === process.env.BASE_URL)
&& (currentURL.split('/')[4] === undefined)) {
if (defaultRouteLang === '') {
defaultRouteLang = defaultLocale;
}
window.location.href = `${currentURL}/${defaultRouteLang}/`;
}
// Create VueI18n instance with options
const i18n = new VueI18n({
locale: lang,
fallbackLocale: defaultLocale,
messages,
silentTranslationWarn: true,
});
// Framanav
if (!window.vuefsPrerender
&& document.querySelectorAll('script[src$="nav.js"]').length < 1
&& process.env.NODE_ENV !== 'development') {
const navConfig = document.createElement('script');
navConfig.innerHTML = 'l$ = { js: { j$: \'noConflict\' } }';
document.getElementsByTagName('head')[0].appendChild(navConfig);
const nav = document.createElement('script');
nav.src = 'https://framasoft.org/nav/nav.js';
// document.getElementsByTagName('head')[0].appendChild(nav);
}
// Routes
const router = new VueRouter({
routes,
mode: 'history',
base: `${__dirname}${process.env.BASE_URL}`,
});
// Stats Matomo
if (!(navigator.doNotTrack === 'yes'
|| navigator.doNotTrack === '1'
|| navigator.msDoNotTrack === '1'
|| window.doNotTrack === '1')
) {
Vue.use(VueMatomo, {
// Configure your matomo server and site
host: 'https://stats.framasoft.org/',
siteId: 68,
// Enables automatically registering pageviews on the router
router,
// Require consent before sending tracking information to matomo
// Default: false
requireConsent: false,
// Whether to track the initial page view
// Default: true
trackInitialView: true,
// Changes the default .js and .php endpoint's filename
// Default: 'piwik'
trackerFileName: 'p',
enableLinkTracking: true,
});
const _paq = _paq || []; // eslint-disable-line
// Conformité CNIL
_paq.push([function piwikCNIL() {
const self = this;
function getOriginalVisitorCookieTimeout() {
const now = new Date();
const nowTs = Math.round(now.getTime() / 1000);
const visitorInfo = self.getVisitorInfo();
const createTs = parseInt(visitorInfo[2], 10);
const cookieTimeout = 33696000; // 13 mois en secondes
const originalTimeout = (createTs + cookieTimeout) - nowTs;
return originalTimeout;
}
this.setVisitorCookieTimeout(getOriginalVisitorCookieTimeout());
}]);
}
new Vue({ // eslint-disable-line no-new
el: '#app',
router,
i18n,
data,
mounted() {
// You'll need this for renderAfterDocumentEvent.
document.dispatchEvent(new Event('render-event'));
},
render: h => h(App),
});