Browse Source

Version 1.3.5 Consolidation

trendschau 5 years ago
parent
commit
c2c3c8166d

+ 126 - 0
cypress/test01-system-setup.spec.js

@@ -0,0 +1,126 @@
+describe('Typemill Setup', function() 
+{
+    it('validates form input', function ()
+    {
+      // visit setup form
+      cy.visit('/setup')
+      cy.url().should('include','/setup')
+
+      // add data and check attributes
+      cy.get('input[name="username"]')
+        .type('?1')
+        .should('have.value', '?1')
+        .and('have.attr', 'required')
+
+      cy.get('input[name="email"]')
+        .type('trendschau.net')
+        .should('have.value', 'trendschau.net')
+        .and('have.attr', 'required')
+     
+      cy.get('input[name="password"]')
+        .type('pass')
+        .should('have.value', 'pass')
+        .and('have.attr', 'required')
+        
+      // submit and get validation errors
+      cy.get('form').submit()
+      cy.get('#flash-message').should('contain', 'Please check your input and try again')
+      cy.get('.error').should('contain', 'invalid characters')
+      cy.get('.error').should('contain', 'e-mail is invalid')
+      cy.get('.error').should('contain', 'Length between 5 - 20')
+    })
+
+    it('fails without CSRF-token', function ()
+    {
+      cy.request({
+        method: 'POST',
+        url: '/setup', // baseUrl is prepended to url
+        form: true, // indicates the body should be form urlencoded and sets Content-Type: application/x-www-form-urlencoded headers
+        failOnStatusCode: false,
+        body: {
+          username: 'trendschau', 
+          email: 'trendschau@gmail.com', 
+          password: 'password'
+        }
+      })
+        .its('body')
+        .should('include', 'Failed CSRF check')
+    })
+
+    it('submits valid form data and visit welcome and settings page', function () 
+    {
+      cy.visit('/setup')
+
+      // enter correct data
+      cy.get('input[name="username"]').clear().type('trendschau')
+      cy.get('input[name="email"]').clear().type('trendschau@gmail.com')
+      cy.get('input[name="password"]').clear().type('password')
+  
+      // submits valid form
+      cy.get('form').submit()
+      cy.url().should('include','/welcome')
+      cy.getCookie('typemill-session').should('exist')
+      Cypress.Cookies.preserveOnce('typemill-session')
+      
+      // clicks link on welcome page to settings page
+      cy.get('.button').should('contain', 'Configure your website')
+      cy.get('.button').click()
+      cy.url().should('include', '/tm/settings')        
+    })
+
+    it('creates default settings data', function()
+    {
+      cy.get('input[name="settings[title]"]')
+        .should('have.value', 'TYPEMILL')
+        .and('have.attr','required')
+      cy.get('input[name="settings[author]"]')
+        .should('have.value', 'Unknown')
+      cy.get('select[name="settings[copyright]"]')
+      cy.get('input[name="settings[year]"]')
+        .should('have.attr', 'required')
+      cy.get('select[name="settings[language]"]')
+      cy.get('input[name="settings[sitemap]"]')
+        .should('have.value', 'http://localhost/typemillTest/cache/sitemap.xml')
+        .and('have.attr','readonly')
+        Cypress.Cookies.preserveOnce('typemill-session')
+      })
+
+    it('creates default user data', function()
+    {
+      cy.visit('/tm/user/trendschau')
+      cy.url().should('include', '/tm/user/trendschau')
+    
+      cy.get('input[name="showusername"]')
+        .should('have.value', 'trendschau')
+        .and('have.attr','disabled')
+      cy.get('input[name="username"]')
+        .should('have.value', 'trendschau')
+      cy.get('input[name="email"]')
+        .should('have.value', 'trendschau@gmail.com')
+        .and('have.attr','required')
+      cy.get('select[name="userrole"]')
+        .should('have.attr','required')
+      cy.get('input[name="password"]')
+        .should('have.value', '')
+      cy.get('input[name="newpassword"]')
+        .should('have.value', '')
+    })
+
+    it('logouts out', function()
+    {
+      // visits logout link
+      cy.visit('/tm/logout')
+      cy.url().should('include', '/tm/login')
+
+      // tries to open setup form again and gets redirected to login
+      cy.visit('/setup')
+      cy.url().should('include','/login')
+    })
+
+    it('redirects when tries to setup again', function()
+    {
+      // tries to open setup form again and gets redirected to login
+      cy.visit('/setup')
+      cy.url().should('include','/login')
+  })
+})

+ 148 - 0
cypress/test02-initial-frontend.spec.js

@@ -0,0 +1,148 @@
+describe('Typemill Initial Frontend', function() 
+{
+    it('has startpage with buttons and links', function ()
+    {
+      /* visit homepage */
+      cy.visit('/')
+
+      /* has start and setup button */
+      cy.get('.actionLink').find('a').should(($a) => {
+        expect($a).to.have.length(1)
+        expect($a[0].href).to.match(/welcome/)
+      })
+
+      /* has start and setup button */
+      cy.get('.toc-nav').find('a').should(($a) => {
+        expect($a).to.have.length(5)
+        expect($a[0].href).to.match(/welcome/)
+        expect($a[1].href).to.match(/welcome\/setup/)
+        expect($a[2].href).to.match(/welcome\/write-content/)
+        expect($a[3].href).to.match(/welcome\/get-help/)
+        expect($a[4].href).to.match(/welcome\/markdown-test/)
+      })      
+    })
+
+    it('has error page', function ()
+    {
+      cy.request({
+        url: '/error',
+        failOnStatusCode: false,
+      })
+      .then((resp) => {
+          /* should return 404 not found */
+          expect(resp.status).to.eq(404)
+      })
+
+      cy.visit('/error', { failOnStatusCode: false })
+      cy.url().should('include','/error')
+
+      cy.get('h1').contains('Not Found')
+    })
+
+    it('has no access to cache files', function ()
+    {
+      cy.request({
+        url: '/cache/structure.txt',
+        failOnStatusCode: false,
+      })
+      .then((resp) => {
+          // redirect status code is 302
+          expect(resp.status).to.eq(403)
+      })
+    })
+
+    it('has sitemap xml', function ()
+    {
+      cy.request({
+        url: '/cache/sitemap.xml',
+      })
+      .then((resp) => {
+          /* should return xml-format */
+          expect(resp.headers).to.have.property('content-type','application/xml')
+      })
+    })
+
+    it('has no access to dashboard', function ()
+    {
+      cy.visit('/tm/settings')
+      cy.url().should('include','/tm/login')
+    })
+
+    it('has proper markdown test page', function ()
+    {
+      cy.visit('/welcome/markdown-test')
+      cy.url().should('include','/welcome/markdown-test')
+
+      /* has navigation element */
+      cy.get('nav').should('exist')
+
+      /* check if toc exists */
+      cy.get('.TOC').within(($toc) =>{
+        /* check if a certain link in toc exists */
+        cy.get('a').eq(2).should('have.attr', 'href', '/typemillTest/welcome/markdown-test#headlines')
+      })
+      
+      /* check if corresponding anchor exists */
+      cy.get('#headlines').should('exist')
+
+      /* soft linebreaks */
+      cy.get('br').should('exist')
+
+      /* emphasis */
+      cy.get('em').should('exist')
+
+      /* strong */
+      cy.get('strong').should('exist')
+
+      /* ordered list */
+      cy.get('ol').should('exist')
+
+      /* linebreak  */
+      cy.get('hr').should('exist') 
+      
+      /* links exists? hard to test, any idea? We need to wrap it in a div... */
+
+      /* images */
+      cy.get('img').eq(0).should('have.attr', 'alt', 'alt-text')
+      cy.get('img').eq(0).should('have.attr', 'src', 'media/markdown.png')
+      cy.get('img').eq(2).should('have.id', 'myid')
+        .and('have.class', 'otherclass')
+        .and('have.attr', 'alt', 'alt-text')
+        .and('have.attr', 'title', 'my title')
+        .and('have.attr', 'width', '150px')
+
+      /* blockquote */
+      cy.get('blockquote').should('exist') 
+
+      /* footnote */
+      cy.get('sup').eq(0).should('have.id', 'fnref1:1')
+      cy.get('sup').eq(0).within(($sup) =>{
+        cy.get('a').eq(0).should('have.attr', 'href', '/typemillTest/welcome/markdown-test#fn%3A1')
+          .and('have.class', 'footnote-ref')
+      })
+
+      /* abbreviation */
+      cy.get('abbr').should('exist') 
+
+      /* definition list */
+      cy.get('dl').should('exist') 
+
+      /* table */
+      cy.get('table').should('exist') 
+
+      /* code */
+      cy.get('pre').should('exist') 
+      cy.get('code').should('exist') 
+
+      /* math */
+      cy.get('.math').should('exist')
+
+      /* footnote end */
+      cy.get('.footnotes').within(($footnotes) => {
+        cy.get('li').eq(0).should('have.id', 'fn:1')
+        cy.get('a').eq(0).should('have.class', 'footnote-backref')
+          .and('have.attr', 'href', '/typemillTest/welcome/markdown-test#fnref1%3A1')
+          .and('have.attr', 'rev', 'footnote')
+      })
+    })
+})

+ 109 - 0
cypress/test03-system-settings.spec.js

@@ -0,0 +1,109 @@
+describe('Typemill System Settings', function() 
+{
+  before(function () 
+  {
+    cy.visit('/tm/login')
+    cy.url().should('include','/tm/login')
+
+    cy.get('input[name="username"]').type('trendschau')
+    cy.get('input[name="password"]').type('password')
+
+    cy.get('form').submit()
+    cy.url().should('include','/tm/content')
+    cy.getCookie('typemill-session').should('exist')
+
+    cy.visit('/tm/settings')
+    cy.url().should('include','/tm/settings')
+  })
+
+  beforeEach(function () 
+  {
+    Cypress.Cookies.preserveOnce('typemill-session')
+  })
+
+  it('validates the form', function()
+  {
+    // fill out valid data
+    cy.get('input[name="settings[title]"]')
+      .clear()
+      .type('Cypress<?')
+      .should('have.value', 'Cypress<?')
+      .and('have.attr', 'required')
+
+      // fill out valid data
+      cy.get('input[name="settings[author]"]')
+        .clear()
+        .type('trendschau')
+        .should('have.value', 'trendschau')
+
+      // fill out copyright data
+      cy.get('select[name="settings[copyright]"]')
+        .select('CC-BY')
+        .should('have.value', 'CC-BY')
+
+      // fill out valid data
+      cy.get('input[name="settings[year]"]')
+        .clear()
+        .type('2017') 
+        .should('have.value', '2017')
+        .and('have.attr', 'required')
+
+      // fill out copyright data
+      cy.get('select[name="settings[language]"]')
+        .select('German')
+        .should('have.value', 'de')
+
+      // submit form
+      cy.get('form').submit()
+        cy.get('#flash-message').should('contain', 'Please correct the errors')
+        cy.get('.error').should('contain', 'Title contains invalid characters')
+    })
+
+    it('changes default values', function()
+    {
+      // fill out valid data
+      cy.get('input[name="settings[title]"]')
+        .clear()
+        .type('Cypress')
+        .should('have.value', 'Cypress')
+        .and('have.attr', 'required')
+
+      // fill out valid data
+      cy.get('input[name="settings[author]"]')
+        .clear()
+        .type('robot')
+        .should('have.value', 'robot')
+
+      cy.get('select[name="settings[copyright]"]')
+        .select('CC-BY-ND')
+        .should('have.value', 'CC-BY-ND')
+
+      // fill out copyright data
+      cy.get('select[name="settings[language]"]')
+        .select('English')
+        .should('have.value', 'en')
+
+      cy.get('form').submit()
+        cy.get('#flash-message').should('contain', 'Settings are stored')
+
+      // fill out valid data
+      cy.get('input[name="settings[title]"]')
+        .should('have.value', 'Cypress')
+
+     // fill out valid data
+     cy.get('input[name="settings[author]"]')
+       .should('have.value', 'robot')
+
+     // fill out copyright data
+     cy.get('select[name="settings[copyright]"]')
+       .should('have.value', 'CC-BY-ND')
+
+     // fill out valid data
+     cy.get('input[name="settings[year]"]')
+       .should('have.value', '2017')
+
+     // fill out copyright data
+     cy.get('select[name="settings[language]"]')
+       .should('have.value', 'en') 
+    })
+})

+ 197 - 0
cypress/test04-theme-settings.spec.js

@@ -0,0 +1,197 @@
+describe('Typemill Theme Settings', function() 
+{
+  before(function () 
+  {
+    cy.visit('/tm/login')
+    cy.url().should('include','/tm/login')
+
+    cy.get('input[name="username"]').type('trendschau')
+    cy.get('input[name="password"]').type('password')
+
+    cy.get('form').submit()
+    cy.url().should('include','/tm/content')
+    cy.getCookie('typemill-session').should('exist')
+
+    cy.visit('/tm/themes')
+    cy.url().should('include','/tm/themes')
+  })
+
+  beforeEach(function ()
+  {
+    Cypress.Cookies.preserveOnce('typemill-session')
+  })
+
+  it('changes default values', function()
+  {
+
+    // open the form
+    cy.get('#typemill-toggle')
+      .should('contain', 'Settings')
+      .click()
+
+    // fill out valid data
+    cy.get('input[name="typemill[chapter]"]')
+      .should('have.value', 'Chapter')
+      .clear()
+      .type('Kapitel')
+      .should('have.value', 'Kapitel')
+
+    // fill out valid data
+    cy.get('input[name="typemill[start]"]')
+      .should('have.value', 'Start')
+      .clear()
+      .type('Run')
+      .should('have.value', 'Run')
+
+    // fill out valid data
+    cy.get('input[name="typemill[chapnum]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    // fill out valid data
+    cy.get('input[name="typemill[authorPosition][top]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    // fill out valid data
+    cy.get('input[name="typemill[authorIntro]"]')
+      .should('have.value', 'Author')
+      .clear()
+      .type('Writer')
+      .should('have.value', 'Writer')
+
+    // fill out valid data
+    cy.get('input[name="typemill[modifiedPosition][bottom]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    // fill out valid data
+    cy.get('input[name="typemill[modifiedText]"]')
+      .should('have.value', 'Last updated')
+      .clear()
+      .type('Final update')
+      .should('have.value', 'Final update')
+
+    cy.get('select[name="typemill[modifiedFormat]"]')
+      .should('have.value', 'd.m.Y')
+      .select('m/d/Y')
+      .should('have.value', 'm/d/Y')
+
+    cy.get('input[name="typemill[socialPosition][bottom]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    cy.get('input[name="typemill[socialButtons][facebook]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    cy.get('input[name="typemill[socialButtons][twitter]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    cy.get('input[name="typemill[socialButtons][xing]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    cy.get('input[name="typemill[gitPosition][top]"]')
+      .should('not.be.checked')
+      .and('not.be.visible')
+      .check({ force: true })
+      .should('be.checked')
+
+    cy.get('input[name="typemill[gitlink]"]')
+      .clear()
+      .type('https://github.com/typemill/docs')
+      .should('have.value', 'https://github.com/typemill/docs')
+
+
+    cy.get('#theme-typemill').submit()
+        cy.get('#flash-message').should('contain', 'Settings are stored')
+
+
+    // fill out valid data
+    cy.get('input[name="typemill[chapter]"]')
+      .should('have.value', 'Kapitel')
+
+    // fill out valid data
+    cy.get('input[name="typemill[start]"]')
+      .should('have.value', 'Run')
+
+    // fill out valid data
+    cy.get('input[name="typemill[chapnum]"]')
+      .should('be.checked')
+
+    // fill out valid data
+    cy.get('input[name="typemill[authorPosition][top]"]')
+      .should('be.checked')
+
+    // fill out valid data
+    cy.get('input[name="typemill[authorIntro]"]')
+      .should('have.value', 'Writer')
+
+    // fill out valid data
+    cy.get('input[name="typemill[modifiedPosition][bottom]"]')
+      .should('be.checked')
+
+    // fill out valid data
+    cy.get('input[name="typemill[modifiedText]"]')
+      .should('have.value', 'Final update')
+
+    cy.get('select[name="typemill[modifiedFormat]"]')
+      .should('have.value', 'm/d/Y')
+
+    cy.get('input[name="typemill[socialPosition][bottom]"]')
+      .should('be.checked')
+
+    cy.get('input[name="typemill[socialButtons][facebook]"]')
+      .should('be.checked')
+
+    cy.get('input[name="typemill[socialButtons][twitter]"]')
+      .should('be.checked')
+
+    cy.get('input[name="typemill[socialButtons][xing]"]')
+      .should('be.checked')
+
+    cy.get('input[name="typemill[gitPosition][top]"]')
+      .should('be.checked')
+
+    cy.get('input[name="typemill[gitlink]"]')
+      .should('have.value', 'https://github.com/typemill/docs')
+  })
+
+  it('validates input', function()
+  {
+
+    // open the form
+    cy.get('#typemill-toggle')
+      .should('contain', 'Settings')
+      .click()
+
+    // fill out valid data
+    cy.get('input[name="typemill[chapter]"]')
+      .should('have.value', 'Kapitel')
+      .clear()
+      .type('Kapitel<?')
+      .should('have.value', 'Kapitel<?')
+
+      // submit form
+    cy.get('#theme-typemill').submit()
+    
+    cy.get('#flash-message').should('contain', 'Please correct the errors')
+
+  })
+})

+ 87 - 0
cypress/test99-login.spec.js

@@ -0,0 +1,87 @@
+describe('Typemill Login', function() 
+{
+    it('redirects if visits dashboard without login', function () 
+    {
+        cy.visit('/tm/content')
+        cy.url().should('include', '/tm/login')
+    })
+
+    it('submits a valid form and logout', function () 
+    {
+        // visits login page and adds valid input
+        cy.visit('/tm/login')
+        cy.url().should('include','/tm/login')
+
+        cy.get('input[name="username"]')
+          .type('trendschau')
+          .should('have.value', 'trendschau')
+          .and('have.attr', 'required')
+
+        cy.get('input[name="password"]')
+          .type('password')
+          .should('have.value', 'password')
+          .and('have.attr', 'required')
+
+        // can login
+        cy.get('form').submit()
+        cy.url().should('include','/tm/content')
+        cy.getCookie('typemill-session').should('exist')
+
+        Cypress.Cookies.preserveOnce('typemill-session')
+    })
+
+    it('redirects if visits login form when logged in', function () 
+    {
+        cy.visit('/tm/login')
+        cy.url().should('include', '/tm/content')
+
+        Cypress.Cookies.preserveOnce('typemill-session')
+    })
+
+    it('logs out', function () 
+    {
+        cy.contains('Logout').click()
+        cy.url().should('include', '/tm/login')
+    })
+
+    it('fails without CSRF-token', function ()
+    {
+      cy.request({
+        method: 'POST',
+        url: '/tm/login', // baseUrl is prepended to url
+        form: true, // indicates the body should be form urlencoded and sets Content-Type: application/x-www-form-urlencoded headers
+        failOnStatusCode: false,
+        body: {
+          username: 'trendschau', 
+          password: 'password'
+        }
+      })
+        .its('body')
+        .should('include', 'Failed CSRF check')
+    })
+ 
+    it('blocks after 3 fails', function ()
+    {
+        cy.visit('/tm/login')
+
+        // validation fails first
+        cy.get('input[name="username"]').clear().type('wrong')
+        cy.get('input[name="password"]').clear().type('pass')
+        cy.get('form').submit()
+        cy.get('#flash-message').should('contain', 'wrong password or username')
+        cy.get('input[name="username"]').should('have.value', 'wrong')
+        cy.get('input[name="password"]').should('have.value', '')
+
+        // validation fails second
+        cy.get('input[name="password"]').clear().type('pass')
+        cy.get('form').submit()
+        cy.get('#flash-message').should('contain', 'wrong password or username')
+
+         // validation fails third and login is blocked
+         cy.get('input[name="password"]').clear().type('pass')
+         cy.get('form').submit()
+         cy.get('#flash-message').should('contain', 'Too many bad logins')
+         cy.contains('wait')        
+         cy.contains('Forgot password')
+    })
+})

+ 104 - 72
settings/languages/en.yaml

@@ -1,127 +1,139 @@
 # English
-
-# themes/typemill/typemill.yaml
-ACTIVATE_SPECIAL_STARTPAGE_DESIGN: Activate Special Startpage-Design
-AUTHOR_INTRO: Author Intro
-BOTTOM: Bottom
-BY: by
-COUNT_CHAPTERS_IN_NAVIGATION?: Count chapters in navigation?
-DIFFERENT_DESIGN_FOR_STARTPAGE: Different Design for Startpage
-FACEBOOK: Facebook
-FORMAT: Format
-GITHUB: GitHub
-LABEL_FOR_CHAPTER: Label for Chapter
-LABEL_FOR_START_BUTTON: Label for Start Button
-LAST_MODIFIED_FORMAT: Last Modified Format
-LAST_MODIFIED: Last Modified
-LAST_MODIFIED_TEXT: Last Modified Text
-LINKEDIN: Linkedin
-LINK_TO_GIT_REPOSITORY: Link to git repository
-MAIL: Mail
-POSITION_OF_AUTHOR: Position of Author
-POSITION_OF_GIT_EDIT_LINK: Position of Git Edit Link
-POSITION_OF_MODIFIED_TEXT: Position of Modified Text
-POSITION_OF_SHARE_BUTTONS: Position of Share-Buttons
-SELECT_SHARE_BUTTONS: Select Share Buttons
-SHARE: Share
-SHOW_CHAPTER_NUMBERS: Show Chapter Numbers
-TOP: Top
-TWITTER: Twitter
-TYPEMILL_DESCRIPTION: The standard theme for Typemill. Responsive, minimal and without any dependencies. It uses the system fonts Calibri and Helvetica. No JavaScript is used.
-WHATSAPP: WhatsApp
-XING: Xing
-
-# system/author/layouts/layoutBlox.twig
-ADD: add
-BOLD: bold
-BULLET_LIST: Bullet List
-CHECK: check
-CODE: Code
-COG: cog
-CROSS: cross
-DEFINITION: Definition List
-DELETE_CLOSE: delete/close
-DELETE: delete
-EXTERNAL_LINK: external-link
-FOLDER: folder
-HEADLINE: Headline
-HOME: home
-HORIZONTAL_LINE: Horizontal Line
-IMAGE: Image
-ITALIC: italic
-LINK: link
-MOVE_VERTICAL: move vertical
-NUMBERED_LIST: Numbered List
-PARAGRAPH: Paragraph
-POWER_OFF: power-off
-QUOTES: Quote
-TABLE_OF_CONTENTS: Table of Contents
-TABLE: Table
-TEXT_FILE: text-file
-UPLOAD: upload
-VIDEO: Video
-
-# others
 ACCOUNT: Account
+ACTIVATE_SPECIAL_STARTPAGE_DESIGN: Activate Special Startpage-Design
 ACTIVE: Active
 ACTUAL_PASSWORD: Actual Password
+ADD: add
+ADD_CONTENT_BLOCK: add content-block
+ADD_DEFINITION: add definition
 ADD_FILE: add file
 ADD_FOLDER: add folder
 ADD_FOLDER_TO_BASE_LEVEL: add folder to base level
 ADD_ITEM: add item
+ADD_LEFT_COLUMN: add left column
+ADD_RIGHT_COLUMN: add right column
+ADD_ROW_ABOVE: add row above
+ADD_ROW_BELOW: add row below
 ALL_USERS: All users
+ALT_TEXT: Alt-Text
 AUTHOR: Author
+AUTHOR_INTRO: Author Intro
 BACK_TO_STARTPAGE: back to startpage
+BOLD: bold
+BOTTOM: Bottom
 BROWSE: BROWSE
+BULLET_LIST: Bullet List
 BY: by
+CANCEL: cancel
+CAPTION: Caption
+CELL: cell
+CENTER: Center
+CHECK: check
 CHOOSE_FILE: Choose file
-CODE: code
+CLASS: Class
+CLOSE_LIBRARY: Close Library
+CODE: Code
+COG: cog
+CONTENT: Content
 CONTENT: Content
 COPYRIGHT: Copyright
+COUNT_CHAPTERS_IN_NAVIGATION?: Count chapters in navigation?
+CREATED_AT__READ_ONLY_: Created at (readonly)
+CREATED_AT__READONLY_: Created at (read only)
 CREATE_NEW_USER: Create New User
 CREATE_USER: Create User
-DEFINITION: definition
+CROSS: cross
+CUSTOM_CSS: Custom CSS
+DEFINITION: Definition List
+DEFINITION_LIST: Definition List
+DELETE_CLOSE: delete/close
+DELETE_COLUMN: delete column
+DELETE_CONTENT_BLOCK: delete content-block
 DELETE: delete
 DELETE_PAGE: Delete page
+DELETE_ROW: delete row
 DELETE_USER: Delete User
+DESCRIPTION: description
+DIFFERENT_DESIGN_FOR_STARTPAGE: Different Design for Startpage
 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
+DRAG_A_PICTURE_OR_CLICK_TO_SELECT: upload an image
 EDIT: edit
 EDIT_USER: Edit User
 E_G_: e.g.
 E_MAIL: E-Mail
+EXTERNAL_LINK: external-link
+FACEBOOK: Facebook
+FILE: File
 FIRST_NAME: First Name
+FOLDER: folder
 FORGOT_PASSWORD: Forgot password
-HEADLINE: headline
+FORMAT: Format
+GITHUB: GitHub
+HEAD: Head
+HEADLINE: Headline
+HIDE: Hide
+HIDE_PAGE_FROM_NAVIGATION: Hide page from navigation
+HOME: home
 HOMEPAGE: Homepage
+HORIZONTAL_LINE: Horizontal Line
 HR: hr
-IMAGE: image
+IF_NOT_FILLED__THE_DESCRIPTION_IS_EXTRACTED_FROM_CONTENT_: If not filled, the description is extracted from content.
+IMAGE: Image
+ITALIC: italic
+LABEL_FOR_CHAPTER: Label for Chapter
+LABEL_FOR_START_BUTTON: Label for Start Button
 LANGUAGE: Language
+LAST_MODIFIED_FORMAT: Last Modified Format
+LAST_MODIFIED: Last Modified
+LAST_MODIFIED_LIVE__READONLY_: Last modified live (readonly)
+LAST_MODIFIED_TEXT: Last Modified Text
 LAST_NAME: Last Name
+LEFT: Left
 LICENCE: Licence
+LINKEDIN: Linkedin
+LINK: Link
+LINK_TO_GIT_REPOSITORY: Link to git repository
+LINK_TO_VIDEO: Link to video
 LOGIN: Login
+LOGO_ON_STARTPAGE: Logo on startpage
 LOGOUT: Logout
+MAIL: Mail
+MANUAL_DATE: Manual date
 MARKDOWN: markdown
 MENU: Menu
-META_TITLE: meta title
+META_DESCRIPTION: Meta description
+META: meta
+META_TITLE: Meta title
 MISSING_REQUIREMENTS: Missing Requirements
+MOVE_VERTICAL: move vertical
+NAVIGATION_TITLE: Navigation Title
 NEW_PASSWORD: New Password
 NO_DESCRIPTION: No description
 NO_PREVIEW: No Preview
 NO_SETTINGS: No Settings
 NOT_EDITABLE: not editable
+NUMBERED_LIST: Numbered List
 OLIST: olist
 ONLY_THE_FOLLOWING_SPECIAL_CHARACTERS_ARE_ALLOWED: Only the following special characters are allowed:
+PARAGRAPH: Paragraph
 PASSWORD: Password
 PLEASE_CONFIRM: Please confirm
+PLEASE_CORRECT_THE_ERRORS_ABOVE: Please correct the errors above
 PLUGINS: Plugins
 PLUGIN_STORE: Plugin Store
+POSITION_OF_AUTHOR: Position of Author
+POSITION_OF_GIT_EDIT_LINK: Position of Git Edit Link
+POSITION_OF_MODIFIED_TEXT: Position of Modified Text
+POSITION_OF_SHARE_BUTTONS: Position of Share-Buttons
+POWER_OFF: power-off
 PUBLISH: Publish
-QUOTE: quote
+QUOTE: Quote
+QUOTES: Quote
 RAW_CONTENT_EDITOR: Raw Content Editor
 RAW_MARKDOWN_EDITOR: Raw Markdown Editor
 RAW_MODE: raw mode
@@ -129,30 +141,47 @@ RAW: raw
 READONLY: Readonly
 REMEMBER_TO_BOOKMARK_THIS_PAGE: Remember to bookmark this page
 REQUIRED: Required
+RIGHT: Right
 ROLE: Role
 SAVE_ALL_SETTINGS: Save All Settings
+SAVED_SUCCESSFULLY: Saved successfully
 SAVE: Save
 SAVE_THEME: Save Theme
+SELECT_SHARE_BUTTONS: Select Share Buttons
 SETTINGS: Settings
+SETTINGS_ARE_STORED: Settings are stored
 SETUP: Setup
+SHARE: Share
+SHOW_CHAPTER_NUMBERS: Show Chapter Numbers
+SHOW_LOGO_INSTEAD_OF_TITLE_ON_STARTPAGE: Show logo instead of title on startpage
 STANDARD_EDITOR_MODE: Standard Editor Mode
 START: Start
 SYSTEM: System
-TABLE: table
+TABLE_OF_CONTENTS: Table of Contents
+TABLE: Table
+TAKEN_FROM_YOUR_USER_ACCOUNT_IF_SET_: Taken from your user account if set.
+TERM: term
+TEXT_FILE: text-file
 THE_FORMAT_BUTTONS: The Format Buttons
 THEMES: Themes
 THEME_STORE: Theme Store
 TITLE: Title
 TOC: toc
+TOP: Top
+TWITTER: Twitter
+TYPEMILL_DESCRIPTION: The standard theme for Typemill. Responsive, minimal and without any dependencies. It uses the system fonts Calibri and Helvetica. No JavaScript is used.
 ULIST: ulist
 UNKNOWN: Unknown
 UPDATE_USER: Update User
+UPLOAD: upload
+UPLOAD_FILE: Upload a file
 USE_2_TO_40_CHARACTERS: Use 2 to 40 characters.
 USE_A_VALID_YEAR: Use a valid year
+USED_AS_FALLBACK_WHEN_NO_MANUAL_DATE_IS_SET_: Used as fallback when no manual date is set.
 USERNAME: Username
 USERS: Users
 USER: User
-VIDEO: video
+VIDEO: Video
 VIEW_SITE: View Site
 VISUAL_CONTENT_EDITOR: Visual Content Editor
 VISUAL_EDITOR: Visual Editor
@@ -162,5 +191,8 @@ VISUAL: visual
 WAIT: wait
 WEBSITE_TITLE: Website Title
 WEB: Web
+WHATSAPP: WhatsApp
 WRITING: Writing
-YEAR: Year
+XING: Xing
+YEAR: Year
+YOU_CAN_OVERWRITE_THE_THEME_CSS_WITH_YOUR_OWN_CSS_HERE_: You can overwrite the theme-css with your own css here.

+ 109 - 75
settings/languages/it.yaml

@@ -1,123 +1,138 @@
 # Italiano
-
-# themes/typemill/typemill.yaml
-ACTIVATE_SPECIAL_STARTPAGE_DESIGN: Attiva il disegno speciale della pagina iniziale
-AUTHOR_INTRO: Introduzione dell'autore
-BOTTOM: Sotto
-BY: di
-COUNT_CHAPTERS_IN_NAVIGATION?: Contare i capitoli nella navigazione?
-DIFFERENT_DESIGN_FOR_STARTPAGE: Disegno diverso per la pagina iniziale
-FACEBOOK: Facebook
-FORMAT: Format
-GITHUB: GitHub
-LABEL_FOR_CHAPTER: Etichetta per capitolo
-LABEL_FOR_START_BUTTON: Etichetta per il pulsante Comincia
-LAST_MODIFIED_FORMAT: Ultimo formato modificato
-LAST_MODIFIED_TEXT: Ultimo testo modificato
-LAST_MODIFIED: Ultima modifica
-LINKEDIN: Linkedin
-LINK_TO_GIT_REPOSITORY: Collegamento al deposito git
-MAIL: Mail
-POSITION_OF_AUTHOR: Posizione dell'autore
-POSITION_OF_GIT_EDIT_LINK: Posizione del collegamento modifica Git
-POSITION_OF_MODIFIED_TEXT: Posizione del testo modificato
-POSITION_OF_SHARE_BUTTONS: Posizione dei pulsanti di condivisione
-SELECT_SHARE_BUTTONS: Seleziona i pulsanti pulsanti di condivisione
-SHARE: Condividere
-SHOW_CHAPTER_NUMBERS: Mostra i numeri dei capitoli
-TOP: Sopra
-TWITTER: Twitter
-TYPEMILL_DESCRIPTION: Il tema standard per Typemill. Reattivo, minimo e senza dipendenze. Utilizza i caratteri di sistema Calibri ed Helvetica. Non viene utilizzato JavaScript.
-WHATSAPP: WhatsApp
-XING: Xing
-
-# system/author/layouts/layoutBlox.twig
-ADD: aggiungi
-BOLD: grassetto
-BULLET_LIST: Elenco puntato
-CHECK: controllo
-CODE: Codice
-COG: ingranaggio
-CROSS: croce
-DEFINITION: Elenco delle definizioni
-DELETE_CLOSE: elimina/chiudi
-DELETE: elimina
-EXTERNAL_LINK: collegamento esterno
-FOLDER: cartella
-HEADLINE: Titolo
-HOME: home
-HORIZONTAL_LINE: Linea orizzontale
-IMAGE: Immagine
-ITALIC: corsivo
-LINK: collegamento
-MOVE_VERTICAL: spostare in verticale
-NUMBERED_LIST: Elenco numerato
-PARAGRAPH: Paragrafo
-POWER_OFF: spegni
-QUOTES: Citazione
-TABLE_OF_CONTENTS: Sommario
-TABLE: Tabella
-TEXT_FILE: file di testo
-VIDEO: Video
-
 ACCOUNT: Utenza
+ACTIVATE_SPECIAL_STARTPAGE_DESIGN: Attiva il disegno speciale della pagina iniziale
 ACTIVE: Attivo
 ACTUAL_PASSWORD: Parola d'ordine corrente
+ADD: aggiungi
+ADD_CONTENT_BLOCK: aggiungi blocco contenuto
+ADD_DEFINITION: aggiungi definizione
 ADD_FILE: aggiungi file
 ADD_FOLDER: aggiungi cartella
 ADD_FOLDER_TO_BASE_LEVEL: aggiungi cartella al livello base
 ADD_ITEM: aggiungi articolo
+ADD_LEFT_COLUMN: aggiungi colonna a sinistra
+ADD_RIGHT_COLUMN: aggiungi colonna a destra
+ADD_ROW_ABOVE: aggiungi la riga sopra
+ADD_ROW_BELOW: aggiungi la riga sotto
 ALL_USERS: Tutti gli utenti
+ALT_TEXT: Testo alternativo
 AUTHOR: Autore
+AUTHOR_INTRO: Introduzione dell'autore
 BACK_TO_STARTPAGE: torna alla pagina iniziale
+BOLD: grassetto
+BOTTOM: Sotto
+BROWSE: Sfoglia
+BULLET_LIST: Elenco puntato
 BY: di
-CODE: codice
+CANCEL: Annulla
+CAPTION: Didascalia
+CELL: cella
+CENTER: Centro
+CHECK: controllo
+CHOOSE_FILE: Scegli il file
+CLASS: Classe
+CODE: Codice
+COG: ingranaggio
+CONTENT: Contenuto
 CONTENT: Contenuto
 COPYRIGHT: Diritti d'autore
+COUNT_CHAPTERS_IN_NAVIGATION?: Contare i capitoli nella navigazione?
+CREATED_AT__READ_ONLY_: Creato il (sola lettura)
+CREATED_AT__READONLY_: Creato il (sola lettura)
 CREATE_NEW_USER: Crea nuovo utente
 CREATE_USER: Crea utente
-DEFINITION: elenco di definizioni
+CROSS: croce
+CUSTOM_CSS: CSS personalizzato
+DEFINITION: Elenco delle definizioni
+DEFINITION_LIST: Elenco delle definizioni
+DELETE_CLOSE: elimina/chiudi
+DELETE_COLUMN: elimina colonna
+DELETE_CONTENT_BLOCK: elimina blocco contenuto
 DELETE: elimina
 DELETE_PAGE: Elimina pagina
+DELETE_ROW: elimina riga
 DELETE_USER: Elimina utente
+DESCRIPTION: descrizione
+DIFFERENT_DESIGN_FOR_STARTPAGE: Disegno diverso per la pagina iniziale
 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
+DRAG_A_PICTURE_OR_CLICK_TO_SELECT: trascina un'immagine o fai clic per selezionare
 EDIT: modifica
 EDIT_USER: Modifica utente
 E_G_: per es.:
 E_MAIL: Posta elettronica
+EXTERNAL_LINK: collegamento esterno
+FACEBOOK: Facebook
+File: File
 FIRST_NAME: Nome
+FOLDER: cartella
 FORGOT_PASSWORD: Parola d'ordine dimenticata
-HEADLINE: titolo
+FORMAT: Format
+GITHUB: GitHub
+HEAD: Intestazione
+HEADLINE: Titolo
+HIDE: Nascondi
+HIDE_PAGE_FROM_NAVIGATION: Nasconde la pagina dalla navigazione
+HOME: home
 HOMEPAGE: Homepage
-HR: linea orizzontale
-IMAGE: immagine
+HORIZONTAL_LINE: Linea orizzontale
+HR: Linea orizzontale
+IF_NOT_FILLED__THE_DESCRIPTION_IS_EXTRACTED_FROM_CONTENT_: Se non compilato, la descrizione viene estratta dal contenuto.
+IMAGE: Immagine
+ITALIC: corsivo
+LABEL_FOR_CHAPTER: Etichetta per capitolo
+LABEL_FOR_START_BUTTON: Etichetta per il pulsante Comincia
 LANGUAGE: Lingua
+LAST_MODIFIED_FORMAT: Ultimo formato modificato
+LAST_MODIFIED_LIVE__READONLY_: Ultima modifica (sola lettura)
+LAST_MODIFIED_TEXT: Ultimo testo modificato
+LAST_MODIFIED: Ultima modifica
 LAST_NAME: Cognome
+LEFT: Sinistra
 LICENCE: Licenza
+LINK: Collegamento
+LINKEDIN: Linkedin
+LINK_TO_GIT_REPOSITORY: Collegamento al deposito git
+LINK_TO_VIDEO: Collega al video
 LOGIN: Accesso
+LOGO_ON_STARTPAGE: Logo sulla pagina iniziale
 LOGOUT: Disconnessione
-MARKDOWN: markdown
+MAIL: Mail
+MANUAL_DATE: Data manuale
+MARKDOWN: Markdown
 MENU: Menu
-META_TITLE: meta titolo
+META_DESCRIPTION: Descrizione
+META_TITLE: Titolo
+META: Metadati
 MISSING_REQUIREMENTS: Requisiti mancanti
+MOVE_VERTICAL: spostare in verticale
+NAVIGATION_TITLE: Titolo di navigazione
 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
+NUMBERED_LIST: Elenco numerato
+OLIST: Elenchi ordinati
 ONLY_THE_FOLLOWING_SPECIAL_CHARACTERS_ARE_ALLOWED: Sono ammessi solo i seguenti caratteri speciali:
+PARAGRAPH: Paragrafo
 PASSWORD: Parola d'ordine
 PLEASE_CONFIRM: Per favore conferma
+PLEASE_CORRECT_THE_ERRORS_ABOVE: Si prega di correggere gli errori sopra
 PLUGINS: Plugin
 PLUGIN_STORE: Deposito plugin
+POSITION_OF_AUTHOR: Posizione dell'autore
+POSITION_OF_GIT_EDIT_LINK: Posizione del collegamento modifica Git
+POSITION_OF_MODIFIED_TEXT: Posizione del testo modificato
+POSITION_OF_SHARE_BUTTONS: Posizione dei pulsanti di condivisione
+POWER_OFF: spegni
 PUBLISH: Pubblica
-QUOTE: citazione
+QUOTE: Citazione
+QUOTES: Citazione
 RAW_CONTENT_EDITOR: Editore contenuto grezzo
 RAW: grezzo
 RAW_MARKDOWN_EDITOR: Editore grezzo Markdown
@@ -125,30 +140,46 @@ RAW_MODE: modo grezzo
 READONLY: Sola lettura
 REMEMBER_TO_BOOKMARK_THIS_PAGE: Ricorda di aggiungere questa pagina ai segnalibri
 REQUIRED: Richiesto
+RIGHT: Destra
 ROLE: Ruolo
 SAVE_ALL_SETTINGS: Salva tutte le impostazioni
+SAVED_SUCCESSFULLY: Salvato con successo
 SAVE: Salva
 SAVE_THEME: Salva tema
+SELECT_SHARE_BUTTONS: Seleziona i pulsanti pulsanti di condivisione
 SETTINGS: Impostazioni
+SETTINGS_ARE_STORED: Le impostazioni sono memorizzate
 SETUP: Configurazione
+SHARE: Condividere
+SHOW_CHAPTER_NUMBERS: Mostra i numeri dei capitoli
+SHOW_LOGO_INSTEAD_OF_TITLE_ON_STARTPAGE: Mostra logo invece del titolo sulla pagina iniziale
 STANDARD_EDITOR_MODE: Modalità editore standard
 START: Comincia
 SYSTEM: Sistema
-TABLE: tabella
+TABLE_OF_CONTENTS: Sommario
+TABLE: Tabella
+TAKEN_FROM_YOUR_USER_ACCOUNT_IF_SET_: Tratto dalla tua utenza, se impostata.
+TERM: termine
+TEXT_FILE: file di testo
 THE_FORMAT_BUTTONS: pulsanti di formattazione
 THEMES: Temi
 THEME_STORE: Deposito temi
 TITLE: Titolo
-TOC: sommario
-ULIST: elenchi non ordinati
+TOC: Sommario
+TOP: Sopra
+TWITTER: Twitter
+TYPEMILL_DESCRIPTION: Il tema standard per Typemill. Reattivo, minimo e senza dipendenze. Utilizza i caratteri di sistema Calibri ed Helvetica. Non viene utilizzato JavaScript.
+ULIST: Elenchi non ordinati
 UNKNOWN: Ignoto
 UPDATE_USER: Aggiorna utente
+UPLOAD: carica
 USE_2_TO_40_CHARACTERS: Usa da 2 a 40 caratteri.
 USE_A_VALID_YEAR: Usa un anno valido
+USED_AS_FALLBACK_WHEN_NO_MANUAL_DATE_IS_SET_: Utilizzato come ripiego quando non è impostata alcuna data manuale.
 USERNAME: Nome utente
 USERS: Utenti
 USER: Utente
-VIDEO: video
+VIDEO: Video
 VIEW_SITE: Mostra sito
 VISUAL_CONTENT_EDITOR: Editore contenuto visivo
 VISUAL_EDITOR: Editore visivo
@@ -158,5 +189,8 @@ VISUAL: visivo
 WAIT: aspetta
 WEBSITE_TITLE: Titolo del sito
 WEB: Sito
+WHATSAPP: WhatsApp
 WRITING: Scrittura
-YEAR: Anno
+XING: Xing
+YEAR: Anno
+YOU_CAN_OVERWRITE_THE_THEME_CSS_WITH_YOUR_OWN_CSS_HERE_: È possibile sovrascrivere il css del tema con il proprio CSS qui.

+ 94 - 71
settings/languages/nl.yaml

@@ -1,123 +1,131 @@
 # Dutch
-
-# themes/typemill/typemill.yaml
-ACTIVATE_SPECIAL_STARTPAGE_DESIGN: Activeer speciaal startpagina-ontwerp
-AUTHOR_INTRO: Auteur Intro
-BOTTOM: bodem
-BY: door
-COUNT_CHAPTERS_IN_NAVIGATION?: Hoofdstukken tellen in navigatie?
-DIFFERENT_DESIGN_FOR_STARTPAGE: ander ontwerp voor startpagina
-FACEBOOK: Facebook
-FORMAT: Formaat
-GITHUB: GitHub
-LABEL_FOR_CHAPTER: Label voor hoofdstuk
-LABEL_FOR_START_BUTTON: label voor startknop
-LAST_MODIFIED_FORMAT: Laatst gewijzigd formaat
-LAST_MODIFIED: Laatst gewijzigd
-LAST_MODIFIED_TEXT: Laatst gewijzigde tekst
-LINKEDIN: Linkedin
-LINK_TO_GIT_REPOSITORY: Link naar git repository
-MAIL: Mail
-POSITION_OF_AUTHOR: Positie van auteur
-POSITION_OF_GIT_EDIT_LINK: Positie van Git Link bewerken
-POSITION_OF_MODIFIED_TEXT: Positie van gemodificeerde tekst
-POSITION_OF_SHARE_BUTTONS: Positie van Share-knoppen
-SELECT_SHARE_BUTTONS: Selecteer Share-knoppen
-SHARE: deel
-SHOW_CHAPTER_NUMBERS: hoofdstuknummers tonen
-TOP: Top
-TWITTER: Twitter
-TYPEMILL_DESCRIPTION: Het standaardthema voor typemill. Responsief, minimaal en zonder afhankelijkheden. Het gebruikt de systeemlettertypen Calibri en Helvetica. Er is geen JavaScript gebruikt.
-WHATSAPP: Whatsapp
-XING: Xing
-
-# system/author/layouts/layoutBlox.twig
-ADD: toevoegen
-BOLD: vetgedrukt
-BULLET_LIST: Bullet List
-CHECK: check
-CODE: Code
-COG: tandwiel
-CROSS: kruis
-DEFINITION: Definitielijst
-DELETE_CLOSE: verwijderen / sluiten
-DELETE: verwijderen
-EXTERNAL_LINK: externe link
-FOLDER: map
-HEADLINE: Kop
-HOME: home
-HORIZONTAL_LINE: Horizontale lijn
-IMAGE: Afbeelding
-ITALIC: cursief
-LINK: link
-MOVE_VERTICAL: verplaats verticaal
-NUMBERED_LIST: Genummerde lijst
-PARAGRAPH: Paragraaf
-POWER_OFF: power-off
-QUOTES: Citeren
-TABLE_OF_CONTENTS: Inhoudsopgave
-TABLE: tabel
-TEXT_FILE: tekstbestand
-VIDEO: Video
-
 ACCOUNT: Account
+ACTIVATE_SPECIAL_STARTPAGE_DESIGN: Activeer speciaal startpagina-ontwerp
 ACTIVE: Actief
 ACTUAL_PASSWORD: Actueel wachtwoord
+ADD_CONTENT_BLOCK: inhoudblok toevoegen
+ADD_DEFINITION: definitie toevoegen
 ADD_FILE: Bestand toevoegen
 ADD_FOLDER: Map toevoegen
 ADD_FOLDER_TO_BASE_LEVEL: map toevoegen op basisniveau
 ADD_ITEM: Item toevoegen
+ADD_LEFT_COLUMN: linkerkolom toevoegen
+ADD_RIGHT_COLUMN: rechter kolom toevoegen
+ADD_ROW_ABOVE: rij boven toevoegen
+ADD_ROW_BELOW: rij hieronder toevoegen
+ADD: toevoegen
 ALL_USERS: Alle gebruikers
+ALT_TEXT: Alt-tekst
 AUTHOR: Auteur
+AUTHOR_INTRO: Auteur Intro
 BACK_TO_STARTPAGE: terug naar startpagina
+BOLD: vetgedrukt
+BOTTOM: bodem
+BULLET_LIST: Lijst met opsommingstekens
 BY: door
-CODE: code
+CANCEL: annuleren
+CAPTION: Bijschrift
+CELL: cel
+CENTER: Midden
+CHECK: check
+CLASS: Class
+CODE: Code
+COG: tandwiel
 CONTENT: Inhoud
 COPYRIGHT: Auteursrecht
+COUNT_CHAPTERS_IN_NAVIGATION?: Hoofdstukken tellen in navigatie?
+CREATED_AT__READ_ONLY_: Gemaakt om (alleen lezen)
+CREATED_AT__READONLY_: Gemaakt om (alleen lezen)
 CREATE_NEW_USER: Nieuwe gebruiker maken
 CREATE_USER: Gebruiker maken
-DEFINITION: definitie
-DELETE: verwijderen
+CROSS: kruis
+DEFINITION: Definitielijst
+DEFINITION_LIST: Definitielijst
+DELETE_CLOSE: verwijderen / sluiten
+DELETE_COLUMN: kolom verwijderen
+DELETE_CONTENT_BLOCK: content-block verwijderen
 DELETE_PAGE: pagina verwijderen
+DELETE_ROW: rij verwijderen
 DELETE_USER: Gebruiker verwijderen
+DELETE: verwijderen
+DESCRIPTION: omschrijving
+DIFFERENT_DESIGN_FOR_STARTPAGE: ander ontwerp voor startpagina
 DISCARD_CHANGES: Wijzigingen negeren
 DISCARD: weggooien
 DO_YOU_REALLY_WANT_TO_DELETE_THE_USER: Wilt u de gebruiker echt verwijderen
 DO_YOU_REALLY_WANT_TO_DELETE_THIS_PAGE: Wilt u deze pagina echt verwijderen?
 DO_YOU_WANT_TO_DISCARD_YOUR_CHANGES_AND_SET_THE_CONTENT_BACK_TO_THE_LIVE_VERSION: Wilt u uw wijzigingen annuleren en de inhoud terugzetten naar de live versie?
 DRAFT: Ontwerp
+DRAG_A_PICTURE_OR_CLICK_TO_SELECT: sleep een foto of klik om te selecteren
 EDIT: bewerken
 EDIT_USER: Gebruiker bewerken
 E_G_: bijv.
 E_MAIL: e-mail
+EXTERNAL_LINK: externe link
+FACEBOOK: Facebook
 FIRST_NAME: Voornaam
+FOLDER: map
 FORGOT_PASSWORD: Wachtwoord vergeten
-HEADLINE: kop
+FORMAT: Formaat
+GITHUB: GitHub
+HEAD: Kop
+HEADLINE: Kop
+HOME: home
 HOMEPAGE: Homepage
+HORIZONTAL_LINE: Horizontale lijn
+HORIZONTAL_LINE: Horizontale lijn
 HR: hr
-IMAGE: afbeelding
+IF_NOT_FILLED__THE_DESCRIPTION_IS_EXTRACTED_FROM_CONTENT_: Indien niet ingevuld, wordt de beschrijving uit de inhoud gehaald.
+IMAGE: Afbeelding
+ITALIC: cursief
+LABEL_FOR_CHAPTER: Label voor hoofdstuk
+LABEL_FOR_START_BUTTON: label voor startknop
 LANGUAGE: Taal
+LAST_MODIFIED_FORMAT: Laatst gewijzigd formaat
+LAST_MODIFIED: Laatst gewijzigd
+LAST_MODIFIED_LIVE__READONLY_: Laatst gewijzigd live (alleen-lezen)
+LAST_MODIFIED_TEXT: Laatst gewijzigde tekst
 LAST_NAME: achternaam
+LEFT: Links
 LICENCE: Licentie
+LINKEDIN: Linkedin
+LINK: Link
+LINK_TO_GIT_REPOSITORY: Link naar git repository
+LINK_TO_VIDEO: Link naar video
 LOGIN: Inloggen
 LOGOUT: Uitloggen
+MAIL: Mail
+MANUAL_DATE: Handmatige datum
 MARKDOWN: Markdown
 MENU: Menu
+META_DESCRIPTION: Metabeschrijving
+META: meta
 META_TITLE: metatitel
+META_TITLE: Metatitel
 MISSING_REQUIREMENTS: ontbrekende vereisten
+MOVE_VERTICAL: verplaats verticaal
 NEW_PASSWORD: Nieuw wachtwoord
 NO_DESCRIPTION: Geen beschrijving
 NO_PREVIEW: Geen voorbeeld
 NO_SETTINGS: Geen instellingen
 NOT_EDITABLE: niet bewerkbaar
+NUMBERED_LIST: Genummerde lijst
 OLIST: olist
 ONLY_THE_FOLLOWING_SPECIAL_CHARACTERS_ARE_ALLOWED: alleen de volgende speciale tekens zijn toegestaan:
+PARAGRAPH: Paragraaf
 PASSWORD: Wachtwoord
 PLEASE_CONFIRM: bevestig alstublieft
+PLEASE_CORRECT_THE_ERRORS_ABOVE: Corrigeer bovenstaande fouten
 PLUGINS: plug-ins
 PLUGIN_STORE: Plugin Store
+POSITION_OF_AUTHOR: Positie van auteur
+POSITION_OF_GIT_EDIT_LINK: Positie van Git Link bewerken
+POSITION_OF_MODIFIED_TEXT: Positie van gemodificeerde tekst
+POSITION_OF_SHARE_BUTTONS: Positie van Share-knoppen
+POWER_OFF: power-off
 PUBLISH: Publiceren
-QUOTE: quote
+QUOTE: Citeren
+QUOTES: Citeren
 RAW_CONTENT_EDITOR: Raw Content Editor
 RAW_MARKDOWN_EDITOR: Raw Markdown Editor
 RAW_MODE: onbewerkte modus
@@ -125,30 +133,43 @@ RAW: rauw
 READONLY: Alleen lezen
 REMEMBER_TO_BOOKMARK_THIS_PAGE: vergeet deze pagina niet te bookmarken
 REQUIRED: verplicht
+RIGHT: Rechts
 ROLE: rol
 SAVE_ALL_SETTINGS: sla alle instellingen op
+SAVED_SUCCESSFULLY: succesvol opgeslagen
 SAVE: Opslaan
 SAVE_THEME: Thema opslaan
+SELECT_SHARE_BUTTONS: Selecteer Share-knoppen
 SETTINGS: Instellingen
 SETUP: Setup
+SHARE: deel
+SHOW_CHAPTER_NUMBERS: hoofdstuknummers tonen
 STANDARD_EDITOR_MODE: Standaardeditormodus
 START: Start
 SYSTEM: Systeem
-TABLE: tabel
+TABLE_OF_CONTENTS: Inhoudsopgave
+TABLE: Tabel
+TAKEN_FROM_YOUR_USER_ACCOUNT_IF_SET_: Genomen uit uw gebruikersaccount indien ingesteld.
+TERM: term
+TEXT_FILE: tekstbestand
 THE_FORMAT_BUTTONS: De opmaakknoppen
 THEMAS: Thema's
 THEME_STORE: Theme Store
 TITLE: Titel
 TOC: toc
+TOP: Top
+TWITTER: Twitter
+TYPEMILL_DESCRIPTION: Het standaardthema voor typemill. Responsief, minimaal en zonder afhankelijkheden. Het gebruikt de systeemlettertypen Calibri en Helvetica. Er is geen JavaScript gebruikt.
 ULIST: ulist
 UNKNOWN: onbekend
 UPDATE_USER: Gebruiker bijwerken
 USE_2_TO_40_CHARACTERS: gebruik 2 tot 40 tekens.
 USE_A_VALID_YEAR: Gebruik een geldig jaar
+USED_AS_FALLBACK_WHEN_NO_MANUAL_DATE_IS_SET_: Gebruikt als fallback als er geen handmatige datum is ingesteld.
+USER: Gebruiker
 USERNAME: Gebruikersnaam
 USERS: Gebruikers
-USER: Gebruiker
-VIDEO: video
+VIDEO: Video
 VIEW_SITE: Site bekijken
 VISUAL_CONTENT_EDITOR: Visual Content Editor
 VISUAL_EDITOR: visuele editor
@@ -158,5 +179,7 @@ VISUEEL: visueel
 WAIT: wacht
 WEBSITE_TITLE: Titel van de website
 WEB: Web
+WHATSAPP: Whatsapp
 WRITING: schrijven
-YEAR: Jaar
+XING: Xing
+YEAR: Jaar

+ 0 - 53
settings/languages/vuejs-en.yaml

@@ -1,53 +0,0 @@
-# English
-en:
-  add content-block: add content-block
-  add definition: add definition
-  add left column: add left column
-  add right column: add right column
-  add row above: add row above
-  add row below: add row below
-  Alt-Text: Alt-Text
-  author: author
-  Bullet List: Bullet List
-  cancel: cancel
-  Caption: Caption
-  cell: cell
-  Center: Center
-  Class: Class
-  Code: Code
-  Content: Content
-  Created at (readonly): Created at (readonly)
-  Definition List: Definition List
-  delete column: delete column
-  delete content-block: delete content-block
-  delete row: delete row
-  description: description
-  drag a picture or click to select: upload an image
-  Head: Head
-  Headline: Headline
-  Horizontal Line: Horizontal Line
-  If not filled, the description is extracted from content.: If not filled, the description is extracted from content.
-  Image: Image
-  Last modified live (readonly): Last modified live (readonly)
-  Left: Left
-  Link: Link
-  Link to video: Link to video
-  Manual date: Manual date
-  Meta description: Meta description
-  meta: meta
-  Meta title: Meta title
-  Numbered List: Numbered List
-  Paragraph: Paragraph
-  Please correct the errors above: Please correct the errors above
-  Quote: Quote
-  Right: Right
-  Saved successfully: Saved successfully
-  save: save
-  save: save
-  table of contents: Table of Contents
-  Table: Table
-  Taken from your user account if set.: Taken from your user account if set.
-  term: term
-  Title: Title
-  Used as fallback when no manual date is set.: Used as fallback when no manual date is set.
-  Video: Video

+ 0 - 53
settings/languages/vuejs-it.yaml

@@ -1,53 +0,0 @@
-# Italiano
-it:
-  add content-block: aggiungi blocco contenuto
-  add definition: aggiungi definizione
-  add left column: aggiungi colonna a sinistra
-  add right column: aggiungi colonna a destra
-  add row above: aggiungi la riga sopra
-  add row below: aggiungi la riga sotto
-  Alt-Text: Testo alternativo
-  author: autore
-  Bullet List: Elenco puntato
-  cancel: Annulla
-  Caption: Didascalia
-  cell: cella
-  Center: Centro
-  Class: Classe
-  Code: Codice
-  Content: Contenuto
-  Created at (readonly): Creato il (sola lettura)
-  Definition List: Elenco delle definizioni
-  delete column: elimina colonna
-  delete content-block: elimina blocco contenuto
-  delete row: elimina riga
-  description: descrizione
-  drag a picture or click to select: trascina un'immagine o fai clic per selezionare
-  Head: Intestazione
-  Headline: Titolo
-  Horizontal Line: Linea orizzontale
-  If not filled, the description is extracted from content.: Se non compilato, la descrizione viene estratta dal contenuto.
-  Image: Immagine
-  Last modified live (readonly): Ultima modifica (sola lettura)
-  Left: Sinistra
-  Link: Collegamento
-  Link to video: Collega al video
-  Manual date: Data manuale
-  Meta description: Descrizione
-  meta: Metadati
-  Meta title: Titolo
-  Numbered List: Elenco numerato
-  Paragraph: Paragrafo
-  Please correct the errors above: Si prega di correggere gli errori sopra
-  Quote: Citazione
-  Right: Destra
-  Saved successfully: Salvato con successo
-  save: salva
-  save: Salva
-  table of contents: Sommario
-  Table: Tabella
-  Taken from your user account if set.: Tratto dalla tua utenza, se impostata.
-  term: termine
-  Title: Titolo
-  Used as fallback when no manual date is set.: Utilizzato come ripiego quando non è impostata alcuna data manuale.
-  Video: Video

+ 0 - 52
settings/languages/vuejs-nl.yaml

@@ -1,52 +0,0 @@
-# Dutch
-nl:
-  add content-block: inhoudblok toevoegen
-  add definition: definitie toevoegen
-  add left column: linkerkolom toevoegen
-  add right column: rechter kolom toevoegen
-  add row above: rij boven toevoegen
-  add row below: rij hieronder toevoegen
-  Alt-Text: Alt-tekst
-  author: auteur
-  Bullet List: Lijst met opsommingstekens
-  cancel: annuleren
-  Caption: Bijschrift
-  cell: cel
-  Center: Midden
-  Class: Class
-  Code: Code
-  Content: inhoud
-  Created at (readonly): Gemaakt om (alleen lezen)
-  Definition List: Definitielijst
-  delete column: kolom verwijderen
-  delete content-block: content-block verwijderen
-  delete row: rij verwijderen
-  description: omschrijving
-  drag a picture or click to select: sleep een foto of klik om te selecteren
-  Head: Kop
-  Headline: Kop
-  Horizontal Line: Horizontale lijn
-  If not filled, the description is extracted from content.: Indien niet ingevuld, wordt de beschrijving uit de inhoud gehaald.
-  Image: Afbeelding
-  Last modified live (readonly): Laatst gewijzigd live (alleen-lezen)
-  Left: Links
-  Link: Link
-  Link to video: Link naar video
-  Manual date: Handmatige datum
-  Meta description: Metabeschrijving
-  meta: meta
-  Meta title: Metatitel
-  Numbered List: Genummerde lijst
-  Paragraph: Paragraaf
-  Please correct the errors above: Corrigeer bovenstaande fouten
-  Quote: Citeren
-  Right: Rechts
-  Saved successfully: succesvol opgeslagen
-  save: opslaan
-  table of contents: inhoudsopgave
-  Table: Tabel
-  Taken from your user account if set.: Genomen uit uw gebruikersaccount indien ingesteld.
-  term: term
-  Title: Titel
-  Used as fallback when no manual date is set.: Gebruikt als fallback als er geen handmatige datum is ingesteld.
-  Video: video

+ 1 - 2
system/Settings.php

@@ -42,7 +42,6 @@ class Settings
 	    # load the strings of the set language
 	    $language = $settings['language'];
 	    $settings['labels'] = self::getLanguageLabels($language);
-	    $settings['vuejsLabels'] = self::getVuejsLabels($language);
 
 		# We know the used theme now so create the theme path 
 		$settings['themePath'] = $settings['rootPath'] . $settings['themeFolder'] . DIRECTORY_SEPARATOR . $settings['theme'];
@@ -81,7 +80,7 @@ class Settings
 			'contentFolder'							=> 'content',
 			'cache'									=> true,
 			'cachePath'								=> $rootPath . 'cache',
-			'version'								=> '1.3.4',
+			'version'								=> '1.3.5',
 			'setup'									=> true,
 			'welcome'								=> true,
 			'images'								=> ['live' => ['width' => 820], 'thumbs' => ['width' => 250, 'height' => 150]],

+ 1 - 1
system/author/editor/editor-blox.twig

@@ -12,7 +12,7 @@
 		    v-bind:key="tab"
 		    v-bind:class="['tab-button', { active: currentTab === tab }]"
 		    v-on:click="currentTab = tab"
-		  >${ tab|translate }</button>
+		   >${ tab|translate }</button>
 
 		  <component 
 		  	class="tab" 

+ 51 - 50
system/author/js/vue-blox.js

@@ -6,8 +6,8 @@ const contentComponent = Vue.component('content-block', {
 				'<div v-if="newblock" class="newblock-info">Choose a content-type <button class="newblock-close" @click.prevent="closeNewBlock($event)">close</button></div>' +	
 				'<div class="blox-wrapper" :class="{ editactive: edit }">' +
 				 '<div class="sideaction" slot="header" v-if="body">' + 
-				  '<button class="add" :disabled="disabled" :title="$t(\'add content-block\')" @mousedown.prevent="disableSort()" @click.prevent="addNewBlock($event)"><svg class="icon icon-plus"><use xlink:href="#icon-plus"></use></svg></button>' +
-				  '<button class="delete" :disabled="disabled" :title="$t(\'delete content-block\')" @mousedown.prevent="disableSort()" @click.prevent="deleteBlock($event)"><svg class="icon icon-close"><use xlink:href="#icon-close"></use></svg></button>' +
+ 					'<button class="add" :disabled="disabled" :title="\'add content-block\'|translate" @mousedown.prevent="disableSort()" @click.prevent="addNewBlock($event)"><svg class="icon icon-plus"><use xlink:href="#icon-plus"></use></svg></button>' +
+				  	'<button class="delete" :disabled="disabled" :title="\'delete content-block\'|translate" @mousedown.prevent="disableSort()" @click.prevent="deleteBlock($event)"><svg class="icon icon-close"><use xlink:href="#icon-close"></use></svg></button>' +
 				 '</div>' + 
 				 '<div class="background-helper" @keyup.enter="submitBlock" @click="getData">' +
 				  '<div class="component" ref="component">' +
@@ -15,8 +15,8 @@ const contentComponent = Vue.component('content-block', {
 				    '<component :disabled="disabled" :compmarkdown="compmarkdown" @updatedMarkdown="updateMarkdown" :is="componentType"></component>' +
 				   '</transition>' +
 				   '<div class="blox-buttons" v-if="edit">' + 
-				    '<button class="edit" :disabled="disabled" @click.prevent="saveBlock">{{ $t(\'save\') }}</button>' +
-				    '<button class="cancel" :disabled="disabled" @click.prevent="switchToPreviewMode">{{ $t(\'cancel\') }}</button>' +
+				    '<button class="edit" :disabled="disabled" @click.prevent="saveBlock">{{ \'save\'|translate }}</button>' +
+				    '<button class="cancel" :disabled="disabled" @click.prevent="switchToPreviewMode">{{ \'cancel\'|translate }}</button>' +
 				   '</div>' +
 				  '</div>' +
 				  '<div :class="preview" ref="preview"><slot><format-component></format-component></slot></div>' +
@@ -938,25 +938,25 @@ const tableComponent = Vue.component('table-component', {
 						'<tr v-for="(row, rowindex) in table">' +
 							'<td v-if="rowindex === 0" v-for="(value,colindex) in row" contenteditable="false" class="noteditable" @click="switchcolumnbar(value)">{{value}} ' +
 							  '<div v-if="columnbar === value" class="columnaction">' + 
-							     '<div class="actionline" @click="addrightcolumn(value)">{{ $t(\'add right column\') }}</div>' +
-								 '<div class="actionline" @click="addleftcolumn(value)">{{ $t(\'add left column\') }}</div>' +
-								 '<div class="actionline" @click="deletecolumn(value)">{{ $t(\'delete column\') }}</div>' +
+							     '<div class="actionline" @click="addrightcolumn(value)">{{ \'add right column\'|translate }}</div>' +
+								 '<div class="actionline" @click="addleftcolumn(value)">{{ \'add left column\'|translate }}</div>' +
+								 '<div class="actionline" @click="deletecolumn(value)">{{ \'delete column\'|translate }}</div>' +							
 							  '</div>' +
 							'</td>' +
 							'<th v-if="rowindex === 1" v-for="(value,colindex) in row" :contenteditable="colindex !== 0 ? true : false" @click="switchrowbar(value)" @blur="updatedata($event,colindex,rowindex)" :class="colindex !== 0 ? editable : noteditable">' + 
 							 '<div v-if="colindex === 0 && rowbar === value" class="rowaction">' + 
-							     '<div class="actionline" @click="addaboverow(value)">{{ $t(\'add row above\') }}</div>' +
-								 '<div class="actionline" @click="addbelowrow(value)">{{ $t(\'add row below\') }}</div>' +
-								 '<div class="actionline" @click="deleterow(value)">{{ $t(\'delete row\') }}</div>' +
+ 								 '<div class="actionline" @click="addaboverow(value)">{{ \'add row above\'|translate }}</div>' +
+								 '<div class="actionline" @click="addbelowrow(value)">{{ \'add row below\'|translate }}</div>' +
+								 '<div class="actionline" @click="deleterow(value)">{{ \'delete row\'|translate }}</div>' +						
 							  '</div>' + 
-							'{{ $t(value) }}</th>' +
+							'{{ value|translate }}</th>' +
 							'<td v-if="rowindex > 1" v-for="(value,colindex) in row" :contenteditable="colindex !== 0 ? true : false" @click="switchrowbar(value)" @blur="updatedata($event,colindex,rowindex)" :class="colindex !== 0 ? editable : noteditable">' + 
 							 '<div v-if="colindex === 0 && rowbar === value" class="rowaction">' + 
-							     '<div class="actionline" @click="addaboverow(value)">{{ $t(\'add row above\') }}</div>' +
-								 '<div class="actionline" @click="addbelowrow(value)">{{ $t(\'add row below\') }}</div>' +
-								 '<div class="actionline" @click="deleterow(value)">{{ $t(\'delete row\') }}</div>' +
+  								 '<div class="actionline" @click="addaboverow(value)">{{ \'add row above\'|translate }}</div>' +
+								 '<div class="actionline" @click="addbelowrow(value)">{{ \'add row below\'|translate }}</div>' +
+								 '<div class="actionline" @click="deleterow(value)">{{ \'delete row\'|translate }}</div>' +
 							  '</div>' +
-							'{{ $t(value) }}</td>' +
+							'{{ value|translate }}</td>' +
 						'</tr>' +
 					'</tbody>' +
 				'</table>' +
@@ -1135,13 +1135,13 @@ const definitionComponent = Vue.component('definition-component', {
 				'<draggable v-model="definitionList" :animation="150" @end="moveDefinition">' +
   			    '<div class="definitionRow" v-for="(definition, dindex) in definitionList" :key="definition.id">' +
 						'<svg class="icon icon-arrows-v"><use xlink:href="#icon-arrows-v"></use></svg>' +
-						'<input type="text" class="definitionTerm" v-bind:placeholder="$t(\'term\')" :value="definition.term" :disabled="disabled" @input="updateterm($event,dindex)" @blur="updateMarkdown">' +
+						'<input type="text" class="definitionTerm" v-bind:placeholder="\'term\'|translate" :value="definition.term" :disabled="disabled" @input="updateterm($event,dindex)" @blur="updateMarkdown">' +
 		  		  '<svg class="icon icon-dots-two-vertical"><use xlink:href="#icon-dots-two-vertical"></use></svg>' + 
-	  			  '<textarea class="definitionDescription" v-bind:placeholder="$t(\'description\')" v-html="definition.description" :disabled="disabled" @input="updatedescription($event, dindex)" @blur="updateMarkdown"></textarea>' +
+	  			  '<textarea class="definitionDescription" v-bind:placeholder="\'description\'|translate" v-html="definition.description" :disabled="disabled" @input="updatedescription($event, dindex)" @blur="updateMarkdown"></textarea>' +
 					  '<button class="delDL" @click.prevent="deleteDefinition(dindex)"><svg class="icon icon-minus"><use xlink:href="#icon-minus"></use></svg></button>' +
 				  '</div>' +
 				'</draggable>' +
-				'<button class="addDL" @click.prevent="addDefinition()"><svg class="icon icon-plus"><use xlink:href="#icon-plus"></use></svg> {{ $t(\'add definition\') }}</button>' +
+				'<button class="addDL" @click.prevent="addDefinition()"><svg class="icon icon-plus"><use xlink:href="#icon-plus"></use></svg> {{ \'add definition\'|translate }}</button>' +
 				'<div v-if="load" class="loadwrapper"><span class="load"></span></div>' +
 				'</div>',
 	mounted: function(){
@@ -1211,8 +1211,8 @@ const videoComponent = Vue.component('video-component', {
 	props: ['compmarkdown', 'disabled', 'load'],
 	template: '<div class="video dropbox">' +
 				'<div class="contenttype"><svg class="icon icon-play"><use xlink:href="#icon-play"></use></svg></div>' +
-				'<label for="video">{{ $t(\'Link to video\') }}: </label><input type="url" ref="markdown" placeholder="https://www.youtube.com/watch?v=" :value="compmarkdown" :disabled="disabled" @input="updatemarkdown">' +
-				'<div v-if="load" class="loadwrapper"><span class="load"></span></div>' +
+					'<label for="video">{{ \'Link to video\'|translate }}: </label><input type="url" ref="markdown" placeholder="https://www.youtube.com/watch?v=" :value="compmarkdown" :disabled="disabled" @input="updatemarkdown">' +
+					'<div v-if="load" class="loadwrapper"><span class="load"></span></div>' +
 				'</div>',
 	mounted: function(){
 
@@ -1242,7 +1242,7 @@ const imageComponent = Vue.component('image-component', {
 				'<input type="hidden" ref="markdown" :value="compmarkdown" :disabled="disabled" @input="updatemarkdown" />' +
 				'<div class="imageupload">' + 
 					'<input type="file" name="image" accept="image/*" class="input-file" @change="onFileChange( $event )" /> ' +
-					'<p><svg class="icon icon-upload baseline"><use xlink:href="#icon-upload"></use></svg> {{ $t(\'drag a picture or click to select\') }}</p>' +
+					'<p><svg class="icon icon-upload baseline"><use xlink:href="#icon-upload"></use></svg> {{ \'drag a picture or click to select\'|translate }}</p>' +
 				'</div>' +
 				'<button class="imageselect" @click.prevent="openmedialib()"><svg class="icon icon-image baseline"><use xlink:href="#icon-image"></use></svg> select from medialib</button>' +
 				'<transition name="fade-editor">' +
@@ -1254,12 +1254,12 @@ const imageComponent = Vue.component('image-component', {
 				'<img class="uploadPreview" :src="imgpreview" />' +
 				'<div v-if="load" class="loadwrapper"><span class="load"></span></div>' +
 				'<div class="imgmeta" v-if="imgmeta">' +
-				'<label for="imgalt">{{ $t(\'Alt-Text\') }}: </label><input name="imgalt" type="text" placeholder="alt" @input="createmarkdown" v-model="imgalt" max="100" />' +
-				'<label for="imgtitle">{{ $t(\'Title\') }}: </label><input name="imgtitle" type="text" placeholder="title" v-model="imgtitle" @input="createmarkdown" max="64" />' +
-				'<label for="imgcaption">{{ $t(\'Caption\') }}: </label><input title="imgcaption" type="text" placeholder="caption" v-model="imgcaption" @input="createmarkdown" max="140" />' +
-				'<label for="imgurl">{{ $t(\'Link\') }}: </label><input title="imgurl" type="url" placeholder="url" v-model="imglink" @input="createmarkdown" />' +
-				'<label for="imgclass">{{ $t(\'Class\') }}: </label><select title="imgclass" v-model="imgclass" @change="createmarkdown"><option value="center">{{ $t(\'Center\') }}</option><option value="left">{{ $t(\'Left\') }}</option><option value="right">{{ $t(\'Right\') }}</option></select>' +
-				'<input title="imgid" type="hidden" placeholder="id" v-model="imgid" @input="createmarkdown" max="140" />' +
+					'<label for="imgalt">{{ \'Alt-Text\'|translate }}: </label><input name="imgalt" type="text" placeholder="alt" @input="createmarkdown" v-model="imgalt" max="100" />' +
+					'<label for="imgtitle">{{ \'Title\'|translate }}: </label><input name="imgtitle" type="text" placeholder="title" v-model="imgtitle" @input="createmarkdown" max="64" />' +
+					'<label for="imgcaption">{{ \'Caption\'|translate }}: </label><input title="imgcaption" type="text" placeholder="caption" v-model="imgcaption" @input="createmarkdown" max="140" />' +
+					'<label for="imgurl">{{ \'Link\'|translate }}: </label><input title="imgurl" type="url" placeholder="url" v-model="imglink" @input="createmarkdown" />' +
+					'<label for="imgclass">{{ \'Class\'|translate }}: </label><select title="imgclass" v-model="imgclass" @change="createmarkdown"><option value="center">{{ \'Center\'|translate }}</option><option value="left">{{ \'Left\'|translate }}</option><option value="right">{{ \'Right\'|translate }}</option></select>' +
+					'<input title="imgid" type="hidden" placeholder="id" v-model="imgid" @input="createmarkdown" max="140" />' +
 				'</div></div>',
 	data: function(){
 		return {
@@ -1534,7 +1534,7 @@ const fileComponent = Vue.component('file-component', {
 				'<input type="hidden" ref="markdown" :value="compmarkdown" :disabled="disabled" @input="updatemarkdown" />' +
 				'<div class="imageupload">' + 
 					'<input type="file" accept="*" name="file" class="input-file" @change="onFileChange( $event )" /> ' +
-					'<p><svg class="icon icon-upload baseline"><use xlink:href="#icon-upload"></use></svg> {{ $t(\'upload file\') }}</p>' +
+					'<p><svg class="icon icon-upload baseline"><use xlink:href="#icon-upload"></use></svg> {{ \'upload file\'|translate }}</p>' +
 				'</div>' +
 				'<button class="imageselect" @click.prevent="openmedialib()"><svg class="icon icon-paperclip baseline"><use xlink:href="#icon-paperclip"></use></svg> select from medialib</button>' +
 				'<transition name="fade-editor">' +
@@ -1545,7 +1545,7 @@ const fileComponent = Vue.component('file-component', {
 				'<div class="contenttype"><svg class="icon icon-paperclip"><use xlink:href="#icon-paperclip"></use></svg></div>' +
 				'<div v-if="load" class="loadwrapper"><span class="load"></span></div>' +
 				'<div class="imgmeta relative" v-if="filemeta">' +
-				  '<label for="filetitle">{{ $t(\'Title\') }}: </label>' + 
+				  '<label for="filetitle">{{ \'Title\'|translate }}: </label>' + 
 				  '<input name="filetitle" type="text" placeholder="Add a title for the download-link" v-model="filetitle" @input="createmarkdown" max="64" />' + 
 				  '<input title="fileid" type="hidden" placeholder="id" v-model="fileid" @input="createmarkdown" max="140" />' +
 				'</div></div>',
@@ -1725,7 +1725,7 @@ const medialib = Vue.component('medialib', {
 	template: '<div class="medialib">' +
 				'<div class="mt3">' +
 					'<div class="w-30 dib v-top ph4 pv3">' +
-						'<button class="f6 link br0 ba ph3 pv2 mb2 w-100 dim white bn bg-tm-red" @click.prevent="closemedialib()">{{ $t(\'close library\') }}</button>' +
+						'<button class="f6 link br0 ba ph3 pv2 mb2 w-100 dim white bn bg-tm-red" @click.prevent="closemedialib()">{{ \'close library\'|translate }}</button>' +	
 	                    '<div class="w-100 relative">' + 
 	                    	'<div><input v-model="search" class="w-100 border-box pa2 mb3 br0 ba b--light-silver"><svg class="icon icon-search absolute top-1 right-1 pa1 gray"><use xlink:href="#icon-search"></use></svg></div>' +
 	                    '</div>' + 
@@ -1895,13 +1895,16 @@ const medialib = Vue.component('medialib', {
 			var searchimages = this.search;
             var filteredImages = {};
             var images = this.imagedata;
-            Object.keys(images).forEach(function(key) {
-                var searchindex = key + ' ' + images[key].name;
-                if(searchindex.toLowerCase().indexOf(searchimages.toLowerCase()) !== -1)
-                {
-                    filteredImages[key] = images[key];
-                }
-            });
+            if(images)
+            {
+	            Object.keys(images).forEach(function(key) {
+	                var searchindex = key + ' ' + images[key].name;
+	                if(searchindex.toLowerCase().indexOf(searchimages.toLowerCase()) !== -1)
+	                {
+	                    filteredImages[key] = images[key];
+	                }
+	            });
+            }
             return filteredImages;
         },
         filteredFiles() {
@@ -1909,13 +1912,16 @@ const medialib = Vue.component('medialib', {
 			var searchfiles = this.search;
             var filteredFiles = {};
             var files = this.filedata;
-            Object.keys(files).forEach(function(key) {
-                var searchindex = key + ' ' + files[key].name;
-                if(searchindex.toLowerCase().indexOf(searchfiles.toLowerCase()) !== -1)
-                {
-                    filteredFiles[key] = files[key];
-                }
-            });
+            if(files)
+            {
+	            Object.keys(files).forEach(function(key) {
+	                var searchindex = key + ' ' + files[key].name;
+	                if(searchindex.toLowerCase().indexOf(searchfiles.toLowerCase()) !== -1)
+	                {
+	                    filteredFiles[key] = files[key];
+	                }
+	            });
+            }
             return filteredFiles;
         }        
     },	
@@ -2217,12 +2223,7 @@ for(var i = 0; i < formatConfig.length; i++)
 	}
 }
 
-let editor = new Vue({
-  i18n: new VueI18n({
-    locale: language,
-    messages: vuejsLabels
-  }),
-  
+let editor = new Vue({  
     delimiters: ['${', '}'],
 	el: '#blox',
 /*	components: componentList, */

File diff suppressed because it is too large
+ 0 - 5
system/author/js/vue-i18n.min.js


+ 4 - 4
system/author/layouts/layout.twig

@@ -17,8 +17,8 @@
 		<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{{ base_url }}/system/author/img/apple-touch-icon-152x152.png" />
 		
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/normalize.css" />
-		<link rel="stylesheet" href="{{ base_url }}/system/author/css/tachyons.min.css?20200405" />
-		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200405" />
+		<link rel="stylesheet" href="{{ base_url }}/system/author/css/tachyons.min.css?20200420" />
+		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200420" />
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/color-picker.min.css" />
 	</head>
 	<body>
@@ -56,7 +56,7 @@
 			</article>
 			<footer></footer>
 		</div>
-		<script src="{{ base_url }}/system/author/js/color-picker.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/author.js?20200405"></script>
+		<script src="{{ base_url }}/system/author/js/color-picker.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/author.js?20200420"></script>
 	</body>
 </html>

+ 2 - 2
system/author/layouts/layoutAuth.twig

@@ -18,7 +18,7 @@
 		<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{{ base_url }}/system/author/img/apple-touch-icon-152x152.png" />
 				
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/normalize.css" />
-		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200405" />
+		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200420" />
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/color-picker.min.css" />
 	</head>
 	<body>
@@ -54,6 +54,6 @@
 			{% block content %}{% endblock %}
 
 		</div>
-		<script src="{{ base_url }}/system/author/js/auth.js?20200405"></script>
+		<script src="{{ base_url }}/system/author/js/auth.js?20200420"></script>
 	</body>
 </html>

+ 1 - 1
system/author/layouts/layoutBlank.twig

@@ -17,7 +17,7 @@
 		<link rel="apple-touch-icon-precomposed" sizes="152x152" href="{{ base_url }}/system/author/img/apple-touch-icon-152x152.png" />
 
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/normalize.css" />
-		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200405" />
+		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200420" />
 	</head>
 	<body>
 		<svg style="position: absolute; width: 0; height: 0; overflow: hidden" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">

+ 14 - 15
system/author/layouts/layoutBlox.twig

@@ -18,7 +18,7 @@
 		
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/normalize.css" />
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/tachyons.min.css" />
-		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200405" />
+		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200420" />
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/color-picker.min.css" />
 
 		{{ assets.renderCSS() }}
@@ -196,28 +196,27 @@
 			const myaxios = axios.create();
 			myaxios.defaults.baseURL =  "{{ base_url }}";
 		</script>
-		<script src="{{ base_url }}/system/author/js/typemillutils.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vue.min.js?20200405"></script>
-    	<script src="{{ base_url }}/system/author/js/vue-i18n.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/autosize.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/author.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vue-publishcontroller.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vue-blox-config.js?20200405"></script>
+		<script src="{{ base_url }}/system/author/js/typemillutils.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vue.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/autosize.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/author.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vue-publishcontroller.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vue-blox-config.js?20200420"></script>
 		<script>
 			let formatConfig = {{ settings.formats|json_encode() }};
       		let language = {{ settings.language|json_encode() }};
-      		let vuejsLabels = {{ settings.vuejsLabels|json_encode() }};
+      		let labels = {{ settings.labels|json_encode() }};
       		let navigation = {{ navigation|json_encode() }};
 		</script>
 
 		{{ assets.renderEditorJS() }}
 
-		<script src="{{ base_url }}/system/author/js/vue-blox.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vue-posts.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/sortable.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vuedraggable.umd.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vue-navi.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vue-meta.js?20200405"></script>
+		<script src="{{ base_url }}/system/author/js/vue-blox.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vue-posts.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/sortable.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vuedraggable.umd.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vue-navi.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vue-meta.js?20200420"></script>
 
 		{{ assets.renderJS() }}
 

+ 12 - 12
system/author/layouts/layoutEditor.twig

@@ -18,7 +18,7 @@
 
 		
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/normalize.css" />
-		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200405" />
+		<link rel="stylesheet" href="{{ base_url }}/system/author/css/style.css?20200420" />
 		<link rel="stylesheet" href="{{ base_url }}/system/author/css/color-picker.min.css" />
 
 		{{ assets.renderCSS() }}
@@ -83,29 +83,29 @@
 			</article>
 			<footer></footer>
 		</div>
-		<script src="{{ base_url }}/system/author/js/axios.min.js?20200405"></script>
+		<script src="{{ base_url }}/system/author/js/axios.min.js?20200420"></script>
 		<script>
 			const myaxios = axios.create();
 			myaxios.defaults.baseURL =  "{{ base_url }}";
 		</script>		
-		<script src="{{ base_url }}/system/author/js/vue.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/autosize.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/sortable.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vuedraggable.umd.min.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/author.js?20200405"></script>
+		<script src="{{ base_url }}/system/author/js/vue.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/autosize.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/sortable.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vuedraggable.umd.min.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/author.js?20200420"></script>
 
 	    <script>
     	  	let language = {{ settings.language|json_encode() }};
-          let labels = {{ settings.labels|json_encode() }};
+          	let labels = {{ settings.labels|json_encode() }};
       		let navigation = {{ navigation|json_encode() }};
 		</script>
     
 		{{ assets.renderEditorJS() }}		
 		
-		<script src="{{ base_url }}/system/author/js/vue-publishcontroller.js?20200405"></script>		
-		<script src="{{ base_url }}/system/author/js/vue-editor.js?20200405"></script>
-		<script src="{{ base_url }}/system/author/js/vue-meta.js?20200405"></script>		
-		<script src="{{ base_url }}/system/author/js/vue-navi.js?20200405"></script>
+		<script src="{{ base_url }}/system/author/js/vue-publishcontroller.js?20200420"></script>		
+		<script src="{{ base_url }}/system/author/js/vue-editor.js?20200420"></script>
+		<script src="{{ base_url }}/system/author/js/vue-meta.js?20200420"></script>		
+		<script src="{{ base_url }}/system/author/js/vue-navi.js?20200420"></script>
 
 		{{ assets.renderJS() }}
 		

+ 1 - 1
system/author/partials/fields.twig

@@ -62,7 +62,7 @@
 
 	{% endif %}
 
-	{% if field.description %}<div class="description">{{field.description}}</div>{% endif %}
+	{% if field.description %}<div class="description">{{ __(field.description) }}</div>{% endif %}
 	
 	{% if errors[itemName][field.name] %}
 		<span class="error">{{ errors[itemName][field.name] | first }}</span>

Some files were not shown because too many files changed in this diff