Commit 0e2a492e authored by Sandro Lutz's avatar Sandro Lutz
Browse files

Implement language prefix in URL

parent 32bbcea3
// src/index.js
import m from 'mithril';
import { getLang } from './models/language';
import { loadLanguage, currentLanguage, changeLanguage, isLanguageValid } from './models/language';
import { verbose } from './models/config';
import { Error404, Error401 } from './views/errors';
import { isLoggedIn } from './models/auth';
import studydocList from './views/studydocs/studydocList';
import studydocNew from './views/studydocs/studydocNew';
import eventList from './views/events/eventList';
......@@ -21,87 +24,189 @@ import companyList from './views/companies/companyList';
import companyDetail from './views/companies/companyDetail';
import './views/styles/base.less';
getLang();
loadLanguage();
if (verbose !== true) {
// set to pathname strategy (Please note that the production server needs to support this)
m.route.prefix('');
}
function onmatch(args, requestedPath, component) {
if (isLanguageValid(args.language)) {
changeLanguage(args.language);
return component;
}
return {
view() {
return m(layout, m(Error404));
},
};
}
function onmatchAuthenticated(args, requestedPath, component) {
if (!isLoggedIn()) {
// m.route.set(`/${currentLanguage()}/login`);
return {
view() {
return m(layout, m(Error401));
},
};
}
return onmatch(args, requestedPath, component);
}
m.route(document.body, '/', {
'/': {
render() {
return m(layout, m(amivLayout, m(frontpage)));
},
},
'/amiv/statuten': {
render() {
return m(layout, m(amivLayout, m(statuten)));
},
},
'/contact': {
render() {
return m(layout, m(contact));
},
},
'/amiv/aufenthaltsraum': {
render() {
return m(layout, m(amivLayout, m(aufenthaltsraum)));
},
},
'/login': {
render() {
return m(layout, m(login));
},
},
'/logout': {
render() {
return m(layout, m(logout));
},
},
'/amiv/board': {
render() {
return m(layout, m(amivLayout, m(board)));
},
},
'/studydocuments': {
render() {
return m(layout, m(studydocList));
},
},
'/studydocuments/new': {
render() {
return m(layout, m(studydocNew));
},
},
'/events': {
render() {
return m(layout, m(eventList));
},
},
'/events/:eventId': {
render(vnode) {
return m(layout, m(eventDetails, vnode.attrs));
},
},
'/jobs': {
render() {
return m(layout, m(jobOfferList));
},
},
'/jobs/:jobId': {
render(vnode) {
return m(layout, m(jobOfferDetails, vnode.attrs));
},
},
'/profile': {
render(vnode) {
return m(layout, m(profile, vnode.attrs));
},
},
'/companies': {
render() {
return m(layout, m(companyList));
},
},
'/companies/:companyId': {
render(vnode) {
return m(layout, m(companyDetail, vnode.attrs));
onmatch() {
m.route.set(`/${currentLanguage()}/`);
},
},
'/:language': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(amivLayout, m(frontpage)));
},
});
},
},
'/:language/amiv/statuten': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(amivLayout, m(statuten)));
},
});
},
},
'/:language/contact': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(contact));
},
});
},
},
'/:language/amiv/aufenthaltsraum': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(amivLayout, m(aufenthaltsraum)));
},
});
},
},
'/:language/login': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(login));
},
});
},
},
'/:language/logout': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(logout));
},
});
},
},
'/:language/amiv/board': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(amivLayout, m(board)));
},
});
},
},
'/:language/studydocuments': {
onmatch(args, requestedPath) {
return onmatchAuthenticated(args, requestedPath, {
view() {
return m(layout, m(studydocList));
},
});
},
},
'/:language/studydocuments/new': {
onmatch(args, requestedPath) {
return onmatchAuthenticated(args, requestedPath, {
view() {
return m(layout, m(studydocNew));
},
});
},
},
'/:language/events': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(eventList));
},
});
},
},
'/:language/events/:eventId': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view(vnode) {
return m(layout, m(eventDetails, vnode.attrs));
},
});
},
},
'/:language/jobs': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(jobOfferList));
},
});
},
},
'/:language/jobs/:jobId': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view(vnode) {
return m(layout, m(jobOfferDetails, vnode.attrs));
},
});
},
},
'/:language/profile': {
onmatch(args, requestedPath) {
return onmatchAuthenticated(args, requestedPath, {
view(vnode) {
return m(layout, m(profile, vnode.attrs));
},
});
},
},
'/:language/companies': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view() {
return m(layout, m(companyList));
},
});
},
},
'/:language/companies/:companyId': {
onmatch(args, requestedPath) {
return onmatch(args, requestedPath, {
view(vnode) {
return m(layout, m(companyDetail, vnode.attrs));
},
});
},
},
'/:404...': {
view() {
return m(layout, m(Error404));
},
},
});
import m from 'mithril';
import { currentLanguage } from './language';
// ensure that all markdown files are compiled
require.context('../views/companies/markdown');
......@@ -12,7 +13,7 @@ require.context('../views/companies/markdown');
export default function load(companyId) {
// dynamically load compiled html files
return m.request({
url: `/dist/companies/${companyId}.html`,
url: `/dist/companies/${companyId}.${currentLanguage()}.html`,
method: 'GET',
deserialize: response => response,
});
......
......@@ -2,21 +2,25 @@ import i18n from 'i18n4v';
import german from '../languages/de.json';
import english from '../languages/en.json';
let currentLang;
let _currentLanguage;
function changeLanguage(lang) {
function changeLanguage(language) {
i18n.translator.reset();
if (lang === 'de') {
currentLang = 'de';
if (language === 'de') {
_currentLanguage = 'de';
i18n.translator.add(german);
} else {
currentLang = 'en';
_currentLanguage = 'en';
i18n.translator.add(english);
}
localStorage.setItem('lanuage', currentLang);
localStorage.setItem('lanuage', _currentLanguage);
}
function getLang() {
function isLanguageValid(language) {
return ['en', 'de'].indexOf(language) > -1;
}
function loadLanguage() {
let lang = localStorage.getItem('lanuage');
if (!lang) {
if (navigator.languages !== undefined) {
......@@ -33,7 +37,7 @@ function getLang() {
}
function switchLanguage() {
if (currentLang === 'en') {
if (_currentLanguage === 'en') {
changeLanguage('de');
} else {
changeLanguage('en');
......@@ -41,7 +45,10 @@ function switchLanguage() {
}
function currentLanguage() {
return currentLang;
if (!_currentLanguage) {
loadLanguage();
}
return _currentLanguage;
}
export { i18n, changeLanguage, switchLanguage, currentLanguage, getLang };
export { i18n, changeLanguage, switchLanguage, currentLanguage, loadLanguage, isLanguageValid };
import m from 'mithril';
import { checkLogin, isLoggedIn } from '../models/auth';
import { currentLanguage } from './language';
const defaultTabs = ['AMIV', 'Events', 'Studienunterlagen', 'Jobs'];
const tabsLoggedOut = ['Login'];
const tabsLoggedIn = ['Profile', 'Logout'];
const tabToUrl = {
AMIV: { href: '/', onupdate: m.route.link, index: 0 },
Events: { href: '/events', onupdate: m.route.link, index: 1 },
Studienunterlagen: { href: '/studydocuments', onupdate: m.route.link, index: 2 },
Jobs: { href: '/jobs', onupdate: m.route.link, index: 3 },
Login: { href: '/login', onupdate: m.route.link, index: 4 },
Profile: { href: '/profile', onupdate: m.route.link, index: 4 },
Logout: { href: '/logout', onupdate: m.route.link, index: 5 },
AMIV: { href: `/${currentLanguage()}/`, onupdate: m.route.link, index: 0 },
Events: { href: `/${currentLanguage()}/events`, onupdate: m.route.link, index: 1 },
Studienunterlagen: {
href: `/${currentLanguage()}/studydocuments`,
onupdate: m.route.link,
index: 2,
},
Jobs: { href: `/${currentLanguage()}/jobs`, onupdate: m.route.link, index: 3 },
Login: { href: `/${currentLanguage()}/login`, onupdate: m.route.link, index: 4 },
Profile: { href: `/${currentLanguage()}/profile`, onupdate: m.route.link, index: 4 },
Logout: { href: `/${currentLanguage()}/logout`, onupdate: m.route.link, index: 5 },
};
export default class Navigation {
......
# ABB
Website: [ABB Website](http://www.abb.ch/)
Angestellte: 145'000 weltweit, 6'800 in der Schweiz
## Contact
ABB Schweiz AG
Herr Marcel Winkelmann
Brown Boveri Strasse 6
5400 Baden
hrmarketing@ch.abb.com
## Portrait
ABB ist weltweit führend in der Energie- und Automationstechnik. Das Unternehmen ermöglicht seinen Kunden in der Energieversorgung und der Industrie, ihre Leistung zu verbessern und gleichzeitig die Umweltbelastung zu reduzieren. ABB beschäftigt rund 130'000 Mitarbeitende in über 100 Länder.
In der Schweiz arbeiten rund 6'600 Mitarbeiter und Mitarbeiterinnen. In der Energietechnik arbeitet ABB Schweiz für Kunden, die in der Elektrizitäts-, Gas- oder Wasserversorgung tätig sind. ABB deckt fast die gesamte Palette der Stromübertragung und -verteilung von Kraftwerkkomponenten bis zur Steckdose ab. Dies umfasst Hoch- und Mittelspannungsschaltanlagen, Schaltanlagenkomponenten, Leistungshalbleiter sowie Transformatoren und Trafostationen. Die Automationstechnik von ABB Schweiz beliefert die Industrie in den Bereichen Zement, Metall- und Bergbau sowie Chemie, Pharma, Konsumgüter und Lebensmittel. Zu den Kunden gehören zudem Unternehmen aus der Fertigung, der Papier- und Druckindustrie sowie dem Maschinen-, Auto- und Schiffbau.
Im ABB-Forschungszentrum in Baden-Dättwil wird Innovation gross geschrieben: Die 170 Beschäftigten aus mehr als 25 Ländern arbeiten schon heute an der Lösung der Probleme von morgen. Denn für einen Technologiekonzern wie ABB sind erfolgreiche Innovationen überlebenswichtig. In der Schweiz wird überdurchschnittlich viel Kapital in die Forschung und Entwicklung investiert. Die Schwerpunkte im Corporate Research Center der Schweiz sind Automatisierung und Informatik, Materialien und Technologien für die Elektrotechnik, Leistungselektronik, Kommunikation sowie Elektronik, Messtechnik und Sensorik.
## Standorte in der Schweiz
Baden, Baden-Dättwil, Lenzburg, Turgi, Klingnau, Zürich-Oerlikon, Schaffhausen, Genf
## Gesuchte Fachrichtungen
* Elektrotechnik und Informationstechnologie
* Informatik
* MTEC
* Maschinenbau und Verfahrenstechnik
* Materialwissenschaft
* Physik
## Möglichkeiten
* Direkteinstieg
* Verschiedene Trainee Programme
* Praktikum
* Bachelor- und Masterarbeiten
[Alles zu Ihrer Karriere](http://www.abb.ch/karriere)
\ No newline at end of file
# Unsere Partner-Firmen
* [ABB](/#!/de/companies/abb)
* [Sensirion](/#!/de/companies/sensirion)
# Our partner companies
* [ABB](/#!/en/companies/abb)
* [Sensirion](/#!/en/companies/sensirion)
# Our partner companies
* [ABB](/#!/companies/abb)
* [Sensirion](/#!/companies/sensirion)
# Sensirion
## Contact
Marco Höhener
+41 44 927 11 96
www.xing.to/Marco_Hoehener
## Über uns
Die Sensirion AG ist ein aus der ETH Zürich hervorgegangenes, innovatives und international tätiges Hightech Unternehmen mit Sitz am Zürichsee mit über 500 Mitarbeitenden.
High Tech Made in Switzerland - Die weltweit führende Sensortechnologie zur Messung von Feuchtigkeit, Gas- und Flüssigkeitsdurchflüsse sowie Differenzdrucke sorgen für mehr Lebensqualität sowie den schonenden Umgang mit Ressourcen.
Geforscht, entwickelt und produziert wird im Headquarter in Stäfa (ZH). Der Vertrieb wird durch ein internationales Netzwerk mit Büros in den USA, Deutschland, China, Taiwan, Japan und Korea unterstützt. Die Kombination aus Teamgeist und technologischer Kompetenzführerschaft macht Sensirion zum bevorzugten Partner der Automobilbranche, Medizinaltechnik, Gebäudetechnologie, Prozessautomatisierung und Konsumgüterindustrie.
## Schwerpunkt
Die Forschung und Entwicklung von neuen, digitalen Mikrosensorprodukten sowie von Produktionsprozessen zur Massenfertigung dieser Produkte bieten zahlreiche Herausforderungen.
Sensirion ermöglicht Physikern/-innen und Ingenieuren/-innen in der F&E und in unserem Produktionsumfeld, sowohl mit interdisziplinärer Arbeit als auch mit der Lösung hoch spezialisierter Technologiefragen, Mikrosensortechnik an der Weltspitze mit zu gestalten.
\ No newline at end of file
import m from 'mithril';
import { i18n } from '../../models/language';
import { i18n, currentLanguage } from '../../models/language';
import * as events from '../../models/events';
const date = `${new Date().toISOString().split('.')[0]}Z`;
......@@ -43,7 +43,14 @@ export default class EventList {
m('td', event.time_start),
m('td', event.signup_count),
m('td', event.spots),
m('td', m('a', { href: `/events/${event._id}`, oncreate: m.route.link }, 'Details')),
m(
'td',
m(
'a',
{ href: `/${currentLanguage()}/events/${event._id}`, oncreate: m.route.link },
'Details'
)
),
])
)
),
......
import m from 'mithril';
import { apiUrl } from '../../models/config';
import * as jobs from '../../models/joboffers';
import { currentLanguage } from '../../models/language';
const date = `${new Date().toISOString().split('.')[0]}Z`;
......@@ -36,7 +37,14 @@ export default class JobOfferList {
m('img', { src: `${apiUrl}${job.logo.file}`, width: '150px', alt: job.company })
),
m('td', job.title),
m('td', m('a', { href: `/jobs/${job._id}`, oncreate: m.route.link }, 'Details')),
m(
'td',
m(
'a',
{ href: `/${currentLanguage()}/jobs/${job._id}`, oncreate: m.route.link },
'Details'
)
),
])
)
),
......
import m from 'mithril';
import { isLoggedIn, getUsername, login } from '../models/auth';
import { getUsername, login } from '../models/auth';
import * as user from '../models/user';
import * as groups from '../models/groups';
import inputGroup from './form/inputGroup';
......@@ -351,9 +351,6 @@ class groupMemberships {
// shows all submodules defined above
export default class profile {
static oninit() {
if (!isLoggedIn()) {
m.route.set('/');
}
user.load();
}
......
import m from 'mithril';
import * as studydocs from '../../models/studydocs';
import { apiUrl } from '../../models/config';
import { isLoggedIn } from '../../models/auth';
import { Error401 } from '../errors';
import { Button, Checkbox, TextField, Dropdown } from '../../components';
const tableHeadings = ['title', 'type'];
......@@ -113,8 +111,6 @@ export default class studydocList {
}
view() {
if (!isLoggedIn()) return m(Error401);
return m('div#studydoc-list', [
m('div.filter', [
m(
......
import m from 'mithril';
import * as studydocs from '../../models/studydocs';
import { isLoggedIn } from '../../models/auth';
import { Error401 } from '../errors';
import inputGroup from '../form/inputGroup';
import selectGroup from '../form/selectGroup';
import { Button } from '../../components';
......@@ -34,8 +32,6 @@ export default class studydocNew {
}
view() {
if (!isLoggedIn()) return m(Error401);
return m('form', [
m(inputGroup, {
name: 'title',
......
......@@ -31,7 +31,7 @@ const config = {
],
},
{
test: /src\/views\/companies\/markdown\/[a-zA-Z\d-]{3,}\.md$/, // Check for all .md files in /companies/markdown
test: /src\/views\/companies\/markdown\/[a-zA-Z\d-]{3,}\.[a-z]{2}\.md$/, // Check for all .md files in /companies/markdown
use: [
{
loader: 'file-loader', // Writes the generated HTML to a file
......
......@@ -32,7 +32,7 @@ const config = {
}],
},
{
test: /src\/views\/companies\/markdown\/[a-zA-Z\d-]{3,}\.md$/, // Check for all .md files in /companies/markdown
test: /src\/views\/companies\/markdown\/[a-zA-Z\d-]{3,}\.[a-z]{2}\.md$/, // Check for all .md files in /companies/markdown
use: [
{
loader: 'file-loader', // Writes the generated HTML to a file
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment