1
0
mirror of https://github.com/typemill/typemill.git synced 2025-04-19 11:31:58 +02:00

i18n-light on 1.3.1

This commit is contained in:
severoiuliano@gmail.com 2020-01-09 15:46:20 +01:00
parent 3ae238afa6
commit a753f96b12
20 changed files with 398 additions and 117 deletions

2
cache/lastCache.txt vendored
View File

@ -1 +1 @@
1577899842
1578580890

101
settings/languages/en.yaml Normal file
View File

@ -0,0 +1,101 @@
# English
ACCOUNT: Account
ACTIVE: Active
ACTUAL_PASSWORD: Actual Password
ADD_FILE: add file
ADD_FOLDER: add folder
ADD_FOLDER_TO_BASE_LEVEL: add folder to base level
ADD_ITEM: add item
ALL_USERS: All users
AUTHOR: Author
BACK_TO_STARTPAGE: back to startpage
BY: by
CODE: code
CONTENT: Content
COPYRIGHT: Copyright
CREATE_NEW_USER: Create New User
CREATE_USER: Create User
DEFINITION: definition
DELETE: delete
DELETE_PAGE: Delete page
DELETE_USER: Delete User
DISCARD_CHANGES: Discard Changes
DISCARD: Discard
DO_YOU_REALLY_WANT_TO_DELETE_THE_USER: Do you really want to delete the user
DO_YOU_REALLY_WANT_TO_DELETE_THIS_PAGE: Do you really want to delete this page?
DO_YOU_WANT_TO_DISCARD_YOUR_CHANGES_AND_SET_THE_CONTENT_BACK_TO_THE_LIVE_VERSION: Do you want to discard your changes and set the content back to the live version?
DRAFT: Draft
EDIT: edit
EDIT_USER: Edit User
E_G_: e.g.
E_MAIL: E-Mail
FIRST_NAME: First Name
FORGOT_PASSWORD: Forgot password
HEADLINE: headline
HOMEPAGE: Homepage
HR: hr
IMAGE: image
LANGUAGE: Language
LAST_NAME: Last Name
LICENCE: Licence
LOGIN: Login
LOGOUT: Logout
MARKDOWN: markdown
MENU: Menu
META_TITLE: meta title
MISSING_REQUIREMENTS: Missing Requirements
NEW_PASSWORD: New Password
NO_DESCRIPTION: No description
NO_PREVIEW: No Preview
NO_SETTINGS: No Settings
NOT_EDITABLE: not editable
OLIST: olist
ONLY_THE_FOLLOWING_SPECIAL_CHARACTERS_ARE_ALLOWED: Only the following special characters are allowed:
PASSWORD: Password
PLEASE_CONFIRM: Please confirm
PLUGINS: Plugins
PLUGIN_STORE: Plugin Store
PUBLISH: Publish
QUOTE: quote
RAW_CONTENT_EDITOR: Raw Content Editor
RAW_MARKDOWN_EDITOR: Raw Markdown Editor
RAW_MODE: raw mode
RAW: raw
READONLY: Readonly
REMEMBER_TO_BOOKMARK_THIS_PAGE: Remember to bookmark this page
REQUIRED: Required
ROLE: Role
SAVE_ALL_SETTINGS: Save All Settings
SAVE: Save
SAVE_THEME: Save Theme
SETTINGS: Settings
SETUP: Setup
STANDARD_EDITOR_MODE: Standard Editor Mode
START: Start
SYSTEM: System
TABLE: table
THE_FORMAT_BUTTONS: The Format Buttons
THEMES: Themes
THEME_STORE: Theme Store
TITLE: Title
TOC: toc
ULIST: ulist
UNKNOWN: Unknown
UPDATE_USER: Update User
USE_2_TO_40_CHARACTERS: Use 2 to 40 characters.
USE_A_VALID_YEAR: Use a valid year
USERNAME: Username
USERS: Users
USER: User
VIDEO: video
VIEW_SITE: View Site
VISUAL_CONTENT_EDITOR: Visual Content Editor
VISUAL_EDITOR: Visual Editor
VISUAL_MARKDOWN_EDITOR: Visual Markdown Editor
VISUAL_MODE: visual mode
VISUAL: visual
WAIT: wait
WEBSITE_TITLE: Website Title
WEB: Web
WRITING: Writing
YEAR: Year

101
settings/languages/it.yaml Normal file
View File

@ -0,0 +1,101 @@
# Italiano
ACCOUNT: Utenza
ACTIVE: Attivo
ACTUAL_PASSWORD: Parola d'ordine corrente
ADD_FILE: aggiungi file
ADD_FOLDER: aggiungi cartella
ADD_FOLDER_TO_BASE_LEVEL: aggiungi cartella al livello base
ADD_ITEM: aggiungi articolo
ALL_USERS: Tutti gli utenti
AUTHOR: Autore
BACK_TO_STARTPAGE: torna alla pagina iniziale
BY: di
CODE: codice
CONTENT: Contenuto
COPYRIGHT: Diritti d'autore
CREATE_NEW_USER: Crea nuovo utente
CREATE_USER: Crea utente
DEFINITION: elenco di definizioni
DELETE: elimina
DELETE_PAGE: Elimina pagina
DELETE_USER: Elimina utente
DISCARD_CHANGES: Non salvare le modifiche
DISCARD: Scarta
DO_YOU_REALLY_WANT_TO_DELETE_THE_USER: Vuoi veramente eliminare l'utente
DO_YOU_REALLY_WANT_TO_DELETE_THIS_PAGE: Vuoi veramente cancellare questa pagina?
DO_YOU_WANT_TO_DISCARD_YOUR_CHANGES_AND_SET_THE_CONTENT_BACK_TO_THE_LIVE_VERSION: Vuoi annullare le modifiche e ripristinare i contenuti alla versione precedente?
DRAFT: Bozza
EDIT: modifica
EDIT_USER: Modifica utente
E_G_: per es.:
E_MAIL: Posta elettronica
FIRST_NAME: Nome
FORGOT_PASSWORD: Parola d'ordine dimenticata
HEADLINE: titolo
HOMEPAGE: Homepage
HR: linea orizzontale
IMAGE: immagine
LANGUAGE: Lingua
LAST_NAME: Cognome
LICENCE: Licenza
LOGIN: Accesso
LOGOUT: Disconnessione
MARKDOWN: markdown
MENU: Menu
META_TITLE: meta titolo
MISSING_REQUIREMENTS: Requisiti mancanti
NEW_PASSWORD: Nuova parola d'ordine
NO_DESCRIPTION: Nessuna descrizione
NO_PREVIEW: Nessuna anteprima
NO_SETTINGS: Nessuna impostazione
NOT_EDITABLE: non modificabile
OLIST: elenchi ordinati
ONLY_THE_FOLLOWING_SPECIAL_CHARACTERS_ARE_ALLOWED: Sono ammessi solo i seguenti caratteri speciali:
PASSWORD: Parola d'ordine
PLEASE_CONFIRM: Per favore conferma
PLUGINS: Plugin
PLUGIN_STORE: Deposito plugin
PUBLISH: Pubblica
QUOTE: citazione
RAW_CONTENT_EDITOR: Editore contenuto grezzo
RAW: grezzo
RAW_MARKDOWN_EDITOR: Editore grezzo Markdown
RAW_MODE: modo grezzo
READONLY: Sola lettura
REMEMBER_TO_BOOKMARK_THIS_PAGE: Ricorda di aggiungere questa pagina ai segnalibri
REQUIRED: Richiesto
ROLE: Ruolo
SAVE_ALL_SETTINGS: Salva tutte le impostazioni
SAVE: Salva
SAVE_THEME: Salva tema
SETTINGS: Impostazioni
SETUP: Configurazione
STANDARD_EDITOR_MODE: Modalità editore standard
START: Comincia
SYSTEM: Sistema
TABLE: tabella
THE_FORMAT_BUTTONS: pulsanti di formattazione
THEMES: Temi
THEME_STORE: Deposito temi
TITLE: Titolo
TOC: sommario
ULIST: elenchi non ordinati
UNKNOWN: Ignoto
UPDATE_USER: Aggiorna utente
USE_2_TO_40_CHARACTERS: Usa da 2 a 40 caratteri.
USE_A_VALID_YEAR: Usa un anno valido
USERNAME: Nome utente
USERS: Utenti
USER: Utente
VIDEO: video
VIEW_SITE: Mostra sito
VISUAL_CONTENT_EDITOR: Editore contenuto visivo
VISUAL_EDITOR: Editore visivo
VISUAL_MARKDOWN_EDITOR: Editore visivo Markdown
VISUAL_MODE: modo visivo
VISUAL: visivo
WAIT: aspetta
WEBSITE_TITLE: Titolo del sito
WEB: Sito
WRITING: Scrittura
YEAR: Anno

View File

@ -0,0 +1,53 @@
<?php
namespace Typemill\Extensions;
use Typemill\Models\WriteYaml;
class TwigLanguageExtension extends \Twig_Extension
{
protected $labels;
public function __construct($labels)
{
$this->labels = $labels;
}
public function getFilters()
{
return [
new \Twig_SimpleFilter('__', [$this,'translate'] )
];
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('__', array($this, 'translate' ))
];
}
public function translate( $label )
{
// replaces spaces, dots and dash with underscores
$string = str_replace(" ", "_", $label);
$string = str_replace(".", "_", $string);
$string = str_replace("-", "_", $string);
// transforms to uppercase
$string = strtoupper( $string );
//translates the string
$translated_label = $this->labels[$string];
// if the string is not present, set the original string
if( empty($translated_label) ){
$translated_label = $label;
}
// returns the string in the set language
return $translated_label;
}
}

View File

@ -16,6 +16,12 @@ class Settings
$settings = array_merge($defaultSettings, $userSettings);
}
// i18n
// load the strings of the set language
$language = $settings['language'];
$settings['labels'] = self::getLanguageLabels($language);
# We know the used theme now so create the theme path
$settings['themePath'] = $settings['rootPath'] . $settings['themeFolder'] . DIRECTORY_SEPARATOR . $settings['theme'];
@ -70,6 +76,23 @@ class Settings
return $userSettings;
}
// i18n
public static function getLanguageLabels($language)
{
// if not present, set the English language
if( empty($language) ){
$language = 'en';
}
// load the strings of the set language
$yaml = new Models\WriteYaml();
$labels = $yaml->getYaml('settings/languages', $language.'.yaml');
return $labels;
}
public static function getObjectSettings($objectType, $objectName)
{
$yaml = new Models\WriteYaml();

View File

@ -6,21 +6,21 @@
<div class="setupWrapper">
<div class="setupContent">
<p><svg class="icon baseline icon-bookmark-o"><use xlink:href="#icon-bookmark-o"></use></svg>Remember to bookmark this page</p>
<p><svg class="icon baseline icon-bookmark-o"><use xlink:href="#icon-bookmark-o"></use></svg>{{ __('Remember to bookmark this page') }}</p>
</div>
<div class="authformWrapper">
<form method="POST" action="{{ path_for("auth.login") }}" autocomplete="off">
<fieldset class="auth">
<div class="formElement{{ errors.username ? ' errors' : '' }}">
<label for="username">Username <abbr title="required">*</abbr></label>
<label for="username">{{ __('Username') }} <abbr title="{{ __('required') }}">*</abbr></label>
<input type="text" name="username" value="{{ old.username }}" required>
{% if errors.signup_username %}
<span class="error">{{ errors.username | first }}</span>
{% endif %}
</div>
<div class="formElement{{ errors.password ? ' errors' : '' }}">
<label for="password">Password <abbr title="required">*</abbr></label>
<label for="password">{{ __('Password') }} <abbr title="{{ __('required') }}">*</abbr></label>
<input type="password" name="password" required autoomplete="off">
{% if errors.password %}
<span class="error">{{ errors.password | first }}</span>
@ -29,18 +29,18 @@
</fieldset>
<div class="loginarea" id="loginarea">
<input type="submit" value="Login" id="loginbutton" class="loginbutton" />
<input type="submit" value="{{ __('Login') }}" id="loginbutton" class="loginbutton" />
{{ csrf_field() | raw }}
{% if messages.time %}
<div id="counter" class="counter">wait <span id="wait">{{ messages.time }}</span> sec</div>
<div class="forgotpw"><a href="https://typemill.net/writers/forgot-password" target="_blank">Forgot password?</a></div>
<div id="counter" class="counter">{{ __('wait') }} <span id="wait">{{ messages.time }}</span> sec</div>
<div class="forgotpw"><a href="https://typemill.net/writers/forgot-password" target="_blank">{{ __('Forgot password') }}?</a></div>
{% endif %}
</div>
</form>
</div>
<div class="setupContent">
<p><a href="{{ base_url() }}">back to startpage</a></p>
<p><a href="{{ base_url() }}">{{ __('back to startpage') }}</a></p>
</div>
</div>
<footer></footer>

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layoutBlox.twig' %}
{% block title %}Visual Content Editor{% endblock %}
{% block title %}{{ __('Visual Content Editor') }}{% endblock %}
{% block content %}

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layoutEditor.twig' %}
{% block title %}Raw Content Editor{% endblock %}
{% block title %}{{ __('Raw Content Editor') }}{% endblock %}
{% block content %}
@ -33,12 +33,12 @@
<fieldset>
<div class="large" :class="{'error' : errors.title}">
<label for="title">Title*</label>
<label for="title">{{ __('Title') }}*</label>
<input @input="changeContent" id="title" name="title" type="text" v-model="form.title" value="{{title}}" required />
<span class="error" v-if="errors.title">${ errors.title }</span>
</div>
<div class="large" :class="{'error' : errors.content}">
<label for="content">Content*</label>
<label for="content">{{ __('Content') }}*</label>
<textarea id="content" v-model="form.content" @input="changeContent" required>{{ content }}</textarea>
<span class="error" v-if="errors.content">${ errors.content }</span>
</div>

View File

@ -1,12 +1,12 @@
<div class="editor buttonset" id="publishController" data-published="{{ item.published }}" data-drafted="{{ item.drafted }}" v-cloak>
<div v-if="errors.message" class="message error">${ errors.message }</div>
<button v-if="raw" @click.prevent="saveDraft" id="draft" :class="draftResult" :disabled="draftDisabled"><span class="desktop">Save&nbsp;</span>Draft</button><button @click.prevent="publishDraft" id="publish" :class="publishResult" :disabled="publishDisabled">Publish</button>
<button @click.prevent="showModal('discard')" v-if="visual && !publishStatus" id="discard" :class="discardResult" :disabled="publishDisabled">Discard</button>
<button v-if="raw" @click.prevent="saveDraft" id="draft" :class="draftResult" :disabled="draftDisabled"><span class="desktop">{{ __('Save') }}&nbsp;</span>{{ __('Draft') }}</button><button @click.prevent="publishDraft" id="publish" :class="publishResult" :disabled="publishDisabled">{{ __('Publish') }}</button>
<button @click.prevent="showModal('discard')" v-if="visual && !publishStatus" id="discard" :class="discardResult" :disabled="publishDisabled">{{ __('Discard') }}</button>
<div class="secondary">
<button @click.prevent="depublishArticle" class="button--secondary" :disabled="publishStatus"><span class="desktop">${publishLabel}</span><span class="mobile">${publishLabelMobile}</span></button>
<button @click.prevent="showModal('delete')" class="button--secondary danger"><span class="desktop">delete</span><span class="mobile">X</span></button>
<a v-if="visual" href="{{ base_url }}/tm/content/raw{{item.urlRelWoF}}" class="button--secondary"><span class="desktop">raw mode</span><span class="mobile">raw</span></a>
<a v-if="raw" href="{{ base_url }}/tm/content/visual{{item.urlRelWoF}}" class="button--secondary"><span class="desktop">visual mode</span><span class="mobile">visual</span></a>
<button @click.prevent="showModal('delete')" class="button--secondary danger"><span class="desktop">{{ __('delete') }}</span><span class="mobile">X</span></button>
<a v-if="visual" href="{{ base_url }}/tm/content/raw{{item.urlRelWoF}}" class="button--secondary"><span class="desktop">{{ __('raw mode') }}</span><span class="mobile">{{ __('raw') }}</span></a>
<a v-if="raw" href="{{ base_url }}/tm/content/visual{{item.urlRelWoF}}" class="button--secondary"><span class="desktop">{{ __('visual mode') }}</span><span class="mobile">{{ __('visual') }}</span></a>
<a target="_blank" class="button--secondary" href="{{ item.urlAbs }}"><svg class="icon baseline icon-external-link"><use xlink:href="#icon-external-link"></use></svg></a>
</div>
<transition name="fade">
@ -14,14 +14,14 @@
<div class="modalInner">
<div @click="hideModal" id="closeModal" class="closeModal">X</div>
<div v-if="modalType == 'delete'">
<h2>Delete page</h2>
<p>Do you really want to delete this page? Please confirm.</p>
<button @click.prevent="deleteArticle" class="large alert" :class="deleteResult" :disabled="deleteDisabled">Delete Page</button>
<h2>{{ __('Delete page') }}</h2>
<p>{{ __('Do you really want to delete this page') }} {{ __('Please confirm') }}</p>
<button @click.prevent="deleteArticle" class="large alert" :class="deleteResult" :disabled="deleteDisabled">{{ __('Delete Page') }}</button>
</div>
<div v-if="modalType == 'discard'">
<h2>Discard Changes</h2>
<p>Do you want to discard your changes and set the content back to the live version?</p>
<button @click.prevent="discardDraft" class="large fullwidth" :class="discardResult" :disabled="publishDisabled">Discard Changes</button>
<h2>{{ __('Discard Changes') }}</h2>
<p>{{ __('Do you want to discard your changes and set the content back to the live version') }}</p>
<button @click.prevent="discardDraft" class="large fullwidth" :class="discardResult" :disabled="publishDisabled">{{ __('Discard Changes') }}</button>
</div>
</div>
</div>

View File

@ -1,16 +1,16 @@
<nav id="sidebar-menu" class="sidebar-menu">
{% if is_role('administrator') %}
<div id="mobile-menu" class="menu-action">Menu <span class="button-arrow"></span></div>
<h3>Settings</h3>
<div id="mobile-menu" class="menu-action">{{ __('Menu') }} <span class="button-arrow"></span></div>
<h3>{{ __('Settings') }}</h3>
<ul class="menu-list margin-bottom">
<li class="menu-item"><a href="{{ path_for('settings.show') }}"{{ (route == 'settings.show') ? ' class="active"' : '' }}>System</a></li>
<li class="menu-item"><a href="{{ path_for('themes.show') }}"{{ (route == 'themes.show') ? ' class="active"' : '' }}>Themes</a></li>
<li class="menu-item"><a href="{{ path_for('plugins.show') }}"{{ (route == 'plugins.show') ? ' class="active"' : '' }}>Plugins</a></li>
<li class="menu-item"><a href="{{ path_for('settings.show') }}"{{ (route == 'settings.show') ? ' class="active"' : '' }}>{{ __('System') }}</a></li>
<li class="menu-item"><a href="{{ path_for('themes.show') }}"{{ (route == 'themes.show') ? ' class="active"' : '' }}>{{ __('Themes') }}</a></li>
<li class="menu-item"><a href="{{ path_for('plugins.show') }}"{{ (route == 'plugins.show') ? ' class="active"' : '' }}>{{ __('Plugins') }}</a></li>
</ul>
<h3>Users</h3>
<h3>{{ __('Users') }}</h3>
<ul class="menu-list">
<li class="menu-item"><a href="{{ path_for('user.list') }}"{{ (route == 'user.list') ? ' class="active"' : '' }}>All users</a></li>
<li class="menu-item"><a href="{{ path_for('user.new') }}"{{ (route == 'user.new') ? ' class="active"' : '' }}>Create user</a></li>
<li class="menu-item"><a href="{{ path_for('user.list') }}"{{ (route == 'user.list') ? ' class="active"' : '' }}>{{ __('All users') }}</a></li>
<li class="menu-item"><a href="{{ path_for('user.new') }}"{{ (route == 'user.new') ? ' class="active"' : '' }}>{{ __('Create user') }}</a></li>
{% for user in users %}
<li class="menu-item"><a href="{{ path_for('user.show', {'username' : user }) }}"{{ (username == user) ? ' class="active"' : '' }}>{{ user }}</a></li>
{% endfor %}

View File

@ -1,11 +1,11 @@
<nav id="sidebar-menu" class="sidebar-menu--content">
<div id="data-navi" data-navi='{{ navigation|json_encode() }}' data-homepage='{{ homepage|json_encode() }}' data-editormode="{{settings.editor}}"></div>
<div id="mobile-menu" class="menu-action">Menu <span class="button-arrow"></span></div>
<div id="mobile-menu" class="menu-action">{{ __('Menu') }} <span class="button-arrow"></span></div>
<div id="navi" class="content-navi" v-model="freeze" v-cloak>
<div class="navi-list">
<div class="navi-item folder">
<div class="status" :class="homepage.status"></div>
<a href="{{ base_url }}/tm/content/{{ settings.editor }}" :class="homepage.active"><span><span class="iconwrapper"><svg class="icon icon-home"><use xlink:href="#icon-home"></use></svg></span><span class="level-1">Homepage</span></a>
<a href="{{ base_url }}/tm/content/{{ settings.editor }}" :class="homepage.active"><span><span class="iconwrapper"><svg class="icon icon-home"><use xlink:href="#icon-home"></use></svg></span><span class="level-1">{{ __('Homepage') }}</span></a>
</div>
</div>
<draggable class="navi-list" tag="ul"
@ -40,12 +40,12 @@
<svg class="icon icon-plus"><use xlink:href="#icon-plus"></use></svg>
</span>
<span class="addNaviItem">
<a class="addNaviLink" href="#" @click.prevent="toggleForm">add item</a>
<a class="addNaviLink" href="#" @click.prevent="toggleForm">{{ __('add item') }}</a>
</span>
<transition name="fade">
<div v-if="showForm" class="addNaviForm">
<input v-model="newItem">
<button class="b-left" @click="addFile('file')">add file</button><button class="b-right" @click="addFile('folder')">add folder</button>
<button class="b-left" @click="addFile('file')">{{ __('add file') }}</button><button class="b-right" @click="addFile('folder')">{{ __('add folder') }}</button>
</div>
</transition>
</li>
@ -90,12 +90,12 @@
<svg class="icon icon-plus"><use xlink:href="#icon-plus"></use></svg>
</span>
<span :class="getLevel(level + '.0')" class="addNaviItem">
<a class="addNaviLink" href="#" @click.prevent="toggleForm">add item</a>
<a class="addNaviLink" href="#" @click.prevent="toggleForm">{% endverbatim %}{{ __('add item') }}{% verbatim %}</a>
</span>
<transition name="fade">
<div v-if="showForm" class="addNaviForm">
<input v-model="newItem">
<button class="b-left" @click="addFile('file')">add file</button><button class="b-right" @click="addFile('folder')">add folder</button>
<button class="b-left" @click="addFile('file')">{% endverbatim %}{{ __('add file') }}{% verbatim %}</button><button class="b-right" @click="addFile('folder')">{% endverbatim %}{{ __('add folder') }}{% verbatim %}</button>
</div>
</transition>
</li>

View File

@ -3,13 +3,13 @@
<a href="{{ base_url }}/tm/content/{{ settings.editor }}">Typemill</a>
</div>
<ul class="navi-items">
<li><a href="{{ base_url }}/tm/content/{{ settings.editor }}"{{ navigation ? ' class="active"' : '' }}><svg class="icon baseline icon-file-text-o"><use xlink:href="#icon-file-text-o"></use></svg><span class="nav-label"> Content</span></a></li><li>
<li><a href="{{ base_url }}/tm/content/{{ settings.editor }}"{{ navigation ? ' class="active"' : '' }}><svg class="icon baseline icon-file-text-o"><use xlink:href="#icon-file-text-o"></use></svg><span class="nav-label"> {{ __('Content') }}</span></a></li><li>
{% if is_role('administrator') %}
<a href="{{ path_for('settings.show') }}"{{ users ? ' class="active"' : '' }}><svg class="icon baseline icon-cog"><use xlink:href="#icon-cog"></use></svg><span class="nav-label"> Settings</span></a></li><li>
<a href="{{ path_for('settings.show') }}"{{ users ? ' class="active"' : '' }}><svg class="icon baseline icon-cog"><use xlink:href="#icon-cog"></use></svg><span class="nav-label"> {{ __('Settings') }}</span></a></li><li>
{% else %}
<a href="{{ path_for('user.show', {'username' : get_username() }) }}"{{ users ? ' class="active"' : '' }}><svg class="icon icon-cog baseline"><use xlink:href="#icon-cog, gear"></use></svg><span class="nav-label"> Account</span></a></li><li>
<a href="{{ path_for('user.show', {'username' : get_username() }) }}"{{ users ? ' class="active"' : '' }}><svg class="icon icon-cog baseline"><use xlink:href="#icon-cog, gear"></use></svg><span class="nav-label"> {{ __('Account') }}</span></a></li><li>
{% endif %}
<a href="{{ base_url }}"><svg class="icon baseline icon-external-link"><use xlink:href="#icon-external-link"></use></svg><span class="nav-label"> View Site</span></a></li><li>
<a href="{{ path_for('auth.logout') }}"><svg class="icon baseline icon-power-off"><use xlink:href="#icon-power-off"></use></svg><span class="nav-label"> Logout</span></a></li>
<a href="{{ base_url }}"><svg class="icon baseline icon-external-link"><use xlink:href="#icon-external-link"></use></svg><span class="nav-label"> {{ __('View Site') }}</span></a></li><li>
<a href="{{ path_for('auth.logout') }}"><svg class="icon baseline icon-power-off"><use xlink:href="#icon-power-off"></use></svg><span class="nav-label"> {{ __('Logout') }}</span></a></li>
</ul>
</nav>

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layout.twig' %}
{% block title %}Setup{% endblock %}
{% block title %}{{ __('Setup') }}{% endblock %}
{% set startpage = old.settings.startpage ? old.settings.startpage : settings.startpage %}
{% block content %}
@ -11,8 +11,8 @@
<section id="plugins" class="plugins">
<header class="headline">
<h1>Plugins</h1>
<a class="button" target="_blank" href="https://plugins.typemill.net">Plugin Store</a>
<h1>{{ __('Plugins') }}</h1>
<a class="button" target="_blank" href="https://plugins.typemill.net">{{ __('Plugin Store') }}</a>
</header>
{% for pluginName,plugin in plugins %}
@ -22,22 +22,22 @@
<header>
<legend>{{ pluginName }}</legend>
<div class="cardActive">
<label class="control-group">Active
<label class="control-group">{{ __('Active') }}
<input type="checkbox" class="fc-active" name="{{pluginName}}[active]"{% if settings.plugins[pluginName].active %} checked {% endif %}>
<span class="checkmark"></span>
</label>
</div>
</header>
<div id="{{ pluginName }}" class="fc-plugin-version update-banner">{{ plugin.version ? plugin.version : 'Unknown' }}</div>
<div id="{{ pluginName }}" class="fc-plugin-version update-banner">{{ plugin.version ? plugin.version : __('Unknown') }}</div>
<div class="cardDescPlugin">
<p>{{ plugin.description ? plugin.description : 'No description' }}</p>
<p>{{ plugin.description ? plugin.description : __('No description') }}</p>
<ul class="cardInfo">
<li>{{ plugin.version ? plugin.version : 'Unknown' }}</li><li>
{{ plugin.licence ? plugin.licence : 'Unkown' }}</li><li>
by {{ plugin.author ? plugin.author : 'Unknown' }}</li>{% if plugin.homepage %}<li>
<a href="{{ plugin.homepage}}" target="blank">Web</a></li>{% endif %}
<li>{{ plugin.version ? plugin.version : __('Unknown') }}</li><li>
{{ plugin.licence ? plugin.licence : __('Unkown') }}</li><li>
by {{ plugin.author ? plugin.author : __('Unknown') }}</li>{% if plugin.homepage %}<li>
<a href="{{ plugin.homepage}}" target="blank">{{ __('Web') }}</a></li>{% endif %}
</ul>
</div>
<div class="cardInner cardFields{{ errors[pluginName] ? ' open' : '' }}">
@ -62,7 +62,7 @@
{% endfor %}
</div>
<button type="button" class="plugin-button fc-settings{{ settings.plugins[pluginName].active ? ' active' : '' }}{{ plugin.forms.fields|length > 0 ? ' has-settings' : ' no-settings'}}">{{ plugin.forms.fields|length > 0 ? 'Settings <span class="button-arrow"></span>' : '&nbsp;'}}</button>
<button type="button" class="plugin-button fc-settings{{ settings.plugins[pluginName].active ? ' active' : '' }}{{ plugin.forms.fields|length > 0 ? ' has-settings' : ' no-settings'}}">{{ plugin.forms.fields|length > 0 ? __('Settings') ~ ' <span class="button-arrow"></span>' : '&nbsp;'}}</button>
</div>
</fieldset>
@ -71,7 +71,7 @@
</section>
<input type="submit" value="Save All Settings" />
<input type="submit" value="{{ __('Save All Settings') }}" />
{{ csrf_field() | raw }}

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layout.twig' %}
{% block title %}Setup{% endblock %}
{% block title %}{{ __('Setup') }}{% endblock %}
{% set startpage = old.settings.startpage ? old.settings.startpage : settings.startpage %}
{% set linebreaks = old.settings.linebreaks ? old.settings.linebreaks : settings.linebreaks %}
{% set year = settings.year ? settings.year : "now"|date("Y") %}
@ -15,7 +15,7 @@
<section id="system" class="settings">
<header class="headline">
<h1>System <span class="version-number">v. {{settings.version}}</span></h1>
<h1>{{ __('System') }} <span class="version-number">v. {{settings.version}}</span></h1>
</header>
<div id="typemill" class="fc-system-version update-banner">{{ settings.version ? settings.version : 'Unknown' }}</div>
@ -23,19 +23,19 @@
<fieldset>
<div class="medium{{ errors.settings.title ? ' error' : '' }}">
<label for="settings[title]">Website Title *</label>
<label for="settings[title]">{{ __('Website Title') }} *</label>
<input type="text" name="settings[title]" id="title" pattern=".{2,20}" required title="Use 2 to 20 characters." value="{{ old.settings.title ? old.settings.title : settings.title }}" />
{% if errors.settings.title %}
<span class="error">{{ errors.settings.title | first }}</span>
{% endif %}
</div><div class="medium{{ errors.settings.author ? ' error' : '' }}">
<label for="settings[author]">Author</label>
<input type="text" name="settings[author]" id="author" pattern="[^()/><\]\{\}\?\$@#!*%§=[\\\x22;:|]{2,40}" value="{{ old.settings.author ? old.settings.author : settings.author }}" title="Use 2 to 40 characters. Only the following special characters are allowed: a,b a.b a-b a_b a&b a+b" />
<label for="settings[author]">{{ __('Author') }}</label>
<input type="text" name="settings[author]" id="author" pattern="[^()/><\]\{\}\?\$@#!*%§=[\\\x22;:|]{2,40}" value="{{ old.settings.author ? old.settings.author : settings.author }}" title="{{ __('Use 2 to 40 characters') }} {{ __('Only the following special characters are allowed') }} a,b a.b a-b a_b a&b a+b" />
{% if errors.settings.author %}
<span class="error">{{ errors.settings.author | first }}</span>
{% endif %}
</div><div class="medium{{ errors.settings.copyright ? ' error' : '' }}">
<label for="settings[copyright]">Copyright/Licence</label>
<label for="settings[copyright]">{{ __('Copyright') }}/{{ __('Licence') }}</label>
<select name="settings[copyright]" id="copyright">
{% for copy in copyright %}
<option value="{{ copy }}"{% if copy == old.settings.copyright or copy == mycopy %} selected{% endif %}>{{ copy }}</option>
@ -45,13 +45,13 @@
<span class="error">{{ errors.settings.copyright | first }}</span>
{% endif %}
</div><div class="medium{{ errors.settings.year ? ' error' : '' }}">
<label for="settings[year]">Year *</label>
<input type="text" name="settings[year]" id="year" value="{{ old.settings.year ? old.settings.year : year }}" pattern="[0-9]{4}" required title="Use a valid year, e.g. 2017" />
<label for="settings[year]">{{ __('Year') }} *</label>
<input type="text" name="settings[year]" id="year" value="{{ old.settings.year ? old.settings.year : year }}" pattern="[0-9]{4}" required title="{{ __('Use a valid year') }}, {{ __('e.g.') }} 2017" />
{% if errors.settings.year %}
<span class="error">{{ errors.settings.year | first }}</span>
{% endif %}
</div><div class="medium{{ errors.settings.language ? ' error' : '' }}">
<label for="settings[language]">Language-Attribute <small>(HTML)</small></label>
<label for="settings[language]">{{ __('Language') }}</label>
<select name="settings[language]" id="language">
{% for key,lang in languages %}
<option value="{{ key }}"{% if (key == old.settings.language or key == mylang) %} selected{% endif %}>{{ lang }}</option>
@ -61,20 +61,20 @@
<span class="error">{{ errors.settings.language | first }}</span>
{% endif %}
</div><div class="medium">
<label for="settings[sitemap]">Google Sitemap <small>(Readonly)</small></label>
<label for="settings[sitemap]">Google Sitemap <small>({{ __('Readonly') }})</small></label>
<input type="text" name="settings[sitemap]" id="sitemap" readonly value="{{ base_url }}/cache/sitemap.xml" />
</div>
<hr>
<header class="headline">
<h2>Writing</h2>
<h2>{{ __('Writing') }}</h2>
</header>
<div class="medium{{ errors.settings.editor ? ' error' : '' }}">
<label for="settings[editor]">Standard Editor Mode *</label>
<label class="control-group">Visual Markdown Editor
<label for="settings[editor]">{{ __('Standard Editor Mode') }} *</label>
<label class="control-group">{{ __('Visual Markdown Editor') }}
<input name="settings[editor]" value="visual" type="radio" {% if (old.settings.editor == "visual") or (settings.editor == "visual") %} checked {% endif %}>
<span class="radiomark"></span>
</label>
<label class="control-group">Raw Markdown Editor
<label class="control-group">{{ __('Raw Markdown Editor') }}
<input name="settings[editor]" value="raw" type="radio" {% if (old.settings.editor == "raw") or (settings.editor == "raw") %} checked {% endif %}>
<span class="radiomark"></span>
</label>
@ -83,11 +83,11 @@
{% endif %}
</div>
<div class="medium{{ errors.settings.editor ? ' error' : '' }}">
<label>Visual Editor: The Format Buttons</label>
<label>{{ __('Visual Editor') }}: {{ __('The Format Buttons') }}</label>
{% for format in formats %}
<label class="control-group">{{ format }}
<input name="settings[formats][]" value="{{ format }}" type="checkbox" {% if format in settings.formats %} checked {% endif %}>
<label class="control-group">{{ __(format) }}
<input name="settings[formats][]" value="{{ __('format') }}" type="checkbox" {% if format in settings.formats %} checked {% endif %}>
<span class="checkmark"></span>
</label>
@ -95,7 +95,7 @@
</div>
</fieldset>
</section>
<input type="submit" value="Save All Settings" />
<input type="submit" value="{{ __('Save All Settings') }}" />
{{ csrf_field() | raw }}

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layout.twig' %}
{% block title %}Setup{% endblock %}
{% block title %}{{ __('Setup') }}{% endblock %}
{% set startpage = old.settings.startpage ? old.settings.startpage : settings.startpage %}
{% block content %}
@ -9,8 +9,8 @@
<section id="themes" class="themes">
<header class="headline">
<h1>Themes</h1>
<a class="button" target="_blank" href="https://themes.typemill.net">Theme Store</a>
<h1>{{ __('Themes') }}</h1>
<a class="button" target="_blank" href="https://themes.typemill.net">{{ __('Theme Store') }}</a>
</header>
{% for themeName, theme in themes %}
@ -24,20 +24,20 @@
{% if theme.img %}
<img src="{{ base_url() }}/themes/{{themeName}}/{{themeName}}.jpg" />
{% else %}
<div class="no-preview">No Preview</div>
<div class="no-preview">{{ __('No Preview') }}</div>
{% endif %}
<div class="cardContent">
<div id="{{ themeName }}" class="fc-theme-version update-banner">{{ theme.version ? theme.version : 'Unknown' }}</div>
<div id="{{ themeName }}" class="fc-theme-version update-banner">{{ theme.version ? theme.version : __('Unknown') }}</div>
<div class="cardDescription">
<h2>{{ themeName }}</h2>
<p>{{ theme.description }}</p>
<ul class="cardInfo">
<li>{{ theme.version ? theme.version : 'Unknown' }}</li><li>
{{ theme.licence ? theme.licence : 'Unkown' }}</li><li>
by {{ theme.author ? theme.author : 'Unknown' }}</li>{% if theme.homepage %}<li>
<a href="{{ theme.homepage}}" target="blank">Web</a></li>{% endif %}
<li>{{ theme.version ? theme.version : __('Unknown') }}</li><li>
{{ theme.licence ? theme.licence : __('Unkown') }}</li><li>
by {{ theme.author ? theme.author : __('Unknown') }}</li>{% if theme.homepage %}<li>
<a href="{{ theme.homepage}}" target="blank">{{ __('Web') }}</a></li>{% endif %}
</ul>
</div>
</div>
@ -68,10 +68,10 @@
<input type="hidden" name="theme" value="{{ themeName }}">
<div class="medium">
<button type="button" id="{{themeName}}-toggle" class="theme-button fc-settings{{ (settings.theme == themeName) ? ' active' : '' }}{{ theme.forms.fields|length > 0 ? ' has-settings' : ' no-settings'}}">{{ theme.forms.fields|length > 0 ? 'Settings <span class="button-arrow"></span>' : 'No Settings'}}</button>
<button type="button" id="{{themeName}}-toggle" class="theme-button fc-settings{{ (settings.theme == themeName) ? ' active' : '' }}{{ theme.forms.fields|length > 0 ? ' has-settings' : ' no-settings'}}">{{ theme.forms.fields|length > 0 ? __('Settings') ~ ' <span class="button-arrow"></span>' : __('No Settings')}}</button>
</div>
<div class="medium">
<input type="submit" id="{{themeName}}-submit" value="Save Theme" />
<input type="submit" id="{{themeName}}-submit" value="{{ __('Save Theme') }}" />
</div>
</div>
</div>

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layout.twig' %}
{% block title %}User{% endblock %}
{% block title %}{{ __('User') }}{% endblock %}
{% block content %}
@ -10,13 +10,13 @@
<section id="user" class="settings">
<header class="headline">
<h1>Edit User</h1>
<h1>{{ __('Edit User') }}</h1>
</header>
<fieldset class="auth">
<div class="large{{ errors.username ? ' errors' : '' }}">
<label for="username">Username <small>(not editable)</small></label>
<label for="username">{{ __('Username') }} <small>({{ __('not editable') }})</small></label>
<input type="text" name="showusername" value="{{ old.username ? old.username : userdata.username }}" required disabled>
<input type="hidden" name="username" value="{{ userdata.username }}">
{% if errors.username %}
@ -25,7 +25,7 @@
</div>
<div class="large{{ errors.firstname ? ' errors' : '' }}">
<label for="firstname">First Name</label>
<label for="firstname">{{ __('First Name') }}</label>
<input type="text" name="firstname" value="{{ old.firstname ? old.firstname : userdata.firstname }}">
{% if errors.firstname %}
<span class="error">{{ errors.firstname | first }}</span>
@ -33,7 +33,7 @@
</div>
<div class="large{{ errors.lastname ? ' errors' : '' }}">
<label for="lastname">Last Name</label>
<label for="lastname">{{ __('Last Name') }}</label>
<input type="text" name="lastname" value="{{ old.lastname ? old.lastname : userdata.lastname }}">
{% if errors.lastname %}
<span class="error">{{ errors.lastname | first }}</span>
@ -41,7 +41,7 @@
</div>
<div class="large{{ errors.email ? ' errors' : '' }}">
<label for="email">E-Mail <abbr title="required">*</abbr></label>
<label for="email">{{ __('E-Mail') }} <abbr title="{{ __('required') }}">*</abbr></label>
<input type="text" name="email" value="{{ old.email ? old.email : userdata.email }}" required>
{% if errors.email %}
<span class="error">{{ errors.email | first }}</span>
@ -50,7 +50,7 @@
{% if is_role('administrator') %}
<div class="large{{ errors.userrole ? ' errors' : '' }}">
<label for="userrole">Role <abbr title="required">*</abbr></label>
<label for="userrole">{{ __('Role') }} <abbr title="{{ __('required') }}">*</abbr></label>
<select name="userrole" required>
{% for role in userrole %}
<option value="{{ role }}"{% if (role == old.userrole or role == userdata.userrole) %} selected{% endif %}>{{ role }}</option>
@ -63,16 +63,16 @@
{% endif %}
<div class="large{{ errors.password ? ' errors' : '' }}">
<label for="password">Actual Password</label>
<input type="password" name="password" autocomplete="off">
<label for="password">{{ __('Actual Password') }}</label>
<input type="password" name="password">
{% if errors.password %}
<span class="error">{{ errors.password | first }}</span>
{% endif %}
</div>
<div class="large{{ errors.newpassword ? ' errors' : '' }}">
<label for="newpassword">New Password</label>
<input type="password" name="newpassword" autocomplete="off">
<label for="newpassword">{{ __('New Password') }}</label>
<input type="password" name="newpassword">
{% if errors.newpassword %}
<span class="error">{{ errors.newpassword | first }}</span>
{% endif %}
@ -81,11 +81,11 @@
</fieldset>
</section>
<input type="submit" value="Update User" />
<input type="submit" value="{{ __('Update User') }}" />
{{ csrf_field() | raw }}
<div class="actionLink">
<a href="#" id="openModal" class="openModal">Delete User</a>
<a href="#" id="openModal" class="openModal">{{ __('Delete User') }}</a>
</div>
</form>
</div>
@ -94,8 +94,8 @@
<div class="modalInner">
<div id="closeModal" class="closeModal">X</div>
<form method="POST" action="{{ path_for('user.delete') }}">
<h2>Delete {{ userdata.username }}</h2>
<p>Do you really want to delete the user {{userdata.username}}? Please confirm.</p>
<h2>{{ __('Delete') }} {{ userdata.username }}</h2>
<p>{{ __('Do you really want to delete the user') }} {{userdata.username}}? {{ __('Please confirm') }}.</p>
<input type="hidden" name="username" value="{{userdata.username}}">
<input type="submit" class="danger" value="Delete user">
{{ csrf_field() | raw }}
@ -104,4 +104,4 @@
</div>
{% endblock %}
{% endblock %}

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layout.twig' %}
{% block title %}User{% endblock %}
{% block title %}{{ __('User') }}{% endblock %}
{% block content %}
@ -8,7 +8,7 @@
<section id="users" class="settings">
<header class="headline">
<h1>All Users</h1>
<h1>{{ __('All Users') }}</h1>
</header>
<ul class="userlist">
@ -19,7 +19,7 @@
<li class="col username">{{ user.username }}
</li><li class="col userrole">{{ user.userrole }}
</li><li class="col email">{{ user.email }}
</li><li class="col edit"><a href="{{ path_for('user.show', {'username' : user.username }) }}">edit</a></li>
</li><li class="col edit"><a href="{{ path_for('user.show', {'username' : user.username }) }}">{{ __('edit') }}</a></li>
</ul>
</li>
@ -27,7 +27,7 @@
</ul>
<div class="medium">
<a class="button" href="{{ path_for('user.new') }}">Create New User</a>
<a class="button" href="{{ path_for('user.new') }}">{{ __('Create New User') }}</a>
</div>
</section>

View File

@ -1,5 +1,5 @@
{% extends 'layouts/layout.twig' %}
{% block title %}User{% endblock %}
{% block title %}{{ __('User') }}{% endblock %}
{% block content %}
@ -10,13 +10,13 @@
<section id="new-user" class="settings">
<header class="headline">
<h1>Create New User</h1>
<h1>{{ __('Create New User') }}</h1>
</header>
<fieldset class="auth">
<div class="large{{ errors.username ? ' errors' : '' }}">
<label for="username">Username <abbr title="required">*</abbr></label>
<label for="username">{{ __('Username') }} <abbr title="{{ __('required') }}">*</abbr></label>
<input type="text" name="username" value="{{ old.username ? old.username : '' }}" required>
{% if errors.username %}
<span class="error">{{ errors.username | first }}</span>
@ -24,7 +24,7 @@
</div>
<div class="large{{ errors.firstname ? ' errors' : '' }}">
<label for="firstname">First Name</label>
<label for="firstname">{{ __('First Name') }}</label>
<input type="text" name="firstname" value="{{ old.firstname ? old.firstname : userdata.firstname }}">
{% if errors.firstname %}
<span class="error">{{ errors.firstname | first }}</span>
@ -32,7 +32,7 @@
</div>
<div class="large{{ errors.lastname ? ' errors' : '' }}">
<label for="lastname">Last Name</label>
<label for="lastname">{{ __('Last Name') }}</label>
<input type="text" name="lastname" value="{{ old.lastname ? old.lastname : userdata.lastname }}">
{% if errors.lastname %}
<span class="error">{{ errors.lastname | first }}</span>
@ -40,7 +40,7 @@
</div>
<div class="large{{ errors.email ? ' errors' : '' }}">
<label for="email">E-Mail <abbr title="required">*</abbr></label>
<label for="email">{{ __('E-Mail') }} <abbr title="{{ __('required') }}">*</abbr></label>
<input type="text" name="email" value="{{ old.email ? old.email : '' }}" required>
{% if errors.email %}
<span class="error">{{ errors.email | first }}</span>
@ -48,7 +48,7 @@
</div>
<div class="large{{ errors.userrole ? ' errors' : '' }}">
<label for="userrole">Role <abbr title="required">*</abbr></label>
<label for="userrole">{{ __('Role') }} <abbr title="{{ __('required') }}">*</abbr></label>
<select name="userrole" required>
{% for role in userrole %}
<option value="{{ role }}"{% if (role == old.userrole) %} selected{% endif %}>{{ role }}</option>
@ -60,8 +60,8 @@
</div>
<div class="large{{ errors.password ? ' errors' : '' }}">
<label for="password">Password <abbr title="required">*</abbr></label>
<input type="password" name="password" autocomplete="off" required>
<label for="password">{{ __('Password') }} <abbr title="{{ __('required') }}">*</abbr></label>
<input type="password" name="password" required>
{% if errors.password %}
<span class="error">{{ errors.password | first }}</span>
{% endif %}
@ -70,10 +70,10 @@
</fieldset>
</section>
<input type="submit" value="Create User" />
<input type="submit" value="{{ __('Create User') }}" />
{{ csrf_field() | raw }}
</form>
</div>
{% endblock %}
{% endblock %}

View File

@ -202,7 +202,10 @@ $container['view'] = function ($container)
$view->addExtension(new Typemill\Extensions\TwigUserExtension());
$view->addExtension(new Typemill\Extensions\TwigMarkdownExtension());
$view->addExtension(new Typemill\Extensions\TwigMetaExtension());
// i18n
$view->addExtension(new Typemill\Extensions\TwigLanguageExtension( $container->get('settings')['labels'] ));
/* use {{ base_url() }} in twig templates */
$view['base_url'] = $container['request']->getUri()->getBaseUrl();
$view['current_url'] = $container['request']->getUri()->getPath();

View File

@ -9,10 +9,10 @@
{{ content }}
<div class="actionLink">
<a href="{{ navigation[0].urlRel }}">{{ settings.themes.typemill.start ? settings.themes.typemill.start : 'Start'}}</a>
<a href="{{ navigation[0].urlRel }}">{{ settings.themes.typemill.start ? __(settings.themes.typemill.start) : __('Start')}}</a>
{% if settings.setup %}
<a href="{{ base_url }}/setup">Setup</a>
<a href="{{ base_url }}/setup">{{ __('Setup') }}</a>
{% endif %}
</div>
</div>