2018-09-21 21:00:42 +00:00
|
|
|
import Vue from 'vue';
|
2018-11-20 10:04:29 +00:00
|
|
|
import VueMatomo from 'vue-matomo';
|
2018-09-21 21:00:42 +00:00
|
|
|
import VueRouter from 'vue-router';
|
|
|
|
import VueI18n from 'vue-i18n';
|
|
|
|
import vueHeadful from 'vue-headful';
|
2019-11-01 16:04:10 +00:00
|
|
|
import '../node_modules/bootstrap-sass/assets/javascripts/bootstrap.min';
|
2018-09-21 21:00:42 +00:00
|
|
|
|
|
|
|
import App from './App.vue';
|
|
|
|
|
|
|
|
import './assets/scss/bootstrap.scss';
|
|
|
|
import '../node_modules/fork-awesome/css/fork-awesome.css';
|
|
|
|
import './assets/scss/main.scss';
|
|
|
|
|
2019-09-26 20:11:50 +00:00
|
|
|
import text from './plugins/text';
|
|
|
|
import is from './plugins/is';
|
|
|
|
import cookie from './plugins/cookie';
|
|
|
|
import merge from './plugins/merge';
|
|
|
|
|
2018-09-21 21:00:42 +00:00
|
|
|
Vue.use(VueRouter);
|
|
|
|
Vue.use(VueI18n);
|
|
|
|
Vue.component('vue-headful', vueHeadful);
|
|
|
|
|
2019-09-26 20:11:50 +00:00
|
|
|
Vue.use(text);
|
|
|
|
Vue.use(is);
|
|
|
|
Vue.use(cookie);
|
|
|
|
Vue.use(merge);
|
|
|
|
|
2019-09-29 18:25:14 +00:00
|
|
|
const defaultLocale = 'en';
|
2019-09-26 20:11:50 +00:00
|
|
|
const locales = {};
|
2018-09-21 21:00:42 +00:00
|
|
|
const pages = [];
|
2019-09-26 20:11:50 +00:00
|
|
|
const commons = [];
|
2018-09-21 21:00:42 +00:00
|
|
|
|
|
|
|
// Import locales list
|
2019-09-26 20:11:50 +00:00
|
|
|
// in locales/[lg]/[file].yml
|
|
|
|
let req = require.context('./locales/', true, /\.\/.*\/.*\.yml$/);
|
2018-09-21 21:00:42 +00:00
|
|
|
req.keys().forEach((key) => {
|
2019-09-26 20:11:50 +00:00
|
|
|
const lg = key.split('/')[1];
|
|
|
|
const file = key.split('/')[2].replace(/\.yml/, '');
|
|
|
|
if (locales[lg] === undefined) {
|
|
|
|
locales[lg] = [];
|
|
|
|
}
|
|
|
|
if (!locales[lg].includes(file)) {
|
|
|
|
locales[lg].push(file);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
// Flag if data/locales/[lg].yml is available
|
|
|
|
req = require.context('./data/locales/', false, /\.yml$/);
|
|
|
|
req.keys().forEach((key) => {
|
|
|
|
const lg = key.replace(/\.\/(.*)\.yml/, '$1');
|
|
|
|
if (Array.isArray(locales[lg])) {
|
|
|
|
locales[lg].push('data');
|
|
|
|
}
|
2018-09-21 21:00:42 +00:00
|
|
|
});
|
|
|
|
// Import pages list
|
|
|
|
req = require.context('./components/pages', false, /\.vue$/);
|
|
|
|
req.keys().forEach((key) => {
|
|
|
|
pages.push(key.replace(/\.\/(.*)\.vue/, '$1'));
|
|
|
|
});
|
2019-09-26 20:11:50 +00:00
|
|
|
// Import commons data list
|
|
|
|
req = require.context('./data/commons/', false, /\.yml$/);
|
|
|
|
req.keys().forEach((key) => {
|
|
|
|
commons.push(key.replace(/\.\/(.*)\.yml/, '$1'));
|
|
|
|
});
|
2018-09-21 21:00:42 +00:00
|
|
|
|
|
|
|
const lang = window.location.href
|
|
|
|
.split('/')[(process.env.BASE_URL === '' || (window.location.href.match(/\//g)).length === 3) ? 3 : 4]
|
|
|
|
.substr(0, 2)
|
2019-09-26 20:11:50 +00:00
|
|
|
.toLowerCase() || '';
|
2018-09-21 21:00:42 +00:00
|
|
|
document.getElementsByTagName('html')[0].setAttribute('lang', lang);
|
2019-02-06 12:08:03 +00:00
|
|
|
const userLang = navigator.languages
|
|
|
|
|| [navigator.language || navigator.userLanguage];
|
2018-09-21 21:00:42 +00:00
|
|
|
let defaultRouteLang = '';
|
|
|
|
|
|
|
|
const messages = {};
|
2019-09-26 20:11:50 +00:00
|
|
|
const numberFormats = {};
|
|
|
|
messages.locales = require('./data/lang.yml'); // eslint-disable-line
|
|
|
|
messages.locales.available = Object
|
|
|
|
.keys(messages.locales)
|
|
|
|
.filter(n => Object.keys(locales).indexOf(n) > -1);
|
2018-09-21 21:00:42 +00:00
|
|
|
|
|
|
|
// Data import
|
2019-09-26 20:11:50 +00:00
|
|
|
const data = {};
|
|
|
|
let project = {};
|
|
|
|
const scripts = document.getElementsByTagName('script');
|
|
|
|
for (let i = 0; i < commons.length; i += 1) {
|
|
|
|
data[commons[i]] = require(`./data/commons/${commons[i]}.yml`); // eslint-disable-line
|
|
|
|
}
|
|
|
|
project = require('./data/project.yml'); // eslint-disable-line
|
|
|
|
Object.assign(data, project);
|
|
|
|
|
|
|
|
Object.assign(data, {
|
|
|
|
host: window.location.host,
|
|
|
|
url: window.location.href,
|
|
|
|
'/': `/${process.env.BASE_URL.replace(/(.+)/, '$1/')}`,
|
|
|
|
inframe: window.top.location !== window.self.document.location,
|
|
|
|
hash: window.location.hash.replace('#', ''),
|
|
|
|
});
|
|
|
|
data.self = new URL(scripts[scripts.length - 1].src, data.url).href;
|
|
|
|
if (process.env.NODE_ENV === 'production'
|
|
|
|
&& data.meta.canonical !== undefined
|
|
|
|
&& /^http/.test(data.meta.canonical)) {
|
|
|
|
data.baseurl = data.meta.canonical;
|
|
|
|
} else {
|
|
|
|
data.baseurl = `${data.self.split('/').slice(0, -1).join('/')}/`;
|
|
|
|
}
|
|
|
|
|
2018-09-21 21:00:42 +00:00
|
|
|
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] = `<a href="${data.link[k]}">${data.color[k]}</a>`;
|
|
|
|
} else if (data.txt[k] !== undefined) {
|
|
|
|
data.html[k] = `<a href="${data.link[k]}">${data.txt[k]}</a>`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2019-09-26 20:11:50 +00:00
|
|
|
const routes = [];
|
|
|
|
Object.keys(locales).forEach((k) => {
|
|
|
|
messages[k] = {};
|
|
|
|
numberFormats[k] = {};
|
2018-09-21 21:00:42 +00:00
|
|
|
// Locales import
|
|
|
|
/* eslint-disable */
|
2019-09-26 20:11:50 +00:00
|
|
|
for (let i = 0; i < commons.length; i += 1) {
|
|
|
|
messages[k] = require(`./data/commons/${commons[i]}.yml`); // eslint-disable-line
|
|
|
|
}
|
|
|
|
messages[k] = require(`./locales/${k}/main.yml`); // eslint-disable-line
|
|
|
|
for (let i = 0; i < locales[k].length; i += 1) {
|
|
|
|
const file = locales[k][i];
|
|
|
|
if (!/main|data/.test(file)) {
|
|
|
|
messages[k][file] = require(`./locales/${k}/${file}.yml`); // eslint-disable-line
|
|
|
|
}
|
|
|
|
if (/data/.test(file)) {
|
|
|
|
const dataLocale = require(`./data/locales/${k}.yml`);
|
|
|
|
Object.keys(dataLocale).forEach((l) => {
|
|
|
|
if (messages[k][l] === undefined) {
|
|
|
|
messages[k][l] = dataLocale[l];
|
|
|
|
} else {
|
|
|
|
Object.assign(messages[k][l], dataLocale[l]);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
messages[k].data = data;
|
|
|
|
messages[k].lang = k;
|
|
|
|
numberFormats[k].eur = {
|
|
|
|
style: 'currency',
|
|
|
|
currency: 'EUR',
|
|
|
|
maximumFractionDigits: 0,
|
|
|
|
minimumFractionDigits: 0,
|
|
|
|
};
|
2018-09-21 21:00:42 +00:00
|
|
|
/* eslint-enable */
|
|
|
|
|
|
|
|
// Localized routes
|
|
|
|
for (let j = 0; j < pages.length; j += 1) {
|
|
|
|
const component = require(`./components/pages/${pages[j]}.vue`); // eslint-disable-line
|
|
|
|
routes.push({
|
2019-09-26 20:11:50 +00:00
|
|
|
path: `/${k}${pages[j].toLowerCase().replace(/^/, '/').replace('/home', '')}`,
|
2018-09-21 21:00:42 +00:00
|
|
|
component: component.default,
|
2019-09-26 20:11:50 +00:00
|
|
|
meta: { id: pages[j].toLowerCase(), lang: k },
|
2018-09-21 21:00:42 +00:00
|
|
|
});
|
|
|
|
}
|
2019-09-26 20:11:50 +00:00
|
|
|
});
|
2018-09-21 21:00:42 +00:00
|
|
|
|
|
|
|
// define defaultRouteLang
|
|
|
|
for (let j = 0; j < userLang.length; j += 1) { // check if user locales
|
2019-09-26 20:11:50 +00:00
|
|
|
const lg = userLang[j].substring(0, 2).toLowerCase();
|
|
|
|
if (defaultRouteLang === '' && Object.keys(locales).includes(lg)) { // matches with app locales
|
|
|
|
defaultRouteLang = lg;
|
2018-09-21 21:00:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-26 20:11:50 +00:00
|
|
|
// Redirections
|
|
|
|
for (let i = 0; i < pages.length; i += 1) {
|
|
|
|
if (!window.vuefsPrerender) {
|
|
|
|
routes.push({
|
|
|
|
path: `/${pages[i].toLowerCase().replace('home', '')}`,
|
|
|
|
redirect: `/${defaultRouteLang}/${pages[i].toLowerCase().replace('home', '')}`,
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
// Component needed for SEO
|
|
|
|
const component = require(`./components/pages/${pages[i]}.vue`); // eslint-disable-line
|
|
|
|
routes.push({
|
|
|
|
path: `/${pages[i].toLowerCase().replace('home', '')}`,
|
|
|
|
component: component.default,
|
|
|
|
});
|
2018-09-21 21:00:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create VueI18n instance with options
|
|
|
|
const i18n = new VueI18n({
|
2019-09-26 20:11:50 +00:00
|
|
|
locale: lang === '' ? defaultRouteLang : lang,
|
2018-09-21 21:00:42 +00:00
|
|
|
fallbackLocale: defaultLocale,
|
|
|
|
messages,
|
2019-09-26 20:11:50 +00:00
|
|
|
numberFormats,
|
2018-09-21 21:00:42 +00:00
|
|
|
silentTranslationWarn: true,
|
|
|
|
});
|
|
|
|
|
|
|
|
// Framanav
|
2019-02-06 12:08:03 +00:00
|
|
|
if (!window.vuefsPrerender
|
|
|
|
&& document.querySelectorAll('script[src$="nav.js"]').length < 1
|
|
|
|
&& process.env.NODE_ENV !== 'development') {
|
2018-09-21 21:00:42 +00:00
|
|
|
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}`,
|
|
|
|
});
|
|
|
|
|
2018-11-20 10:04:29 +00:00
|
|
|
// 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());
|
|
|
|
}]);
|
|
|
|
}
|
|
|
|
|
2018-09-21 21:00:42 +00:00
|
|
|
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),
|
|
|
|
});
|