diff --git a/.hgignore b/.hgignore index cf572d1b2..1656d0fd4 100644 --- a/.hgignore +++ b/.hgignore @@ -10,3 +10,4 @@ cache dist-apps build nw-cache +nwbuilder-cache \ No newline at end of file diff --git a/README.md b/README.md index eb0175544..3387b88c7 100644 --- a/README.md +++ b/README.md @@ -27,12 +27,12 @@ Run `npm start` to begin serving a development version of Twine to http://localhost:8080. This server will automatically update with changes you make. You can also create a dev build at `build/` with `npm run build`. -`npm lint` and `npm test` will lint and test the source code respectively. +`npm run lint` and `npm test` will lint and test the source code respectively. -`npm pot` will create a POT template file for localization at +`npm run pot` will create a POT template file for localization at `src/locale/po/template.pot`. See Localization below for more information. -`npm nw` will build NW.js-based apps in `dist/nw`. In order to build Windows +`npm run nw` will build NW.js-based apps in `dist/nw`. In order to build Windows apps on OS X or Linux, you will need to have [Wine](https://www.winehq.org/) and [makensis](http://nsis.sourceforge.net/) installed. diff --git a/karma.conf.js b/karma.conf.js index 557708c8e..b582bec84 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,20 +1,13 @@ 'use strict'; let webpackConfig = require('./webpack.config.js'); -/* -Clear entry point re: -http://mike-ward.net/2015/09/07/tips-on-setting-up-karma-testing-with-webpack/. -*/ - -webpackConfig.entry = {}; - /* Add Babel loader since PhantomJS doesn't speak ES6. */ -webpackConfig.module.loaders.push({ +webpackConfig.module.rules.push({ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader', - query: { + options: { presets: ['es2015'] } }); @@ -25,6 +18,7 @@ module.exports = function(config) { files: ['src/**/*.spec.js'], frameworks: ['mocha'], preprocessors: { 'src/**/*.spec.js': ['webpack'] }, + reporters: ['mocha'], singleRun: true, webpack: webpackConfig, webpackMiddleware: { noInfo: true } diff --git a/package.json b/package.json index 8fd1a3319..3f1680288 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Twine", - "version": "2.1.0", + "version": "2.1.1", "author": "Chris Klimas ", "description": "a GUI for creating nonlinear stories", "license": "GPL-3.0", @@ -18,9 +18,9 @@ }, "scripts": { "build": "webpack -d --progress", - "build:release": "webpack -p --progress --config webpack.config.release.js; webpack -p --progress --config webpack.config.cdn.js", + "build:release": "webpack -p --progress --config webpack.config.release.js && webpack -p --progress --config webpack.config.cdn.js", "clean": "rimraf build/ dist/", - "lint": "eslint src/; jscs src/; exit 0", + "lint": "eslint src/ && jscs src/ || exit 0", "nw": "node scripts/build-nw.js", "package": "npm run build:release && npm run nw && node scripts/package.js", "pot": "node scripts/extract-pot.js", @@ -29,16 +29,20 @@ "watch": "webpack -d --progress --watch" }, "dependencies": { + "babel-loader": "^6.2.10", "blob-polyfill": "^1.0.20150320", "browser-saveas": "^1.0.0", "codemirror": "^5.5.0", "core-js": "^2.4.0", - "dom-event-special": "^0.1.7", + "ejs-html-loader": "^2.0.2", + "extract-text-webpack-plugin": "^2.0.0-rc.3", "fastclick": "^1.0.6", "font-awesome": "^4.3.0", + "html-webpack-plugin": "^2.28.0", "jed": "^1.1.0", "jquery": "^2.1.4", "jszip": "^2.5.0", + "karma-webpack": "^1.8.1", "mkdirp": "^0.5.1", "moment": "^2.10.3", "osenv": "^0.1.3", @@ -51,7 +55,9 @@ "underscore": "^1.8.3", "vue": "^1.0.18", "vue-router": "^0.7.13", - "vuex": "^0.6.3" + "vuex": "^0.6.3", + "webpack": "^2.2.1", + "webpack-dev-server": "^1.16.3" }, "devDependencies": { "acorn": "^4.0.3", @@ -79,12 +85,14 @@ "karma": "^1.3.0", "karma-cli": "^1.0.1", "karma-mocha": "^1.3.0", + "karma-mocha-reporter": "^2.2.2", "karma-phantomjs-launcher": "^1.0.2", "karma-webpack": "^1.8.0", "less": "^2.7.1", "less-loader": "^2.2.3", "less-plugin-autoprefix": "^1.5.1", "less-plugin-clean-css": "^1.5.1", + "mocha": "^3.2.0", "nw-builder": "^3.1.2", "po2json": "^0.4.5", "pofile": "^1.0.2", @@ -93,7 +101,7 @@ "sinon": "^2.0.0-pre.4", "style-loader": "^0.13.1", "url-loader": "^0.5.7", - "webpack": "^1.13.3", + "webpack": "^2.2.0", "webpack-dev-server": "^1.16.2", "yargs": "^6.6.0" } diff --git a/src/data/actions.js b/src/data/actions.js index e378c2ad5..cd2947e7e 100644 --- a/src/data/actions.js +++ b/src/data/actions.js @@ -192,7 +192,7 @@ const actions = module.exports = { */ const oldNameEscaped = oldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - const newNameEscaped = newName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + const newNameEscaped = newName.replace(/\$/g, '$$$$'); const simpleLinkRe = new RegExp( '\\[\\[' + oldNameEscaped + '(\\]\\[.*?)?\\]\\]', @@ -256,14 +256,42 @@ const actions = module.exports = { crossDomain: true }) .done(props => { - if (store.state.storyFormat.formats.some( - format => format.name === props.name)) { + const pVer = semverUtils.parse(props.version); + const pMinor = parseInt(pVer.minor); + const pPatch = parseInt(pVer.patch); + + /* + Check for an identical version. + */ + + if (store.state.storyFormat.formats.some(current => { + return existing.version === props.version; + })) { + reject(new Error( + locale.say('this story format is already installed') + )); + return; + } + + /* + Check for a more recent version. + */ + + if (store.state.storyFormat.formats.some(current => { + const cVer = semverUtils.parse(current.version); + + return current.name === props.name && + cVer.major === pVer.major && + parseInt(cVer.minor) >= pMinor && + parseInt(cVer.patch) >= pPatch; + })) { reject(new Error( locale.say( - 'a story format named “%s” already exists', + 'a more recent version of the story format “%s” is already installed', props.name ) )); + return; } const format = { @@ -300,15 +328,17 @@ const actions = module.exports = { const format = formats.reduce((prev, current) => { const pVer = semverUtils.parse(prev.version); + const pMinor = parseInt(pVer.minor); + const pPatch = parseInt(pVer.patch); const cVer = semverUtils.parse(current.version); + const cMinor = parseInt(cVer.minor); + const cPatch = parseInt(cVer.patch); - if (cVer.major === pVer.major && (parseInt(cVer.minor) > - parseInt(pVer.minor) || parseInt(cVer.patch) > - parseInt(pVer.minor))) { - return current; + if (cMinor <= pMinor && cPatch <= pPatch) { + return prev; } - return previous; + return current; }); if (!format) { @@ -391,8 +421,8 @@ const actions = module.exports = { }, { name: 'SugarCube', - url: 'story-formats/sugarcube-2.12.1/format.js', - version: '2.12.1', + url: 'story-formats/sugarcube-2.14.0/format.js', + version: '2.14.0', userAdded: false } ]; @@ -426,6 +456,50 @@ const actions = module.exports = { { name: 'Paperthin', version: '1.0.0' } ); } + + /* + Delete any outdated formats. + */ + + const latestVersions = {}; + + store.state.storyFormat.formats.forEach(format => { + if (!format.version) { + return; + } + + const v = semverUtils.parse(format.version); + + if (latestVersions[format.name]) { + const existing = latestVersions[format.name][v.major]; + + if (!existing || + v.minor > existing.minor || + v.minor === existing.minor && v.patch > existing.patch) { + latestVersions[format.name][v.major] = v; + } + } + else { + latestVersions[format.name] = {}; + latestVersions[format.name][v.major] = v; + } + }); + + store.state.storyFormat.formats.forEach(format => { + if (!format.version) { + return; + } + + const v = semverUtils.parse(format.version); + + if (v.version !== latestVersions[format.name][v.major].version) { + console.warn( + `Deleting outdated story format ${format.name} ` + + v.version + ); + actions.deleteFormat(store, format.id); + } + }); }, /* @@ -463,7 +537,7 @@ const actions = module.exports = { actions.updateStory( store, story.id, - { storyFormat: 'SugarCube', storyFormatVersion: '2.12.1' } + { storyFormat: 'SugarCube', storyFormatVersion: '2.14.0' } ); } else if (!story.storyFormatVersion) { diff --git a/src/data/actions.spec.js b/src/data/actions.spec.js index d83469520..cf7fa8815 100644 --- a/src/data/actions.spec.js +++ b/src/data/actions.spec.js @@ -4,7 +4,7 @@ const actions = require('./actions'); describe('actions data module', () => { const props = { fake: true }; - const fakeId = fakeId; + const fakeId = 'not-a-real-id'; let store; beforeEach(() => { @@ -146,9 +146,9 @@ describe('actions data module', () => { expect(created['SugarCube-1.0.35']).to.exist; expect(created['SugarCube-1.0.35'].url).to.equal('story-formats/sugarcube-1.0.35/format.js'); expect(created['SugarCube-1.0.35'].userAdded).to.be.false; - expect(created['SugarCube-2.12.1']).to.exist; - expect(created['SugarCube-2.12.1'].url).to.equal('story-formats/sugarcube-2.12.1/format.js'); - expect(created['SugarCube-2.12.1'].userAdded).to.be.false; + expect(created['SugarCube-2.14.0']).to.exist; + expect(created['SugarCube-2.14.0'].url).to.equal('story-formats/sugarcube-2.14.0/format.js'); + expect(created['SugarCube-2.14.0'].userAdded).to.be.false; }); it('sets default formats with repairFormats()', () => { @@ -179,19 +179,19 @@ describe('actions data module', () => { pref: {}, storyFormat: { formats: [ - { name: 'Test' } + { id: fakeId, name: 'Test' } ] } } }; actions.repairFormats(formatsStore); - expect(formatsStore.dispatch.calledWith('DELETE_FORMAT')).to.be.true; + expect(formatsStore.dispatch.calledWith('DELETE_FORMAT', fakeId)).to.be.true; }); it('does not duplicate formats with repairFormats()', () => { let formatsStore = { - dispatch: spy(), + dispatch: spy().withArgs('CREATE_FORMAT'), state: { pref: {}, storyFormat: { @@ -201,14 +201,34 @@ describe('actions data module', () => { { name: 'Paperthin', version: '1.0.0' }, { name: 'Snowman', version: '1.3.0' }, { name: 'SugarCube', version: '1.0.35' }, - { name: 'SugarCube', version: '2.12.1' } + { name: 'SugarCube', version: '2.14.0' } ] } } }; actions.repairFormats(formatsStore); - expect(formatsStore.dispatch.calledWith('CREATE_FORMAT')).to.be.false; + expect(formatsStore.dispatch.calledOnce).to.be.false; + }); + + it('deletes outdated story format versions with repairFormats()', () => { + let formatsStore = { + dispatch: spy(), + state: { + pref: {}, + storyFormat: { + formats: [ + { name: 'Custom', version: '1.2.3' }, + { id: fakeId, name: 'Custom', version: '1.2.1' }, + { name: 'Custom', version: '2.0.0' } + ] + } + } + }; + + formatsStore.dispatch.withArgs('DELETE_FORMAT', fakeId); + actions.repairFormats(formatsStore); + expect(formatsStore.dispatch.withArgs('DELETE_FORMAT', fakeId).calledOnce).to.be.true; }); it('sets default formats on stories with repairStories()', () => { @@ -267,7 +287,7 @@ describe('actions data module', () => { expect(storiesStore.dispatch.calledWith( 'UPDATE_STORY', 'also-not-a-real-id', - { storyFormat: 'SugarCube', storyFormatVersion: '2.12.1' } + { storyFormat: 'SugarCube', storyFormatVersion: '2.14.0' } )).to.be.true; }); @@ -367,4 +387,76 @@ describe('actions data module', () => { actions.createNewlyLinkedPassages(storyStore, fakeId, fakeId, '[[Test 2]]'); expect(storyStore.dispatch.called).to.be.false; }); + + it('updates links with changeLinksInStory()', () => { + let storyStore = { + dispatch: spy(), + state: { + story: { + stories: [ + { + id: fakeId, + passages: [ + { + id: fakeId, + name: 'Test', + text: '[[Test 2]]' + } + ] + } + ] + } + } + }; + + actions.changeLinksInStory(storyStore, fakeId, 'Test 2', 'Test 2 Changed'); + + const firstCall = storyStore.dispatch.getCall(0); + expect(firstCall.args[0]).to.equal('UPDATE_PASSAGE_IN_STORY'); + expect(firstCall.args[1]).to.equal(fakeId); + expect(firstCall.args[2]).to.equal(fakeId); + expect(firstCall.args[3].text).to.equal('[[Test 2 Changed]]'); + }); + + it('handles regular expression characters with changeLinksInStory()', () => { + let storyStore = { + dispatch: spy(), + state: { + story: { + stories: [ + { + id: fakeId, + passages: [ + { + id: fakeId, + name: 'Test', + text: '[[.]]' + }, + { + id: fakeId + '2', + name: 'Test 2', + text: '[[2]]' + } + ] + } + ] + } + } + }; + + actions.changeLinksInStory(storyStore, fakeId, '.', 'Changed'); + actions.changeLinksInStory(storyStore, fakeId, '2', '$'); + + const firstCall = storyStore.dispatch.getCall(0); + expect(firstCall.args[0]).to.equal('UPDATE_PASSAGE_IN_STORY'); + expect(firstCall.args[1]).to.equal(fakeId); + expect(firstCall.args[2]).to.equal(fakeId); + expect(firstCall.args[3].text).to.equal('[[Changed]]'); + + const secondCall = storyStore.dispatch.getCall(1 ); + expect(secondCall.args[0]).to.equal('UPDATE_PASSAGE_IN_STORY'); + expect(secondCall.args[1]).to.equal(fakeId); + expect(secondCall.args[2]).to.equal(fakeId + '2'); + expect(secondCall.args[3].text).to.equal('[[$]]'); + }); }); diff --git a/src/data/link-parser.js b/src/data/link-parser.js index 68b2e63d6..f5d3f50ba 100644 --- a/src/data/link-parser.js +++ b/src/data/link-parser.js @@ -2,70 +2,71 @@ // e.g. those pointing to other passages in a story, not to an external web // site. -module.exports = (text, internalOnly) => { - // The top level regular expression to catch links -- i.e. [[link]]. - - const matches = text.match(/\[\[.*?\]\]/g); - - if (!matches) { - return []; - } - - // Links we've already found, to ensure the array we return contains only - // unique links. - - const found = {}; +'use strict'; - // A helper function for dealing with arrow links, e.g. [[text->passage]]. +// The top level regular expression to catch links -- i.e. [[link]]. +const extractLinkTags = (text) => text.match(/\[\[.*?\]\]/g) || []; - const arrowReplacer = (a, b, c, d) => c || d; +// Links _not_ starting with a protocol, e.g. abcd://. +const internalLinks = link => !/^\w+:\/\/\/?\w/i.test(link); - let result = matches.reduce((links, match) => { - // The link matching regexps ignore setter components, should - // they exist. +const nonEmptyLinks = link => link !== ''; - const link = match +// Identifies values that appear only once in the arry +const uniques = (v, i, a) => a.indexOf(v) === a.lastIndexOf(v); - // Arrow links: - // [[display text->link]] format - // [[link<-display text]] format - // - // Arrow links, with setter component: - // [[display text->link][...]] format - // [[link<-display text][...]] format - // - // This regexp will interpret the rightmost '->' and the leftmost - // '<-' as the divider. +// Setter is the second [] block if exists +const removeSetters = link => { + const noSetter = getField(link, '][', 0); + return typeof(noSetter) !== 'undefined' ? noSetter : link; +} - .replace(/\[\[(?:([^\]]*)\->|([^\]]*?)<\-)([^\]]*)(?:\]\[.*?)?\]\]/g, arrowReplacer) +const removeEnclosingBrackets = link => link.substr(2, link.length - 4); - // TiddlyWiki links: - // [[display text|link]] format - // - // TiddlyWiki links, with setter component: - // [[display text|link][...]] format +// Split the link by the separator and return the field in the +// given index. Negative indices start from the end of the array. +const getField = (link, separator, index) => { + const fields = link.split(separator); + if (fields.length === 1) { + // Separator not present + return undefined; + } + return (index < 0) ? fields[fields.length + index] : fields[index]; +}; - .replace(/\[\[([^\|\]]*?)\|([^\|\]]*)?(?:\]\[.*?)?\]\]/g, '$2') +const extractLink = (tagContent) => { - // [[link]] format, and [[link][...]] format, with setter component + // Arrow links: + // [[display text->link]] format + // [[link<-display text]] format + // + // Interpret the rightmost '->' and the leftmost '<-' as the divider. - .replace(/\[\[|(?:\]\[.*?)?\]\]/g,''); + return getField(tagContent, '->', -1) || + getField(tagContent, '<-', 0) || - // Catch empty links and links we've already found. + // TiddlyWiki links: + // [[display text|link]] format + getField(tagContent, '|', -1) || + + // [[link]] format + tagContent; +}; + +module.exports = (text, internalOnly) => { - if (link !== '' && found[link] === undefined) { - found[link] = true; - links.push(link); - } + // Link matching regexps ignore setter components, should they exist. - return links; - }, []); + let result = extractLinkTags(text) + .map(removeEnclosingBrackets) + .map(removeSetters) + .map(extractLink) + .filter(nonEmptyLinks) + .filter(uniques); if (internalOnly) { - // Remove any link starting with a protocol, e.g. abcd://. - - result = result.filter(link => !/^\w+:\/\/\/?\w/i.test(link)); + result = result.filter(internalLinks); } - + return result; }; diff --git a/src/data/link-parser.spec.js b/src/data/link-parser.spec.js index 14c785adf..adac5c9bf 100644 --- a/src/data/link-parser.spec.js +++ b/src/data/link-parser.spec.js @@ -104,4 +104,27 @@ describe('link-parser', () => expect(links).to.have.lengthOf(0); }); + + it('parses [[ /regex with [ | ]/ ->link]]', () => { + const links = linkParser('[[/regex with [ | ]/ ->link]]'); + + expect(links).to.have.lengthOf(1); + expect(links[0]).to.equal('link'); + }); + + it('parses [[ /regex with [ | ]/ ->link][setter]]', () => { + const links = linkParser('[[/regex with [ | ]/ ->link][setter]]'); + + expect(links).to.have.lengthOf(1); + expect(links[0]).to.equal('link'); + }); + + it('parses [[simple link1]][[simple link 2]]', () => { + const links = linkParser('[[link1]][[link2]]'); + + expect(links).to.have.lengthOf(2); + expect(links[0]).to.equal('link1'); + expect(links[1]).to.equal('link2'); + }); + }); diff --git a/src/dialogs/formats/index.js b/src/dialogs/formats/index.js index 2f607b4b1..eedc3b8be 100644 --- a/src/dialogs/formats/index.js +++ b/src/dialogs/formats/index.js @@ -1,6 +1,6 @@ const Vue = require('vue'); const semverUtils = require('semver-utils'); -const { createFormatFromUrl, loadFormat } = require('../../data/actions'); +const { createFormatFromUrl, loadFormat, repairFormats } = require('../../data/actions'); const locale = require('../../locale'); const notify = require('../../ui/notify'); @@ -87,6 +87,7 @@ module.exports = Vue.extend({ this.createFormatFromUrl(this.newFormatUrl) .then(format => { + this.repairFormats(); this.error = ''; this.working = false; this.loadedFormats.push(format); @@ -129,7 +130,8 @@ module.exports = Vue.extend({ vuex: { actions: { createFormatFromUrl, - loadFormat + loadFormat, + repairFormats }, getters: { diff --git a/src/dialogs/formats/item.html b/src/dialogs/formats/item.html index dfb3b4607..a950ba6d8 100644 --- a/src/dialogs/formats/item.html +++ b/src/dialogs/formats/item.html @@ -1,14 +1,16 @@ - +

- {{ format.name }} {{ format.properties.version }} - - {{{ author }}} - +

diff --git a/src/dialogs/story-format/index.html b/src/dialogs/story-format/index.html index c8c976771..7b9066192 100644 --- a/src/dialogs/story-format/index.html +++ b/src/dialogs/story-format/index.html @@ -11,7 +11,7 @@ - +
diff --git a/src/dialogs/story-format/item.html b/src/dialogs/story-format/item.html index a74d5b03a..5fd6ff589 100644 --- a/src/dialogs/story-format/item.html +++ b/src/dialogs/story-format/item.html @@ -1,11 +1,11 @@ - +

- {{ format.name }} {{ format.properties.version }} + {{{ author }}} diff --git a/src/dialogs/story-format/item.less b/src/dialogs/story-format/item.less index 3ef5478c5..b50deeba7 100644 --- a/src/dialogs/story-format/item.less +++ b/src/dialogs/story-format/item.less @@ -1,3 +1,3 @@ #storyFormatModal .format-item { - white-space: nowrap; + //white-space: nowrap; } diff --git a/src/editors/passage/index.js b/src/editors/passage/index.js index 7246b273e..97f955fae 100644 --- a/src/editors/passage/index.js +++ b/src/editors/passage/index.js @@ -7,6 +7,7 @@ const Vue = require('vue'); const locale = require('../../locale'); const { thenable } = require('../../vue/mixins/thenable'); const { changeLinksInStory, updatePassageInStory, loadFormat } = require('../../data/actions'); +const { passageDefaults } = require('../../data/story'); require('codemirror/addon/display/placeholder'); require('../../codemirror/prefix-trigger'); @@ -189,7 +190,11 @@ module.exports = Vue.extend({ this.$options.storyFormat.name, this.$options.storyFormat.version ).then(format => { - const modeName = format.name.toLowerCase(); + let modeName = format.name.toLowerCase(); + /* TODO: Resolve this special case with PR #118 */ + if (modeName === "harlowe") { + modeName += `-${/^\d+/.exec(format.version)}`; + } if (modeName in CodeMirror.modes) { /* @@ -216,6 +221,18 @@ module.exports = Vue.extend({ */ this.$refs.codemirror.$cm.setOption('mode', 'text'); + + /* + Either move the cursor to the end or select the existing text, depending + on whether this passage has only default text in it. + */ + + if (this.passage.text === passageDefaults.text) { + this.$refs.codemirror.$cm.execCommand('selectAll'); + } + else { + this.$refs.codemirror.$cm.execCommand('goDocEnd'); + } }, destroyed() { diff --git a/src/locale/po/cs.po b/src/locale/po/cs.po new file mode 100644 index 000000000..22a4c43a8 --- /dev/null +++ b/src/locale/po/cs.po @@ -0,0 +1,1371 @@ +# Czech language file for Twine 2 +# Copyright (C) 2016 +# This file is distributed under the same license as the PACKAGE package. +# Svatopluk Vít (svatopluk.vit@gmail.com), 2016. +msgid "" +msgstr "" +"Project-Id-Version: CZ-TWINE2-1.01\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-19 09:36+0100\n" +"PO-Revision-Date: 2016-12-20 12:01+0100\n" +"Last-Translator: Svatopluk Vít \n" +"Language-Team: \n" +"Language: cze (B)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" +"X-Generator: Eazy Po 0.9.5.3\n" + +#: templates/localeview.html:4 +#, approved +msgid "Please choose which language you would like to use with Twine." +msgstr "Zvolte si jazyk, který budete používat v Twine." + +#: templates/localeview.html:12 +#, approved +msgid "English" +msgstr "Angličtina" + +#: templates/localeview.html:19 +#, approved +msgid "Spanish" +msgstr "Španělština" + +#: templates/storyeditview/passageeditmodal.html:8 +#, approved +msgid "Passage Name" +msgstr "Název místnosti" + +#. L10n: this is the noun form, as in tags you would apply to content. +#: templates/storyeditview/passageeditmodal.html:22 +#, approved +msgid "Tag" +msgstr "Štítek" + +#. L10n: A noun, i.e. what a tag is named. +#: templates/storyeditview/passageeditmodal.html:28 +#, approved +msgid "Tag name" +msgstr "Jméno štítku" + +#: templates/storyeditview/passageeditmodal.html:36 +#, approved +msgid "" +"Enter the body text of your passage here. To link to another passage, put " +"two square brackets around its name, [[like this]]." +msgstr "" +"Vložte hlavní text místnosti. Pokud se chcete odkázat na jinou místnost, " +"uveďte její název do dvou hranatých závorek, [[například takto]]." + +#. L10n: %s is the name of the thing to be deleted. +#: templates/storyeditview/passageitemview.html:16 +#, php-format +#, approved +msgid "Delete “%s”" +msgstr "Smazat “%s”" + +#. L10n: %s is the name of the thing to be edited. +#: templates/storyeditview/passageitemview.html:21 +#, php-format +#, approved +msgid "Edit “%s”" +msgstr "Upravit “%s”" + +#: templates/storyeditview/passageitemview.html:24 +#, approved +msgid "Test story starting here" +msgstr "Začít test příběhu z tohoto místa" + +#. L10n: %s is a name of a passage +#: templates/storyeditview/passageitemview.html:28 +#, php-format +#, approved +msgid "Set “%s” as starting point" +msgstr "Nastavit “%s” jako počáteční bod" + +#: templates/storyeditview/renamestorymodal.html:8 +#: templates/storyeditview/toolbar.html:31 +#: templates/storylistview/storyitemview.html:36 +#, approved +msgid "Rename Story" +msgstr "Přejmenovat příběh" + +#: templates/storyeditview/renamestorymodal.html:14 +#, approved +msgid "What should this story's name be?" +msgstr "Jak se bude příběh jmenovat?" + +#: templates/storyeditview/renamestorymodal.html:24 +#, approved +msgid "Please enter a name." +msgstr "Zadejte jméno." + +#: templates/storyeditview/renamestorymodal.html:28 +#: templates/storylistview/formatitem.html:7 +#: templates/storylistview/storylistview.html:25 +#: templates/storylistview/storylistview.html:50 +#, approved +msgid "Cancel" +msgstr "Storno" + +#: templates/storyeditview/renamestorymodal.html:29 +#, approved +msgid "Save" +msgstr "Uložit" + +#: templates/storyeditview/scripteditmodal.html:8 +#, approved +msgid "JavaScript" +msgstr "JavaScript" + +#: templates/storyeditview/scripteditmodal.html:14 +#, approved +msgid "" +"in a Web browser." +"in a Web browser." +msgstr "" +"internetovém prohlížeči." +"internetovém prohlížeči." + +#: templates/storyeditview/searchmodal.html:7 +#, approved +msgid "Find and Replace" +msgstr "Najít a nahradit" + +#: templates/storyeditview/searchmodal.html:12 +#, approved +msgid "Search For" +msgstr "Hledat" + +#: templates/storyeditview/searchmodal.html:18 +#, approved +msgid "Include passage names" +msgstr "Včetně názvu místnosti" + +#. L10n: As in uppercase or lowercase letters. +#: templates/storyeditview/searchmodal.html:23 +#, approved +msgid "Match case" +msgstr "Rozlišovat velikost písmen" + +#. L10n: A technical term, see https://en.wikipedia.org/wiki/Regular_expression. +#: templates/storyeditview/searchmodal.html:29 +#, approved +msgid "Regular expression" +msgstr "Regulární výrazy" + +#: templates/storyeditview/searchmodal.html:34 +#, approved +msgid "Replace With" +msgstr "Nahradit" + +#: templates/storyeditview/searchmodal.html:40 +#, approved +msgid "Expand all search results" +msgstr "Rozbalit všechny výsledky" + +#: templates/storyeditview/searchmodal.html:44 +#, approved +msgid "Collapse all search results" +msgstr "Sbalit všechny výsledky" + +#: templates/storyeditview/searchmodal.html:49 +#, approved +msgid "Replace All" +msgstr "Nahradit vše" + +#: templates/storyeditview/searchmodal.html:57 +#, approved +msgid "Searching..." +msgstr "Vyhledávání..." + +#. L10n: %d is a number of text matches after a search. +#: templates/storyeditview/searchmodalresult.html:13 +#, php-format +#, approved +msgid "%d match" +msgid_plural "%d matches" +msgstr[0] "%d shoda" +msgstr[1] "%d shody" +msgstr[2] "%d shod" + +#: templates/storyeditview/searchmodalresult.html:22 +#, approved +msgid "Replace in this passage" +msgstr "Nahradit v této místnosti" + +#: templates/storyeditview/searchmodalresult.html:23 +#, approved +msgid "Replace in Passage" +msgstr "Nahradit v místnosti" + +#: templates/storyeditview/statsmodal.html:8 +#: templates/storyeditview/toolbar.html:39 +#, approved +msgid "Story Statistics" +msgstr "Statistika příběhu" + +#: templates/storyeditview/statsmodal.html:38 +#, php-format +#, approved +msgid "This story was last changed at %s" +msgstr "Příběh byl naposledy změněn v %s" + +#. L10n: %s is the IFID of the story. Please keep the element around it. +#: templates/storyeditview/statsmodal.html:45 +#, php-format +#, approved +msgid "" +"The IFID for this story is %s. What's an IFID?)" +msgstr "" +"IFID tohoto příběhu je %s. Co je to IFID?)" + +#: templates/storyeditview/storyformatmodal.html:7 +#, approved +msgid "Story Format" +msgstr "Formát příběhu" + +#: templates/storyeditview/storyformatmodal.html:12 +#, approved +msgid "" +"A story format controls the appearance and behavior of your story during " +"play." +msgstr "Formát příběhu určuje vzhled a chování příběhu během hraní." + +#: templates/storyeditview/storyformatmodal.html:16 +#: templates/storylistview/modals/formatsmodal.html:58 +#, approved +msgid "Loading..." +msgstr "Nahrávání..." + +#: templates/storyeditview/stylesheeteditmodal.html:8 +#, approved +msgid "Stylesheet" +msgstr "Styl" + +#: templates/storyeditview/stylesheeteditmodal.html:14 +#, approved +msgid "" +"Any CSS entered here will override the default appearance of your story." +msgstr "Jakýkoliv CSS skript zadaný zde přepíše výchozí vzhled vašeho příběhu." + +#: templates/storyeditview/toolbar.html:5 +#, approved +msgid "Go to the story list" +msgstr "Přejít na seznam příběhů" + +#: templates/storyeditview/toolbar.html:19 +#, approved +msgid "Edit Story JavaScript" +msgstr "Upravit JavaScript příběhu" + +#: templates/storyeditview/toolbar.html:23 +#, approved +msgid "Edit Story Stylesheet" +msgstr "Upravit styl příběhu" + +#: templates/storyeditview/toolbar.html:27 +#, approved +msgid "Change Story Format" +msgstr "Změnit formát příběhu" + +#: templates/storyeditview/toolbar.html:35 +#, approved +msgid "Snap to Grid" +msgstr "Ukotvit k mřížce" + +#: templates/storyeditview/toolbar.html:45 +#, approved +msgid "View Proofing Copy" +msgstr "Zobrazit kopii k revizi" + +#: templates/storyeditview/toolbar.html:49 +#: templates/storylistview/storyitemview.html:32 +#, approved +msgid "Publish to File" +msgstr "Zveřejnit do souboru" + +#: templates/storyeditview/toolbar.html:62 +#, approved +msgid "Quick Find" +msgstr "Rychlé hledání" + +#: templates/storyeditview/toolbar.html:63 +#, approved +msgid "Find and replace across the entire story" +msgstr "Najít a nahradit v celém příběhu" + +#: templates/storyeditview/toolbar.html:67 +#, approved +msgid "Show only story structure" +msgstr "Zobrazit pouze strukturu příběhu" + +#: templates/storyeditview/toolbar.html:71 +#, approved +msgid "Show only passage titles" +msgstr "Zobrazit pouze názvy místností" + +#: templates/storyeditview/toolbar.html:75 +#, approved +msgid "Show passage titles and excerpts" +msgstr "Zobrazit názvy místností a výňatky" + +#: templates/storyeditview/toolbar.html:81 +#, approved +msgid "Play this story in test mode" +msgstr "Přehrát příběh v testovacím módu" + +#. L10n: The verb form, to try something or to check it for problems. +#: templates/storyeditview/toolbar.html:84 +#, approved +msgid "Test" +msgstr "Otestovat" + +#: templates/storyeditview/toolbar.html:88 +#, approved +msgid "Play this story" +msgstr "Přehrát příběh" + +#. L10n: The verb form, as in playing a game. +#: templates/storyeditview/toolbar.html:91 +#, approved +msgid "Play" +msgstr "Přehrát" + +#: templates/storyeditview/toolbar.html:95 +#, approved +msgid "Add a new passage" +msgstr "Přidat novou místnost" + +#. L10n: This does not actually show the count here, as it is used in a table. +#: templates/storyeditview/toolbar.html:96 +#: js/views/storyeditview/modals/statsmodal.js:75 +#, approved +msgid "Passage" +msgid_plural "Passages" +msgstr[0] "Místnost" +msgstr[1] "Místnosti" +msgstr[2] "Místností" + +#. L10n: %s is the name of an author. +#: templates/storyformatdetail.html:26 +#, php-format +#, approved +msgid "by %s" +msgstr "od autora %s" + +#. L10n: %s is the name of a software license. +#: templates/storyformatdetail.html:39 +#, php-format +#, approved +msgid "License: %s" +msgstr "Licence: %s" + +#: templates/storylistview/formatitem.html:5 +#, approved +msgid "Are you sure?" +msgstr "Opravdu?" + +#: templates/storylistview/formatitem.html:6 +#, approved +msgid "Remove" +msgstr "Odstranit" + +#: templates/storylistview/formatitem.html:12 +#, approved +msgid "Remove this format" +msgstr "Odstranit tento formát" + +#: templates/storylistview/formatitem.html:14 +#, approved +msgid "Set this format as default for stories" +msgstr "Nastavit tento formát jako výchozí pro příběhy" + +#: templates/storylistview/modals/aboutmodal.html:8 +#, approved +msgid "About Twine" +msgstr "O Twine" + +#. L10n: This is the noun form, to describe a version of the software. e.g. 'I am using Twine build 123' +#: templates/storylistview/modals/aboutmodal.html:14 +#, approved +msgid "Build" +msgstr "Sestavení" + +#: templates/storylistview/modals/aboutmodal.html:21 +#, approved +msgid "" +"Twine is an open-source tool for telling interactive, nonlinear stories." +msgstr "" +"Twine je open-source nástroj pro vyprávění interaktivních, nelineárních " +"příběhů." + +#: templates/storylistview/modals/aboutmodal.html:25 +#, approved +msgid "" +"Twine 2.0 is released under the GPL v3 license, but any work created with it may be " +"released under any terms, including commercial ones. Source Code Repository" +msgstr "" +"Twine 2.0 je vydán pod licencí GPL v3, ale cokoliv v něm vytvořené může být vydáno pod " +"libovolnou licencí včetně licencí komerčních. Repozitář zdrojových kódů" + +#: templates/storylistview/modals/aboutmodal.html:31 +#, approved +msgid "Help Twine Grow With A Donation" +msgstr "Pomozte Twine existovat z vašich dobrovolných příspěvků" + +#. L10n: This is the noun form, as program code. +#: templates/storylistview/modals/aboutmodal.html:39 +#, approved +msgid "Code" +msgstr "Kód" + +#: templates/storylistview/modals/aboutmodal.html:55 +#, approved +msgid "Libraries" +msgstr "Knihovny" + +#: templates/storylistview/modals/aboutmodal.html:74 +#, approved +msgid "Fonts" +msgstr "Písma" + +#: templates/storylistview/modals/aboutmodal.html:78 +#, approved +msgid "" +"Source Sans Pro and Source Code Pro were designed by Paul D. Hunt under the " +"guidance of Robert Slimbach for Adobe
Nunito was designed by
Vernon Adams" +msgstr "" +"Source Sans Pro a Source Code Pro byly vytvořeny Paulem D. Huntem pod " +"vedením Roberta Slimbacha pro Adobe
Nunito bylo vytvořeno
Vernonem Adamsem" + +#: templates/storylistview/modals/aboutmodal.html:82 +#, approved +msgid "Icons" +msgstr "Ikony" + +#: templates/storylistview/modals/aboutmodal.html:87 +#, approved +msgid "Document designed by Rob Gill from the Noun Project" +msgstr "Dokument zpracován Robem Gillem z The Noun Project" + +#: templates/storylistview/modals/aboutmodal.html:88 +#, approved +msgid "Question designed by Henry Ryder from the Noun Project" +msgstr "Otázky zpracovány Henry Ryderem z The Noun Project" + +#: templates/storylistview/modals/aboutmodal.html:89 +#, approved +msgid "Smile designed by jelio dimitrov from the Noun Project" +msgstr "Emotikony vytvořeny Jelio Dimitrovem z The Noun Project" + +#. L10n: The will have a version number, i.e. 2.0.6, interpolated into it. +#: templates/storylistview/modals/appupdatemodal.html:10 +#, approved +msgid "" +"A new version of Twine, , has been released." +msgstr "Byla vydána nová verze Twine ." + +#. L10n: A polite rejection of a request, in the sense that the answer may change in the future. +#: templates/storylistview/modals/appupdatemodal.html:18 +#, approved +msgid "Not Right Now" +msgstr "Právě teď bohužel ne" + +#: templates/storylistview/modals/appupdatemodal.html:21 +#, approved +msgid "Download" +msgstr "Stáhnout" + +#: templates/storylistview/modals/donatemodal.html:6 +#, approved +msgid "" +"If you love Twine as much as I do, please consider helping it grow with a " +"donation. Twine is as an open source project that will always be free to use " +"— and with your help, Twine will continue to thrive." +msgstr "" +"Pokud máte Twine rádi jako já, zvažte finanční příspěvek na jeho další " +"rozvoj. Twine je open-source projekt, který bude vždy možné zdarma používat " +"a jen s vaší pomocí bude vzkvétat." + +#: templates/storylistview/modals/donatemodal.html:10 +#, approved +msgid "Chris Klimas, Twine creator" +msgstr "Chris Klimas, autor Twine" + +#: templates/storylistview/modals/donatemodal.html:16 +#, approved +msgid "Donate" +msgstr "Přispět" + +#: templates/storylistview/modals/donatemodal.html:17 +#, approved +msgid "No Thanks" +msgstr "Ne děkuji" + +#: templates/storylistview/modals/donatemodal.html:21 +#, approved +msgid "This message will only be shown to you once.
" +msgstr "Tato zpráva se zobrazí pouze jednou.
" + +#: templates/storylistview/modals/formatsmodal.html:9 +#, approved +msgid "Story Formats" +msgstr "Formát příběhu" + +#: templates/storylistview/modals/formatsmodal.html:10 +#, approved +msgid "Proofing Formats" +msgstr "Formáty kontroly" + +#: templates/storylistview/modals/formatsmodal.html:11 +#, approved +msgid "Add a New Format" +msgstr "Přidat nový formát" + +#: templates/storylistview/modals/formatsmodal.html:20 +#, approved +msgid "" +"Story formats control the appearance and behavior of stories during play." +msgstr "Formát příběhu určuje vzhled a chování příběhů během hraní." + +#: templates/storylistview/modals/formatsmodal.html:30 +#, approved +msgid "" +"Proofing formats create a versions of stories tailored for editing and " +"proofreading." +msgstr "" +"Formát kontroly příběhu vytváří verzi příběhu uzpůsobenou k úpravám a " +"kontrole." + +#. L10n: Address in the sense of a URL. +#: templates/storylistview/modals/formatsmodal.html:42 +#, approved +msgid "To add a story format, enter its address below." +msgstr "Pro přidání formátu příběhu zadejte jeho internetovou adresu níže." + +#: templates/storylistview/modals/formatsmodal.html:50 +#: templates/storylistview/storylistview.html:26 +#, approved +msgid "Add" +msgstr "Přidat" + +#: templates/storylistview/storyitemview.html:24 +#, approved +msgid "Play Story" +msgstr "Přehrát příběh" + +#: templates/storylistview/storyitemview.html:28 +#, approved +msgid "Test Story" +msgstr "Otestovat příběh" + +#: templates/storylistview/storyitemview.html:40 +#, approved +msgid "Duplicate Story" +msgstr "Duplikovat příběh" + +#: templates/storylistview/storyitemview.html:46 +#, approved +msgid "Delete Story" +msgstr "Vymazat příběh" + +#: templates/storylistview/storylistview.html:5 +#, approved +msgid "Twine" +msgstr "Twine" + +#: templates/storylistview/storylistview.html:9 +#, approved +msgid "Create a brand-new story" +msgstr "Vytvořit úplně nový příběh" + +#: templates/storylistview/storylistview.html:10 +#, approved +msgid "Story" +msgstr "Příběh" + +#: templates/storylistview/storylistview.html:17 +#, approved +msgid "What should your story be named?
(You can change this later.)" +msgstr "" +"Jaký by měl být titul vašeho příběhu?
(Později jej budete moci změnit.)" + +#: templates/storylistview/storylistview.html:34 +#, approved +msgid "Import a published story or Twine archive" +msgstr "Importovat zveřejněný příběh nebo Twine archiv" + +#: templates/storylistview/storylistview.html:35 +#, approved +msgid "Import From File" +msgstr "Importovat ze souboru" + +#: templates/storylistview/storylistview.html:42 +#, approved +msgid "Import this file:" +msgstr "Importovat soubor:" + +#: templates/storylistview/storylistview.html:59 +#, approved +msgid "Importing..." +msgstr "Importování..." + +#: templates/storylistview/storylistview.html:67 +#, approved +msgid "Save all stories to a Twine archive file" +msgstr "Uložit všechny příběhy do Twine archivu" + +#: templates/storylistview/storylistview.html:68 +#, approved +msgid "Archive" +msgstr "Archiv" + +#: templates/storylistview/storylistview.html:73 +#, approved +msgid "Work with story and proofing formats" +msgstr "Pracovat s formáty příběhu a konrtoly" + +#: templates/storylistview/storylistview.html:74 +#, approved +msgid "Formats" +msgstr "Formáty" + +#: templates/storylistview/storylistview.html:79 +#, approved +msgid "Change the language Twine uses" +msgstr "Změnit jazyk, který Twine používá" + +#: templates/storylistview/storylistview.html:80 +#, approved +msgid "Language" +msgstr "Jazyk" + +#: templates/storylistview/storylistview.html:85 +#, approved +msgid "Browse online help" +msgstr "Procházet nápovědu online" + +#: templates/storylistview/storylistview.html:86 +#, approved +msgid "Help" +msgstr "Nápověda" + +#: templates/storylistview/storylistview.html:101 +#, approved +msgid "version" +msgstr "verze" + +#: templates/storylistview/storylistview.html:103 +#, approved +msgid "Report a bug" +msgstr "Nahlásit chybu" + +#: templates/storylistview/storylistview.html:111 +#, approved +msgid "Stories" +msgstr "Příběhy" + +#: templates/storylistview/storylistview.html:114 +#, approved +msgid "Sort By" +msgstr "Třídit podle" + +#: templates/storylistview/storylistview.html:116 +#, approved +msgid "Last changed date" +msgstr "Datum poslední změny" + +#: templates/storylistview/storylistview.html:117 +#, approved +msgid "Edit Date" +msgstr "Upravit datum" + +#: templates/storylistview/storylistview.html:120 +#, approved +msgid "Story name" +msgstr "Název příběhu" + +#: templates/storylistview/storylistview.html:121 +#, approved +msgid "Name" +msgstr "Název" + +#: templates/storylistview/storylistview.html:128 +#, approved +msgid "" +"There are no stories saved in Twine right now. To get started, you can " +"either create a new story or import an existing one from a file." +msgstr "" +"V Twine nejsou právě uloženy žádné příběhy. Abyste mohli začít, musíte " +"vytvořit nový příběh nebo nějaký importovat ze souboru." + +#: templates/welcomeview.html:6 +#, approved +msgid "Hi!" +msgstr "Vítejte!" + +#: templates/welcomeview.html:10 +#, approved +msgid "" +"There are a few things you should know before you get started." +"There are a few things you should know before you get started." +msgstr "" +"příběhů. Předtím než začnete, měli byste vědět několik věcí." +"příběhů. Předtím než začnete, měli byste vědět několik věcí." + +#: templates/welcomeview.html:14 +#, approved +msgid "Tell Me More" +msgstr "Dozvědět se více" + +#: templates/welcomeview.html:15 +#, approved +msgid "Skip" +msgstr "Přeskočit" + +#: templates/welcomeview.html:23 +#, approved +msgid "New here?" +msgstr "Jste nováček?" + +#: templates/welcomeview.html:27 +#, approved +msgid "" +"If you've never used Twine before, then welcome! The Twine 2 Guide " +"and the official wiki in general, are a great place to learn. Keep in mind " +"that some articles on the wiki at large were written for Twine 1, which is a " +"little bit different than this version. But most of the concepts are the " +"same." +msgstr "" +"Pokud jste Twine nikdy nepoužil, pak vítejte! Twine 2 průvodce a " +"oficiální wiki jsou obecně nejlepšími místy, jak se něco naučit. Veďte ovšem " +"v patrnosti, že některé články na wiki jsou většinou vytvořeny pro Twine " +"verze 1, jež se trochu liší od stávající verze. Většina konceptů je však " +"shodná." + +#: templates/welcomeview.html:31 +#, approved +msgid "" +"You can also get help over at the Twine forum, too." +msgstr "" +"Pomoc můžete také získat na Twine fóru." + +#: templates/welcomeview.html:35 +#, approved +msgid "" +"If you have used Twine 1 before, the guide also has details " +"on what has changed in this version. Chief among them is a new default story " +"format, Harlowe. But if you find you prefer the Twine 1 scripting syntax, " +"try using SugarCube instead." +msgstr "" +"Pokud jste Twine 1 již předtím používali, najdete v " +"průvodci i popis toho, co bylo v nové verzi změněno. Hlavní změnou je asi " +"výchozí formát příběhu Harlowe. Pokud ale dáváte přednost skriptovací " +"syntaxi Twine 1, použijte místo toho SugarCube." + +#: templates/welcomeview.html:39 templates/welcomeview.html:63 +#: templates/welcomeviewnw.html:23 +#, approved +msgid "OK" +msgstr "OK" + +#: templates/welcomeview.html:47 +#, approved +msgid "Your work is saved only in your browser." +msgstr "Vaše práce je uložena pouze v prohlížeči." + +#: templates/welcomeview.html:51 +#, approved +msgid "" +"That means you don't need to create an account to use Twine 2, and " +"everything you create isn't stored on a server somewhere else — it " +"stays right in your browser." +msgstr "" +"To znamená, že není nutno vytvářet účet pro používání Twine 2 a všechno co " +"vytvoříte, není ukládáno někam na server — zůstává to ve vašem " +"prohlížeči. " + +#: templates/welcomeview.html:55 +#, approved +msgid "" +"Two very important things to remember, though. Since your work is " +"saved only in your browser, if you clear its saved data, then you'll lose " +"your work! Not good. Remember to use that  Archive button often. You can also publish " +"individual stories to files using the menu on " +"each story in the story list. Both archive and story files can always be re-" +"imported into Twine." +msgstr "" +"Musíte si zapamatovat dvě velmi důležité věci. Protože je vaše práce " +"ukládána pouze ve vašem prohlížeči a pokud vyčistíte jeho uložená data, o " +"všechnu práci přijdete! To není dobré. Naučte se prostě využívat častěji " +"tlačítko  Archiv. " +"Můžete také zveřejnit jednotlivé příběhy do souboru s využitím nabídky na každém příběhu v seznamu příběhů. Jak archiv tak " +"soubor s příběhem mohou být kdykoliv importovány do Twine." + +#: templates/welcomeview.html:59 +#, approved +msgid "" +"Secondly, anyone who can use this browser can see and make changes to " +"your work. So if you've got a nosy kid brother, look into setting up a " +"separate profile for yourself." +msgstr "" +"Dále, kdokoliv, kdo může využívat váš internetový prohlížeč pak může " +"vidět a provádět změny ve vaší práci.. Pokud například máte \"dětinského" +"\" bratra, podívejte se radši do nastavení prohlížeče a vytvořte si váš " +"oddělený profil." + +#: templates/welcomeview.html:71 +#, approved +msgid "That's it!" +msgstr "A to je vše!" + +#: templates/welcomeview.html:75 +#, approved +msgid "Thanks for reading, and have fun with Twine." +msgstr "Děkuji za pozornost a přeji vám mnoho legrace s Twine." + +#: templates/welcomeview.html:79 +#, approved +msgid "Go to the Story List" +msgstr "Přejít na seznam příběhů" + +#: templates/welcomeviewnw.html:7 +#, approved +msgid "Your work is automatically saved." +msgstr "Vaše práce je automaticky ukládána." + +#: templates/welcomeviewnw.html:11 +#, approved +msgid "" +"There's now a folder named Twine in your Documents folder. Inside that is a " +"Stories folder, where all your work will be saved. Twine saves as you work, " +"so you don't have to worry about remembering to save it yourself. You can " +"always open the folder your stories are saved to by using the Show " +"Library item in the Twine menu." +msgstr "" +"Ve vaší složce dokumentů je nyní složka Twine. Uvnitř je složka s příběhy, " +"kam se ukládá vaše rozpracovaná práce. Twine vše průběžně ukládá, takže se o " +"to nemusíte nějak zvlášť starat. Složku s uloženými příběhy můžete kdykoliv " +"zobrazit s pomocí položky Zobrazit knihovnu z nabídky aplikace " +"Twine." + +#: templates/welcomeviewnw.html:15 +#, approved +msgid "" +"Because Twine is always saving your work, the files in your story library " +"will be locked from editing while Twine is open." +msgstr "" +"Protože Twine vaši práci neustále ukládá, budou všechny soubory ve složce s " +"příběhy uzamčeny s nemožností zápisu, pokud je Twine otevřeno." + +#: templates/welcomeviewnw.html:19 +#, approved +msgid "" +"If you'd like to open a Twine story file you received from someone else, you " +"can import it into your library using the " +"Import From File link in the story list." +msgstr "" +"Pokud chcete otevřít soubor s Twine příběhem od někoho jiného, můžete jej " +"naimportovat do knihovny použitím odkazu " +"Importovat ze souboru v seznamu příběhů." + +#. L10n: %1$s is a filename; %2$s is the error message. +#: js/app.js:226 +#, approved +msgid "“%1$s” could not be saved (%2$s)." +msgstr "“%1$s” nemůže být uložen (%2$s)." + +#. L10n: %s is the error message. +#: js/app.js:283 +#, javascript-format +#, approved +msgid "An error occurred while publishing your story. (%s)" +msgstr "Při zveřejnění příběhu se vyskytla chyba. (%s)" + +#: js/app.js:314 +#, approved +msgid "Twine Archive.html" +msgstr "Twine Archive.html" + +#. L10n: An internal error. %s is a bad sort criterion. +#: js/collections/storycollection.js:35 +#, javascript-format +#, approved +msgid "don't know how to sort stories by %s" +msgstr "není možné řadit příběhy dle %s" + +#: js/models/passage.js:19 +#, approved +msgid "Untitled Passage" +msgstr "Nepojmenovaná místnost" + +#: js/models/passage.js:21 +#, approved +msgid "Tap this passage, then the pencil icon to edit it." +msgstr "Klikněte na místnost a poté můžete zahájit úpravy skrz ikonu tužky." + +#: js/models/passage.js:22 +#, approved +msgid "Double-click this passage to edit it." +msgstr "Pro úpravu místnosti na ní dvakrát klikněte." + +#: js/models/passage.js:78 +#, approved +msgid "You must give this passage a name." +msgstr "Místnost musíte pojmenovat." + +#: js/models/passage.js:85 +#, javascript-format +#, approved +msgid "" +"There is already a passage named \"%s.\" Please give this one a unique name." +msgstr "" +"Místnost pojmenovaná \"%s\" již existuje. Použijte jiné unikátní jméno." + +#: js/models/story.js:16 +#, approved +msgid "Untitled Story" +msgstr "Nepojmenovaný příběh" + +#: js/models/story.js:112 +#, approved +msgid "There is no starting point set for this story." +msgstr "Tento příběh nemá nastaven počáteční bod." + +#: js/models/story.js:115 +#, approved +msgid "The passage set as starting point for this story does not exist." +msgstr "Místnost, která je nastavena jako počáteční bod příběhu, neexistuje." + +#: js/models/storyformat.js:38 +#, approved +msgid "Untitled Story Format" +msgstr "Nepojmenovaný formát příběhu" + +#: js/nwui.js:81 +#, approved +msgid "Toggle Fullscreen" +msgstr "Přepnout na celou obrazovku" + +#: js/nwui.js:100 +#, approved +msgid "Quit" +msgstr "Ukončit" + +#: js/nwui.js:115 +#, approved +msgid "Edit" +msgstr "Upravit" + +#: js/nwui.js:120 +#, approved +msgid "Undo" +msgstr "Zpět" + +#: js/nwui.js:132 +#, approved +msgid "Cut" +msgstr "Vyjmout" + +#: js/nwui.js:142 +#, approved +msgid "Copy" +msgstr "Kopírovat" + +#: js/nwui.js:152 +#, approved +msgid "Paste" +msgstr "Vložit" + +#: js/nwui.js:162 js/views/storyeditview/passageitemview.js:171 +#: js/views/storyeditview/storyeditview.js:126 +#, approved +msgid "Delete" +msgstr "Smazat" + +#: js/nwui.js:182 +#, approved +msgid "Show Library" +msgstr "Zobrazit knihovnu" + +#. L10n: This is the folder name on OS X, Linux, and recent versions of +#. Windows that a user's documents are stored in, relative to the +#. user's home directory. If you need to use a space in this name, +#. then it should have two backslashes (\\) in front of it. +#. Regardless, this must have a single forward slash (/) as its first +#. character. +#: js/nwui.js:239 +#, approved +msgid "/Documents" +msgstr "/Documents" + +#. L10n: This is the folder name on Windows XP that a user's +#. documents are stored in, relative to the user's home directory. +#. This is used if a folder with the name given by the translation +#. key '/Documents' does not exist. If you need to use a space in +#. this name, then it should have two backslashes (\\) in front of it. +#. Regardless, this must have a single forward slash (/) as its first character. +#: js/nwui.js:249 js/nwui.js:250 +#, approved +msgid "/My\\ Documents" +msgstr "/My\\ Documents" + +#. L10n: '/Twine' is a suitable name for Twine-related files to exist +#. under on the user's hard drive. '/Stories' is a suitable name for +#. story files specifically. If you need to use a space in this name, +#. then it should have two backslashes in front of it. Regardless, +#. this must have a single forward slash (/) as its first character. +#: js/nwui.js:260 js/nwui.js:264 +#, approved +msgid "/Twine" +msgstr "/Twine" + +#: js/nwui.js:260 +#, approved +msgid "/Stories" +msgstr "/Stories" + +#. L10n: %s is the error message. +#: js/nwui.js:430 +#, javascript-format +#, approved +msgid "An error occurred while saving your story (%s)." +msgstr "Při ukládání příběhu se vyskytla chyba (%s)." + +#. L10n: %s is the error message. +#: js/nwui.js:457 +#, javascript-format +#, approved +msgid "An error occurred while deleting your story (%s)." +msgstr "Při mazání příběhu se vyskytla chyba (%s)." + +#. L10n: Locking in the sense of preventing changes to a file. %s is the error message. +#: js/nwui.js:527 +#, javascript-format +#, approved +msgid "An error occurred while locking your library (%s)." +msgstr "Při zamykání knihovny se vyskytla chyba (%s)." + +#. L10n: Unlocking in the sense of allowing changes to a file. %s is the error message. +#: js/nwui.js:556 +#, javascript-format +#, approved +msgid "An error occurred while unlocking your library (%s)." +msgstr "Při odemykání knihovny se vyskytla chyba (%s)." + +#. L10n: An internal error message related to UI components. +#: js/ui.js:166 +#, javascript-format +#, approved +msgid "Don't know how to do bubble action %s" +msgstr "Není možno provést akci %s" + +#. L10n: An internal error message related to UI components. +#: js/ui.js:219 +#, javascript-format +#, approved +msgid "Don't know how to do collapse action %s" +msgstr "Není možno rozbalit akci %s" + +#. L10n: An internal error when changing locale. +#: js/views/localeview.js:27 +#, javascript-format +#, approved +msgid "Can't set locale to nonstring: %s" +msgstr "Nelze přiřadit jazykové nastavení na špatný řetězec: %s" + +#: js/views/storyeditview/editors/passageeditor.js:120 +#: js/views/storyeditview/storyeditview.js:563 +#, javascript-format +#, approved +msgid "Editing “%s”" +msgstr "Upravuji “%s”" + +#: js/views/storyeditview/editors/passageeditor.js:211 +#, approved +msgid "Any changes to the passage you're editing haven't been saved yet. " +msgstr "Změny v místnosti, kterou upravujete, ještě nebyly uloženy. " + +#. L10n: Matched in the sense of matching a search criteria. %d is the number of passages. +#: js/views/storyeditview/modals/searchmodal.js:94 +#, javascript-format +#, approved +msgid "%d passage matches." +msgid_plural "%d passages match." +msgstr[0] "%d místnost odpovídá kritériím." +msgstr[1] "%d místnosti odpovídají kritériím." +msgstr[2] "%d místností odpovídá kritériím." + +#: js/views/storyeditview/modals/searchmodal.js:102 +#, approved +msgid "No matching passages found." +msgstr "Nebyly nalezeny žádné odpovídající místnosti." + +#. L10n: replacement in the sense of text search and replace. %d is the number. +#: js/views/storyeditview/modals/searchmodal.js:183 +#, javascript-format +#, approved +msgid "%d replacement was made in" +msgid_plural "%d replacements were made in" +msgstr[0] "Bylo provedeno %d nahrazení v " +msgstr[1] "Byla provedena %d nahrazení v" +msgstr[2] "Bylo provedeno %d nahrazení v" + +#. L10n: %d is a number of passages. +#: js/views/storyeditview/modals/searchmodal.js:187 +#, javascript-format +#, approved +msgid "%d passage" +msgid_plural "%d passages" +msgstr[0] "%d místnost" +msgstr[1] "%d místnosti" +msgstr[2] "%d místností" + +#. L10n: This is the formatting used to combine two pluralizations. +#. In English, %1$s equals "2 replacements were made in" and %2$s equals "5 passages." +#. This is a way to reshape the sentence as needed. +#: js/views/storyeditview/modals/searchmodal.js:192 +#, approved +msgid "%1$s %2$s" +msgstr "%1$s %2$s" + +#. L10n: Character in the sense of individual letters in a word. +#. This does not actually show the count here, as it is used in a table. +#: js/views/storyeditview/modals/statsmodal.js:68 +#, approved +msgid "Character" +msgid_plural "Characters" +msgstr[0] "Znak" +msgstr[1] "Znaky" +msgstr[2] "Znaků" + +#. L10n: Word in the sense of individual words in a sentence. +#. This does not actually show the count here, as it is used in a table. +#: js/views/storyeditview/modals/statsmodal.js:72 +#, approved +msgid "Word" +msgid_plural "Words" +msgstr[0] "Slovo" +msgstr[1] "Slova" +msgstr[2] "Slov" + +#. L10n: Links in the sense of hypertext links. +#. This does not actually show the count here, as it is used in a table. +#: js/views/storyeditview/modals/statsmodal.js:79 +#, approved +msgid "Link" +msgid_plural "Links" +msgstr[0] "Odkaz" +msgstr[1] "Odkazy" +msgstr[2] "Odkazů" + +#. L10n: Links in the sense of hypertext links. +#. This does not actually show the count here, as it is used in a table. +#: js/views/storyeditview/modals/statsmodal.js:83 +#, approved +msgid "Broken Link" +msgid_plural "Broken Links" +msgstr[0] "Špatný odkaz" +msgstr[1] "Špatné odkazy" +msgstr[2] "Špatných odkazů" + +#. L10n: %1$s is the name of the story format, %2$s is the error message. +#: js/views/storyeditview/modals/storyformatmodal.js:96 +#: js/views/storylistview/modals/formatsmodal.js:74 +#, approved +msgid "The story format “%1$s” could not be loaded (%2$s)." +msgstr "Formát příběhu “%1$s” nemůže být nahrán (%2$s)." + +#: js/views/storyeditview/passageitemview.js:165 +#, javascript-format +#, approved +msgid "Are you sure you want to delete “%s”? " +msgstr "Skutečně chcete vymazat “%s”? " + +#: js/views/storyeditview/passageitemview.js:169 +#, approved +msgid "(Hold the Shift key when deleting to skip this message.)" +msgstr "(Při mazání stiskněte klávesu Shift pro přeskočení této zprávy.)" + +#. L10n: An internal error related to handling user input. +#: js/views/storyeditview/passageitemview.js:461 +#, approved +msgid "Don't see either mouse or touch coordinates on event" +msgstr "Není možné získat souřadnice myši nebo dotyku v události" + +#. L10n: An internal error related to user input. +#: js/views/storyeditview/passageitemview.js:523 +#, approved +msgid "Couldn't find original touch ID in movement event" +msgstr "Nelze najít unikátní touch ID v pohybové události" + +#. L10n: %s is the error message. +#: js/views/storyeditview/storyeditview.js:43 +#: js/views/storyeditview/storyeditview.js:64 +#, javascript-format +#, approved +msgid "A problem occurred while saving your changes (%s)." +msgstr "Při ukládání změn se vyskytl problém (%s)." + +#. L10n: This message is always shown with more than one passage. +#. %d is the number of passages. +#: js/views/storyeditview/storyeditview.js:122 +#, javascript-format +#, approved +msgid "Are you sure you want to delete this passage?" +msgid_plural "" +"Are you sure you want to delete these %d passages? This cannot be undone." +msgstr[0] "Skutečně chcete vymazat tuto místnost?" +msgstr[1] "" +"Skutečně chcete vymazat tyto %d místnosti? Operaci nelze vrátit zpět." +msgstr[2] "" +"Skutečně chcete vymazat těchto %d místností? Operaci nelze vrátit zpět." + +#: js/views/storyeditview/storyeditview.js:268 +#, approved +msgid "This story does not have a starting point. " +msgstr "Tento příběh nemá žádný počáteční bod. " + +#: js/views/storyeditview/storyeditview.js:282 +#, approved +msgid "" +"Refreshed the playable version of your story in the previously-opened tab or " +"window." +msgstr "" +"Hratelná verze příběhu byla aktualizována v již dříve otevřené záložce nebo " +"okně." + +#: js/views/storyeditview/storyeditview.js:312 +#: js/views/storyeditview/storyeditview.js:352 +#: js/views/storylistview/storyitemview.js:110 +#, approved +msgid "" +"This story does not have a starting point. Use the icon on a passage to set this." +msgstr "" +"Tento příběh nemá žádný počáteční bod. Pro jeho nastavení použijte ikonu dostupnou v místnosti." + +#: js/views/storyeditview/storyeditview.js:325 +#, approved +msgid "" +"Refreshed the test version of your story in the previously-opened tab or " +"window." +msgstr "" +"Testovací verze příběhu byla aktualizována v již dříve otevřené záložce nebo " +"okně." + +#. L10n: This refers to when a story was last saved by the user +#. %s will be replaced with a localized date and time +#: js/views/storyeditview/storyeditview.js:573 +#: js/views/storyeditview/toolbar.js:94 +#, javascript-format +#, approved +msgid "Last saved at %s" +msgstr "Naposledy uloženo %s" + +#: js/views/storylistview/modals/formatsmodal.js:137 +#, approved +msgid "The story format at %1$s could not be added (%2$s)." +msgstr "Formát příběhu v %1$s nemůže být přidán (%2$s)." + +#. L10n: An internal error related to story formats. +#: js/views/storylistview/modals/formatsmodal.js:246 +#, approved +msgid "Don't know what kind of format to set as default" +msgstr "Není možné určit výchozí formát" + +#: js/views/storylistview/storagequota.js:21 +#: js/views/storylistview/storagequota.js:44 +#: js/views/storylistview/storagequota.js:49 +#, javascript-format +#, approved +msgid "%d%% space available" +msgstr "K dispozici %d%% místa" + +#: js/views/storylistview/storyitemview.js:80 +#: js/views/storylistview/storyitemview.js:94 +#, approved +msgid "" +"This story does not have a starting point. Edit this story and use the icon on a passage to set this." +msgstr "" +"Tento příběh nemá žádný počáteční bod. Upravte jej a pak použijte ikonu dostupnou v příběhu." + +#: js/views/storylistview/storyitemview.js:123 +#, javascript-format +#, approved +msgid "" +"Are you sure you want to delete “%s”? This cannot be undone." +msgstr "Skutečně chcete vymazat “%s”? Operaci nelze vrátit zpět." + +#: js/views/storylistview/storyitemview.js:125 +#, approved +msgid "Delete Forever" +msgstr "Smazat trvale" + +#: js/views/storylistview/storyitemview.js:137 +#, javascript-format +#, approved +msgid "What should “%s” be renamed to?" +msgstr "Jak má být “%s” přejmenován?" + +#: js/views/storylistview/storyitemview.js:138 +#, approved +msgid "Rename" +msgstr "Přejmenovat" + +#: js/views/storylistview/storyitemview.js:155 +#, approved +msgid "What should the duplicate be named?" +msgstr "Jak se má duplikát jmenovat?" + +#: js/views/storylistview/storyitemview.js:156 +#, approved +msgid "Duplicate" +msgstr "Duplikovat" + +#: js/views/storylistview/storyitemview.js:162 +#, javascript-format +#, approved +msgid "%s Copy" +msgstr "%s kopie" + +#. L10n: %d is a number of stories. +#: js/views/storylistview/storylistview.js:251 +#, javascript-format +#, approved +msgid "%d story was imported." +msgid_plural "%d stories were imported." +msgstr[0] "%d příběh byl importován." +msgstr[1] "%d příběhy byly importovány." +msgstr[2] "%d příběhů bylo importováno." + +#. L10n: %d is a number of stories +#: js/views/storylistview/storylistview.js:341 +#, javascript-format +#, approved +msgid "%d Story" +msgid_plural "%d Stories" +msgstr[0] "%d příběh" +msgstr[1] "%d příběhy" +msgstr[2] "%d příběhů" \ No newline at end of file diff --git a/src/locale/po/de.po b/src/locale/po/de.po index 7c88868af..d075c1fa1 100644 --- a/src/locale/po/de.po +++ b/src/locale/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-01-01 22:43+0100\n" -"PO-Revision-Date: 2016-01-01 23:17+0100\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2016-12-18 21:39+0100\n" "Last-Translator: Moritz Rebbert \n" "Language-Team: \n" "Language: de\n" @@ -16,658 +16,627 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.6\n" +"X-Generator: Poedit 1.8.11\n" -#: templates/localeview.html:4 -msgid "Please choose which language you would like to use with Twine." -msgstr "Bitte wähle die Sprache, in der du Twine verwenden möchtest." +#: src/dialogs/about/index.html +msgid "About Twine" +msgstr "Über Twine" -#: templates/localeview.html:12 -msgid "English" -msgstr "Englisch" +#: src/dialogs/about/index.html +msgid "" +"Twine is an open-source tool for telling interactive, nonlinear stories." +msgstr "" +"Twine ist eine Open-Source-Software zum Erzählen interaktiver, nicht-" +"linearer Geschichten." -#: templates/localeview.html:19 -msgid "Spanish" -msgstr "Spanisch" +#: src/dialogs/about/index.html +msgid "" +"This application is released under the \\x3ca href=\"http:\\/\\/www.gnu.org/" +"licenses/gpl-3.0.html\">GPL v3\\x3c/a> license, but any work created with it " +"may be released under any terms, including commercial ones." +msgstr "" +"Diese Anwendung ist unter der \\x3ca href=\"http:\\/\\/www.gnu.org/licenses/" +"gpl-3.0.html\">GPL v3\\x3c/a> veröffentlicht, aber ein Werk, das mit dieser " +"Anwendung erstellt wurde, darf unter einer beliebigen auch kommerziellen " +"Lizenz veröffentlich werden." -#: templates/storyeditview/passageeditmodal.html:8 -msgid "Passage Name" -msgstr "Name des Absatzes" +#: src/dialogs/about/index.html +msgid "Help Twine Grow With A Donation" +msgstr "Unterstütze Twine mit Spenden" -#. L10n: this is the noun form, as in tags you would apply to content. -#: templates/storyeditview/passageeditmodal.html:22 -msgid "Tag" -msgstr "Tag" +#: src/dialogs/about/index.html +msgid "Source Code Repository" +msgstr "Quellcode Repository" -#. L10n: A noun, i.e. what a tag is named. -#: templates/storyeditview/passageeditmodal.html:28 -msgid "Tag name" -msgstr "Name des Tags" +#: src/dialogs/about/index.html +msgid "Translations" +msgstr "Übersetzungen" -#: templates/storyeditview/passageeditmodal.html:36 +#: src/dialogs/about/index.html +msgid "Libraries" +msgstr "Bibliotheken" + +#: src/dialogs/about/index.html +msgid "Fonts" +msgstr "Schriftarten" + +#: src/dialogs/about/index.html msgid "" -"Enter the body text of your passage here. To link to another passage, put " -"two square brackets around its name, [[like this]]." +"Source Sans Pro and Source Code Pro were designed by Paul D. Hunt under the " +"guidance of Robert Slimbach for \\x3ca href=\"http:\\/\\/adobe.com/\">Adobe" +"\\x3c/a>\\x3cbr> Nunito was designed by \\x3ca href=\"http:\\/\\/code." +"newtypography.co.uk/\">Vernon Adams\\x3c/a>" msgstr "" -"Fügen den Absatztext hier ein. Um einen Link zu einem anderen Absatz zu " -"erstellen, schreibe dessen Namen in doppelten eckigen Klammern. [[So wie " -"hier]]." - -#. L10n: %s is the name of the thing to be deleted. -#: templates/storyeditview/passageitemview.html:16 -#, php-format -msgid "Delete “%s”" -msgstr "Lösche “%s”" - -#. L10n: %s is the name of the thing to be edited. -#: templates/storyeditview/passageitemview.html:21 -#, php-format -msgid "Edit “%s”" -msgstr "Bearbeite “%s”" - -#: templates/storyeditview/passageitemview.html:24 -msgid "Test story starting here" -msgstr "Test hier starten" +"Source Sans Pro und Source Code Pro wurden entworfen von Paul D. Hunt unter " +"der Leitung von Robert Slimbach für \\x3ca href=\"http:///\\/adobe.com/" +"\">Adobe\\x3c/a>\\x3cbr > Nunito wurde von \\x3ca href=\"http:///\\/code." +"newtypography.co.uk/\">Vernon Adams\\x3c/a > entworfen." -#. L10n: %s is a name of a passage -#: templates/storyeditview/passageitemview.html:28 -#, php-format -msgid "Set “%s” as starting point" -msgstr "Setze “%s” als Startpunkt" +#: src/dialogs/about/index.html +msgid "Icons" +msgstr "Symbole" -#: templates/storyeditview/renamestorymodal.html:8 -#: templates/storyeditview/toolbar.html:31 -#: templates/storylistview/storyitemview.html:36 -msgid "Rename Story" -msgstr "Geschichte umbennenen" +#: src/dialogs/about/index.html +msgid "Document designed by Rob Gill from the Noun Project" +msgstr "Document erstellt von Rob Gill vom Noun Project" -#: templates/storyeditview/renamestorymodal.html:14 -msgid "What should this story's name be?" -msgstr "Wie soll die Geschichte heißen?" +#: src/dialogs/about/index.html +msgid "Question designed by Henry Ryder from the Noun Project" +msgstr "Question erstellt von Henry Ryder vom Noun Project" -#: templates/storyeditview/renamestorymodal.html:24 -msgid "Please enter a name." -msgstr "Bitte einen Namen eingeben." +#: src/dialogs/about/index.html +msgid "Smile designed by jelio dimitrov from the Noun Project" +msgstr "Smile erstellt von jelio dimitrov vom Noun Project" + +#: src/dialogs/app-donation/index.html +msgid "" +"If you love Twine as much as I do, please consider helping it grow with a " +"donation. Twine is an open source project that will always be free to use " +"— and with your help, Twine will continue to thrive." +msgstr "" +"Wenn dir Twine so sehr am Herzen liegt wie mir, möchtest du es vielleicht " +"mit einer Spenden unterstützen. Twine ist ein Open-Source-Projekt, das immer " +"frei zur Verfügung stehen wird und mit deiner Hilfe weiter wachsen kann." + +#: src/dialogs/app-donation/index.html +msgid "Chris Klimas, Twine creator" +msgstr "Chris Klimas, Schöpfer von Twine" + +#: src/dialogs/app-donation/index.html +msgid "No Thanks" +msgstr "Nein Danke" + +#: src/dialogs/app-donation/index.html +msgid "Donate" +msgstr "Spende" + +#: src/dialogs/app-donation/index.html +msgid "" +"This message will only be shown to you once.<br>If you'd like to " +"donate to Twine development in the future, you can do so at <a href=" +"\"http:\\/\\/twinery.org/donate\" target=\"_blank\">http://twinery.org/" +"donate</a>." +msgstr "" +"Diese Meldung wird nur einmal angezeigt.<br>Wenn du für die " +"Entwicklung von Twine spenden möchtest, kannst du das hier tun <a href=" +"\"http:\\/\\/twinery.org/donate\" target=\"_blank\">http://twinery.org/" +"donate</a>." + +#: src/dialogs/formats/index.html +msgid "Story Formats" +msgstr "Story-Formate" + +#: src/dialogs/formats/index.html +msgid "" +"Story formats control the appearance and behavior of stories during play." +msgstr "" +"Story-Formate bestimmen das Aussehen und Verhalten der Geschichte beim " +"Spielen." + +#: src/dialogs/formats/index.html +msgid "Use as Default" +msgstr "Als Standard verwenden" + +#: src/dialogs/formats/index.html +msgid "" +"Proofing formats create a versions of stories tailored for editing and " +"proofreading." +msgstr "" +"Diese Formate erzeugen eine Version der Geschichte zum Redigieren und zur " +"Fehlersuche." + +#: src/dialogs/formats/index.html +msgid "Use" +msgstr "Verwenden" -#: templates/storyeditview/renamestorymodal.html:28 -#: templates/storylistview/formatitem.html:7 -#: templates/storylistview/storylistview.html:25 -#: templates/storylistview/storylistview.html:50 +#: src/dialogs/formats/index.html src/story-list-view/list-toolbar/index.js +msgid "Add" +msgstr "Hinzufügen" + +#: src/dialogs/formats/index.html src/dialogs/story-format/index.html +msgid "Loading..." +msgstr "Laden..." + +#: src/dialogs/formats/item.html +msgid "Set this format as default for stories" +msgstr "Dieses Format als Standard für alle Geschichten setzen" + +#: src/dialogs/formats/item.html +msgid "Remove this format" +msgstr "Dieses Format entfernen" + +#: src/dialogs/story-format/index.html +msgid "Story Format" +msgstr "Story-Format" + +#: src/dialogs/story-format/index.html +msgid "" +"A story format controls the appearance and behavior of your story during " +"play." +msgstr "" +"Das Story-Format bestimmt Aussehen und Verhalten der Geschichte beim Spielen." + +#: src/dialogs/story-import/index.html +#: src/story-list-view/list-toolbar/index.html +msgid "Import From File" +msgstr "Importieren aus Datei" + +#: src/dialogs/story-import/index.html +msgid "Import this file:" +msgstr "Diese Datei importieren:" + +#: src/dialogs/story-import/index.html src/dialogs/confirm/index.js +#: src/dialogs/prompt/index.js msgid "Cancel" msgstr "Abbrechen" -#: templates/storyeditview/renamestorymodal.html:29 -msgid "Save" -msgstr "Speichern" +#: src/dialogs/story-import/index.html +msgid "Working..." +msgstr "In Bearbeitung..." -#: templates/storyeditview/scripteditmodal.html:8 -msgid "JavaScript" -msgstr "JavaScript" - -#: templates/storyeditview/scripteditmodal.html:14 +#: src/dialogs/story-import/index.html msgid "" -"Any JavaScript entered here will immediately run when your story is opened " -"in a Web browser." +"Some stories you are importing already exist in your library. Please choose " +"which to replace. Any other stories in your file will be imported as well." msgstr "" -"JavaScript, das hier steht, wird ausgeführt, sobald die Geschichte im " -"Browser geöffnet ist." +"Einige Stories existieren schon in deiner Sammlung. Bitte wähle aus, welche " +"ersetzt werden sollen. Alle anderen Stories in der Datei werden nicht " +"importiert. " + +#: src/dialogs/story-import/index.html +msgid "Don't Import Any Stories" +msgstr "Keine Geschichte importieren" -#: templates/storyeditview/searchmodal.html:7 +#: src/dialogs/story-search/index.html msgid "Find and Replace" msgstr "Suchen und ersetzen" -#: templates/storyeditview/searchmodal.html:12 +#: src/dialogs/story-search/index.html msgid "Search For" msgstr "Suchen nach" -#: templates/storyeditview/searchmodal.html:18 +#: src/dialogs/story-search/index.html msgid "Include passage names" msgstr "Absatznamen berücksichtigen" -#. L10n: As in uppercase or lowercase letters. -#: templates/storyeditview/searchmodal.html:23 +#: src/dialogs/story-search/index.html msgid "Match case" msgstr "Groß-/Kleinschreibung beachten" -#. L10n: A technical term, see https://en.wikipedia.org/wiki/Regular_expression. -#: templates/storyeditview/searchmodal.html:29 +#: src/dialogs/story-search/index.html msgid "Regular expression" msgstr "Regulärer Ausdruck" -#: templates/storyeditview/searchmodal.html:34 +#: src/dialogs/story-search/index.html msgid "Replace With" msgstr "Ersetzen durch" -#: templates/storyeditview/searchmodal.html:40 +#: src/dialogs/story-search/index.html msgid "Expand all search results" msgstr "Alle Ergebnisse ausklappen" -#: templates/storyeditview/searchmodal.html:44 +#: src/dialogs/story-search/index.html msgid "Collapse all search results" msgstr "Alle Ergebnisse einklappen" -#: templates/storyeditview/searchmodal.html:49 +#: src/dialogs/story-search/index.html msgid "Replace All" msgstr "Alle ersetzen" -#: templates/storyeditview/searchmodal.html:57 +#: src/dialogs/story-search/index.html +#, fuzzy +msgid "%d passage matches." +msgid_plural "%d passage matches." +msgstr[0] "%d Absatz erfüllt die Anfrage." +msgstr[1] "%d Absätze erfüllen die Anfrage." + +#: src/dialogs/story-search/index.html msgid "Searching..." msgstr "Suche läuft..." -#. L10n: %d is a number of text matches after a search. -#: templates/storyeditview/searchmodalresult.html:13 -#, php-format +#: src/dialogs/story-search/result.html +#, fuzzy msgid "%d match" -msgid_plural "%d matches" +msgid_plural "%d match" msgstr[0] "%d Treffer" msgstr[1] "%d Treffer" -#: templates/storyeditview/searchmodalresult.html:22 +#: src/dialogs/story-search/result.html msgid "Replace in this passage" msgstr "Ersetzen in diesem Absatz" -#: templates/storyeditview/searchmodalresult.html:23 +#: src/dialogs/story-search/result.html msgid "Replace in Passage" msgstr "Ersetzen im Absatz" -#: templates/storyeditview/statsmodal.html:8 -#: templates/storyeditview/toolbar.html:39 +#: src/dialogs/story-stats/index.html +#: src/story-edit-view/story-toolbar/story-menu/index.html msgid "Story Statistics" msgstr "Statistik zur Geschichte" -#: templates/storyeditview/statsmodal.html:38 -#, php-format -msgid "This story was last changed at %s" -msgstr "Diese Geschichte wurde am %s das letzte Mal bearbeitet" +#: src/editors/javascript/index.html +msgid "JavaScript" +msgstr "JavaScript" -#. L10n: %s is the IFID of the story. Please keep the element around it. -#: templates/storyeditview/statsmodal.html:45 -#, php-format +#: src/editors/javascript/index.html msgid "" -"The IFID for this story is %s. What's an IFID?)" +"Any JavaScript entered here will immediately run when your story is opened " +"in a Web browser." msgstr "" -"Die IFID dieser Geschichte lautet %s.(Was ist eine IFID?)" +"JavaScript, das hier steht, wird ausgeführt, sobald die Geschichte im " +"Browser geöffnet ist." -#: templates/storyeditview/storyformatmodal.html:7 -msgid "Story Format" -msgstr "Story-Format" +#: src/editors/passage/index.html +msgid "Passage Name" +msgstr "Name des Absatzes" -#: templates/storyeditview/storyformatmodal.html:12 -msgid "" -"A story format controls the appearance and behavior of your story during " -"play." -msgstr "" -"Das Story-Format bestimmt Aussehen und Verhalten der Geschichte beim Spielen." +#: src/editors/passage/index.html +msgid "A passage already exists with this name." +msgstr "Es gibt schon einen Absatz mit diesem Namen" -#: templates/storyeditview/storyformatmodal.html:16 -#: templates/storylistview/modals/formatsmodal.html:58 -msgid "Loading..." -msgstr "Laden..." +#: src/editors/passage/tag-editor.html +msgid "Tag" +msgstr "Tag" + +#: src/editors/passage/tag-editor.html +msgid "Tag name" +msgstr "Name des Tags" -#: templates/storyeditview/stylesheeteditmodal.html:8 +#: src/editors/stylesheet/index.html msgid "Stylesheet" msgstr "Stylesheet" -#: templates/storyeditview/stylesheeteditmodal.html:14 +#: src/editors/stylesheet/index.html msgid "" "Any CSS entered here will override the default appearance of your story." msgstr "" "Jedes CSS an dieser Stelle überschreibt das Standard-Aussehen der Geschichte." -#: templates/storyeditview/toolbar.html:5 -msgid "Go to the story list" -msgstr "Gehe zur Übersicht der Geschichten" +#: src/locale/view/index.html +msgid "Please choose which language you would like to use with Twine." +msgstr "Bitte wähle die Sprache, in der du Twine verwenden möchtest." -#: templates/storyeditview/toolbar.html:19 -msgid "Edit Story JavaScript" -msgstr "JavaScript der Geschichte bearbeiten" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Hi!" +msgstr "Hallo!" -#: templates/storyeditview/toolbar.html:23 -msgid "Edit Story Stylesheet" -msgstr "Stylesheet der Geschichte bearbeiten" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "" +"Twine is an open-source tool for telling interactive, nonlinear stories. " +"There are a few things you should know before you get started." +msgstr "" +"Twine ist eine Open-Source-Software zum Erzählen interaktiver, nicht-" +"linearer Geschichten. Ein paar Dinge solltest du wissen, bevor du starten " +"kannst." -#: templates/storyeditview/toolbar.html:27 -msgid "Change Story Format" -msgstr "Format der Geschichte ändern" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Tell Me More" +msgstr "Mehr erfahren" -#: templates/storyeditview/toolbar.html:35 -msgid "Snap to Grid" -msgstr "Am Gitter ausrichten" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Skip" +msgstr "Überspringen" -#: templates/storyeditview/toolbar.html:45 -msgid "View Proofing Copy" -msgstr "Korrekturfassung anzeigen" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "New here?" +msgstr "Neu hier?" -#: templates/storyeditview/toolbar.html:49 -#: templates/storylistview/storyitemview.html:32 -msgid "Publish to File" -msgstr "Als Datei veröffentlichen" +#: src/nw/patches/welcome-view/replacement-template.html +msgid "" +"<strong>If you've never used Twine before,</strong> then " +"welcome! The <a href=\"http://twinery.org/2guide\" target=\"_blank\">" +"Twine 2 Guide</a> and the official wiki in general, are a great place " +"to learn. Keep in mind that some articles on the wiki at large were written " +"for Twine 1, which is a little bit different than this version. But most of " +"the concepts are the same." +msgstr "" +"<strong>Wenn du Twine noch nie benutzt hast:</strong> Herzlich " +"Wilkommen! <a href=\"http://twinery.org/2guide\" target=\"_blank\">" +"Twine 2 Guide</a> und das offizielle Wiki allgemein helfen dir beim " +"Einstieg. Denk daran, dass einige Artikel im Wiki für Twine 1 geschrieben " +"wurden. Twine 1 verhält sich eine wenig anders als diese Version. Aber die " +"meisten Konzepte sind die selben." + +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "" +"You can also get help over at the <a href=\"http://twinery.org/forum\" " +"target=\"_blank\">Twine forum, too." +msgstr "" +"Hilfe findest du auch im <a href=\"http://twinery.org/forum\" target=" +"\"_blank\">Twine Forum</a>." -#: templates/storyeditview/toolbar.html:62 -msgid "Quick Find" -msgstr "Schnellsuche" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "" +"<strong>If you have used Twine 1 before,</strong> the guide also " +"has details on what has changed in this version. Chief among them is a new " +"default story format, Harlowe. But if you find you prefer the Twine 1 " +"scripting syntax, try using SugarCube instead." +msgstr "" +"<strong>Wenn du Twine schon einmal verwendet hast,</strong> " +"enthält die Anleitung Hinweise, was sich in dieser Version geändert hat. " +"Hervorzuheben ist hierbei das neue Standard-Story-Format Harlowe. Wenn du " +"die Twine 1 Syntax bevorzugst, dann bietet SugarCube einen guten Einstieg." -#: templates/storyeditview/toolbar.html:63 -msgid "Find and replace across the entire story" -msgstr "Suchen und Ersetzen in der gesamten Geschichte" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "OK" +msgstr "OK" -#: templates/storyeditview/toolbar.html:67 +#: src/nw/patches/welcome-view/replacement-template.html +msgid "Your work is automatically saved." +msgstr "Deine Arbeit wird automatisch gespeichert." + +#: src/nw/patches/welcome-view/replacement-template.html +msgid "" +"There's now a folder named Twine in your Documents folder. Inside that is a " +"Stories folder, where all your work will be saved. Twine saves as you work, " +"so you don't have to worry about remembering to save it yourself. You can " +"always open the folder your stories are saved to by using the <b>Show " +"Library</b> item in the <b>Twine</b> menu." +msgstr "" +"Es gibt nun einen Twine-Ordner in deinem Dokumente-Ordner. Dieser enthält " +"einen Stories-Ordner, indem deine Geschichten gespeichert werden. Twine " +"speichert automatisch beim Schreiben der Story, du musst nicht explizit " +"speichern. Um den Ordner zu öffnen, indem deine Stories gesichert werden, " +"verwende <b>Sammlung Anzeigen</b> im <b>Twine</b>-" +"Menü." + +#: src/nw/patches/welcome-view/replacement-template.html +msgid "" +"Because Twine is always saving your work, the files in your story library " +"will be locked from editing while Twine is open." +msgstr "" +"Da Twine deine Fortschritte regelmäßig speichert, sind die Dateien in deiner " +"Sammlung gesperrt so lange Twine geöffnet ist." + +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "That's it!" +msgstr "Das ist alles!" + +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Thanks for reading, and have fun with Twine." +msgstr "Danke fürs Lesen und viel Spass mit Twine." + +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Go to the Story List" +msgstr "Gehe zur Liste der Geschichten" + +#: src/story-edit-view/passage-item/passage-menu/index.html +msgid "Test story starting here" +msgstr "Test hier starten" + +#: src/story-edit-view/story-toolbar/index.html +msgid "Go to the story list" +msgstr "Gehe zur Übersicht der Geschichten" + +#: src/story-edit-view/story-toolbar/index.html msgid "Show only story structure" msgstr "Nur Struktur anzeigen" -#: templates/storyeditview/toolbar.html:71 +#: src/story-edit-view/story-toolbar/index.html msgid "Show only passage titles" msgstr "Nur Titel der Absätze anzeigen" -#: templates/storyeditview/toolbar.html:75 +#: src/story-edit-view/story-toolbar/index.html msgid "Show passage titles and excerpts" msgstr "Titel und Auszug der Absätze anzeigen" -#: templates/storyeditview/toolbar.html:81 +#: src/story-edit-view/story-toolbar/index.html msgid "Play this story in test mode" msgstr "Geschichte im Testmodus spielen" -#. L10n: The verb form, to try something or to check it for problems. -#: templates/storyeditview/toolbar.html:84 +#: src/story-edit-view/story-toolbar/index.html msgid "Test" msgstr "Testen" -#: templates/storyeditview/toolbar.html:88 +#: src/story-edit-view/story-toolbar/index.html msgid "Play this story" msgstr "Geschichte spielen" -#. L10n: The verb form, as in playing a game. -#: templates/storyeditview/toolbar.html:91 +#: src/story-edit-view/story-toolbar/index.html msgid "Play" msgstr "Spielen" -#: templates/storyeditview/toolbar.html:95 +#: src/story-edit-view/story-toolbar/index.html msgid "Add a new passage" -msgstr "Neuen Absatz hinzufügen" - -#. L10n: This does not actually show the count here, as it is used in a table. -#: templates/storyeditview/toolbar.html:96 -#: js/views/storyeditview/modals/statsmodal.js:75 -msgid "Passage" -msgid_plural "Passages" -msgstr[0] "Absatz" -msgstr[1] "Absätze" - -#. L10n: %s is the name of an author. -#: templates/storyformatdetail.html:26 -#, php-format -msgid "by %s" -msgstr "von %s" - -#. L10n: %s is the name of a software license. -#: templates/storyformatdetail.html:39 -#, php-format -msgid "License: %s" -msgstr "Lizenz: %s" - -#: templates/storylistview/formatitem.html:5 -msgid "Are you sure?" -msgstr "Bist du sicher?" - -#: templates/storylistview/formatitem.html:6 -msgid "Remove" -msgstr "Entfernen" - -#: templates/storylistview/formatitem.html:12 -msgid "Remove this format" -msgstr "Dieses Format entfernen" - -#: templates/storylistview/formatitem.html:14 -msgid "Set this format as default for stories" -msgstr "Dieses Format als Standard für alle Geschichten setzen" - -#: templates/storylistview/modals/aboutmodal.html:8 -msgid "About Twine" -msgstr "Über Twine" - -#. L10n: This is the noun form, to describe a version of the software. e.g. 'I am using Twine build 123' -#: templates/storylistview/modals/aboutmodal.html:14 -msgid "Build" -msgstr "Version" - -#: templates/storylistview/modals/aboutmodal.html:21 -msgid "" -"Twine is an open-source tool for telling interactive, nonlinear stories." -msgstr "" -"Twine ist eine Open-Source-Software zum Erzählen interaktiver, nicht-" -"linearer Geschichten." - -#: templates/storylistview/modals/aboutmodal.html:25 -msgid "" -"Twine 2.0 is released under the GPL v3 license, but any work created with it may be " -"released under any terms, including commercial ones. Source Code Repository" -msgstr "" -"Twine 2.0 steht unter der GPL v3 Lizenz, aber jedes Werk, das damit erstellt wird, kann " -"unter einer beliebigen auch kommerziellen Lizenz veröffentlicht werden. Quellecode" - -#: templates/storylistview/modals/aboutmodal.html:31 -msgid "Help Twine Grow With A Donation" -msgstr "Unterstütze Twine mit Spenden" - -#. L10n: This is the noun form, as program code. -#: templates/storylistview/modals/aboutmodal.html:39 -msgid "Code" -msgstr "Code" - -#: templates/storylistview/modals/aboutmodal.html:55 -msgid "Libraries" -msgstr "Bibliotheken" - -#: templates/storylistview/modals/aboutmodal.html:74 -msgid "Fonts" -msgstr "Schriftarten" - -#: templates/storylistview/modals/aboutmodal.html:78 -msgid "" -"Source Sans Pro and Source Code Pro were designed by Paul D. Hunt under the " -"guidance of Robert Slimbach for Adobe
Nunito was designed by
Vernon Adams" -msgstr "" -"Source Sans Pro und Source Code Pro wurden von Paul D. Hunt unter der " -"Anleitung von Robert Slimbach für Adobeentworfen.
Nunito wurde von
Vernon Adams entworfen." - -#: templates/storylistview/modals/aboutmodal.html:82 -msgid "Icons" -msgstr "Symbole" - -#: templates/storylistview/modals/aboutmodal.html:87 -msgid "Document designed by Rob Gill from the Noun Project" -msgstr "Document erstellt von Rob Gill vom Noun Project" - -#: templates/storylistview/modals/aboutmodal.html:88 -msgid "Question designed by Henry Ryder from the Noun Project" -msgstr "Question erstellt von Henry Ryder vom Noun Project" - -#: templates/storylistview/modals/aboutmodal.html:89 -msgid "Smile designed by jelio dimitrov from the Noun Project" -msgstr "Smile erstellt von jelio dimitrov vom Noun Project" - -#. L10n: The will have a version number, i.e. 2.0.6, interpolated into it. -#: templates/storylistview/modals/appupdatemodal.html:10 -msgid "" -"A new version of Twine, , has been released." -msgstr "" -"Eine neue Version von Twine, , steht zur " -"Verfügung." - -#. L10n: A polite rejection of a request, in the sense that the answer may change in the future. -#: templates/storylistview/modals/appupdatemodal.html:18 -msgid "Not Right Now" -msgstr "Nicht jetzt" - -#: templates/storylistview/modals/appupdatemodal.html:21 -msgid "Download" -msgstr "Download" - -#: templates/storylistview/modals/donatemodal.html:6 -msgid "" -"If you love Twine as much as I do, please consider helping it grow with a " -"donation. Twine is as an open source project that will always be free to use " -"— and with your help, Twine will continue to thrive." -msgstr "" -"Wenn dir Twine so sehr am Herzen liegt wie mir, möchtest du es vielleicht " -"mit einer Spenden unterstützen. Twine ist ein Open-Source-Projekt, das immer " -"frei zur Verfügung stehen wird und mit deiner Hilfe weiter wachsen kann." +msgstr "Neuen Absatz hinzufügen" -#: templates/storylistview/modals/donatemodal.html:10 -msgid "Chris Klimas, Twine creator" -msgstr "Chris Klimas, Schöpfer von Twine" +#: src/story-edit-view/story-toolbar/index.html +#, fuzzy +msgid "Passage" +msgstr "Absatz" -#: templates/storylistview/modals/donatemodal.html:16 -msgid "Donate" -msgstr "Spende" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Edit Story JavaScript" +msgstr "JavaScript der Geschichte bearbeiten" -#: templates/storylistview/modals/donatemodal.html:17 -msgid "No Thanks" -msgstr "Nein Danke" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Edit Story Stylesheet" +msgstr "Stylesheet der Geschichte bearbeiten" -#: templates/storylistview/modals/donatemodal.html:21 -msgid "This message will only be shown to you once.
" -msgstr "Diese Nachricht wird dir nur einmal angezeigt.
" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Change Story Format" +msgstr "Format der Geschichte ändern" -#: templates/storylistview/modals/formatsmodal.html:9 -msgid "Story Formats" -msgstr "Story-Formate" +#: src/story-edit-view/story-toolbar/story-menu/index.html +#: src/story-list-view/story-item/item-menu/index.html +msgid "Rename Story" +msgstr "Geschichte umbennenen" -#: templates/storylistview/modals/formatsmodal.html:10 -msgid "Proofing Formats" -msgstr "Formate zum Gegenlesen" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Snap to Grid" +msgstr "Am Gitter ausrichten" -#: templates/storylistview/modals/formatsmodal.html:11 -msgid "Add a New Format" -msgstr "Neues Format hinzufügen" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "View Proofing Copy" +msgstr "Korrekturfassung anzeigen" -#: templates/storylistview/modals/formatsmodal.html:20 -msgid "" -"Story formats control the appearance and behavior of stories during play." -msgstr "" -"Story-Formate bestimmen das Aussehen und Verhalten der Geschichte beim " -"Spielen." +#: src/story-edit-view/story-toolbar/story-menu/index.html +#: src/story-list-view/story-item/item-menu/index.html +msgid "Publish to File" +msgstr "Als Datei veröffentlichen" -#: templates/storylistview/modals/formatsmodal.html:30 -msgid "" -"Proofing formats create a versions of stories tailored for editing and " -"proofreading." -msgstr "" -"Diese Formate erzeugen eine Version der Geschichte zum Redigieren und zur " -"Fehlersuche." +#: src/story-edit-view/story-toolbar/story-search/index.html +msgid "Quick Find" +msgstr "Schnellsuche" -#. L10n: Address in the sense of a URL. -#: templates/storylistview/modals/formatsmodal.html:42 -msgid "To add a story format, enter its address below." -msgstr "Zum Hinzufügen eines Formates, gib hier die zugehörige URL an." +#: src/story-edit-view/story-toolbar/story-search/index.html +msgid "Find and replace across the entire story" +msgstr "Suchen und Ersetzen in der gesamten Geschichte" -#: templates/storylistview/modals/formatsmodal.html:50 -#: templates/storylistview/storylistview.html:26 -msgid "Add" -msgstr "Hinzufügen" +#: src/story-list-view/index.html +msgid "Drop a story file to import" +msgstr "Story-Datei hier ablegen. (Drag & Drop)" -#: templates/storylistview/storyitemview.html:24 -msgid "Play Story" -msgstr "Geschichte spielen" +#: src/story-list-view/index.html +msgid "Sort By" +msgstr "Sortieren nach" -#: templates/storylistview/storyitemview.html:28 -msgid "Test Story" -msgstr "Geschichte testen" +#: src/story-list-view/index.html +msgid "Last changed date" +msgstr "Letztes Änderungsdatum" -#: templates/storylistview/storyitemview.html:40 -msgid "Duplicate Story" -msgstr "Geschichte duplizieren" +#: src/story-list-view/index.html +msgid "Edit Date" +msgstr "Änderungsdatum" -#: templates/storylistview/storyitemview.html:46 -msgid "Delete Story" -msgstr "Geschichte löschen" +#: src/story-list-view/index.html +msgid "Story name" +msgstr "Name der Geschichte" + +#: src/story-list-view/index.html +msgid "Name" +msgstr "Name" + +#: src/story-list-view/index.html +msgid "" +"There are no stories saved in Twine right now. To get started, you can " +"either create a new story or import an existing one from a file." +msgstr "" +"Es gibt zur Zeit noch keine Geschichten in Twine. Du kannst entweder eine " +"neue Geschichte anlegen oder eine bestehende Geschichte importieren." -#: templates/storylistview/storylistview.html:5 +#: src/story-list-view/list-toolbar/index.html src/nw/directories.js +#: src/nw/menus.js msgid "Twine" msgstr "Twine" -#: templates/storylistview/storylistview.html:9 +#: src/story-list-view/list-toolbar/index.html msgid "Create a brand-new story" msgstr "Ganz neue Geschichte schreiben" -#: templates/storylistview/storylistview.html:10 +#: src/story-list-view/list-toolbar/index.html msgid "Story" msgstr "Geschichte" -#: templates/storylistview/storylistview.html:17 -msgid "What should your story be named?
(You can change this later.)" -msgstr "Wie soll die Geschichte heißen?
(Kann später angepasst werden.)" - -#: templates/storylistview/storylistview.html:34 +#: src/story-list-view/list-toolbar/index.html msgid "Import a published story or Twine archive" msgstr "Importieren aus veröffentlichter Geschichte oder Twine-Archiv" -#: templates/storylistview/storylistview.html:35 -msgid "Import From File" -msgstr "Importieren aus Datei" - -#: templates/storylistview/storylistview.html:42 -msgid "Import this file:" -msgstr "Diese Datei importieren:" - -#: templates/storylistview/storylistview.html:59 -msgid "Importing..." -msgstr "Import läuft..." - -#: templates/storylistview/storylistview.html:67 +#: src/story-list-view/list-toolbar/index.html msgid "Save all stories to a Twine archive file" msgstr "Alle Geschichten als Twine-Archiv speichern" -#: templates/storylistview/storylistview.html:68 +#: src/story-list-view/list-toolbar/index.html msgid "Archive" msgstr "Archiv" -#: templates/storylistview/storylistview.html:73 +#: src/story-list-view/list-toolbar/index.html msgid "Work with story and proofing formats" msgstr "Mit Geschichte und Korrekturfassung arbeiten" -#: templates/storylistview/storylistview.html:74 +#: src/story-list-view/list-toolbar/index.html msgid "Formats" msgstr "Formate" -#: templates/storylistview/storylistview.html:79 +#: src/story-list-view/list-toolbar/index.html msgid "Change the language Twine uses" msgstr "Anzeigesprache von Twine ändern" -#: templates/storylistview/storylistview.html:80 +#: src/story-list-view/list-toolbar/index.html msgid "Language" msgstr "Sprache" -#: templates/storylistview/storylistview.html:85 +#: src/story-list-view/list-toolbar/index.html msgid "Browse online help" msgstr "Online-Hilfe durchsuchen" -#: templates/storylistview/storylistview.html:86 +#: src/story-list-view/list-toolbar/index.html msgid "Help" msgstr "Hilfe" -#: templates/storylistview/storylistview.html:101 +#: src/story-list-view/list-toolbar/index.html msgid "version" msgstr "Version" -#: templates/storylistview/storylistview.html:103 +#: src/story-list-view/list-toolbar/index.html msgid "Report a bug" msgstr "Fehler melden" -#: templates/storylistview/storylistview.html:111 -msgid "Stories" -msgstr "Geschichten" - -#: templates/storylistview/storylistview.html:114 -msgid "Sort By" -msgstr "Sortieren nach" - -#: templates/storylistview/storylistview.html:116 -msgid "Last changed date" -msgstr "Letztes Änderungsdatum" - -#: templates/storylistview/storylistview.html:117 -msgid "Edit Date" -msgstr "Änderungsdatum" - -#: templates/storylistview/storylistview.html:120 -msgid "Story name" -msgstr "Name der Geschichte" - -#: templates/storylistview/storylistview.html:121 -msgid "Name" -msgstr "Name" - -#: templates/storylistview/storylistview.html:128 -msgid "" -"There are no stories saved in Twine right now. To get started, you can " -"either create a new story or import an existing one from a file." -msgstr "" -"Es gibt zur Zeit noch keine Geschichten in Twine. Du kannst entweder eine " -"neue Geschichte anlegen oder eine bestehende Geschichte importieren." - -#: templates/welcomeview.html:6 -msgid "Hi!" -msgstr "Hallo!" +#: src/story-list-view/list-toolbar/theme-switcher.html +msgid "Use light theme" +msgstr "Helle Ansicht verwenden" -#: templates/welcomeview.html:10 -msgid "" -"Twine is an open-source tool for telling interactive, nonlinear stories. " -"There are a few things you should know before you get started." -msgstr "" -"Twine ist eine Open-Source-Software zum Erzählen interaktiver, nicht-" -"linearer Geschichten. Ein paar Dinge solltest du wissen, bevor du starten " -"kannst." +#: src/story-list-view/list-toolbar/theme-switcher.html +msgid "Use dark theme" +msgstr "Dunkle Ansicht verwenden" -#: templates/welcomeview.html:14 -msgid "Tell Me More" -msgstr "Mehr erfahren" +#: src/story-list-view/story-item/item-menu/index.html +msgid "Play Story" +msgstr "Geschichte spielen" -#: templates/welcomeview.html:15 -msgid "Skip" -msgstr "Überspringen" +#: src/story-list-view/story-item/item-menu/index.html +msgid "Test Story" +msgstr "Geschichte testen" -#: templates/welcomeview.html:23 -msgid "New here?" -msgstr "Neu hier?" +#: src/story-list-view/story-item/item-menu/index.html +msgid "Duplicate Story" +msgstr "Geschichte dublizieren" -#: templates/welcomeview.html:27 -msgid "" -"If you've never used Twine before, then welcome! The Twine 2 Guide " -"and the official wiki in general, are a great place to learn. Keep in mind " -"that some articles on the wiki at large were written for Twine 1, which is a " -"little bit different than this version. But most of the concepts are the " -"same." -msgstr "" -"Wenn du Twine noch nie benutzt hast, dann Herzlich " -"Willkommen! Der Twine 2 Guide und das offizielle Wiki im allgemeinen, sind ein guter " -"Ort mehr über Twine zu lernen. Einige Artikel im Wiki wurden für Twine 1 " -"geschrieben, das sich in einigen Details von der aktuellen Version " -"unterscheidet. Die groben Konzepte sind aber bestehen geblieben." - -#: templates/welcomeview.html:31 -msgid "" -"You can also get help over at the Twine forum, too." -msgstr "" -"Hilfe erhältst du außerdem im Twine Forum." +#: src/story-list-view/story-item/item-menu/index.html +msgid "Delete Story" +msgstr "Geschichte löschen" -#: templates/welcomeview.html:35 +#: src/welcome/index.html msgid "" -"If you have used Twine 1 before, the guide also has details " -"on what has changed in this version. Chief among them is a new default story " -"format, Harlowe. But if you find you prefer the Twine 1 scripting syntax, " -"try using SugarCube instead." +"<strong>If you've never used Twine before,</strong> then " +"welcome! The <a href=\"http://twinery.org/2guide\" target=\"_blank\">" +"Twine 2 Guide</a> and the official wiki in general, are a great place " +"to learn. Keep in mind that some articles on the wiki at larger were written " +"for Twine 1, which is a little bit different than this version. But most of " +"the concepts are the same." msgstr "" -"Hast du bisher Twine 1 verwendet, dann enthält der \"Twine " -"2 Guide\" außerdem Details darüber, was sich in der neuen Version geändert " -"hat. Vor allem wurde das neue Standardformat Harlowe eingeführt. Wenn du das " -"Format von Twine 1 bevorzugst, teste stattdessen SugarCube." - -#: templates/welcomeview.html:39 templates/welcomeview.html:63 -#: templates/welcomeviewnw.html:23 -msgid "OK" -msgstr "OK" - -#: templates/welcomeview.html:47 +"<strong>Wenn du Twine noch nie benutzt hast:</strong> Herzlich " +"Wilkommen! <a href=\"http://twinery.org/2guide\" target=\"_blank\">" +"Twine 2 Guide</a> und das offizielle Wiki allgemein helfen dir beim " +"Einstieg. Denk daran, dass einige Artikel im Wiki für Twine 1 geschrieben " +"wurden. Twine 1 verhält sich eine wenig anders als diese Version. Aber die " +"meisten Konzepte sind die selben." + +#: src/welcome/index.html msgid "Your work is saved only in your browser." msgstr "Die Arbeit wird nur im Browser gespeichert." -#: templates/welcomeview.html:51 +#: src/welcome/index.html msgid "" "That means you don't need to create an account to use Twine 2, and " "everything you create isn't stored on a server somewhere else — it " @@ -677,494 +646,558 @@ msgstr "" "du erstellst, wird nicht auf einem entfernten Server abgelegt, sondern lokal " "in deinem Browser gespeichert." -#: templates/welcomeview.html:55 -msgid "" -"Two very important things to remember, though. Since your work is " -"saved only in your browser, if you clear its saved data, then you'll lose " -"your work! Not good. Remember to use that  Archive button often. You can also publish " -"individual stories to files using the menu on " -"each story in the story list. Both archive and story files can always be re-" -"imported into Twine." -msgstr "" -"Zwei sehr wichtige Hinweise: Da die Arbeit nur lokal im Browser " -"gespeichert wird, verlierst du all deine Fortschritte, wenn du die lokalen " -"Daten des Browser löschen! Nutze häufig den  Archiv-Button. Du kannst außerdem einzelnen " -"Geschichten in Dateien veröffentlichen, indem du das -Menü an den Geschichten in der Übersicht verwendest. Sowohl Archive " -"als auch einzelnen als Datei veröffentlichte Geschichten können immer wieder " -"zurück nach Twine importiert werden." - -#: templates/welcomeview.html:59 -msgid "" -"Secondly, anyone who can use this browser can see and make changes to " -"your work. So if you've got a nosy kid brother, look into setting up a " -"separate profile for yourself." -msgstr "" -"Außerdem, jeder der diesen Browser nutzten darf, kann deine Arbeit sehen " -"und verändern. Hast du also neugierige Mitmenschen, die den selben " -"Rechner verwenden, dann könnte es sinnvoll sein dich zu informiere, wie du " -"eine eigenes privates Profil anlegest." - -#: templates/welcomeview.html:71 -msgid "That's it!" -msgstr "Das ist alles!" - -#: templates/welcomeview.html:75 -msgid "Thanks for reading, and have fun with Twine." -msgstr "Danke fürs Lesen und viel Spass mit Twine." - -#: templates/welcomeview.html:79 -msgid "Go to the Story List" -msgstr "Gehe zur Liste der Geschichten" - -#: templates/welcomeviewnw.html:7 -msgid "Your work is automatically saved." -msgstr "Deine Arbeit wird automatisch gespeichert." - -#: templates/welcomeviewnw.html:11 +#: src/welcome/index.html msgid "" -"There's now a folder named Twine in your Documents folder. Inside that is a " -"Stories folder, where all your work will be saved. Twine saves as you work, " -"so you don't have to worry about remembering to save it yourself. You can " -"always open the folder your stories are saved to by using the Show " -"Library item in the Twine menu." +"Two <b>very important</b> things to remember, though. Since your " +"work is saved only in your browser, if you clear its saved data, then you'll " +"lose your work! Not good. Remember to use that <i class=\"fa fa-briefcase" +"\"></i> <strong>Archive</strong> button often. You " +"can also publish individual stories to files using the <i class=\"fa fa-" +"cog\"></i> menu on each story in the story list. Both archive and " +"story files can always be re-imported into Twine." msgstr "" -"Es gibt nun einen Ordner Twine in deinem Dokumente-Ordner. Darin ist ein " -"Ordner Geschichten, indem all deine Fortschritte gespeichert werden. Twine " -"speichert deine Arbeit regelmäßig, du musst also nicht selbst daran denken, " -"deine Fortschritte zu speichern. Du kannst jederzeit den Ordner mit deinen " -"Geschichten öffnen, indem du Sammlung Anzeigen im Twine-Menü " -"auswählst." - -#: templates/welcomeviewnw.html:15 +"Zwei <b>sehr wichtiget</b> Dinge sind zu beachten. Deine " +"Geschichten werden nur in deinem Browser gespeichert. Wenn du die " +"\"Browserdaten\" löscht, dann geht deine Arbeit verloren. Denk daran, den " +"<i class=\"fa fa-briefcase\"></i> <strong>Archiv</" +"strong>-Button häufig zu verwenden. Du kannst einzelnen Geschichten auch " +"sichern in dem du das <i class=\"fa fa-cog\"></i>-Menü in der " +"Story oder im der Story-Übersicht verwendest. Sowohl das Archiv als auch die " +"gesicherten Story-Dateien können jederzeit re-importiert werden." + +#: src/welcome/index.html msgid "" -"Because Twine is always saving your work, the files in your story library " -"will be locked from editing while Twine is open." +"Secondly, <b>anyone who can use this browser can see and make changes " +"to your work</b>. So if you've got a nosy kid brother, look into " +"setting up a separate profile for yourself." msgstr "" -"Da Twine deine Fortschritte regelmäßig speichert, sind die Dateien in deiner " -"Sammlung gesperrt so lange Twine geöffnet ist." +"Außerdem: <b>Jeder der diesen Browser verwendet kann deinen " +"Geschichten lesen und verändern</b>. Wenn du also neugierige " +"Mitmenschen hast, die den selben Rechner verwenden, danke darüber nach einen " +"separaten Benutzer-Account zu verwenden." -#: templates/welcomeviewnw.html:19 -msgid "" -"If you'd like to open a Twine story file you received from someone else, you " -"can import it into your library using the " -"Import From File link in the story list." -msgstr "" -"Wenn du eine Twine Datei von jemandem erhältst, kannst du sie in deine " -"Sammlung übernehmen. Nutze dazu den Menüpunkt Importieren aus Datei " -"in der Übersicht." - -#. L10n: %1$s is a filename; %2$s is the error message. -#: js/app.js:226 -msgid "“%1$s” could not be saved (%2$s)." -msgstr "“%1$s” konnte nicht gespeichert werden (%2$s)." - -#. L10n: %s is the error message. -#: js/app.js:283 -#, javascript-format -msgid "An error occurred while publishing your story. (%s)" -msgstr "Eine Fehler beim Veröffentlichen der Geschichte ist aufgetreten. (%s)" - -#: js/app.js:314 -msgid "Twine Archive.html" -msgstr "Twine Archiv.html" +#: src/data/story-format.js +msgid "Untitled Story Format" +msgstr "Unbenanntes Format der Geschichte" -#. L10n: An internal error. %s is a bad sort criterion. -#: js/collections/storycollection.js:35 -#, javascript-format -msgid "don't know how to sort stories by %s" -msgstr "es ist nicht möglich die Geschichten nach %s zu sortieren" +#: src/data/story.js +msgid "Untitled Story" +msgstr "Unbenannte Geschichte" -#: js/models/passage.js:19 +#: src/data/story.js src/story-edit-view/index.js msgid "Untitled Passage" msgstr "Unbenannter Absatz" -#: js/models/passage.js:21 +#: src/data/story.js msgid "Tap this passage, then the pencil icon to edit it." msgstr "Zum Bearbeiten: Tippe den Absatz und dann das Stift-Icon." -#: js/models/passage.js:22 +#: src/data/story.js msgid "Double-click this passage to edit it." msgstr "Doppelklick auf diesen Absatz zum Bearbeiten." -#: js/models/passage.js:78 -msgid "You must give this passage a name." -msgstr "Du musst diesem Absatz einen Namen geben." - -#: js/models/passage.js:85 -#, javascript-format +#. The will have a version number, i.e. 2.0.6, interpolated into it. +#: src/dialogs/app-update/index.js msgid "" -"There is already a passage named \"%s.\" Please give this one a unique name." +"A new version of Twine, , has been released." msgstr "" -"Es gibt schon einen Absatz mit dem Namen \"%s\". Bitter vergib einen " -"eindeutigen Namen." +"Eine neue Version von Twine, , steht zur " +"Verfügung." -#: js/models/story.js:16 -msgid "Untitled Story" -msgstr "Unbenannte Geschichte" +#: src/dialogs/app-update/index.js +msgid "Download" +msgstr "Download" -#: js/models/story.js:112 -msgid "There is no starting point set for this story." -msgstr "Es ist kein Startpunkt für diese Geschichte markiert." +#. A polite rejection of a request, in the sense that the answer may change in the future. +#: src/dialogs/app-update/index.js +msgid "Not Right Now" +msgstr "Nicht jetzt" -#: js/models/story.js:115 -msgid "The passage set as starting point for this story does not exist." -msgstr "Der Absatz, der als Startpunkt markiert wurde, existiert nicht." +#. %s is the name of an author. +#: src/dialogs/formats/item.js +msgid "by %s" +msgstr "von %s" -#: js/models/storyformat.js:38 -msgid "Untitled Story Format" -msgstr "Unbenanntes Format der Geschichte" +#: src/dialogs/formats/item.js +msgid "Are you sure?" +msgstr "Bist du sicher?" + +#: src/dialogs/formats/item.js +msgid "Remove" +msgstr "Entfernen" + +#: src/dialogs/story-import/index.js +msgid "Don't Replace Any Stories" +msgstr "Keine Geschichte ersetzen" + +#. Character in the sense of individual letters in a word. This does not actually include the count, as it is used in a table. +#: src/dialogs/story-stats/index.js +#, fuzzy +msgid "Character" +msgid_plural "Character" +msgstr[0] "Buchstabe" +msgstr[1] "Buchstaben" + +#. Word in the sense of individual words in a sentence. This does not actually include the count, as it is used in a table. +#: src/dialogs/story-stats/index.js +#, fuzzy +msgid "Word" +msgid_plural "Word" +msgstr[0] "Wort" +msgstr[1] "Wörter" + +#. Links in the sense of hypertext links. This does not actually include the count, as it is used in a table. +#: src/dialogs/story-stats/index.js +#, fuzzy +msgid "Link" +msgid_plural "Link" +msgstr[0] "Link" +msgstr[1] "Links" + +#: src/editors/passage/index.js +msgid "Editing \\u201c%s\\u201d" +msgstr "\\u201c%s\\u201d bearbeiten" + +#. This is the folder name on OS X, Linux, and recent versions of Windows that a user's documents are stored in, relative to the user's home directory. If you need to use a space in this name, then it should have two backslashes (\\) in front of it. Regardless, this must have a single forward slash (/) as its first character. +#: src/nw/directories.js +msgid "/Documents" +msgstr "/Dokumente" + +#. This is the folder name on Windows XP that a user's documents are stored in, relative to the user's home directory. This is used if a folder with the name given by the translation key '/Documents' does not exist. If you need to use a space in this name, then it should have two backslashes (\\) in front of it. Regardless, this must have a single forward slash (/) as its first character. +#: src/nw/directories.js +msgid "My\\ Documents" +msgstr "Eigene\\ Dateien" + +#: src/nw/directories.js +msgid "Stories" +msgstr "Geschichten" -#: js/nwui.js:81 +#: src/nw/menus.js msgid "Toggle Fullscreen" msgstr "Vollbild umschalten" -#: js/nwui.js:100 +#: src/nw/menus.js msgid "Quit" msgstr "Schließen" -#: js/nwui.js:115 +#: src/nw/menus.js msgid "Edit" msgstr "Bearbeiten" -#: js/nwui.js:120 +#: src/nw/menus.js msgid "Undo" msgstr "Widerrufen" -#: js/nwui.js:132 +#: src/nw/menus.js msgid "Cut" msgstr "Ausschneiden" -#: js/nwui.js:142 +#: src/nw/menus.js msgid "Copy" msgstr "Kopieren" -#: js/nwui.js:152 +#: src/nw/menus.js msgid "Paste" msgstr "Einfügen" -#: js/nwui.js:162 js/views/storyeditview/passageitemview.js:171 -#: js/views/storyeditview/storyeditview.js:126 +#: src/nw/menus.js src/story-edit-view/passage-item/index.js msgid "Delete" msgstr "Löschen" -#: js/nwui.js:182 +#: src/nw/menus.js msgid "Show Library" msgstr "Sammlung Anzeigen" -#. L10n: This is the folder name on OS X, Linux, and recent versions of -#. Windows that a user's documents are stored in, relative to the -#. user's home directory. If you need to use a space in this name, -#. then it should have two backslashes (\\) in front of it. -#. Regardless, this must have a single forward slash (/) as its first -#. character. -#: js/nwui.js:239 -msgid "/Documents" -msgstr "/Dokumente" - -#. L10n: This is the folder name on Windows XP that a user's -#. documents are stored in, relative to the user's home directory. -#. This is used if a folder with the name given by the translation -#. key '/Documents' does not exist. If you need to use a space in -#. this name, then it should have two backslashes (\\) in front of it. -#. Regardless, this must have a single forward slash (/) as its first character. -#: js/nwui.js:249 js/nwui.js:250 -msgid "/My\\ Documents" -msgstr "/Eigene\\ Dokumente" - -#. L10n: '/Twine' is a suitable name for Twine-related files to exist -#. under on the user's hard drive. '/Stories' is a suitable name for -#. story files specifically. If you need to use a space in this name, -#. then it should have two backslashes in front of it. Regardless, -#. this must have a single forward slash (/) as its first character. -#: js/nwui.js:260 js/nwui.js:264 -msgid "/Twine" -msgstr "/Twine" - -#: js/nwui.js:260 -msgid "/Stories" -msgstr "/Geschichten" - -#. L10n: %s is the error message. -#: js/nwui.js:430 -#, javascript-format -msgid "An error occurred while saving your story (%s)." -msgstr "Eine Fehler beim Speichern der Geschichte ist aufgetreten (%s)." - -#. L10n: %s is the error message. -#: js/nwui.js:457 -#, javascript-format -msgid "An error occurred while deleting your story (%s)." -msgstr "Ein Fehler beim Löschen der Geschichte ist aufgetreten (%s)." - -#. L10n: Locking in the sense of preventing changes to a file. %s is the error message. -#: js/nwui.js:527 -#, javascript-format -msgid "An error occurred while locking your library (%s)." -msgstr "Ein Fehler beim Sperren deiner Sammlung ist aufgetreten (%s)." - -#. L10n: Unlocking in the sense of allowing changes to a file. %s is the error message. -#: js/nwui.js:556 -#, javascript-format -msgid "An error occurred while unlocking your library (%s)." -msgstr "Ein Fehler beim Entsperren deiner Sammlung ist aufgetreten (%s)." - -#. L10n: An internal error message related to UI components. -#: js/ui.js:166 -#, javascript-format -msgid "Don't know how to do bubble action %s" -msgstr "Kann die Aktion %s nicht weiterreichen " - -#. L10n: An internal error message related to UI components. -#: js/ui.js:219 -#, javascript-format -msgid "Don't know how to do collapse action %s" -msgstr "Kann die Aktion %s nicht einklappen" - -#. L10n: An internal error when changing locale. -#: js/views/localeview.js:27 -#, javascript-format -msgid "Can't set locale to nonstring: %s" -msgstr "Fehler bei Setzen der Sprache. Wert muss vom Typ String sein: %s" - -#: js/views/storyeditview/editors/passageeditor.js:120 -#: js/views/storyeditview/storyeditview.js:563 -#, javascript-format -msgid "Editing “%s”" -msgstr "\"%s\" bearbeiten" - -#: js/views/storyeditview/editors/passageeditor.js:211 -msgid "Any changes to the passage you're editing haven't been saved yet. " -msgstr "" -"Die Änderungen an dem bearbeiteten Absatz würden noch nicht gespeichert." - -#. L10n: Matched in the sense of matching a search criteria. %d is the number of passages. -#: js/views/storyeditview/modals/searchmodal.js:94 -#, javascript-format -msgid "%d passage matches." -msgid_plural "%d passages match." -msgstr[0] "%d Absatz erfüllt die Anfrage." -msgstr[1] "%d Absätze erfüllen die Anfrage." - -#: js/views/storyeditview/modals/searchmodal.js:102 -msgid "No matching passages found." -msgstr "Keine passenden Absätze gefunden." - -#. L10n: replacement in the sense of text search and replace. %d is the number. -#: js/views/storyeditview/modals/searchmodal.js:183 -#, javascript-format -msgid "%d replacement was made in" -msgid_plural "%d replacements were made in" -msgstr[0] "wurde %d Ersetzung durchgeführt" -msgstr[1] "wurden %d Ersetzungen durchgeführt" - -#. L10n: %d is a number of passages. -#: js/views/storyeditview/modals/searchmodal.js:187 -#, javascript-format -msgid "%d passage" -msgid_plural "%d passages" -msgstr[0] "In %d Absatz" -msgstr[1] "In %d Absätze" - -#. L10n: This is the formatting used to combine two pluralizations. -#. In English, %1$s equals "2 replacements were made in" and %2$s equals "5 passages." -#. This is a way to reshape the sentence as needed. -#: js/views/storyeditview/modals/searchmodal.js:192 -msgid "%1$s %2$s" -msgstr "%2$s %1$s" - -#. L10n: Character in the sense of individual letters in a word. -#. This does not actually show the count here, as it is used in a table. -#: js/views/storyeditview/modals/statsmodal.js:68 -msgid "Character" -msgid_plural "Characters" -msgstr[0] "Buchstabe" -msgstr[1] "Buchstaben" - -#. L10n: Word in the sense of individual words in a sentence. -#. This does not actually show the count here, as it is used in a table. -#: js/views/storyeditview/modals/statsmodal.js:72 -msgid "Word" -msgid_plural "Words" -msgstr[0] "Wort" -msgstr[1] "Wörter" - -#. L10n: Links in the sense of hypertext links. -#. This does not actually show the count here, as it is used in a table. -#: js/views/storyeditview/modals/statsmodal.js:79 -msgid "Link" -msgid_plural "Links" -msgstr[0] "Link" -msgstr[1] "Links" - -#. L10n: Links in the sense of hypertext links. -#. This does not actually show the count here, as it is used in a table. -#: js/views/storyeditview/modals/statsmodal.js:83 -msgid "Broken Link" -msgid_plural "Broken Links" -msgstr[0] "Toter Link" -msgstr[1] "Tote Links" - -#. L10n: %1$s is the name of the story format, %2$s is the error message. -#: js/views/storyeditview/modals/storyformatmodal.js:96 -#: js/views/storylistview/modals/formatsmodal.js:74 -msgid "The story format “%1$s” could not be loaded (%2$s)." -msgstr "Das Format “%1$s” konnte nicht geladen werden (%2$s). " - -#: js/views/storyeditview/passageitemview.js:165 -#, javascript-format -msgid "Are you sure you want to delete “%s”? " -msgstr "Bist du sicher, dass du “%s” löschen willst?" - -#: js/views/storyeditview/passageitemview.js:169 -msgid "(Hold the Shift key when deleting to skip this message.)" -msgstr "" -"(Halte Umschalten/Shift beim Löschen gedrückt, um diese Nachricht zu " -"vermeiden.)" - -#. L10n: An internal error related to handling user input. -#: js/views/storyeditview/passageitemview.js:461 -msgid "Don't see either mouse or touch coordinates on event" -msgstr "Kann weder Maus- noch Touch-Koordinaten am Ereignis finden" - -#. L10n: An internal error related to user input. -#: js/views/storyeditview/passageitemview.js:523 -msgid "Couldn't find original touch ID in movement event" -msgstr "" -"Konnte die ursprüngliche touch ID der Bewegung im Ereignis nicht finden" - -#. L10n: %s is the error message. -#: js/views/storyeditview/storyeditview.js:43 -#: js/views/storyeditview/storyeditview.js:64 -#, javascript-format -msgid "A problem occurred while saving your changes (%s)." -msgstr "Beim Speichern der Änderungen ist eine Problem aufgetreten (%s)." - -#. L10n: This message is always shown with more than one passage. -#. %d is the number of passages. -#: js/views/storyeditview/storyeditview.js:122 -#, javascript-format -msgid "Are you sure you want to delete this passage?" -msgid_plural "" -"Are you sure you want to delete these %d passages? This cannot be undone." -msgstr[0] "Bist du sicher, dass du diesen Absatz löschen willst?" -msgstr[1] "" -"Bist du sicher, dass du diese %d Absätze löschen willst? Kann nicht " -"widerrufen gemacht werden." - -#: js/views/storyeditview/storyeditview.js:268 -msgid "This story does not have a starting point. " -msgstr "Die Geschichte hat keinen Startpunkt." - -#: js/views/storyeditview/storyeditview.js:282 -msgid "" -"Refreshed the playable version of your story in the previously-opened tab or " -"window." -msgstr "" -"Lade die spielbare Version der Geschichte im bereits geöffneten Tab oder " -"Fenster neu." - -#: js/views/storyeditview/storyeditview.js:312 -#: js/views/storyeditview/storyeditview.js:352 -#: js/views/storylistview/storyitemview.js:110 -msgid "" -"This story does not have a starting point. Use the icon on a passage to set this." -msgstr "" -"Die Geschichte hat keinen Startpunkt. Benutze das Icon an einem Absatz, um den Startpunkt dort zu setzen." - -#: js/views/storyeditview/storyeditview.js:325 -msgid "" -"Refreshed the test version of your story in the previously-opened tab or " -"window." -msgstr "" -"Lade die Testversion der Gesichte im bereits geöffneten Tab oder Fenster neu." - -#. L10n: This refers to when a story was last saved by the user -#. %s will be replaced with a localized date and time -#: js/views/storyeditview/storyeditview.js:573 -#: js/views/storyeditview/toolbar.js:94 -#, javascript-format -msgid "Last saved at %s" -msgstr "Zuletzt gespeichert am %s" - -#: js/views/storylistview/modals/formatsmodal.js:137 -msgid "The story format at %1$s could not be added (%2$s)." -msgstr "Das Story-Format in %1$s konnte nicht hinzugefügt werden (%2$s)." - -#. L10n: An internal error related to story formats. -#: js/views/storylistview/modals/formatsmodal.js:246 -msgid "Don't know what kind of format to set as default" -msgstr "Das Standardformat der Geschichte kann nicht gesetzt werden" - -#: js/views/storylistview/storagequota.js:21 -#: js/views/storylistview/storagequota.js:44 -#: js/views/storylistview/storagequota.js:49 -#, javascript-format -msgid "%d%% space available" -msgstr "%d%% Speicherplatz frei" +#: src/story-edit-view/story-toolbar/story-menu/index.js +#: src/story-list-view/story-item/item-menu/index.js +msgid "Rename" +msgstr "Umbenennen" -#: js/views/storylistview/storyitemview.js:80 -#: js/views/storylistview/storyitemview.js:94 -msgid "" -"This story does not have a starting point. Edit this story and use the icon on a passage to set this." -msgstr "" -"Diese Geschichte hat keinen Startpunkt. Bearbeite die Geschichte und setze " -"mit dem Icon einen Absatz als Startpunkt." +#: src/story-edit-view/story-toolbar/story-menu/index.js +#: src/story-list-view/story-item/item-menu/index.js +msgid "Please enter a name." +msgstr "Bitte einen Namen eingeben." -#: js/views/storylistview/storyitemview.js:123 -#, javascript-format -msgid "" -"Are you sure you want to delete “%s”? This cannot be undone." -msgstr "" -"Bist du sicher das du “%s” löschen willst? Kann nicht widerrufen " -"werden." +#: src/story-list-view/list-toolbar/index.js +msgid "Twine Archive.html" +msgstr "Twine Archiv.html" -#: js/views/storylistview/storyitemview.js:125 +#: src/story-list-view/story-item/item-menu/index.js msgid "Delete Forever" msgstr "Für immer Löschen" -#: js/views/storylistview/storyitemview.js:137 -#, javascript-format -msgid "What should “%s” be renamed to?" -msgstr "Wie soll “%s” umbenannt werden?" - -#: js/views/storylistview/storyitemview.js:138 -msgid "Rename" -msgstr "Umbenennen" - -#: js/views/storylistview/storyitemview.js:155 +#: src/story-list-view/story-item/item-menu/index.js msgid "What should the duplicate be named?" msgstr "Wie soll das Dublikat benannt werden?" -#: js/views/storylistview/storyitemview.js:156 +#: src/story-list-view/story-item/item-menu/index.js msgid "Duplicate" msgstr "Dublizieren" -#: js/views/storylistview/storyitemview.js:162 -#, javascript-format +#: src/story-list-view/story-item/item-menu/index.js msgid "%s Copy" msgstr "%s Kopieren" -#. L10n: %d is a number of stories. -#: js/views/storylistview/storylistview.js:251 -#, javascript-format -msgid "%d story was imported." -msgid_plural "%d stories were imported." -msgstr[0] "%d Geschichte wurde importiert." -msgstr[1] "%d Geschichte wurde importiert." - -#. L10n: %d is a number of stories -#: js/views/storylistview/storylistview.js:341 -#, javascript-format -msgid "%d Story" -msgid_plural "%d Stories" -msgstr[0] "%d Geschichte" -msgstr[1] "%d Geschichten" +#: src/ui/quota-gauge/index.js +msgid "%d%% space available" +msgstr "%d%% Speicherplatz frei" + +#~ msgid "English" +#~ msgstr "Englisch" + +#~ msgid "Spanish" +#~ msgstr "Spanisch" + +#~ msgid "" +#~ "Enter the body text of your passage here. To link to another passage, put " +#~ "two square brackets around its name, [[like this]]." +#~ msgstr "" +#~ "Fügen den Absatztext hier ein. Um einen Link zu einem anderen Absatz zu " +#~ "erstellen, schreibe dessen Namen in doppelten eckigen Klammern. [[So wie " +#~ "hier]]." + +#~ msgid "Delete “%s”" +#~ msgstr "Lösche “%s”" + +#~ msgid "Edit “%s”" +#~ msgstr "Bearbeite “%s”" + +#~ msgid "Set “%s” as starting point" +#~ msgstr "Setze “%s” als Startpunkt" + +#~ msgid "What should this story's name be?" +#~ msgstr "Wie soll die Geschichte heißen?" + +#~ msgid "Save" +#~ msgstr "Speichern" + +#~ msgid "This story was last changed at %s" +#~ msgstr "Diese Geschichte wurde am %s das letzte Mal bearbeitet" + +#~ msgid "" +#~ "The IFID for this story is %s. What's an IFID?)" +#~ msgstr "" +#~ "Die IFID dieser Geschichte lautet %s.(Was ist eine " +#~ "IFID?)" + +#~ msgid "License: %s" +#~ msgstr "Lizenz: %s" + +#~ msgid "Build" +#~ msgstr "Version" + +#~ msgid "" +#~ "Twine 2.0 is released under the GPL v3 license, but any work created with it may be " +#~ "released under any terms, including commercial ones. Source Code Repository" +#~ msgstr "" +#~ "Twine 2.0 steht unter der GPL v3 Lizenz, aber jedes Werk, das damit erstellt " +#~ "wird, kann unter einer beliebigen auch kommerziellen Lizenz " +#~ "veröffentlicht werden. Quellecode" + +#~ msgid "Code" +#~ msgstr "Code" + +#~ msgid "" +#~ "Source Sans Pro and Source Code Pro were designed by Paul D. Hunt under " +#~ "the guidance of Robert Slimbach for Adobe
Nunito was designed by Vernon Adams" +#~ msgstr "" +#~ "Source Sans Pro und Source Code Pro wurden von Paul D. Hunt unter der " +#~ "Anleitung von Robert Slimbach für Adobeentworfen.
Nunito wurde von Vernon Adams entworfen." + +#~ msgid "" +#~ "If you love Twine as much as I do, please consider helping it grow with a " +#~ "donation. Twine is as an open source project that will always be free to " +#~ "use — and with your help, Twine will continue to thrive." +#~ msgstr "" +#~ "Wenn dir Twine so sehr am Herzen liegt wie mir, möchtest du es vielleicht " +#~ "mit einer Spenden unterstützen. Twine ist ein Open-Source-Projekt, das " +#~ "immer frei zur Verfügung stehen wird und mit deiner Hilfe weiter wachsen " +#~ "kann." + +#~ msgid "This message will only be shown to you once.
" +#~ msgstr "Diese Nachricht wird dir nur einmal angezeigt.
" + +#~ msgid "Proofing Formats" +#~ msgstr "Formate zum Gegenlesen" + +#~ msgid "Add a New Format" +#~ msgstr "Neues Format hinzufügen" + +#~ msgid "To add a story format, enter its address below." +#~ msgstr "Zum Hinzufügen eines Formates, gib hier die zugehörige URL an." + +#~ msgid "What should your story be named?
(You can change this later.)" +#~ msgstr "Wie soll die Geschichte heißen?
(Kann später angepasst werden.)" + +#~ msgid "Importing..." +#~ msgstr "Import läuft..." + +#~ msgid "" +#~ "If you've never used Twine before, then welcome! The Twine 2 Guide and the official wiki in general, are a great place to learn. Keep in " +#~ "mind that some articles on the wiki at large were written for Twine 1, " +#~ "which is a little bit different than this version. But most of the " +#~ "concepts are the same." +#~ msgstr "" +#~ "Wenn du Twine noch nie benutzt hast, dann Herzlich " +#~ "Willkommen! Der Twine 2 Guide und das offizielle Wiki im allgemeinen, sind ein " +#~ "guter Ort mehr über Twine zu lernen. Einige Artikel im Wiki wurden für " +#~ "Twine 1 geschrieben, das sich in einigen Details von der aktuellen " +#~ "Version unterscheidet. Die groben Konzepte sind aber bestehen geblieben." + +#~ msgid "" +#~ "You can also get help over at the Twine forum, too." +#~ msgstr "" +#~ "Hilfe erhältst du außerdem im Twine Forum." + +#~ msgid "" +#~ "If you have used Twine 1 before, the guide also has " +#~ "details on what has changed in this version. Chief among them is a new " +#~ "default story format, Harlowe. But if you find you prefer the Twine 1 " +#~ "scripting syntax, try using SugarCube instead." +#~ msgstr "" +#~ "Hast du bisher Twine 1 verwendet, dann enthält der " +#~ "\"Twine 2 Guide\" außerdem Details darüber, was sich in der neuen Version " +#~ "geändert hat. Vor allem wurde das neue Standardformat Harlowe eingeführt. " +#~ "Wenn du das Format von Twine 1 bevorzugst, teste stattdessen SugarCube." + +#~ msgid "" +#~ "Two very important things to remember, though. Since your work is " +#~ "saved only in your browser, if you clear its saved data, then you'll lose " +#~ "your work! Not good. Remember to use that  Archive button often. You can also publish " +#~ "individual stories to files using the menu on " +#~ "each story in the story list. Both archive and story files can always be " +#~ "re-imported into Twine." +#~ msgstr "" +#~ "Zwei sehr wichtige
Hinweise: Da die Arbeit nur lokal im " +#~ "Browser gespeichert wird, verlierst du all deine Fortschritte, wenn du " +#~ "die lokalen Daten des Browser löschen! Nutze häufig den  Archiv-Button. Du kannst außerdem " +#~ "einzelnen Geschichten in Dateien veröffentlichen, indem du das -Menü an den Geschichten in der Übersicht verwendest. " +#~ "Sowohl Archive als auch einzelnen als Datei veröffentlichte Geschichten " +#~ "können immer wieder zurück nach Twine importiert werden." + +#~ msgid "" +#~ "Secondly, anyone who can use this browser can see and make changes to " +#~ "your work. So if you've got a nosy kid brother, look into setting up " +#~ "a separate profile for yourself." +#~ msgstr "" +#~ "Außerdem, jeder der diesen Browser nutzten darf, kann deine Arbeit " +#~ "sehen und verändern. Hast du also neugierige Mitmenschen, die den " +#~ "selben Rechner verwenden, dann könnte es sinnvoll sein dich zu " +#~ "informiere, wie du eine eigenes privates Profil anlegest." + +#~ msgid "" +#~ "There's now a folder named Twine in your Documents folder. Inside that is " +#~ "a Stories folder, where all your work will be saved. Twine saves as you " +#~ "work, so you don't have to worry about remembering to save it yourself. " +#~ "You can always open the folder your stories are saved to by using the " +#~ "Show Library item in the Twine menu." +#~ msgstr "" +#~ "Es gibt nun einen Ordner Twine in deinem Dokumente-Ordner. Darin ist ein " +#~ "Ordner Geschichten, indem all deine Fortschritte gespeichert werden. " +#~ "Twine speichert deine Arbeit regelmäßig, du musst also nicht selbst daran " +#~ "denken, deine Fortschritte zu speichern. Du kannst jederzeit den Ordner " +#~ "mit deinen Geschichten öffnen, indem du Sammlung Anzeigen im " +#~ "Twine-Menü auswählst." + +#~ msgid "" +#~ "If you'd like to open a Twine story file you received from someone else, " +#~ "you can import it into your library using the Import From File link in the story list." +#~ msgstr "" +#~ "Wenn du eine Twine Datei von jemandem erhältst, kannst du sie in deine " +#~ "Sammlung übernehmen. Nutze dazu den Menüpunkt Importieren aus Datei in der Übersicht." + +#~ msgid "“%1$s” could not be saved (%2$s)." +#~ msgstr "“%1$s” konnte nicht gespeichert werden (%2$s)." + +#~ msgid "An error occurred while publishing your story. (%s)" +#~ msgstr "" +#~ "Eine Fehler beim Veröffentlichen der Geschichte ist aufgetreten. (%s)" + +#~ msgid "don't know how to sort stories by %s" +#~ msgstr "es ist nicht möglich die Geschichten nach %s zu sortieren" + +#~ msgid "You must give this passage a name." +#~ msgstr "Du musst diesem Absatz einen Namen geben." + +#~ msgid "" +#~ "There is already a passage named \"%s.\" Please give this one a unique " +#~ "name." +#~ msgstr "" +#~ "Es gibt schon einen Absatz mit dem Namen \"%s\". Bitter vergib einen " +#~ "eindeutigen Namen." + +#~ msgid "There is no starting point set for this story." +#~ msgstr "Es ist kein Startpunkt für diese Geschichte markiert." + +#~ msgid "The passage set as starting point for this story does not exist." +#~ msgstr "Der Absatz, der als Startpunkt markiert wurde, existiert nicht." + +#~ msgid "/My\\ Documents" +#~ msgstr "/Eigene\\ Dokumente" + +#~ msgid "/Twine" +#~ msgstr "/Twine" + +#~ msgid "/Stories" +#~ msgstr "/Geschichten" + +#~ msgid "An error occurred while saving your story (%s)." +#~ msgstr "Eine Fehler beim Speichern der Geschichte ist aufgetreten (%s)." + +#~ msgid "An error occurred while deleting your story (%s)." +#~ msgstr "Ein Fehler beim Löschen der Geschichte ist aufgetreten (%s)." + +#~ msgid "An error occurred while locking your library (%s)." +#~ msgstr "Ein Fehler beim Sperren deiner Sammlung ist aufgetreten (%s)." + +#~ msgid "An error occurred while unlocking your library (%s)." +#~ msgstr "Ein Fehler beim Entsperren deiner Sammlung ist aufgetreten (%s)." + +#~ msgid "Don't know how to do bubble action %s" +#~ msgstr "Kann die Aktion %s nicht weiterreichen " + +#~ msgid "Don't know how to do collapse action %s" +#~ msgstr "Kann die Aktion %s nicht einklappen" + +#~ msgid "Can't set locale to nonstring: %s" +#~ msgstr "Fehler bei Setzen der Sprache. Wert muss vom Typ String sein: %s" + +#~ msgid "Editing “%s”" +#~ msgstr "\"%s\" bearbeiten" + +#~ msgid "Any changes to the passage you're editing haven't been saved yet. " +#~ msgstr "" +#~ "Die Änderungen an dem bearbeiteten Absatz würden noch nicht gespeichert." + +#~ msgid "No matching passages found." +#~ msgstr "Keine passenden Absätze gefunden." + +#~ msgid "%d replacement was made in" +#~ msgid_plural "%d replacements were made in" +#~ msgstr[0] "wurde %d Ersetzung durchgeführt" +#~ msgstr[1] "wurden %d Ersetzungen durchgeführt" + +#~ msgid "%d passage" +#~ msgid_plural "%d passages" +#~ msgstr[0] "In %d Absatz" +#~ msgstr[1] "In %d Absätze" + +#~ msgid "%1$s %2$s" +#~ msgstr "%2$s %1$s" + +#~ msgid "Broken Link" +#~ msgid_plural "Broken Links" +#~ msgstr[0] "Toter Link" +#~ msgstr[1] "Tote Links" + +#~ msgid "The story format “%1$s” could not be loaded (%2$s)." +#~ msgstr "Das Format “%1$s” konnte nicht geladen werden (%2$s). " + +#~ msgid "Are you sure you want to delete “%s”? " +#~ msgstr "Bist du sicher, dass du “%s” löschen willst?" + +#~ msgid "(Hold the Shift key when deleting to skip this message.)" +#~ msgstr "" +#~ "(Halte Umschalten/Shift beim Löschen gedrückt, um diese Nachricht zu " +#~ "vermeiden.)" + +#~ msgid "Don't see either mouse or touch coordinates on event" +#~ msgstr "Kann weder Maus- noch Touch-Koordinaten am Ereignis finden" + +#~ msgid "Couldn't find original touch ID in movement event" +#~ msgstr "" +#~ "Konnte die ursprüngliche touch ID der Bewegung im Ereignis nicht finden" + +#~ msgid "A problem occurred while saving your changes (%s)." +#~ msgstr "Beim Speichern der Änderungen ist eine Problem aufgetreten (%s)." + +#~ msgid "Are you sure you want to delete this passage?" +#~ msgid_plural "" +#~ "Are you sure you want to delete these %d passages? This cannot be undone." +#~ msgstr[0] "Bist du sicher, dass du diesen Absatz löschen willst?" +#~ msgstr[1] "" +#~ "Bist du sicher, dass du diese %d Absätze löschen willst? Kann nicht " +#~ "widerrufen gemacht werden." + +#~ msgid "This story does not have a starting point. " +#~ msgstr "Die Geschichte hat keinen Startpunkt." + +#~ msgid "" +#~ "Refreshed the playable version of your story in the previously-opened tab " +#~ "or window." +#~ msgstr "" +#~ "Lade die spielbare Version der Geschichte im bereits geöffneten Tab oder " +#~ "Fenster neu." + +#~ msgid "" +#~ "This story does not have a starting point. Use the icon on a passage to set this." +#~ msgstr "" +#~ "Die Geschichte hat keinen Startpunkt. Benutze das Icon an einem Absatz, um den Startpunkt dort zu setzen." + +#~ msgid "" +#~ "Refreshed the test version of your story in the previously-opened tab or " +#~ "window." +#~ msgstr "" +#~ "Lade die Testversion der Gesichte im bereits geöffneten Tab oder Fenster " +#~ "neu." + +#~ msgid "Last saved at %s" +#~ msgstr "Zuletzt gespeichert am %s" + +#~ msgid "The story format at %1$s could not be added (%2$s)." +#~ msgstr "Das Story-Format in %1$s konnte nicht hinzugefügt werden (%2$s)." + +#~ msgid "Don't know what kind of format to set as default" +#~ msgstr "Das Standardformat der Geschichte kann nicht gesetzt werden" + +#~ msgid "" +#~ "This story does not have a starting point. Edit this story and use the icon on a passage to set this." +#~ msgstr "" +#~ "Diese Geschichte hat keinen Startpunkt. Bearbeite die Geschichte und " +#~ "setze mit dem Icon einen Absatz als " +#~ "Startpunkt." + +#~ msgid "" +#~ "Are you sure you want to delete “%s”? This cannot be undone." +#~ msgstr "" +#~ "Bist du sicher das du “%s” löschen willst? Kann nicht " +#~ "widerrufen werden." + +#~ msgid "What should “%s” be renamed to?" +#~ msgstr "Wie soll “%s” umbenannt werden?" + +#~ msgid "%d story was imported." +#~ msgid_plural "%d stories were imported." +#~ msgstr[0] "%d Geschichte wurde importiert." +#~ msgstr[1] "%d Geschichte wurde importiert." + +#~ msgid "%d Story" +#~ msgid_plural "%d Stories" +#~ msgstr[0] "%d Geschichte" +#~ msgstr[1] "%d Geschichten" #~ msgid "Asked to render a non-function template " #~ msgstr "Versuch ein template zu verwenden, das nicht vom Typ function ist." diff --git a/src/locale/po/it.po b/src/locale/po/it.po index 75db27d64..200eb0959 100644 --- a/src/locale/po/it.po +++ b/src/locale/po/it.po @@ -1,510 +1,513 @@ -# ITALIAN TRANSLATION FOR TWINE 2. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Marco Secchi, http://marcosecchi.it 2016. -# msgid "" msgstr "" "Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-06-06 16:56+0200\n" -"PO-Revision-Date: 2016-06-06 18:23+0200\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.8.8\n" +"X-Generator: Poedit 1.8.11\n" "Last-Translator: Marco Secchi \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: it\n" -#. L10n: %s is the name of an author. -#: src/common/ejs/storyFormatDetail.ejs:26 -#, php-format -msgid "by %s" -msgstr "di %s" +#: src/dialogs/about/index.html +msgid "About Twine" +msgstr "A Proposito di Twine" -#. L10n: %s is the name of a software license. -#: src/common/ejs/storyFormatDetail.ejs:39 -#, php-format -msgid "License: %s" +#: src/dialogs/about/index.html +msgid "" +"Twine is an open-source tool for telling interactive, nonlinear stories." msgstr "" -"Licenza\n" -": %s" +"Twine è uno strumento open-source per realizzare storie interattive e non " +"lineari." -#: src/locale/ejs/localeView.ejs:4 -msgid "Please choose which language you would like to use with Twine." -msgstr "Prego scegli la lingua che vuoi utilizzare con Twine" +#: src/dialogs/about/index.html +msgid "" +"This application is released under the \\x3ca href=\"http:\\/\\/www.gnu.org/" +"licenses/gpl-3.0.html\">GPL v3\\x3c/a> license, but any work created with it " +"may be released under any terms, including commercial ones." +msgstr "" +"Questa applicazione è rilasciata sotto licenza \\x3ca href=\"http:\\/\\/www." +"gnu.org/licenses/gpl-3.0.html\">GPL v3\\x3c/a>, ma ogni lavoro realizzato " +"con essa può essere rilasciato sotto qualsiasi altra condizione, comprese " +"licenze commerciali." -#: src/story-edit/ejs/passageEditModal.ejs:8 -msgid "Passage Name" -msgstr "Nome Passaggio" +#: src/dialogs/about/index.html +msgid "Help Twine Grow With A Donation" +msgstr "Aiuta Twine a crescere con una donazione" -#. L10n: this is the noun form, as in tags you would apply to content. -#: src/story-edit/ejs/passageEditModal.ejs:22 -msgid "Tag" -msgstr "Etichetta" +#: src/dialogs/about/index.html +msgid "Source Code Repository" +msgstr "Repository del Codice Sorgente" -#. L10n: A noun, i.e. what a tag is named. -#: src/story-edit/ejs/passageEditModal.ejs:28 -msgid "Tag name" -msgstr "Nome etichetta" +#: src/dialogs/about/index.html +msgid "Translations" +msgstr "Traduzioni" -#: src/story-edit/ejs/passageEditModal.ejs:36 +#: src/dialogs/about/index.html +msgid "Libraries" +msgstr "Librerie" + +#: src/dialogs/about/index.html +msgid "Fonts" +msgstr "Font" + +#: src/dialogs/about/index.html msgid "" -"Enter the body text of your passage here. To link to another passage, put " -"two square brackets around its name, [[like this]]." +"Source Sans Pro and Source Code Pro were designed by Paul D. Hunt under the " +"guidance of Robert Slimbach for \\x3ca href=\"http:\\/\\/adobe.com/\">Adobe" +"\\x3c/a>\\x3cbr> Nunito was designed by \\x3ca href=\"http:\\/\\/code." +"newtypography.co.uk/\">Vernon Adams\\x3c/a>" msgstr "" -"Inserisci qui il corpo del tuo testo. Per collegare ad un altro passaggio, " -"aggiungi due parentesi quadre intorno al nome, [[in questo modo]]." +"Source Sans Pro e Source Code Pro sono stati realizzati da Paul D. Hunt " +"sotto la supervisione di Robert Slimbach per \\x3ca href=\"http:\\/\\/adobe." +"com/\">Adobe\\x3c/a>\\x3cbr> Nunito è stato realizzato da \\x3ca href=\"http:" +"\\/\\/code.newtypography.co.uk/\">Vernon Adams\\x3c/a>" -#. L10n: %s is the name of the thing to be deleted. -#: src/story-edit/ejs/passageItemView.ejs:16 -#, php-format -msgid "Delete “%s”" -msgstr "Elimina “%s”" - -#. L10n: %s is the name of the thing to be edited. -#: src/story-edit/ejs/passageItemView.ejs:21 -#, php-format -msgid "Edit “%s”" -msgstr "Modifica “%s”" - -#: src/story-edit/ejs/passageItemView.ejs:24 -msgid "Test story starting here" -msgstr "Il racconto test inizia qui" - -#. L10n: %s is a name of a passage -#: src/story-edit/ejs/passageItemView.ejs:28 -#, php-format -msgid "Set “%s” as starting point" -msgstr "Seleziona “%s” come punto di partenza" - -#: src/story-edit/ejs/renameStoryModal.ejs:8 src/story-edit/ejs/toolbar.ejs:31 -#: src/story-list/ejs/storyItemView.ejs:36 -msgid "Rename Story" -msgstr "Rinomina Racconto" +#: src/dialogs/about/index.html +msgid "Icons" +msgstr "Icone" -#: src/story-edit/ejs/renameStoryModal.ejs:14 -msgid "What should this story's name be?" -msgstr "Qual’è il nome del racconto?" +#: src/dialogs/about/index.html +msgid "Document designed by Rob Gill from the Noun Project" +msgstr "Documento realizzato da Rob Gill di Noun Project" -#: src/story-edit/ejs/renameStoryModal.ejs:24 -msgid "Please enter a name." -msgstr "Inserisci un nome" +#: src/dialogs/about/index.html +msgid "Question designed by Henry Ryder from the Noun Project" +msgstr "Question realizzato da Henry Ryder di Noun Project" + +#: src/dialogs/about/index.html +msgid "Smile designed by jelio dimitrov from the Noun Project" +msgstr "Smile realizzato da jelio dimitrov di Noun Project" + +#: src/dialogs/app-donation/index.html +msgid "" +"If you love Twine as much as I do, please consider helping it grow with a " +"donation. Twine is an open source project that will always be free to use " +"— and with your help, Twine will continue to thrive." +msgstr "" +"Se ti piace Twine quanto piace a me, considera la possibilità di effettuare " +"una donazione. Twine è un progetto open source che sarà sempre gratuito e, " +"con il tuo aiuto, potrà continuare a migliorare.\t" + +#: src/dialogs/app-donation/index.html +msgid "Chris Klimas, Twine creator" +msgstr "Chris Klimas, creatore di Twine" + +#: src/dialogs/app-donation/index.html +msgid "No Thanks" +msgstr "No Grazie" + +#: src/dialogs/app-donation/index.html +msgid "Donate" +msgstr "Donazioni" + +#: src/dialogs/app-donation/index.html +msgid "" +"This message will only be shown to you once.<br>If you'd like to " +"donate to Twine development in the future, you can do so at <a href=\\" +"\"http:\\/\\/twinery.org/donate\\\" target=\\\"_blank\\\">http://twinery." +"org/donate</a>." +msgstr "" +"Questo messaggio verrà mostrato solo una volta.<br>Se, in futuro, " +"vorrai effettuare una donazione per lo sviluppo di Twine, potrai visitare " +"<a href=\\\"http:\\/\\/twinery.org/donate\\\" target=\\\"_blank\\\">" +"http://twinery.org/donate</a>." + +#: src/dialogs/formats/index.html +msgid "" +"Story formats control the appearance and behavior of stories during play." +msgstr "" +"I formati Racconto controllano l’aspetto ed il comportamento delle storie " +"durante l’esecuzione." + +#: src/dialogs/formats/index.html +msgid "Use as Default" +msgstr "Utilizza come Predefinito" + +#: src/dialogs/formats/index.html +msgid "" +"Proofing formats create a versions of stories tailored for editing and " +"proofreading." +msgstr "" +"I formati di test creano una versione dei racconti specifica per il " +"controllo e la modifica." + +#: src/dialogs/formats/index.html +msgid "Use" +msgstr "Utilizza" + +#: src/dialogs/formats/index.html src/story-list-view/list-toolbar/index.js:24 +msgid "Add" +msgstr "Aggiungi" + +#: src/dialogs/formats/index.html src/dialogs/story-format/index.html +msgid "Loading..." +msgstr "In Caricamento…" + +#: src/dialogs/story-format/index.html +msgid "Story Format" +msgstr "Formato Racconto" -#: src/story-edit/ejs/renameStoryModal.ejs:28 -#: src/story-list/ejs/formatItem.ejs:7 src/story-list/ejs/storyListView.ejs:25 -#: src/story-list/ejs/storyListView.ejs:50 src/ui/ejs/confirm.ejs:5 -#: src/ui/ejs/prompt.ejs:9 +#: src/dialogs/story-format/index.html +msgid "" +"A story format controls the appearance and behavior of your story during " +"play." +msgstr "" +"Il Formato Racconto controlla l’aspetto ed il comportamento del racconto " +"stesso durante l’esecuzione." + +#: src/dialogs/story-import/index.html +#: src/story-list-view/list-toolbar/index.html +msgid "Import From File" +msgstr "Importa da File" + +#: src/dialogs/story-import/index.html +msgid "Import this file:" +msgstr "Importa questo file:" + +#: src/dialogs/story-import/index.html src/dialogs/confirm/index.js:31 +#: src/dialogs/prompt/index.js:15 msgid "Cancel" msgstr "Annulla" -#: src/story-edit/ejs/renameStoryModal.ejs:29 -msgid "Save" -msgstr "Salva" +#: src/dialogs/story-import/index.html +msgid "Working..." +msgstr "Al lavoro..." -#: src/story-edit/ejs/scriptEditModal.ejs:8 -msgid "JavaScript" -msgstr "JavaScript" - -#: src/story-edit/ejs/scriptEditModal.ejs:14 +#: src/dialogs/story-import/index.html msgid "" -"Any JavaScript entered here will immediately run when your story is opened " -"in a Web browser." +"Some stories you are importing already exist in your library. Please choose " +"which to replace. Any other stories in your file will be imported as well." msgstr "" -"Qualsiasi codice JavaScript inserito qui verrà immediatamente eseguito " -"quando il racconto verrà aperto con un Web browser." +"Alcune storie che stai importando esistono già nella tua libreria. Per " +"favore, scegli quale sostituire. Qualsiasi altro racconto nel tuo file verrà " +"comunque importata." + +#: src/dialogs/story-import/index.html +msgid "Don't Import Any Stories" +msgstr "Non importare nessun Racconto" -#: src/story-edit/ejs/searchModal.ejs:7 +#: src/dialogs/story-search/index.html msgid "Find and Replace" -msgstr "Trova e Sostituisci" +msgstr "Trova e sostituisci" -#: src/story-edit/ejs/searchModal.ejs:12 +#: src/dialogs/story-search/index.html msgid "Search For" msgstr "Cerca" -#: src/story-edit/ejs/searchModal.ejs:18 +#: src/dialogs/story-search/index.html msgid "Include passage names" msgstr "Includi i nomi dei passaggi" -#. L10n: As in uppercase or lowercase letters. -#: src/story-edit/ejs/searchModal.ejs:23 +#: src/dialogs/story-search/index.html msgid "Match case" msgstr "Maiuscole/Minuscole" -#. L10n: A technical term, see https://en.wikipedia.org/wiki/Regular_expression. -#: src/story-edit/ejs/searchModal.ejs:29 +#: src/dialogs/story-search/index.html msgid "Regular expression" -msgstr "Espressione regolare" +msgstr "Espressione Regolare" -#: src/story-edit/ejs/searchModal.ejs:34 +#: src/dialogs/story-search/index.html msgid "Replace With" -msgstr "Sostituisci con" - -#: src/story-edit/ejs/searchModal.ejs:40 -msgid "Expand all search results" -msgstr "Espandi tutti i risultati della ricerca" +msgstr "Sostituisci Con" -#: src/story-edit/ejs/searchModal.ejs:44 -msgid "Collapse all search results" -msgstr "Chiudi tutti i risultati della ricerca" - -#: src/story-edit/ejs/searchModal.ejs:49 +#: src/dialogs/story-search/index.html msgid "Replace All" -msgstr "Sostituisci tutti" +msgstr "Sostituisci Tutto" -#: src/story-edit/ejs/searchModal.ejs:57 +#: src/dialogs/story-search/index.html +msgid "%d passage matches." +msgid_plural "%d passages match." +msgstr[0] "%d passaggio corrispondente." +msgstr[1] "%d passaggi corrispondenti." + +#: src/dialogs/story-search/index.html msgid "Searching..." msgstr "Cerco…" -#. L10n: %d is a number of text matches after a search. -#: src/story-edit/ejs/searchModalResult.ejs:13 -#, php-format +#: src/dialogs/story-search/result.html msgid "%d match" msgid_plural "%d matches" msgstr[0] "%d trovato" msgstr[1] "%d trovati" -#: src/story-edit/ejs/searchModalResult.ejs:22 -msgid "Replace in this passage" -msgstr "Sostituisci questo passaggio" - -#: src/story-edit/ejs/searchModalResult.ejs:23 +#: src/dialogs/story-search/result.html msgid "Replace in Passage" msgstr "Sostituisci nel Passaggio" -#: src/story-edit/ejs/statsModal.ejs:8 src/story-edit/ejs/toolbar.ejs:39 +#: src/dialogs/story-stats/index.html +#: src/story-edit-view/story-toolbar/story-menu/index.html msgid "Story Statistics" -msgstr "Statistiche del racconto" +msgstr "Statistiche del Racconto" -#: src/story-edit/ejs/statsModal.ejs:38 -#, php-format -msgid "This story was last changed at %s" -msgstr "Il racconto è stato modificato il %s" +#: src/editors/javascript/index.html +msgid "JavaScript" +msgstr "JavaScript" -#. L10n: %s is the IFID of the story. Please keep the element around it. -#: src/story-edit/ejs/statsModal.ejs:45 -#, php-format +#: src/editors/javascript/index.html msgid "" -"The IFID for this story is %s. What's an IFID?)" +"Any JavaScript entered here will immediately run when your story is opened " +"in a Web browser." msgstr "" -"L’IFID per questo racconto è %s. Cos’è un IFID?)" - -#: src/story-edit/ejs/storyFormatModal.ejs:7 -msgid "Story Format" -msgstr "Formato racconto" +"Qualsiasi codice JavaScript inserito qui verrà immediatamente eseguito " +"quando il tuo Racconto verrà aperto in un Web browser." -#: src/story-edit/ejs/storyFormatModal.ejs:12 -msgid "" -"A story format controls the appearance and behavior of your story during " -"play." -msgstr "" -"Il formato di un racconto controlla l'aspetto ed il comportamento del tuo " -"racconto durante l'esecuzione." +#: src/editors/passage/index.html +msgid "A passage already exists with this name." +msgstr "Esiste già un passaggio con questo nome" -#: src/story-edit/ejs/storyFormatModal.ejs:16 -msgid "Loading..." -msgstr "In caricamento…" +#: src/editors/passage/tag-editor.html +msgid "Tag" +msgstr "Etichetta" -#: src/story-edit/ejs/stylesheetEditModal.ejs:8 +#: src/editors/stylesheet/index.html msgid "Stylesheet" -msgstr "Foglio di stile" +msgstr "Foglio di Stile" -#: src/story-edit/ejs/stylesheetEditModal.ejs:14 +#: src/editors/stylesheet/index.html msgid "" "Any CSS entered here will override the default appearance of your story." -msgstr "" -"Qualsiasi CSS inserito qui andrà a modificare l’aspetto del tuo racconto" +msgstr "Qualsiasi CSS inserito qui andrà a modificare l’aspetto del racconto." -#: src/story-edit/ejs/toolbar.ejs:5 -msgid "Go to the story list" -msgstr "Vai alla lista dei racconti" +#: src/locale/view/index.html +msgid "Please choose which language you would like to use with Twine." +msgstr "Scegli quale lingua utilizzare quando utilizzi Twine." -#: src/story-edit/ejs/toolbar.ejs:19 -msgid "Edit Story JavaScript" -msgstr "Modifica il codice JavaScript del racconto" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Hi!" +msgstr "Ciao!" -#: src/story-edit/ejs/toolbar.ejs:23 -msgid "Edit Story Stylesheet" -msgstr "Modifica il foglio stile del racconto" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "" +"Twine is an open-source tool for telling interactive, nonlinear stories. " +"There are a few things you should know before you get started." +msgstr "" +"Twine è uno strumento open-source per la realizzazione di storie non lineari " +"ed interattive. Ci sono alcune cose che dovresti conoscere prima di " +"cominciare." -#: src/story-edit/ejs/toolbar.ejs:27 -msgid "Change Story Format" -msgstr "Cambia il Formato del racconto" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Tell Me More" +msgstr "Dimmi di più" -#: src/story-edit/ejs/toolbar.ejs:35 -msgid "Snap to Grid" -msgstr "Blocca sulla griglia" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Skip" +msgstr "Salta" -#: src/story-edit/ejs/toolbar.ejs:45 -msgid "View Proofing Copy" -msgstr "Visualizza Copia di Test" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "New here?" +msgstr "Sei nuovo?" -#: src/story-edit/ejs/toolbar.ejs:49 src/story-list/ejs/storyItemView.ejs:32 -msgid "Publish to File" -msgstr "Pubblica come File" +#: src/nw/patches/welcome-view/replacement-template.html +msgid "" +"<strong>If you've never used Twine before,</strong> then " +"welcome! The <a href=\\\"http://twinery.org/2guide\\\" target=\\\"_blank\\" +"\">Twine 2 Guide</a> and the official wiki in general, are a great " +"place to learn. Keep in mind that some articles on the wiki at large were " +"written for Twine 1, which is a little bit different than this version. But " +"most of the concepts are the same." +msgstr "" +"<strong>Se non hai mai utilizzato Twine,</strong>, benvenuto! La " +"<a href=\\\"http://twinery.org/2guide\\\" target=\\\"_blank\\\">Guida " +"a Twine 2</a> ed il wiki ufficiale sono degli ottimi punti di " +"partenza. Tieni a mente che alcuni articoli del wiki sono stati scritti per " +"Twine 1, che in alcuni punti è leggermente differente. La maggior parte dei " +"concetti sono comunque gli stessi." + +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "" +"<strong>If you have used Twine 1 before,</strong> the guide also " +"has details on what has changed in this version. Chief among them is a new " +"default story format, Harlowe. But if you find you prefer the Twine 1 " +"scripting syntax, try using SugarCube instead." +msgstr "" +"<strong>Se hai utilizzato Twine 1 in precedenza,</strong> la " +"guida elenca anche i dettagli di cosa è cambiato in questa versione. Prima " +"di tutto c'è un nuovo formato default per il racconto, Harlowe. Ma se pensi " +"di preferire la sintassi di Twine 1, prova ad utilizzare SugarCube." -#: src/story-edit/ejs/toolbar.ejs:62 -msgid "Quick Find" -msgstr "Ricerca veloce" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "OK" +msgstr "OK" -#: src/story-edit/ejs/toolbar.ejs:63 -msgid "Find and replace across the entire story" -msgstr "Trova e sostituisci all’interno di tutto il racconto" +#: src/nw/patches/welcome-view/replacement-template.html +msgid "Your work is automatically saved." +msgstr "Il tuo lavoro viene salvato automaticamente." -#: src/story-edit/ejs/toolbar.ejs:67 -msgid "Show only story structure" -msgstr "Mostra solo la struttura del racconto" +#: src/nw/patches/welcome-view/replacement-template.html +msgid "" +"There's now a folder named Twine in your Documents folder. Inside that is a " +"Stories folder, where all your work will be saved. Twine saves as you work, " +"so you don't have to worry about remembering to save it yourself. You can " +"always open the folder your stories are saved to by using the <b>Show " +"Library</b> item in the <b>Twine</b> menu." +msgstr "" +"Ora c’è una cartella chiamata Twine nella tua cartella Documenti. Al suo " +"interno si trova una cartella chiamata Racconti, dove verranno salvati tutti " +"i tuoi lavori. Twine effettua i salvataggi mentre lavori, quindi non dovrai " +"preoccuparti di farlo manualmente. Potrai sempre aprire la cartella dei " +"salvataggi utilizzando <b>Mostra Libreria</b> nel menu di <" +"b>Twine</b>." + +#: src/nw/patches/welcome-view/replacement-template.html +msgid "" +"Because Twine is always saving your work, the files in your story library " +"will be locked from editing while Twine is open." +msgstr "" +"Siccome Twine continua a salvare il tuo lavoro, i file nella tua libreria " +"rimarranno bloccati fino a che Twine resterà aperto." -#: src/story-edit/ejs/toolbar.ejs:71 -msgid "Show only passage titles" -msgstr "Mostra solo i titoli dei passaggi" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "That's it!" +msgstr "E’ tutto!" -#: src/story-edit/ejs/toolbar.ejs:75 -msgid "Show passage titles and excerpts" -msgstr "Mostra i titoli dei passaggi e gli estratti" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Thanks for reading, and have fun with Twine." +msgstr "Grazie per la lettura, e divertiti con Twine!" -#: src/story-edit/ejs/toolbar.ejs:81 -msgid "Play this story in test mode" -msgstr "Esegui il racconto in modalità test" +#: src/nw/patches/welcome-view/replacement-template.html src/welcome/index.html +msgid "Go to the Story List" +msgstr "Vai all’elenco delle Storie" -#. L10n: The verb form, to try something or to check it for problems. -#: src/story-edit/ejs/toolbar.ejs:84 +#: src/story-edit-view/story-toolbar/index.html msgid "Test" -msgstr "Test" - -#: src/story-edit/ejs/toolbar.ejs:88 -msgid "Play this story" -msgstr "Esegui questo racconto" +msgstr "Testa" -#. L10n: The verb form, as in playing a game. -#: src/story-edit/ejs/toolbar.ejs:91 +#: src/story-edit-view/story-toolbar/index.html msgid "Play" -msgstr "Esegui" +msgstr "Gioca" -#: src/story-edit/ejs/toolbar.ejs:95 -msgid "Add a new passage" -msgstr "Aggiungi un nuovo passaggio" - -#. L10n: This does not actually show the count here, as it is used in a table. -#: src/story-edit/ejs/toolbar.ejs:96 src/story-edit/modals/statsModal.js:77 +#: src/story-edit-view/story-toolbar/index.html msgid "Passage" -msgid_plural "Passages" -msgstr[0] "Passaggio" -msgstr[1] "Passaggi" +msgstr "Passaggio" -#: src/story-list/ejs/formatItem.ejs:5 -msgid "Are you sure?" -msgstr "Sei sicuro?" - -#: src/story-list/ejs/formatItem.ejs:6 -msgid "Remove" -msgstr "Rimuovi" - -#: src/story-list/ejs/formatItem.ejs:12 -msgid "Remove this format" -msgstr "Elimina questo formato" - -#: src/story-list/ejs/formatItem.ejs:14 -msgid "Set this format as default for stories" -msgstr "Seleziona questo formato come predefinito per i racconti." - -#: src/story-list/ejs/storyItemView.ejs:24 -msgid "Play Story" -msgstr "Esegui Racconto" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Edit Story JavaScript" +msgstr "Modifica il codice JavaScript del Racconto" -#: src/story-list/ejs/storyItemView.ejs:28 -msgid "Test Story" -msgstr "Testa Racconto" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Edit Story Stylesheet" +msgstr "Modifica i Fogli Stile del Racconto" -#: src/story-list/ejs/storyItemView.ejs:40 -msgid "Duplicate Story" -msgstr "Duplica Racconto" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Change Story Format" +msgstr "Cambia il Formato Racconto" -#: src/story-list/ejs/storyItemView.ejs:46 -msgid "Delete Story" -msgstr "Elimina Racconto" +#: src/story-edit-view/story-toolbar/story-menu/index.html +#: src/story-list-view/story-item/item-menu/index.html +msgid "Rename Story" +msgstr "Rinomina Racconto" -#: src/story-list/ejs/storyListView.ejs:5 -msgid "Twine" -msgstr "Twine" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "Snap to Grid" +msgstr "Blocca sulla griglia" -#: src/story-list/ejs/storyListView.ejs:9 -msgid "Create a brand-new story" -msgstr "Crea un nuovo Racconto" +#: src/story-edit-view/story-toolbar/story-menu/index.html +msgid "View Proofing Copy" +msgstr "Visualizza Copia di Test" -#: src/story-list/ejs/storyListView.ejs:10 -msgid "Story" -msgstr "Racconto" +#: src/story-edit-view/story-toolbar/story-menu/index.html +#: src/story-list-view/story-item/item-menu/index.html +msgid "Publish to File" +msgstr "Pubblica come File" -#: src/story-list/ejs/storyListView.ejs:17 -msgid "What should your story be named?
(You can change this later.)" -msgstr "Qual’è il nome del Racconto?
(più tardi potrai cambiarlo.)" +#: src/story-list-view/index.html +msgid "Drop a story file to import" +msgstr "Trascina un Racconto da importare" -#: src/story-list/ejs/storyListView.ejs:26 -msgid "Add" -msgstr "Aggiungi" +#: src/story-list-view/index.html +msgid "Sort By" +msgstr "Ordina per" -#: src/story-list/ejs/storyListView.ejs:34 -msgid "Import a published story or Twine archive" -msgstr "Importa una storia pubblicata o un archivio Twine" +#: src/story-list-view/index.html +msgid "Edit Date" +msgstr "Modifica data" -#: src/story-list/ejs/storyListView.ejs:35 -msgid "Import From File" -msgstr "Importa da File" +#: src/story-list-view/index.html +msgid "Name" +msgstr "Nome" -#: src/story-list/ejs/storyListView.ejs:42 -msgid "Import this file:" -msgstr "Importa questo File:" +#: src/story-list-view/index.html +msgid "" +"There are no stories saved in Twine right now. To get started, you can " +"either create a new story or import an existing one from a file." +msgstr "" +"Al momento non ci sono racconti salvati in Twine. Per cominciare, puoi " +"creare un nuovo racconto oppure importarne uno da file." -#: src/story-list/ejs/storyListView.ejs:59 -msgid "Importing..." -msgstr "In importazione…" +#: src/story-list-view/list-toolbar/index.html src/nw/directories.js:69 +#: src/nw/menus.js:17 src/nw/menus.js:39 +msgid "Twine" +msgstr "Twine" -#: src/story-list/ejs/storyListView.ejs:67 -msgid "Save all stories to a Twine archive file" -msgstr "Salva tutti i racconti in un file archivio Twine" +#: src/story-list-view/list-toolbar/index.html +msgid "Story" +msgstr "Racconto" -#: src/story-list/ejs/storyListView.ejs:68 +#: src/story-list-view/list-toolbar/index.html msgid "Archive" -msgstr "Archivio" +msgstr "Archivia" -#: src/story-list/ejs/storyListView.ejs:73 -msgid "Work with story and proofing formats" -msgstr "Lavora con i formati racconto e test" - -#: src/story-list/ejs/storyListView.ejs:74 +#: src/story-list-view/list-toolbar/index.html msgid "Formats" msgstr "Formati" -#: src/story-list/ejs/storyListView.ejs:79 -msgid "Change the language Twine uses" -msgstr "Cambia il linguaggio utilizzato da Twine" - -#: src/story-list/ejs/storyListView.ejs:80 +#: src/story-list-view/list-toolbar/index.html msgid "Language" msgstr "Lingua" -#: src/story-list/ejs/storyListView.ejs:85 -msgid "Browse online help" -msgstr "Visualizza il manuale online" - -#: src/story-list/ejs/storyListView.ejs:86 +#: src/story-list-view/list-toolbar/index.html msgid "Help" msgstr "Aiuto" -#: src/story-list/ejs/storyListView.ejs:101 +#: src/story-list-view/list-toolbar/index.html msgid "version" msgstr "versione" -#: src/story-list/ejs/storyListView.ejs:103 +#: src/story-list-view/list-toolbar/index.html msgid "Report a bug" -msgstr "Riporta un bug" - -#: src/story-list/ejs/storyListView.ejs:111 -msgid "Stories" -msgstr "Racconti" - -#: src/story-list/ejs/storyListView.ejs:114 -msgid "Sort By" -msgstr "Ordina per" - -#: src/story-list/ejs/storyListView.ejs:116 -msgid "Last changed date" -msgstr "Data dell’ultima modifica" - -#: src/story-list/ejs/storyListView.ejs:117 -msgid "Edit Date" -msgstr "Modifica data" - -#: src/story-list/ejs/storyListView.ejs:120 -msgid "Story name" -msgstr "Nome del racconto" - -#: src/story-list/ejs/storyListView.ejs:121 -msgid "Name" -msgstr "Nome" - -#: src/story-list/ejs/storyListView.ejs:128 -msgid "" -"There are no stories saved in Twine right now. To get started, you can " -"either create a new story or import an existing one from a file." -msgstr "" -"Al momento non ci sono racconti salvati in Twine. Per cominciare, puoi " -"creare un nuovo racconto oppure importarne uno da file." - -#: src/welcome/ejs/welcomeView.ejs:6 -msgid "Hi!" -msgstr "Ciao!" - -#: src/welcome/ejs/welcomeView.ejs:10 -msgid "" -"Twine is an open-source tool for telling interactive, nonlinear stories. " -"There are a few things you should know before you get started." -msgstr "" -"Twine è uno strumento open-source per realizzare storie interattive e non " -"lineari. Ci sono alcune cose che dovresti conoscere prima di iniziare." +msgstr "Comunica un bug" -#: src/welcome/ejs/welcomeView.ejs:14 -msgid "Tell Me More" -msgstr "Dimmi di più" +#: src/story-list-view/story-item/item-menu/index.html +msgid "Play Story" +msgstr "Esegui Racconto" -#: src/welcome/ejs/welcomeView.ejs:15 -msgid "Skip" -msgstr "Salta" +#: src/story-list-view/story-item/item-menu/index.html +msgid "Test Story" +msgstr "Testa Racconto" -#: src/welcome/ejs/welcomeView.ejs:23 -msgid "New here?" -msgstr "Sei nuovo?" +#: src/story-list-view/story-item/item-menu/index.html +msgid "Duplicate Story" +msgstr "Duplica Racconto" -#: src/welcome/ejs/welcomeView.ejs:27 -msgid "" -"If you've never used Twine before, then welcome! The Twine 2 Guide " -"and the official wiki in general, are a great place to learn. Keep in mind " -"that some articles on the wiki at large were written for Twine 1, which is a " -"little bit different than this version. But most of the concepts are the " -"same." -msgstr "" -"Se non hai mai utilizzato Twine,, benvenuto! La Guida aTwine 2 ed il " -"wiki ufficiale sono degli ottimi punti di partenza. Tieni a mente che alcuni " -"articoli del wiki sono stati scritti per Twine 1, che in alcuni punti è " -"leggermente differente. La maggior parte dei concetti sono comunque gli " -"stessi." - -#: src/welcome/ejs/welcomeView.ejs:31 -msgid "" -"You can also get help over at the Twine forum, too." -msgstr "" -"Puoi anche cercare aiuto nel forum di Twine." +#: src/story-list-view/story-item/item-menu/index.html +msgid "Delete Story" +msgstr "Elimina Racconto" -#: src/welcome/ejs/welcomeView.ejs:35 +#: src/welcome/index.html msgid "" -"If you have used Twine 1 before, the guide also has details " -"on what has changed in this version. Chief among them is a new default story " -"format, Harlowe. But if you find you prefer the Twine 1 scripting syntax, " -"try using SugarCube instead." +"<strong>If you've never used Twine before,</strong> then " +"welcome! The <a href=\\\"http://twinery.org/2guide\\\" target=\\\"_blank\\" +"\">Twine 2 Guide</a> and the official wiki in general, are a great " +"place to learn. Keep in mind that some articles on the wiki at larger were " +"written for Twine 1, which is a little bit different than this version. But " +"most of the concepts are the same." msgstr "" -"Se hai utilizzato Twine 1 in precedenza, la guida elenca " -"anche i dettagli di cosa è cambiato in questa versione. Prima di tutto c'è " -"un nuovo formato default per il racconto, Harlowe. Ma se pensi di preferire " -"la sintassi di Twine 1, prova ad utilizzare SugarCube." - -#: src/welcome/ejs/welcomeView.ejs:39 src/welcome/ejs/welcomeView.ejs:63 -msgid "OK" -msgstr "OK" - -#: src/welcome/ejs/welcomeView.ejs:47 +"<strong>Se non hai mai utilizzato Twine,</strong>, benvenuto! La " +"<a href=\\\"http://twinery.org/2guide\\\" target=\\\"_blank\\\">Guida " +"aTwine 2</a> ed il wiki ufficiale sono degli ottimi punti di partenza. " +"Tieni a mente che alcuni articoli del wiki sono stati scritti per Twine 1, " +"che in alcuni punti è leggermente differente. La maggior parte dei concetti " +"sono comunque gli stessi." + +#: src/welcome/index.html msgid "Your work is saved only in your browser." -msgstr "Il tuo lavoro è stato salvato solamente nel tuo browser" +msgstr "Il tuo lavoro verrà salvato solamente nel browser." -#: src/welcome/ejs/welcomeView.ejs:51 +#: src/welcome/index.html msgid "" "That means you don't need to create an account to use Twine 2, and " "everything you create isn't stored on a server somewhere else — it " @@ -514,457 +517,277 @@ msgstr "" "2, e qualsiasi cosa andrai a creare rimarrà esclusivamente nel tuo browser e " "non sarà salvata su un server online." -#: src/welcome/ejs/welcomeView.ejs:55 +#: src/welcome/index.html msgid "" -"Two very important things to remember, though. Since your work is " -"saved only in your browser, if you clear its saved data, then you'll lose " -"your work! Not good. Remember to use that  Archive button often. You can also publish " -"individual stories to files using the menu on " -"each story in the story list. Both archive and story files can always be re-" -"imported into Twine." +"Two <b>very important</b> things to remember, though. Since your " +"work is saved only in your browser, if you clear its saved data, then you'll " +"lose your work! Not good. Remember to use that <i class=\\\"fa fa-" +"briefcase\\\"></i> <strong>Archive</strong> button " +"often. You can also publish individual stories to files using the <i " +"class=\\\"fa fa-cog\\\"></i> menu on each story in the story list. " +"Both archive and story files can always be re-imported into Twine." msgstr "" -"Ci sono due punti molto importanti da ricordare. Siccome il tuo " -"lavoro è salvato nel tuo browser, se elimini i suoi dati salvati, perderai " -"il tuo lavoro! Ricordati di utilizzare spesso il pulsante  Archivia. Puoi anche pubblicare " -"storie singole tramite file utilizzando il menu " -"che trovi nell'elenco dei racconti. Sia i file che gli archivi possono " -"essere reimportati in Twine." - -#: src/welcome/ejs/welcomeView.ejs:59 +"Ci sono due punti <b>molto importanti</b> da ricordare. Siccome " +"il tuo lavoro è salvato nel tuo browser, se elimini i suoi dati salvati, " +"perderai il tuo lavoro! Ricordati di utilizzare spesso il pulsante <i " +"class=\\\"fa fa-briefcase\\\"></i> <strong>Archivia</" +"strong>. Puoi anche pubblicare storie singole tramite file utilizzando il " +"menu <i class=\\\"fa fa-cog\\\"></i> che trovi nell'elenco dei " +"racconti. Sia i file che gli archivi possono essere reimportati in Twine." + +#: src/welcome/index.html msgid "" -"Secondly, anyone who can use this browser can see and make changes to " -"your work. So if you've got a nosy kid brother, look into setting up a " -"separate profile for yourself." +"Secondly, <b>anyone who can use this browser can see and make changes " +"to your work</b>. So if you've got a nosy kid brother, look into " +"setting up a separate profile for yourself." msgstr "" -"In secondo luogo, chiunque può accedere a questo browser potrà vedere e " -"modificare il tuo lavoro. Se quindi hai un fratello ficcanaso, considera " -"la possibilità di creare un profilo a parte su questo computer." +"In secondo luogo, <b>chiunque può accedere a questo browser potrà " +"vedere e modificare il tuo lavoro</b>. Se quindi hai un fratello " +"ficcanaso, considera la possibilità di creare un profilo a parte su questo " +"computer." -#: src/welcome/ejs/welcomeView.ejs:71 -msgid "That's it!" -msgstr "E’ tutto!" +#: src/data/actions.js:262 +msgid "a story format named “%s” already exists" +msgstr "Esiste già un formato racconto con nome “%s”" -#: src/welcome/ejs/welcomeView.ejs:75 -msgid "Thanks for reading, and have fun with Twine." -msgstr "Grazie per aver letto e buon divertimento con Twine." +#: src/data/publish.js:75 +msgid "There is no starting point set for this story." +msgstr "Non esiste un punto di partenza per questo racconto" -#: src/welcome/ejs/welcomeView.ejs:79 -msgid "Go to the Story List" -msgstr "Vai all’elenco dei racconti" +#: src/data/publish.js:81 +msgid "The passage set as starting point for this story does not exist." +msgstr "" +"Il passaggio selezionato come punto di partenza per questo racconto non " +"esiste." -#: src/common/app.js:73 -msgid "Asked to render a non-function template " -msgstr "Rischiesta di visualizzare un template che non è una funzione" +#: src/data/story-format.js:7 +msgid "Untitled Story Format" +msgstr "Formato Racconto senza nome" -#. L10n: An internal error. %s is a bad sort criterion. -#: src/data/collections/storyCollection.js:36 -#, javascript-format -msgid "don't know how to sort stories by %s" -msgstr "non so come ordinare i racconti %s" +#: src/data/story.js:190 +msgid "Untitled Story" +msgstr "Racconto senza titolo" -#: src/data/models/passage.js:24 +#: src/data/story.js:207 src/story-edit-view/index.js:195 msgid "Untitled Passage" -msgstr "Passaggio senza nome" +msgstr "Passaggio senza titolo" -#: src/data/models/passage.js:26 +#: src/data/story.js:210 msgid "Tap this passage, then the pencil icon to edit it." msgstr "" -"Effettua il tap su questo passaggio, dopodiché seleziona l’icona della " -"matita per modificare." +"Tappa questo passaggio, dopodiché l’icona della matita per modificarlo." -#: src/data/models/passage.js:27 +#: src/data/story.js:211 msgid "Double-click this passage to edit it." -msgstr "Effettua doppio click su questo passaggio per modificarlo." - -#: src/data/models/passage.js:86 -msgid "You must give this passage a name." -msgstr "Devi dare un nome a questo passaggio." +msgstr "Clicca due colte questo passaggio per modificarlo." -#: src/data/models/passage.js:96 -#, javascript-format +#. L10n: The will have a version number, i.e. 2.0.6, interpolated into it. +#: src/dialogs/app-update/index.js:40 msgid "" -"There is already a passage named \"%s.\" Please give this one a unique name." +"A new version of Twine, , has been released." msgstr "" -"Esiste già un passaggio chiamato \"%s.\" Per favore scegli un nome unico." +"E’ stata rilasciata una nuova versione di Twine, ." -#: src/data/models/story.js:23 -msgid "Untitled Story" -msgstr "Racconto senza titolo" +#: src/dialogs/app-update/index.js:44 +msgid "Download" +msgstr "Scarica" -#: src/data/models/story.js:114 -msgid "There is no starting point set for this story." -msgstr "Non esiste un punto di partenza per questo racconto." +#. L10n: A polite rejection of a request, in the sense that the answer may change in the future. +#: src/dialogs/app-update/index.js:51 +msgid "Not Right Now" +msgstr "Non Ora" -#: src/data/models/story.js:117 -msgid "The passage set as starting point for this story does not exist." +#. L10n: %1$s is the name of the story format; %2$s is +#: src/dialogs/formats/index.js:60 +msgid "The story format “%1$s” could not be loaded (%2$s)." msgstr "" -"Il passaggio selezionato come punto di partenza per questo racconto non " -"esiste." - -#: src/data/models/storyformat.js:42 -msgid "Untitled Story Format" -msgstr "Formato Racconto senza ttolo" - -#. L10n: %1$s is a filename; %2$s is the error message. -#: src/file/save.js:65 -msgid "“%1$s” could not be saved (%2$s)." -msgstr "“%1$s” non è potuto essere salvato (%2$s)." - -#. L10n: An internal error message related to UI components. -#: src/jquery-ext/bubble.js:87 -#, javascript-format -msgid "Don't know how to do bubble action %s" -msgstr "Non so come effettuare l’azione di chiusura %s" - -#. L10n: An internal error message related to UI components. -#: src/jquery-ext/collapse.js:30 -#, javascript-format -msgid "Don't know how to do collapse action %s" -msgstr "Non so come effettuare l’azione di chiusura %s" - -#. L10n: An internal error when changing locale. -#: src/locale/localeView.js:32 -#, javascript-format -msgid "Can't set locale to nonstring: %s" -msgstr "Non posso modificare il locale: %s" - -#: src/nwui/index.js:81 -msgid "Toggle Fullscreen" -msgstr "Attiva Fullscreen" - -#: src/nwui/index.js:100 -msgid "Quit" -msgstr "Esci" - -#: src/nwui/index.js:115 -msgid "Edit" -msgstr "Modifica" - -#: src/nwui/index.js:120 -msgid "Undo" -msgstr "Undo" - -#: src/nwui/index.js:132 -msgid "Cut" -msgstr "Tagli" +"Non è stato possibile caricare il formato del racconto “%1$s” " +"(%2$s)." -#: src/nwui/index.js:142 -msgid "Copy" -msgstr "Copia" - -#: src/nwui/index.js:152 -msgid "Paste" -msgstr "Incolla" +#: src/dialogs/formats/index.js:102 +msgid "The story format at %1$s could not be added (%2$s)." +msgstr "" +"Non è stato possibile aggiungere il formato del racconto “%1$s” " +"(%2$s)." -#: src/nwui/index.js:162 src/story-edit/passageItemView.js:178 -#: src/story-edit/storyEditView.js:151 -msgid "Delete" -msgstr "Elimina" +#. L10n: %s is the name of an author. +#: src/dialogs/formats/item.js:30 +msgid "by %s" +msgstr "di %s" -#: src/nwui/index.js:181 -msgid "Show Library" -msgstr "Mostra Libreria" +#: src/dialogs/formats/item.js:51 +msgid "Are you sure?" +msgstr "Sei sicuro?" -#. L10n: This is the folder name on OS X, Linux, and recent versions of -#. Windows that a user's documents are stored in, relative to the -#. user's home directory. If you need to use a space in this name, -#. then it should have two backslashes (\\) in front of it. -#. Regardless, this must have a single forward slash (/) as its first -#. character. -#: src/nwui/index.js:239 -msgid "/Documents" -msgstr "/Documents" +#: src/dialogs/formats/item.js:53 +msgid "Remove" +msgstr "Rimuovi" -#. L10n: This is the folder name on Windows XP that a user's -#. documents are stored in, relative to the user's home directory. -#. This is used if a folder with the name given by the translation -#. key '/Documents' does not exist. If you need to use a space in -#. this name, then it should have two backslashes (\\) in front of it. -#. Regardless, this must have a single forward slash (/) as its first character. -#: src/nwui/index.js:249 src/nwui/index.js:250 -msgid "/My\\ Documents" -msgstr "/My\\ Documents" - -#. L10n: '/Twine' is a suitable name for Twine-related files to exist -#. under on the user's hard drive. '/Stories' is a suitable name for -#. story files specifically. If you need to use a space in this name, -#. then it should have two backslashes in front of it. Regardless, -#. this must have a single forward slash (/) as its first character. -#: src/nwui/index.js:260 src/nwui/index.js:264 -msgid "/Twine" -msgstr "/Twine" - -#: src/nwui/index.js:260 -msgid "/Stories" -msgstr "/Stories" - -#. L10n: %s is the error message. -#: src/nwui/index.js:448 -#, javascript-format -msgid "An error occurred while saving your story (%s)." -msgstr "Si è presentato un errore durante il salvataggio del racconto (%s)." - -#. L10n: %s is the error message. -#: src/nwui/index.js:474 -#, javascript-format -msgid "An error occurred while deleting your story (%s)." -msgstr "Si è presentato un errore durante l’eliminazione del racconto (%s)." - -#. L10n: Locking in the sense of preventing changes to a file. %s is the error message. -#: src/nwui/index.js:541 -#, javascript-format -msgid "An error occurred while locking your library (%s)." -msgstr "Si è presentato un errore durante la chiusura della tua libreria (%s)." - -#. L10n: Unlocking in the sense of allowing changes to a file. %s is the error message. -#: src/nwui/index.js:568 -#, javascript-format -msgid "An error occurred while unlocking your library (%s)." -msgstr "Si è presentato un errore durante l’apertura della tua libreria (%s)." - -#: src/story-edit/editors/passageEditor.js:127 -#: src/story-edit/storyEditView.js:588 -#, javascript-format -msgid "Editing “%s”" -msgstr "“%s” in modifica" - -#: src/story-edit/editors/passageEditor.js:218 -msgid "Any changes to the passage you're editing haven't been saved yet. " -msgstr "" -"I cambiamenti al passaggio che stai modificando non sono ancora stati " -"salvati." +#: src/dialogs/story-import/index.js:56 +msgid "Don\\'t Replace Any Stories" +msgstr "Non sostituire nessun Racconto" -#. L10n: Matched in the sense of matching a search criteria. %d is the number of passages. -#: src/story-edit/modals/searchModal.js:100 -#, javascript-format -msgid "%d passage matches." -msgid_plural "%d passages match." -msgstr[0] "%d passaggio corrispondente." -msgstr[1] "%d passaggi corrispondenti." +#: src/dialogs/story-import/index.js:59 +msgid "Replace %d Story" +msgid_plural "Replace %d Stories" +msgstr[0] "Sostituisci %d Racconto" +msgstr[1] "Sostituisci %d Racconti" -#: src/story-edit/modals/searchModal.js:108 -msgid "No matching passages found." -msgstr "Non è stato trovato nessun passaggio corrispondente." - -#. L10n: replacement in the sense of text search and replace. %d is the number. -#: src/story-edit/modals/searchModal.js:189 -#, javascript-format -msgid "%d replacement was made in" -msgid_plural "%d replacements were made in" -msgstr[0] "%d sostituzione è stata effettuata in" -msgstr[1] "%d sostituzioni sono state effettuate in" - -#. L10n: %d is a number of passages. -#: src/story-edit/modals/searchModal.js:193 -#, javascript-format -msgid "%d passage" -msgid_plural "%d passages" -msgstr[0] "%d passaggio" -msgstr[1] "%d passaggi" - -#. L10n: This is the formatting used to combine two pluralizations. -#. In English, %1$s equals "2 replacements were made in" and %2$s equals "5 passages." -#. This is a way to reshape the sentence as needed. -#: src/story-edit/modals/searchModal.js:198 -msgid "%1$s %2$s" -msgstr "%1$s %2$s" - -#. L10n: Character in the sense of individual letters in a word. -#. This does not actually show the count here, as it is used in a table. -#: src/story-edit/modals/statsModal.js:70 +#: src/dialogs/story-stats/index.js:37 msgid "Character" msgid_plural "Characters" msgstr[0] "Carattere" msgstr[1] "Caratteri" -#. L10n: Word in the sense of individual words in a sentence. -#. This does not actually show the count here, as it is used in a table. -#: src/story-edit/modals/statsModal.js:74 +#: src/dialogs/story-stats/index.js:51 msgid "Word" msgid_plural "Words" msgstr[0] "Parola" msgstr[1] "Parole" -#. L10n: Links in the sense of hypertext links. -#. This does not actually show the count here, as it is used in a table. -#: src/story-edit/modals/statsModal.js:81 +#: src/dialogs/story-stats/index.js:85 msgid "Link" msgid_plural "Links" msgstr[0] "Collegamento" msgstr[1] "Collegamenti" -#. L10n: Links in the sense of hypertext links. -#. This does not actually show the count here, as it is used in a table. -#: src/story-edit/modals/statsModal.js:85 +#: src/dialogs/story-stats/index.js:98 msgid "Broken Link" msgid_plural "Broken Links" -msgstr[0] "Collegamento interrotto" -msgstr[1] "Collegamenti interrotti" +msgstr[0] "Collegamento non funzionante" +msgstr[1] "Collegamenti non funzionanti" -#. L10n: %1$s is the name of the story format, %2$s is the error message. -#: src/story-edit/modals/storyFormatModal.js:103 -#: src/story-list/modals/formatsModal.js:84 -msgid "The story format “%1$s” could not be loaded (%2$s)." +#: src/editors/passage/index.js:37 +msgid "" +"Enter the body text of your passage here. To link to another passage, put " +"two square brackets around its name, [[like this]]." msgstr "" -"Il formato del racconto “%1$s” non può essere caricato (%2$s)." +"Inserisci qui il corpo del tuo testo. Per collegare ad un altro passaggio, " +"aggiungi due parentesi quadre intorno al nome, [[in questo modo]]." -#: src/story-edit/passageItemView.js:172 -#, javascript-format -msgid "Are you sure you want to delete “%s”? " -msgstr "Sei sicuro di voler cancellare “%s”? " +#: src/editors/passage/index.js:181 +msgid "Editing \\u201c%s\\u201d" +msgstr "\\u201c%s\\u201d in modifica" -#: src/story-edit/passageItemView.js:176 -msgid "(Hold the Shift key when deleting to skip this message.)" -msgstr "" -"(Tieni premuto Shift quando cancelli, per non mostrare questo messaggio.)" - -#. L10n: An internal error related to handling user input. -#: src/story-edit/passageItemView.js:468 -msgid "Don't see either mouse or touch coordinates on event" -msgstr "Non riesco a trovare le coordinate sull'evento" - -#. L10n: An internal error related to user input. -#: src/story-edit/passageItemView.js:530 -msgid "Couldn't find original touch ID in movement event" -msgstr "Non sono riuscito a trovare il touch ID originale nell'evento" - -#. L10n: %s is the error message. -#: src/story-edit/storyEditView.js:69 src/story-edit/storyEditView.js:90 -#, javascript-format -msgid "A problem occurred while saving your changes (%s)." -msgstr "Sì è presentato un errore durante il salvataggio delle modifiche (%s)." - -#. L10n: This message is always shown with more than one passage. -#. %d is the number of passages. -#: src/story-edit/storyEditView.js:147 -#, javascript-format -msgid "Are you sure you want to delete this passage?" -msgid_plural "" -"Are you sure you want to delete these %d passages? This cannot be undone." -msgstr[0] "Sei sicuro di voler eliminare questo passaggio (%d)?" -msgstr[1] "" -"Sei sicuro di voler eliminare questi %d passaggi? Questa operazione è " -"definitiva." +#. L10n: %1$s is a filename; %2$s is the error message. +#: src/file/save.js:71 +msgid "“%1$s” could not be saved (%2$s)." +msgstr "Non è stato possibile salvare “%1$s” (%2$s)." -#: src/story-edit/storyEditView.js:293 -msgid "This story does not have a starting point. " -msgstr "Questo racconto non ha un punto di partenza." +#. L10n: This is the folder name on OS X, Linux, and recent versions of Windows that a user's documents are stored in, relative to the user's home directory. If you need to use a space in this name, then it should have two backslashes (\\) in front of it. Regardless, this must have a single forward slash (/) as its first character. +#: src/nw/directories.js:38 +msgid "/Documents" +msgstr "/Documents" -#: src/story-edit/storyEditView.js:307 -msgid "" -"Refreshed the playable version of your story in the previously-opened tab or " -"window." -msgstr "" -"E' stata aggiornata la versione eseguibile del tuo racconto nel pannello o " -"nella finestra precedentemente aperto." +#: src/nw/directories.js:51 +msgid "My\\\\ Documents" +msgstr "My\\\\ Documents" -#: src/story-edit/storyEditView.js:337 src/story-edit/storyEditView.js:377 -#: src/story-list/storyItemView.js:121 -msgid "" -"This story does not have a starting point. Use the icon on a passage to set this." -msgstr "" -"Il racconto non possiede un punto di partenza. Usa l’icona su un passaggio." +#: src/nw/directories.js:70 +msgid "Stories" +msgstr "Racconti" -#: src/story-edit/storyEditView.js:350 -msgid "" -"Refreshed the test version of your story in the previously-opened tab or " -"window." -msgstr "" -"E' stata aggiornata la versione test del tuo racconto, nel pannello o nella " -"finestra precedentemente aperto." +#: src/nw/menus.js:27 +msgid "Toggle Fullscreen" +msgstr "Aziona Fullscreen" -#. L10n: This refers to when a story was last saved by the user -#. %s will be replaced with a localized date and time -#: src/story-edit/storyEditView.js:598 src/story-edit/toolbar.js:98 -#, javascript-format -msgid "Last saved at %s" -msgstr "Ultimo salvataggio: %s" +#: src/nw/menus.js:44 +msgid "Quit" +msgstr "Chiudi" -#: src/story-list/modals/formatsModal.js:147 -msgid "The story format at %1$s could not be added (%2$s)." -msgstr "" -"Il formato del racconto posizionato in %1$s non può essere aggiunto (%2$s)." +#: src/nw/menus.js:61 +msgid "Edit" +msgstr "Modifica" -#. L10n: An internal error related to story formats. -#: src/story-list/modals/formatsModal.js:256 -msgid "Don't know what kind of format to set as default" -msgstr "Non so quale tipo di formato selezionare come default." +#: src/nw/menus.js:66 +msgid "Undo" +msgstr "Undo" -#: src/story-list/storageQuota.js:23 src/story-list/storageQuota.js:46 -#: src/story-list/storageQuota.js:51 -#, javascript-format -msgid "%d%% space available" -msgstr "%d%% spazio disponibile" +#: src/nw/menus.js:79 +msgid "Cut" +msgstr "Taglia" -#: src/story-list/storyItemView.js:91 src/story-list/storyItemView.js:105 -msgid "" -"This story does not have a starting point. Edit this story and use the icon on a passage to set this." -msgstr "" -"Il racconto non ha un punto di partenza. Modifica il racconto ed utilizza " -"l’icona su un passaggio." +#: src/nw/menus.js:88 +msgid "Copy" +msgstr "Copia" + +#: src/nw/menus.js:97 +msgid "Paste" +msgstr "Incolla" -#: src/story-list/storyItemView.js:134 -#, javascript-format +#: src/nw/menus.js:106 src/story-edit-view/passage-item/index.js:275 +msgid "Delete" +msgstr "Elimina" + +#: src/nw/menus.js:118 +msgid "Show Library" +msgstr "Mostra Libreria" + +#: src/story-edit-view/passage-item/index.js:260 +#: src/story-list-view/story-item/item-menu/index.js:78 msgid "" "Are you sure you want to delete “%s”? This cannot be undone." msgstr "" -"Sei sicuro di voler eliminare “%s”? Questa operazione sarà " +"Sei sicuro di voler eliminare “%s”? Questa azione sarà " "definitiva." -#: src/story-list/storyItemView.js:136 -msgid "Delete Forever" -msgstr "Elimina per sempre" +#: src/story-edit-view/passage-item/index.js:267 +msgid "(Hold the Shift key when deleting to skip this message.)" +msgstr "" +"(Tieni premuto il tasto Shift quando cancelli per saltare questo messaggio)" -#: src/story-list/storyItemView.js:148 -#, javascript-format +#: src/story-edit-view/story-toolbar/story-menu/index.js:46 +#: src/story-list-view/story-item/item-menu/index.js:100 msgid "What should “%s” be renamed to?" msgstr "Qual’è il nuovo nome per “%s”?" -#: src/story-list/storyItemView.js:149 +#: src/story-edit-view/story-toolbar/story-menu/index.js:51 +#: src/story-list-view/story-item/item-menu/index.js:105 msgid "Rename" msgstr "Rinomina" -#: src/story-list/storyItemView.js:166 -msgid "What should the duplicate be named?" -msgstr "Qual’è il nome del duplicato?" - -#: src/story-list/storyItemView.js:167 -msgid "Duplicate" -msgstr "Duplica" - -#: src/story-list/storyItemView.js:173 -#, javascript-format -msgid "%s Copy" -msgstr "%s Copia" +#: src/story-edit-view/story-toolbar/story-menu/index.js:55 +#: src/story-list-view/story-item/item-menu/index.js:109 +#: src/story-list-view/story-item/item-menu/index.js:128 +msgid "Please enter a name." +msgstr "Inserisci un nome." -#. L10n: %d is a number of stories. -#: src/story-list/storyListView.js:268 -#, javascript-format -msgid "%d story was imported." -msgid_plural "%d stories were imported." -msgstr[0] "E’ stato importato %d racconto." -msgstr[1] "Sono stati importati %d racconti." - -#. L10n: %d is a number of stories -#: src/story-list/storyListView.js:358 -#, javascript-format +#: src/story-list-view/index.js:79 msgid "%d Story" msgid_plural "%d Stories" msgstr[0] "%d Racconto" msgstr[1] "%d Racconti" -#. L10n: %s is the error message. -#: src/story-publish/index.js:46 -#, javascript-format -msgid "An error occurred while publishing your story. (%s)" +#: src/story-list-view/list-toolbar/index.js:21 +msgid "What should your story be named?
(You can change this later.)" msgstr "" -"Si è verificato un errore durante la pubblicazione del tuo racconto. (%s)" +"Qual’è il nome del Racconto?
(successivamente potrà essere modificato)" + +#: src/story-list-view/list-toolbar/index.js:30 +msgid "A story with this name already exists." +msgstr "Esiste già un racconto con questo nome." -#: src/story-publish/index.js:77 +#: src/story-list-view/list-toolbar/index.js:60 msgid "Twine Archive.html" msgstr "Twine Archive.html" + +#: src/story-list-view/story-item/item-menu/index.js:84 +msgid "Delete Forever" +msgstr "Elimina per sempre" + +#: src/story-list-view/story-item/item-menu/index.js:122 +msgid "What should the duplicate be named?" +msgstr "Come vuoi chiamare il duplicato?" + +#: src/story-list-view/story-item/item-menu/index.js:124 +msgid "Duplicate" +msgstr "Duplica" + +#: src/story-list-view/story-item/item-menu/index.js:126 +msgid "%s Copy" +msgstr "%s Copia" + +#: src/ui/quota-gauge/index.js:24 +msgid "%d%% space available" +msgstr "%d%% di spazio disponibile" diff --git a/src/locale/po/template.pot b/src/locale/po/template.pot index 533f5505e..d6a579326 100644 --- a/src/locale/po/template.pot +++ b/src/locale/po/template.pot @@ -291,7 +291,9 @@ msgstr "" msgid "Play" msgstr "" +#. L10n: Word in the sense of individual words in a sentence. This does not actually include the count, as it is used in a table. #: src/story-edit-view/story-toolbar/index.html +#: src/dialogs/story-stats/index.js:86 msgid "Passage" msgstr "" @@ -416,8 +418,8 @@ msgstr "" msgid "Secondly, <b>anyone who can use this browser can see and make changes to your work</b>. So if you've got a nosy kid brother, look into setting up a separate profile for yourself." msgstr "" -#: src/data/actions.js:262 -msgid "a story format named “%s” already exists" +#: src/data/actions.js:272 +msgid "a more recent version of the story format “%s” is already installed" msgstr "" #: src/data/publish.js:75 @@ -437,7 +439,7 @@ msgid "Untitled Story" msgstr "" #: src/data/story.js:207 -#: src/story-edit-view/index.js:195 +#: src/story-edit-view/index.js:218 msgid "Untitled Passage" msgstr "" @@ -464,11 +466,11 @@ msgid "Not Right Now" msgstr "" #. L10n: %1$s is the name of the story format; %2$s is -#: src/dialogs/formats/index.js:60 +#: src/dialogs/formats/index.js:63 msgid "The story format “%1$s” could not be loaded (%2$s)." msgstr "" -#: src/dialogs/formats/index.js:102 +#: src/dialogs/formats/index.js:105 msgid "The story format at %1$s could not be added (%2$s)." msgstr "" @@ -495,35 +497,39 @@ msgid_plural "Replace %d Stories" msgstr[0] "" msgstr[1] "" -#: src/dialogs/story-stats/index.js:37 +#. L10n: Character in the sense of individual letters in a word. This does not actually include the count, as it is used in a table. +#: src/dialogs/story-stats/index.js:40 msgid "Character" msgid_plural "Characters" msgstr[0] "" msgstr[1] "" -#: src/dialogs/story-stats/index.js:51 +#. L10n: Word in the sense of individual words in a sentence. This does not actually include the count, as it is used in a table. +#: src/dialogs/story-stats/index.js:55 msgid "Word" msgid_plural "Words" msgstr[0] "" msgstr[1] "" -#: src/dialogs/story-stats/index.js:85 +#. L10n: Links in the sense of hypertext links. This does not actually include the count, as it is used in a table. +#: src/dialogs/story-stats/index.js:104 msgid "Link" msgid_plural "Links" msgstr[0] "" msgstr[1] "" -#: src/dialogs/story-stats/index.js:98 +#. L10n: Links in the sense of hypertext links. This does not actually include the count, as it is used in a table. +#: src/dialogs/story-stats/index.js:119 msgid "Broken Link" msgid_plural "Broken Links" msgstr[0] "" msgstr[1] "" -#: src/editors/passage/index.js:37 +#: src/editors/passage/index.js:38 msgid "Enter the body text of your passage here. To link to another passage, put two square brackets around its name, [[like this]]." msgstr "" -#: src/editors/passage/index.js:181 +#: src/editors/passage/index.js:182 msgid "Editing \\u201c%s\\u201d" msgstr "" @@ -532,11 +538,12 @@ msgstr "" msgid "“%1$s” could not be saved (%2$s)." msgstr "" -#. L10n: This is the folder name on OS X, Linux, and recent versions of Windows that a user's documents are stored in, relative to the user's home directory. If you need to use a space in this name, then it should have two backslashes (\\) in front of it. Regardless, this must have a single forward slash (/) as its first character. -#: src/nw/directories.js:38 -msgid "/Documents" +#. L10n: This is the folder name on OS X, Linux, and recent versions of Windows that a user's documents are stored in, relative to the user's home directory. If you need to use a space in this name, then it should have two backslashes (\\) in front of it. +#: src/nw/directories.js:37 +msgid "Documents" msgstr "" +#. L10n: This is the folder name on Windows XP that a user's documents are stored in, relative to the user's home directory. This is used if a folder with the name given by the translation key '/Documents' does not exist. If you need to use a space in this name, then it should have two backslashes (\\) in front of it. #: src/nw/directories.js:51 msgid "My\\\\ Documents" msgstr "" @@ -574,7 +581,7 @@ msgid "Paste" msgstr "" #: src/nw/menus.js:106 -#: src/story-edit-view/passage-item/index.js:275 +#: src/story-edit-view/passage-item/index.js:334 msgid "Delete" msgstr "" @@ -582,12 +589,12 @@ msgstr "" msgid "Show Library" msgstr "" -#: src/story-edit-view/passage-item/index.js:260 +#: src/story-edit-view/passage-item/index.js:319 #: src/story-list-view/story-item/item-menu/index.js:78 msgid "Are you sure you want to delete “%s”? This cannot be undone." msgstr "" -#: src/story-edit-view/passage-item/index.js:267 +#: src/story-edit-view/passage-item/index.js:326 msgid "(Hold the Shift key when deleting to skip this message.)" msgstr "" @@ -621,7 +628,7 @@ msgstr "" msgid "A story with this name already exists." msgstr "" -#: src/story-list-view/list-toolbar/index.js:60 +#: src/story-list-view/list-toolbar/index.js:62 msgid "Twine Archive.html" msgstr "" diff --git a/src/locale/view/img/flags/cs.svg b/src/locale/view/img/flags/cs.svg new file mode 100644 index 000000000..c18c40a31 --- /dev/null +++ b/src/locale/view/img/flags/cs.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/locale/view/index.js b/src/locale/view/index.js index 87afa966d..938235936 100644 --- a/src/locale/view/index.js +++ b/src/locale/view/index.js @@ -15,6 +15,7 @@ module.exports = Vue.extend({ locales: [ { label: 'Castellano', code: 'es' }, + { label: 'Čeština', code: 'cs'}, { label: 'Dansk', code: 'da' }, { label: 'Deutsch', code: 'de' }, { label: 'English', code: 'en' }, diff --git a/src/story-edit-view/index.js b/src/story-edit-view/index.js index 3d2cf2397..093511b87 100644 --- a/src/story-edit-view/index.js +++ b/src/story-edit-view/index.js @@ -1,4 +1,4 @@ -// The main view where story editing takes place. +/* The main view where story editing takes place. */ const { values } = require('underscore'); const Vue = require('vue'); @@ -15,14 +15,16 @@ const { passageDefaults } = require('../data/story'); const zoomSettings = require('./zoom-settings'); require('./index.less'); -// A memoized, sorted array of zoom levels used when zooming in or out. +/* +A memoized, sorted array of zoom levels used when zooming in or out. +*/ const zoomLevels = values(zoomSettings).sort(); module.exports = Vue.extend({ template: require('./index.html'), - // The id of the story we're editing is provided by the router. + /* The id of the story we're editing is provided by the router. */ props: { storyId: { @@ -32,41 +34,51 @@ module.exports = Vue.extend({ }, data: () => ({ - // The window's width and height. Our resize() method keeps this in sync - // with the DOM. - + /* + The window's width and height. Our resize() method keeps this in sync + with the DOM. + */ + winWidth: window.innerWidth, winHeight: window.innerHeight, - - // The calculated width and height we maintain to allow the user to - // always have space below and to the right of passages in the story - // map. + + /* + The calculated width and height we maintain to allow the user to + always have space below and to the right of passages in the story + map. + */ width: 0, height: 0, - // The regular expression that matching passages should highlight. - // If null, none should highlight. - + /* + The regular expression that matching passages should highlight. + If null, none should highlight. + */ + highlightRegexp: null, - // The offset that selected passages should be displayed at - // temporarily, to show feedback as the user drags passages around. + /* + The offset that selected passages should be displayed at + temporarily, to show feedback as the user drags passages around. + */ screenDragOffsetX: 0, screenDragOffsetY: 0 }), computed: { - // Sets our width and height to: - // * the size of the browser window - // * the minimum amount of space needed to enclose all existing - // passages - // - // ... whichever is bigger, plus 50% of the browser window's - // width and height, so that there's always room for the story to - // expand. + /* + Sets our width and height to: + * the size of the browser window + * the minimum amount of space needed to enclose all existing + passages + ... whichever is bigger, plus 50% of the browser window's + width and height, so that there's always room for the story to + expand. + */ + cssDimensions() { let width = this.winWidth; let height = this.winHeight; @@ -85,38 +97,44 @@ module.exports = Vue.extend({ passagesHeight = bottom; } }); - + width = Math.max(passagesWidth * this.story.zoom, this.winWidth); height = Math.max(passagesHeight * this.story.zoom, this.winHeight); - // Give some space below and to the right for the user to add - // passages. + /* + Give some space below and to the right for the user to add + passages. + */ width += this.winWidth / 2; height += this.winHeight / 2; - + return { width: width + 'px', height: height + 'px' }; }, - // Our grid size -- for now, constant. + /* Our grid size -- for now, constant. */ gridSize() { return 25; }, - // Returns an array of currently-selected components. This - // is used by the marquee selector component to do additive selections - // by remembering what was originally selected. + /* + Returns an array of currently-selected components. This + is used by the marquee selector component to do additive selections + by remembering what was originally selected. + */ selectedChildren() { return this.$refs.passages.filter(p => p.selected); }, - // An array of components and their link positions, - // indexed by name. + /* + An array of components and their link positions, + indexed by name. + */ passagePositions() { return this.$refs.passages.reduce( @@ -124,16 +142,15 @@ module.exports = Vue.extend({ result[passageView.passage.name] = passageView.linkPosition; return result; }, - {} ); }, - + story() { return this.allStories.find(story => story.id === this.storyId); }, - // A human readable adjective for the story's zoom level. + /* A human readable adjective for the story's zoom level. */ zoomDesc() { return Object.keys(zoomSettings).find( @@ -167,30 +184,36 @@ module.exports = Vue.extend({ this.winHeight = window.innerHeight; }, - // Creates a passage, optionally at a certain position onscreen. If - // unspecified, this does so at the center of the page. This also - // handles positioning the passage so it doesn't overlap others. + /* + Creates a passage, optionally at a certain position onscreen. If + unspecified, this does so at the center of the page. This also + handles positioning the passage so it doesn't overlap others. + */ createPassage(name, top, left) { - // If we haven't been given coordinates, place the new passage at - // the center of the window. We start by finding the center point - // of the browser window in logical coordinates, e.g. taking into - // account the current zoom level. Then, we move upward and to the - // left by half the dimensions of a passage in logical space. + /* + If we haven't been given coordinates, place the new passage at + the center of the window. We start by finding the center point + of the browser window in logical coordinates, e.g. taking into + account the current zoom level. Then, we move upward and to the + left by half the dimensions of a passage in logical space. + */ if (!left) { - left = (window.scrollX + window.innerWidth / 2) / this.story.zoom; + left = (window.pageXOffset + window.innerWidth / 2) / this.story.zoom; left -= passageDefaults.width; } if (!top) { - top = (window.scrollY + window.innerHeight / 2) / this.story.zoom; + top = (window.pageYOffset + window.innerHeight / 2) / this.story.zoom; top -= passageDefaults.height; } - // Make sure the name is unique. If it's a duplicate, we add a - // number at the end (e.g. "Untitled Passage 2", "Untitled Passage - // 3", and so on. + /* + Make sure the name is unique. If it's a duplicate, we add a + number at the end (e.g. "Untitled Passage 2", "Untitled Passage + 3", and so on. + */ name = name || locale.say('Untitled Passage'); @@ -206,12 +229,14 @@ module.exports = Vue.extend({ (this.story.passages.find(p => p.name === name)); } - // Add it to our collection. + /* Add it to our collection. */ this.createPassageInStory(this.story.id, { name, left, top }); - // Then position it so it doesn't overlap any others, and save it - // again. + /* + Then position it so it doesn't overlap any others, and save it + again. + */ this.positionPassage( this.story.id, @@ -220,24 +245,26 @@ module.exports = Vue.extend({ ); }, - // Zooms in or out based on a mouse wheel event. The user must hold - // down the Alt or Option key for it to register. + /* + Zooms in or out based on a mouse wheel event. The user must hold + down the Alt or Option key for it to register. + */ onWheel(e) { if (e.altKey && !e.ctrlKey) { let zoomIndex = zoomLevels.indexOf(this.story.zoom); - // Only consider the Y component of the motion. + /* Only consider the Y component of the motion. */ if (e.wheelDeltaY > 0) { - // Zoom in. + /* Zoom in. */ zoomIndex = (zoomIndex === 0) ? zoomLevels.length - 1 : zoomIndex - 1; } else { - // Zoom out. + /* Zoom out. */ zoomIndex = (zoomIndex === zoomLevels.length - 1) ? 0 : @@ -251,22 +278,28 @@ module.exports = Vue.extend({ }, events: { - // Our children (e.g. the search field can tell us to change what the - // highlight filter should be. + /* + Our children (e.g. the search field can tell us to change what the + highlight filter should be. + */ 'highlight-regexp-change'(value) { this.highlightRegexp = value; }, - // A hook into our createPassage() method for child components. + /* + A hook into our createPassage() method for child components. + */ 'passage-create'(name, left, top) { this.createPassage(name, left, top); }, - // A child will dispatch this event to us as it is dragged around. We - // set a data property here and other selected passages react to it by - // temporarily shifting their onscreen position. + /* + A child will dispatch this event to us as it is dragged around. We + set a data property here and other selected passages react to it by + temporarily shifting their onscreen position. + */ 'passage-drag'(xOffset, yOffset) { if (this.story.snapToGrid) { @@ -281,9 +314,11 @@ module.exports = Vue.extend({ } }, - // A child will dispatch this event at the completion of a drag. We - // pass this onto our children, who use it as a chance to save what was - // a temporary change in the DOM to their model. + /* + A child will dispatch this event at the completion of a drag. We + pass this onto our children, who use it as a chance to save what was + a temporary change in the DOM to their model. + */ 'passage-drag-complete'(xOffset, yOffset) { this.screenDragOffsetX = 0; @@ -297,28 +332,34 @@ module.exports = Vue.extend({ this.$broadcast('passage-drag-complete', xOffset, yOffset); }, - // A child will dispatch this event to us when it is selected - // non-additively; we broadcast it to all children to deselect them. + /* + A child will dispatch this event to us when it is selected + non-additively; we broadcast it to all children to deselect them. + */ 'passage-deselect-except'(...children) { this.$broadcast('passage-deselect-except', ...children); }, - // The marquee selector component dispatches these events as it is moved, - // and child passage items react to it by setting their selected - // property accordingly. - // - // If a component is in the always array, then it will always select - // itself during this operation. + /* + The marquee selector component dispatches these events as it is moved, + and child passage items react to it by setting their selected + property accordingly. + + If a component is in the always array, then it will always select + itself during this operation. + */ 'passage-select-intersects'(rect, always) { this.$broadcast('passage-select-intersects', rect, always); }, - // Positions a passage on behalf of a child component. This needs to be - // here, as opposed to a direct Vuex action, because this allows the - // child to ask that the positioning ignore selected passage components - // (e.g. after finishing a drag). + /* + Positions a passage on behalf of a child component. This needs to be + here, as opposed to a direct Vuex action, because this allows the + child to ask that the positioning ignore selected passage components + (e.g. after finishing a drag). + */ 'passage-position'(passage, options) { this.positionPassage( @@ -357,4 +398,4 @@ module.exports = Vue.extend({ }, mixins: [domEvents] -}); +}); \ No newline at end of file diff --git a/src/story-edit-view/marquee-selector/index.js b/src/story-edit-view/marquee-selector/index.js index e15ca97c4..579c5a76a 100644 --- a/src/story-edit-view/marquee-selector/index.js +++ b/src/story-edit-view/marquee-selector/index.js @@ -2,6 +2,7 @@ const Vue = require('vue'); const domEvents = require('../../vue/mixins/dom-events'); +require('../../ui/ie-mouse-event-polyfill'); require('./index.less'); module.exports = Vue.extend({ @@ -12,22 +13,28 @@ module.exports = Vue.extend({ data: () => ({ visible: false, - // Where the selection began, and where the user is currently pointing. + /* + Where the selection began, and where the user is currently pointing. + */ startX: 0, startY: 0, currentX: 0, currentY: 0, - // Is this an additive selection, e.g. keeping what was selected in - // place? + /* + Is this an additive selection, e.g. keeping what was selected in + place? + */ additive: false, originallySelected: [] }), computed: { - // The rectangle encompasing this selection in screen coordinates. + /* + The rectangle encompasing this selection in screen coordinates. + */ screenRect() { if (!this.visible) { @@ -57,8 +64,10 @@ module.exports = Vue.extend({ return result; }, - // The rectangle encompasing this selection in logical space -- this, - // factoring in the parent component's zoom level. + /* + The rectangle encompasing this selection in logical space -- this, + factoring in the parent component's zoom level. + */ logicalRect() { if (!this.screenRect) { @@ -73,7 +82,9 @@ module.exports = Vue.extend({ }; }, - // How the above translates into CSS properties. + /* + How the above translates into CSS properties. + */ css() { if (!this.screenRect) { @@ -91,16 +102,22 @@ module.exports = Vue.extend({ methods: { startDrag(e) { - // Only listen to the left mouse button, and only when the is - // not in space-bar scroll mode (see vue/directives/mouse-scrolling). - - if (e.which !== 1 || document.body.classList.contains('mouseScrollReady')) { + /* + Only listen to clicks with the left mouse button on the background + SVG element (e.g. links) and only when the is not in + space-bar scroll mode (see vue/directives/mouse-scrolling). + */ + + if (e.target.nodeName !== 'svg' || e.which !== 1 || + document.body.classList.contains('mouseScrollReady')) { return; } - // If the user is holding down shift or control, then this is an - // additive selection. Remember the currently selected passage - // components for later. + /* + If the user is holding down shift or control, then this is an + additive selection. Remember the currently selected passage + components for later. + */ this.additive = e.shiftKey || e.ctrlKey; @@ -111,34 +128,44 @@ module.exports = Vue.extend({ this.visible = true; document.body.classList.add('marqueeing'); - // Set up coordinates initially. clientX and clientY don't take - // into account the window's scroll position. + /* + Set up coordinates initially. clientX and clientY don't take + into account the window's scroll position. + */ - this.startX = this.currentX = e.clientX + window.scrollX; - this.startY = this.currentY = e.clientY + window.scrollY; + this.startX = this.currentX = e.clientX + window.pageXOffset; + this.startY = this.currentY = e.clientY + window.pageYOffset; - // Set up event listeners to continue the drag. + /* + Set up event listeners to continue the drag. + */ this.on(this.$parent.$el, 'mousemove', this.followDrag); this.on(this.$parent.$el, 'mouseup', this.endDrag); }, followDrag(e) { - // It appears we get a stray movement event in the process of - // ending a drag-- ignore this case. + /* + It appears we get a stray movement event in the process of + ending a drag-- ignore this case. + */ if (!this.logicalRect) { return; } - // As noted above, clientX and clientY don't take into account the - // window's scroll position. + /* + As noted above, clientX and clientY don't take into account the + window's scroll position. + */ - this.currentX = e.clientX + window.scrollX; - this.currentY = e.clientY + window.scrollY; + this.currentX = e.clientX + window.pageXOffset; + this.currentY = e.clientY + window.pageYOffset; - // Our parent component will broadcast this event onto child - // passage components. + /* + Our parent component will broadcast this event onto child + passage components. + */ this.$dispatch( 'passage-select-intersects', @@ -148,14 +175,16 @@ module.exports = Vue.extend({ }, endDrag(e) { - // Only listen to the left mouse button. + /* Only listen to the left mouse button. */ if (e.which !== 1) { return; } - - // If the user never actually moved the mouse (e.g. this was a - // single click in the story map), deselect everything. + + /* + If the user never actually moved the mouse (e.g. this was a + single click in the story map), deselect everything. + */ if (this.screenRect && this.screenRect.width === 0 && this.screenRect.height === 0) { @@ -165,23 +194,25 @@ module.exports = Vue.extend({ this.visible = false; document.querySelector('body').classList.remove('marqueeing'); - // Deactivate the event listeners we had been using. + /* Deactivate the event listeners we had been using. */ this.off(this.$el.parentNode, 'mousemove'); this.off(this.$el.parentNode, 'mouseup'); - // Because this component's $el has been re-rendered (entirely replaced) - // due to startDrag() and followDrag() altering the data, this mouseup - // event won't result in a click event bubbling up from this. - // To alleviate this, we generate a synthetic MouseEvent now, - // using this mouseup event's values. + /* + Because this component's $el has been re-rendered (entirely replaced) + due to startDrag() and followDrag() altering the data, this mouseup + event won't result in a click event bubbling up from this. + To alleviate this, we generate a synthetic MouseEvent now, + using this mouseup event's values. + */ this.$el.dispatchEvent(new MouseEvent('click', e)); } }, ready() { - this.on(this.$el.parentNode, 'mousedown', this.startDrag.bind(this)); + this.on(this.$el.parentNode, 'mousedown', this.startDrag); }, mixins: [domEvents] diff --git a/src/story-edit-view/passage-item/index.html b/src/story-edit-view/passage-item/index.html index c949b8d7c..80ee121dd 100644 --- a/src/story-edit-view/passage-item/index.html +++ b/src/story-edit-view/passage-item/index.html @@ -1,4 +1,5 @@ -

+

diff --git a/src/story-edit-view/passage-item/index.js b/src/story-edit-view/passage-item/index.js index cf7cfab23..807b73fe1 100644 --- a/src/story-edit-view/passage-item/index.js +++ b/src/story-edit-view/passage-item/index.js @@ -1,4 +1,6 @@ -// A single passage in the story map. +/* +A single passage in the story map. +*/ const { escape } = require('underscore'); const Vue = require('vue'); @@ -146,7 +148,8 @@ module.exports = Vue.extend({ edit() { /* - Close any existing passage menu -- it may still be visible if the user double-clicked. + Close any existing passage menu -- it may still be visible if the + user double-clicked. */ this.$broadcast('drop-down-close'); @@ -176,79 +179,129 @@ module.exports = Vue.extend({ }, startDrag(e) { - // Only listen to the left mouse button. + /* Only listen to the left mouse button. */ - if (e.which !== 1) { + if (e.type === 'mousedown' && e.which !== 1) { return; } - + if (e.shiftKey || e.ctrlKey) { - // Shift- or control-clicking toggles our selected status, but - // doesn't affect any other passage's selected status. - // If the shift or control key was not held down, select only - // ourselves. + /* + Shift- or control-clicking toggles our selected status, but + doesn't affect any other passage's selected status. If the shift + or control key was not held down, select only ourselves. + */ this.selected = !this.selected; } else if (!this.selected) { - // If we are newly-selected and the shift or control keys are - // not held, deselect everything else. The check for - // newly-selected status is needed so that if the user is - // beginning a drag, we don't deselect everything right away. - // The check for that occurs in the mouse up handler, above. + /* + If we are newly-selected and the shift or control keys are not + held, deselect everything else. The check for newly-selected + status is needed so that if the user is beginning a drag, we + don't deselect everything right away. The check for that occurs + in the mouse up handler, above. + */ this.selected = true; this.$dispatch('passage-deselect-except', this); } - // Begin tracking a potential drag. + /* Begin tracking a potential drag. */ + + const srcPoint = (event.type === 'mousedown') ? e : e.touches[0]; + + this.screenDragStartX = srcPoint.clientX + window.pageXOffset; + this.screenDragStartY = srcPoint.clientY + window.pageYOffset; + + if (hasPrimaryTouchUI()) { + this.on(window, 'touchmove', this.followDrag, { passive: false }); + this.on(window, 'touchend', this.stopDrag); + } + else { + this.on(window, 'mousemove', this.followDrag, { passive: false }); + this.on(window, 'mouseup', this.stopDrag); + } - this.screenDragStartX = e.clientX + window.scrollX; - this.screenDragStartY = e.clientY + window.scrollY; - this.on(window, 'mousemove', this.followDrag); - this.on(window, 'mouseup', this.stopDrag); document.querySelector('body').classList.add('draggingPassages'); }, followDrag(e) { + const srcPoint = (event.type === 'mousemove') ? e : e.touches[0]; + this.$dispatch( 'passage-drag', - e.clientX + window.scrollX - this.screenDragStartX, - e.clientY + window.scrollY - this.screenDragStartY + srcPoint.clientX + window.pageXOffset - this.screenDragStartX, + srcPoint.clientY + window.pageYOffset - this.screenDragStartY ); + + /* + Block scrolling if we're following touch events -- otherwise, the + browser will treat it as though the user is dragging to scroll + around the screen. + */ + + if (e.type === 'touchmove') { + e.preventDefault(); + } }, stopDrag(e) { - // Only listen to the left mouse button. + /* Only listen to the left mouse button. */ - if (e.which !== 1) { + if (e.type === 'mouseup' && e.which !== 1) { return; } - // Remove event listeners set up at the start of the drag. - this.off(window, 'mousemove'); - this.off(window, 'mouseup'); - document.querySelector('body').classList.remove('draggingPassages'); + /* Remove event listeners set up at the start of the drag. */ - // If we haven't actually been moved and the shift or control key - // were not held down, select just this passage only. This handles - // the scenario where the user clicks a single passage when several - // were selected. We don't want to immediately deselect them all, - // as the user may be starting a drag; but now that we know for - // sure that the user didn't intend this, we select just this one. + if (hasPrimaryTouchUI()) { + this.off(window, 'touchmove'); + this.off(window, 'touchend'); + } + else { + this.off(window, 'mousemove'); + this.off(window, 'mouseup'); + } + + document.querySelector('body').classList.remove('draggingPassages'); + /* + If we haven't actually been moved and the shift or control key were + not held down, select just this passage only. This handles the + scenario where the user clicks a single passage when several were + selected. We don't want to immediately deselect them all, as the + user may be starting a drag; but now that we know for sure that the + user didn't intend this, we select just this one. + */ + if (this.dragXOffset === 0 && this.dragYOffset === 0) { if (!(e.ctrlKey || e.shiftKey)) { this.$dispatch('passage-deselect-except', this); } } else { - this.$dispatch( - 'passage-drag-complete', - e.clientX + window.scrollX - this.screenDragStartX, - e.clientY + window.scrollY - this.screenDragStartY, - this - ); + /* + touchend events do not include client coordinates, but mouseup + events do. + */ + + if (e.type === 'mouseup') { + this.$dispatch( + 'passage-drag-complete', + e.clientX + window.pageXOffset - this.screenDragStartX, + e.clientY + window.pageYOffset - this.screenDragStartY, + this + ); + } + else { + this.$dispatch( + 'passage-drag-complete', + this.screenDragOffsetX, + this.screenDragOffsetY, + this + ); + } } } }, @@ -287,12 +340,16 @@ module.exports = Vue.extend({ }, 'passage-drag-complete'(xOffset, yOffset, emitter) { - // We have to check whether we originally emitted this event, as - // $dispatch triggers first on ourselves, then our parent. + /* + We have to check whether we originally emitted this event, as + $dispatch triggers first on ourselves, then our parent. + */ if (this.selected && emitter !== this) { - // Because the x and y offsets are in screen coordinates, we - // need to convert back to logical space. + /* + Because the x and y offsets are in screen coordinates, we need + to convert back to logical space. + */ this.updatePassageInStory( this.parentStory.id, @@ -303,9 +360,12 @@ module.exports = Vue.extend({ } ); - // Ask our parent to position us so we overlap no unselected - // passages. We need to stipulate that passages are not selected so - // that we don't inadvertantly collide with other passages being dragged. + /* + Ask our parent to position us so we overlap no unselected + passages. We need to stipulate that passages are not selected so + that we don't inadvertantly collide with other passages being + dragged. + */ this.$dispatch( 'passage-position', @@ -314,8 +374,10 @@ module.exports = Vue.extend({ ); } - // Tell our menu that our position has changed, so that it in turn - // can change its position. + /* + Tell our menu that our position has changed, so that it in turn can + change its position. + */ this.$broadcast('drop-down-reposition'); }, diff --git a/src/story-list-view/index.js b/src/story-list-view/index.js index aadfd3c80..b74d66101 100644 --- a/src/story-list-view/index.js +++ b/src/story-list-view/index.js @@ -59,11 +59,11 @@ module.exports = Vue.extend({ const aTime = a.lastUpdate.getTime(); const bTime = b.lastUpdate.getTime(); - if (aTime > bTime) { + if (aTime < bTime) { return 1; } - if (aTime < bTime) { + if (aTime > bTime) { return -1; } diff --git a/src/story-list-view/story-item/index.less b/src/story-list-view/story-item/index.less index 2f4d94880..93f41c1a4 100644 --- a/src/story-list-view/story-item/index.less +++ b/src/story-list-view/story-item/index.less @@ -1,13 +1,15 @@ @import '../../common/depth.less'; @import '../../common/metrics.less'; +@item-width: 11rem; + .story-item { width: 11rem; margin-right: @len-extra-large; margin-bottom: @len-extra-large; button.preview { - height: 11rem; + height: @item-width; padding: 0; border-radius: 2px; transition: 0.2s box-shadow; @@ -20,6 +22,7 @@ svg { padding: @len-small; + width: @item-width; } } diff --git a/src/ui/drop-down/index.js b/src/ui/drop-down/index.js index b4004f05e..1d382d3af 100644 --- a/src/ui/drop-down/index.js +++ b/src/ui/drop-down/index.js @@ -3,6 +3,8 @@ const Drop = require('tether-drop'); const Vue = require('vue'); +const { hasPrimaryTouchUI } = require('../index'); +const domEvents = require('../../vue/mixins/dom-events'); require('./index.less'); module.exports = Vue.extend({ @@ -28,11 +30,31 @@ module.exports = Vue.extend({ }, ready() { + let openOn = this.openOn; + const target = this.$el.parentNode; + + if (hasPrimaryTouchUI() && openOn === 'click') { + /* + FastClick interferes with Drop's native handling -- we have to + handle it manually. + */ + + openOn = null; + this.on(this.$el.parentNode, 'click', () => this.$drop.open()); + + this.on(document.body, 'click', e => { + if (e.target !== this.$el.parentNode && + !target.contains(e.target)) { + this.$drop.close(); + } + }) + } + this.$drop = new Drop({ - target: this.$el.parentNode, + target: target, content: this.$el, position: this.position, - openOn: this.openOn, + openOn: openOn, classes: this.class, constrainToWindow: true, constrainToScrollParent: false, @@ -47,7 +69,10 @@ module.exports = Vue.extend({ } }); - // Close the dropdown when one of its menu items is clicked. + /* + Close the dropdown when one of its menu items is clicked. + */ + this.$drop.drop.addEventListener('click', () => { this.$drop.close(); }); @@ -69,5 +94,7 @@ module.exports = Vue.extend({ 'drop-down-reposition'() { this.$drop.position(); } - } + }, + + mixins: [domEvents] }); diff --git a/src/ui/ie-mouse-event-polyfill.js b/src/ui/ie-mouse-event-polyfill.js new file mode 100644 index 000000000..c28033659 --- /dev/null +++ b/src/ui/ie-mouse-event-polyfill.js @@ -0,0 +1,22 @@ +/* https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/MouseEvent */ + +(function (window) { + try { + new CustomEvent('test'); + } catch (e) { + return false; // No need to polyfill + } + + // Polyfills DOM4 CustomEvent + function MouseEvent(eventType, params) { + params = params || { bubbles: false, cancelable: false }; + var mouseEvent = document.createEvent('MouseEvent'); + mouseEvent.initMouseEvent(eventType, params.bubbles, params.cancelable, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + + return mouseEvent; + } + + MouseEvent.prototype = Event.prototype; + + window.MouseEvent = MouseEvent; +})(window); \ No newline at end of file diff --git a/src/ui/modal-dialog/index.less b/src/ui/modal-dialog/index.less index f38789264..950f6cb71 100644 --- a/src/ui/modal-dialog/index.less +++ b/src/ui/modal-dialog/index.less @@ -21,9 +21,8 @@ display: flex; flex-direction: column; top: @len-extra-large; - left: 50%; + left: calc(~"(100vw - 40em) / 2"); background: @color-paper; - margin-left: -20em; width: 40em; max-height: calc(~"100% - " 2 * @len-extra-large); border-radius: 2px; @@ -85,7 +84,7 @@ top: @len-small; bottom: @len-small; width: 48em; - margin-left: -24em; + left: calc(~"(100vw - 48em) / 2"); max-height: none; .content { diff --git a/src/vue/directives/mouse-scrolling.js b/src/vue/directives/mouse-scrolling.js index 57c6d7fc1..ee8043d35 100644 --- a/src/vue/directives/mouse-scrolling.js +++ b/src/vue/directives/mouse-scrolling.js @@ -4,11 +4,10 @@ may scroll the document by holding down the middle button and dragging (or the space bar and left button). */ -const domEvent = require('dom-event-special'); -const uuid = require('tiny-uuid'); +const ui = require('../../ui'); require('./mouse-scrolling.less'); -let namespaces = {}; +let handlers = {}; module.exports = { addTo(Vue) { @@ -20,6 +19,12 @@ module.exports = { let scrolling = false; let spaceHeld = false; + handlers[this] = []; + + if (ui.hasPrimaryTouchUI()) { + return; + } + function beginScrolling(e) { /* We don't need to account for the window's scroll position @@ -27,15 +32,17 @@ module.exports = { */ mouseOrigin = [e.clientX, e.clientY]; - scrollOrigin = [window.scrollX, window.scrollY]; + scrollOrigin = [window.pageXOffset, window.pageYOffset]; scrolling = true; body.classList.add('mouseScrolling'); e.preventDefault(); } - domEvent.on(body, 'keydown.mouse-scrolling', e => { + function handleKeyDown(e) { + /* Space bar */ + if (e.which === 32) { - if (!scrolling && !spaceHeld) { // Space bar + if (!scrolling && !spaceHeld) { spaceHeld = true; body.classList.add('mouseScrollReady'); } @@ -51,9 +58,9 @@ module.exports = { e.preventDefault(); } } - }); + } - domEvent.on(body, 'mousedown.mouse-scrolling', e => { + function handleMouseDown(e) { if (e.which === 2 && !scrolling) { // Middle button beginScrolling(e); } @@ -63,45 +70,77 @@ module.exports = { beginScrolling(e); } } - }); + } - domEvent.on(body, 'mousemove.mouse-scrolling', e => { + function handleMouseMove(e) { if (scrolling) { window.scrollTo( scrollOrigin[0] + mouseOrigin[0] - e.clientX, scrollOrigin[1] + mouseOrigin[1] - e.clientY ); } - }); + } - domEvent.on(body, 'keyup.mouse-scrolling', e => { + function handleKeyUp(e) { if (e.which === 32 && spaceHeld) { scrolling = spaceHeld = false; body.classList.remove('mouseScrollReady', 'mouseScrolling'); - // Prevent the space bar from scrolling the window - // down. We have to make sure that by doing so, we - // don't accidentally gobble a keystroke meant for a - // form element. + /* + Prevent the space bar from scrolling the window + down. We have to make sure that by doing so, we + don't accidentally gobble a keystroke meant for a + form element. + */ if (document.activeElement.nodeName !== 'INPUT' && document.activeElement.nodeName !== 'TEXTAREA') { e.preventDefault(); } } - }); + } - domEvent.on(body, 'mouseup.mouse-scrolling', e => { + function handleMouseUp(e) { if ((e.which === 2 || e.which === 1) && scrolling) { scrolling = false; body.classList.remove('mouseScrolling'); e.preventDefault(); } - }); + } + + body.addEventListener('mousedown', handleMouseDown); + body.addEventListener('mousemove', handleMouseMove); + body.addEventListener('mouseup', handleMouseUp); + body.addEventListener('keydown', handleKeyDown); + body.addEventListener('keyup', handleKeyUp); + + handlers[this] = { + 'mousedown': handleMouseDown, + 'mousemove': handleMouseMove, + 'mouseup': handleMouseUp, + 'keydown': handleKeyDown, + 'keyup': handleKeyUp + }; + + Object.keys(handlers[this]).forEach( + event => body.addEventListener( + event, + handlers[this][event] + ), + this + ); }, unbind() { - domEvent.off(document.body, '.mouse-scrolling'); + Object.keys(handlers[this]).forEach( + event => document.body.removeEventListener( + event, + handlers[this][event] + ), + this + ); + + delete handlers[this]; } }); } diff --git a/src/vue/mixins/dom-events.js b/src/vue/mixins/dom-events.js index 2279824d2..67d3f21af 100644 --- a/src/vue/mixins/dom-events.js +++ b/src/vue/mixins/dom-events.js @@ -1,44 +1,32 @@ /* -This helps Vue components listen to DOM events outside their element. Sometimes -an event listener needs to be attached to the element, for example. +This helps Vue components listen to DOM events outside their el. Sometimes +an event listener needs to be attached to the el, for example. Using this mixin, the component does not need to hold onto a reference to the listeners and manually remove them. */ -const domEventSpecial = require('dom-event-special'); -const uuid = require('tiny-uuid'); - -/* A list of all namespaces, indexed by the component. */ -let eventNamespaces = {}; - -/* A list of all elements that have been listened to, indexed by component. */ -let attachedEls = {}; +/* +A list of all event listeners, indexed by the component. Each entry is an array +of objects with event, el, and listener properties. +*/ +let listeners = {}; module.exports = { init() { - /* - This is an arbitrary name -- we just need the prefix to ensure it - doesn't start with a number. - */ - - eventNamespaces[this] = '.e-' + uuid(); - - /* We use a set here to ensure that it contains unique values. */ - - if (!attachedEls[this]) { - attachedEls[this] = new Set(); + if (!listeners[this]) { + listeners[this] = []; } }, beforeDestroy() { /* Clean up event listeners that have been previously attached. */ - if (!attachedEls[this]) { + if (!listeners[this]) { return; } - attachedEls[this].forEach( - el => domEventSpecial.off(el, eventNamespaces[this]) + listeners[this].forEach( + props => props.el.removeEventListener(props.event, props.listener) ); }, @@ -49,20 +37,30 @@ module.exports = { handlers to the component. */ - on(element, event, handler) { - attachedEls[this].add(element); - domEventSpecial.on(element, event + eventNamespaces[this], handler.bind(this)); - }, + on(el, event, listener, options) { + const boundListener = listener.bind(this); - /* - Removes an event listener type. + el.addEventListener(event, boundListener, options); + listeners[this].push({ el, event, options, listener: boundListener }); + }, - We don't need to do anything special; if we have extraneous entries in - attachedEls, it's harmless. + /* + Removes all listeners for an event type. */ - off(element, event) { - domEventSpecial.off(element, event + eventNamespaces[this]); + off(el, event) { + if (!listeners[this]) { + return; + } + + listeners[this] = listeners[this].filter(props => { + if (props.event === event) { + props.el.removeEventListener(props.event, props.listener, props.options); + return false; + } + + return true; + }); } } -}; +}; \ No newline at end of file diff --git a/src/vue/mixins/dom-events.spec.js b/src/vue/mixins/dom-events.spec.js index a501328ec..b2b0754e9 100644 --- a/src/vue/mixins/dom-events.spec.js +++ b/src/vue/mixins/dom-events.spec.js @@ -1,4 +1,3 @@ -let domEventSpecial = require('dom-event-special'); const { expect } = require('chai'); const { spy, stub } = require('sinon'); const Vue = require('vue'); @@ -6,20 +5,19 @@ const domEvents = require('./dom-events'); describe('dom-events Vue mixin', () => { const body = document.querySelector('body'); - const handler = function() { return this; }; - let component; + let clickEvent = document.createEvent('MouseEvent'); + let handler, component; + + clickEvent.initMouseEvent('click'); beforeEach(() => { component = new Vue({ mixins: [domEvents] }); + handler = spy(); spy(handler, 'bind'); - stub(domEventSpecial, 'on'); - stub(domEventSpecial, 'off'); }); afterEach(() => { handler.bind.restore(); - domEventSpecial.on.restore(); - domEventSpecial.off.restore(); }); it('adds on() and off() methods to a Vue component', () => { @@ -27,9 +25,10 @@ describe('dom-events Vue mixin', () => { expect(component.off).to.be.a('function'); }); - it('passes through calls to on() to dom-event-special', () => { + it('adds event listeners with on()', () => { component.on(body, 'click', handler); - expect(domEventSpecial.on.calledOnce).to.be.true; + body.dispatchEvent(clickEvent); + expect(handler.calledOnce).to.be.true; }); it('binds handlers passed to on() to the component', () => { @@ -38,15 +37,18 @@ describe('dom-events Vue mixin', () => { expect(handler.bind.calledWith(component)).to.be.true; }); - it('passes through calls to off() to dom-event-special', () => { + it('removes event listeners with off()', () => { + component.on(body, 'click', handler); component.off(body, 'click', handler); - expect(domEventSpecial.off.calledOnce).to.be.true; + body.dispatchEvent(clickEvent); + expect(handler.calledOnce).to.be.false; }); it('cleans up event listeners added via on() when the component is destroyed', () => { component.on(body, 'click', handler); component.$destroy(); - expect(domEventSpecial.off.calledOnce).to.be.true; + body.dispatchEvent(clickEvent); + expect(handler.calledOnce).to.be.false; }); it('does not do anything if a component has no listeners attached when destroyed', () => { diff --git a/story-formats/harlowe-1.2.3/format.js b/story-formats/harlowe-1.2.3/format.js index b963a98e1..def703314 100644 --- a/story-formats/harlowe-1.2.3/format.js +++ b/story-formats/harlowe-1.2.3/format.js @@ -1 +1 @@ -window.storyFormat({"name":"Harlowe","version":"1.2.3","author":"Leon Arnott","description":"The default story format for Twine 2. See its documentation.","image":"icon.svg","url":"http://twinery.org/","license":"Zlib","proofing":false,"source":"\n\n\n\n{{STORY_NAME}}\n\n\n\n\n\n\n\n{{STORY_DATA}}\n\n\n\n\n\n\n","setup": function(){"use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t-1)||e.cannotFollow&&(-1!==e.cannotFollow.indexOf(n&&n.type)||e.cannotFollow.indexOf("text")>-1&&o)||e.peek&&e.peek!==t.slice(0,e.peek.length))}function o(e){for(var t=e.innerText,o=[],i=0,l=i,s=t.length,c=null;s>i;){for(var u=t.slice(i),p=(o.length?o[0]:e).innerMode,d=0,f=p.length;f>d;d+=1){var h=a[p[d]];if(n(h,u,c,i>l)&&h.pattern.test(u)){var m=h.pattern.exec(u),g=h.fn(m),k=!1,y=0;if(g.matches){for(;y-1&&(y=o.length-1)}if(y>=o.length&&!g.isFront)continue}i>l&&e.addChild({type:"text",text:t.slice(l,i),innerMode:p}),c=e.addChild(g),i+=c.text.length,l=i,k&&(r(e,c,o[y]),o=o.slice(y+1)),c.isFrontToken()&&o.unshift(c);break}}d===f&&(i+=1,null===c&&(c={type:"text"}))}for(i>l&&e.addChild({type:"text",text:t.slice(l,i),innerMode:(o.length?o[0]:e).innerMode});o.length>0;)o.shift().demote();return e}function r(e,n,o){var r=e.children.indexOf(n),i=e.children.indexOf(o);n.children=e.children.splice(i+1,r-(i+1)),n.children.forEach(function(e){t(n,e)}),n.type=n.matches[o.type],n.innerText="";for(var a=0,l=n.children.length;l>a;a++)n.innerText+=n.children[a].text;n.start=o.start,n.text=o.text+n.innerText+n.text,Object.keys(o).forEach(function(e){Object.hasOwnProperty.call(n,e)||(n[e]=o[e])}),n.isFront&&(n.isFront=!1),e.children.splice(i,1),t(e,n)}var i=void 0,a={};e.prototype={constructor:e,addChild:function(n){var r=this.lastChildEnd(),i=new e({start:r,end:n.text&&r+n.text.length,children:[]},n);return i.innerText&&o(i),this.children.push(i),t(this,i),i},lastChild:function(){return this.children?this.children[this.children.length-1]||null:null},lastChildEnd:function(){var e=this.lastChild();return e?e.end:this.start+Math.max(0,this.text.indexOf(this.innerText))},tokenAt:function(e){if(e=this.end)return null;if(this.childAt)return this.childAt[e]&&this.childAt[e].tokenAt(e)||this;if(this.children.length)for(var t=0;t=this.end)return[];if(this.childAt)return(this.childAt[e]&&this.childAt[e].pathAt(e)||[]).concat(this);var t=[];if(this.children.length)for(var n=0;n=this.end?null:this.children?this.children.reduce(function(t,n){return t||(e>=n.start&&e0&&(e+="["+this.children+"]"),e}},i={lex:function(t,n){return o(new e({type:"root",start:n||0,end:t.length,text:t,innerText:t,children:[],childAt:{},innerMode:i.startMode}))},rules:a},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=i:"function"==typeof define&&define.amd?define("lexer",[],function(){return i}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Lexer=i):this.TwineLexer=i}).call(eval("this")||("undefined"!=typeof global?global:window)),function(){function e(t){return t&&"object"===("undefined"==typeof t?"undefined":_typeof(t))?(Object.keys(t).forEach(function(n){t[n]=e(t[n])}),t):(t+"").replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function t(){return"[^"+Array.apply(0,arguments).map(e).join("")+"]*"}function n(e){return function(){return"("+e+Array.apply(0,arguments).join("|")+")"}}var o=void 0,r=n("?:"),i=n("?!"),a=n("?="),l="[ \\f\\t\\v  ᠎ - \u2028\u2029   ]*",s=l.replace("*","+"),c="\\b",u="\\\\\\n\\\\?|\\n\\\\",p="\\n(?!\\\\)",d="[\\w\\-À-Þß-ÿŐŰőű]",f="[\\wÀ-Þß-ÿŐŰőű]",h=r("\\n","$"),m="("+r(u,"[^\\n]")+"+)",g="\\*",k=l+"("+g+"+)"+s+m+h,y="(?:0\\.)",b=l+"("+y+"+)"+s+m+h,v=l+"-{3,}"+l+h,x=l+"(#{1,6})"+l+m+h,w=l+"(==+>|<=+|=+><=+|<==+>)"+l+h,O={opener:"\\[\\[(?!\\[)",text:"("+t("]")+")",rightSeparator:r("\\->","\\|"),leftSeparator:"<\\-",closer:"\\]\\]",legacySeparator:"\\|",legacyText:"("+r("[^\\|\\]]","\\]"+i("\\]"))+"+)"},F=d.replace("\\-","")+"*"+d.replace("\\-","").replace("\\w","a-zA-Z")+d.replace("\\-","")+"*",A="\\$("+F+")",P="'s"+s+"("+F+")",T="("+F+")"+s+"of"+c+i("it"+c),C="'s"+s,L="of"+c,j=r("it","time")+c,S="its"+s+"("+F+")",M="its"+s,B="("+F+")"+s+"of"+s+"it"+c,E="of"+c+s+"it"+c,I={opener:"\\(",name:"("+r(d.replace("]","\\/]")+d+"*",A)+"):",closer:"\\)"},R="<<[^>\\s]+\\s*(?:\\\\.|'(?:[^'\\\\]*\\\\.)*[^'\\\\]*'|\"(?:[^\"\\\\]*\\\\.)*[^\"\\\\]*\"|[^'\"\\\\>]|>(?!>))*>>",_={name:"[a-zA-Z][\\w\\-]*",attrs:"(?:\"[^\"]*\"|'[^']*'|[^'\">])*?"},N="\\|("+d.replace("]","_]")+"*)>",q="<("+d.replace("]","_]")+"*)\\|",z="\\b(\\d+(?:\\.\\d+)?(?:[eE][+\\-]?\\d+)?|NaN)"+i("m?s")+"\\b";O.main=O.opener+r(O.text+O.rightSeparator,O.text.replace("*","*?")+O.leftSeparator)+O.text,o={upperLetter:"[A-ZÀ-ÞŐŰ]",lowerLetter:"[a-z0-9_\\-ß-ÿőű]",anyLetter:d,anyLetterStrict:f,whitespace:s,escapedLine:u,br:p,commentFront:"",tag:"<\\/?"+_.name+_.attrs+">",tagPeek:"<",scriptStyleTag:"<("+r("script","style")+")"+_.attrs+">[^]*?<\\/\\1>",scriptStyleTagOpener:"<",url:"("+r("https?","mailto","javascript","ftp","data")+":\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])",bullet:g,hr:v,heading:x,align:w,bulleted:k,numbered:b,delOpener:e("~~"),italicOpener:e("//"),boldOpener:e("''"),supOpener:e("^^"),strongFront:e("**"),strongBack:e("**"),emFront:e("*"),emBack:e("*"),verbatimOpener:"`+",collapsedFront:"{",collapsedBack:"}",hookAppendedFront:"\\[",hookPrependedFront:N+"\\[",hookAnonymousFront:"\\[",hookBack:"\\]"+i(q),hookAppendedBack:"\\]"+q,passageLink:O.main+O.closer,passageLinkPeek:"[[",legacyLink:O.opener+O.legacyText+O.legacySeparator+O.legacyText+O.closer,legacyLinkPeek:"[[",simpleLink:O.opener+O.legacyText+O.closer,simpleLinkPeek:"[[",macroFront:I.opener+a(I.name),macroFrontPeek:"(",macroName:I.name,groupingFront:"\\("+i(I.name),groupingFrontPeek:"(",groupingBack:"\\)",twine1Macro:R,twine1MacroPeek:"<<",property:P,propertyPeek:"'s",belongingProperty:T,possessiveOperator:C,belongingOperator:L,belongingOperatorPeek:"of",itsOperator:M,itsOperatorPeek:"its",belongingItOperator:E,belongingItOperatorPeek:"of",variable:A,variablePeek:"$",hookRef:"\\?("+d+"+)\\b",hookRefPeek:"?",cssTime:"(\\d+\\.?\\d*|\\d*\\.?\\d+)(m?s)"+c,colour:r(r("Red","Orange","Yellow","Lime","Green","Cyan","Aqua","Blue","Navy","Purple","Fuchsia","Magenta","White","Gray","Grey","Black"),"#[\\dA-Fa-f]{3}(?:[\\dA-Fa-f]{3})?"),number:z,boolean:r("true","false")+c,identifier:j,itsProperty:S,itsPropertyPeek:"its",belongingItProperty:B,escapedStringChar:"\\\\[^\\n]",singleStringOpener:"'",doubleStringOpener:'"',is:"is"+i(" not"," in")+c,isNot:"is not"+c,and:"and"+c,or:"or"+c,not:"not"+c,inequality:r("<(?!=)","<=",">(?!=)",">="),isIn:"is in"+c,contains:"contains"+c,addition:e("+")+i("="),subtraction:e("-")+i("="),multiplication:e("*")+i("="),division:r("/","%")+i("="),comma:",",spread:"\\.\\.\\."+i("\\."),to:r("to"+c,"="),into:"into"+c,augmentedAssign:r("\\+","\\-","\\*","\\/","%")+"="},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=o:"function"==typeof define&&define.amd?define("patterns",[],function(){return o}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Patterns=o):this.Patterns=o}.call(eval("this")||("undefined"!=typeof global?global:window)),function(){function e(e){function t(e){return e=e||"innerText",function(t){var n=t.reduceRight(function(e,t,n){return e||(n?t:"")},""),o={};return o[e]=n,o}}function o(e,t){var n={};return n[e]=t,function(){return{isFront:!0,matches:n,cannotCross:["verbatimOpener"]}}}function r(e,t){return Object.keys(t).forEach(function(n){var o=t[n].fn;t[n].fn=function(t){var r=o(t);return r.text||(r.text=t[0]),r.type||(r.type=n),r.innerMode||(r.innerMode=e),r}}),t}var i=Object.bind(0,null),a=[],l=[],s=r(a,{hr:{fn:i},bulleted:{fn:function(e){return{depth:e[1].length,innerText:e[2]}}},numbered:{fn:function(e){return{depth:e[1].length/2,innerText:e[2]}}},heading:{fn:function(e){return{depth:e[1].length,innerText:e[2]}}},align:{fn:function(e){var t=void 0,n=e[1],o=n.indexOf("><");return~o?(t=Math.round(o/(n.length-2)*50),25===t&&(t="center")):"<"===n[0]&&">"===n.slice(-1)?t="justify":n.indexOf(">")>-1?t="right":n.indexOf("<")>-1&&(t="left"),{align:t}}}});Object.keys(s).forEach(function(e){s[e].canFollow=[null,"br","hr","bulleted","numbered","heading","align"],s[e].cannotFollow=["text"]});var c=r(a,{twine1Macro:{fn:function(){return{type:"error",message:"Harlowe macros use a different syntax to Twine 1 and SugarCube macros."}}},br:{fn:i},emBack:{fn:function(){return{matches:{emFront:"em"},cannotCross:["verbatimOpener"]}}},strongBack:{fn:function(){return{matches:{strongFront:"strong"},cannotCross:["verbatimOpener"]}}},strongFront:{fn:function(){return{isFront:!0}}},emFront:{fn:function(){return{isFront:!0}}},boldOpener:{fn:o("boldOpener","bold")},italicOpener:{fn:o("italicOpener","italic")},delOpener:{fn:o("delOpener","del")},supOpener:{fn:o("supOpener","sup")},commentFront:{fn:function(){return{isFront:!0}}},commentBack:{fn:function(){return{matches:{commentFront:"comment"}}}},scriptStyleTag:{fn:i},tag:{fn:i},url:{fn:i},passageLink:{fn:function(e){var t=e[1],n=e[2],o=e[3];return{type:"twineLink",innerText:n?o:t,passage:t?o:n}}},simpleLink:{fn:function(e){return{type:"twineLink",innerText:e[1],passage:e[1]}}},hookPrependedFront:{fn:function(e){return{name:e[1],isFront:!0,tagPosition:"prepended"}}},hookAnonymousFront:{fn:function(){return{isFront:!0,demote:function(){this.error("This tagged hook doesn't have a matching ].")}}},canFollow:["macro","variable"]},hookAppendedFront:{fn:function(){return{isFront:!0}},cannotFollow:["macro","variable"]},hookBack:{fn:function(){return{type:"hookAppendedBack",matches:{hookPrependedFront:"hook",hookAnonymousFront:"hook"},cannotCross:["verbatimOpener"]}}},hookAppendedBack:{fn:function(e){return{name:e[1],tagPosition:"appended",matches:{hookAppendedFront:"hook"},cannotCross:["verbatimOpener"]}}},verbatimOpener:{fn:function(e){var t=e[0].length,n={};return n["verbatim"+t]="verbatim",{type:"verbatim"+t,isFront:!0,matches:n}}},collapsedFront:{fn:function(){return{isFront:!0}}},collapsedBack:{fn:function(){return{matches:{collapsedFront:"collapsed"},cannotCross:["verbatimOpener"]}}},escapedLine:{fn:i},legacyLink:{fn:function(e){return{type:"twineLink",innerText:e[1],passage:e[2]}}}}),u=r(l,{macroFront:{fn:function(e){return{isFront:!0,name:e[1]}}},groupingBack:{fn:function(){return{matches:{groupingFront:"grouping",macroFront:"macro"},cannotCross:["singleStringOpener","doubleStringOpener"]}}},hookRef:{fn:t("name")},variable:{fn:t("name")},whitespace:{fn:i,cannotFollow:"text"}}),p=r(l,Object.assign({macroName:{canFollow:["macroFront"],fn:function(e){return e[2]?{isMethodCall:!0,innerText:e[2]}:{isMethodCall:!1}}},groupingFront:{fn:function(){return{isFront:!0}}},property:{fn:t("name"),canFollow:["variable","hookRef","property","itsProperty","belongingItProperty","macro","grouping","string","boolean","number"]},possessiveOperator:{fn:i},itsProperty:{cannotFollow:["text"],fn:t("name")},itsOperator:{cannotFollow:["text"],fn:i},belongingItProperty:{cannotFollow:["text"],fn:t("name")},belongingItOperator:{cannotFollow:["text"],fn:i},belongingProperty:{cannotFollow:["text"],fn:t("name")},belongingOperator:{cannotFollow:["text"],fn:i},escapedStringChar:{fn:function(){return{type:"text"}}},singleStringOpener:{fn:function(){return{isFront:!0,matches:{singleStringOpener:"string"}}}},doubleStringOpener:{fn:function(){return{isFront:!0,matches:{doubleStringOpener:"string"}}}},cssTime:{fn:function(e){return{value:+e[1]*("s"===e[2].toLowerCase()?1e3:1)}}},colour:{cannotFollow:["text"],fn:function(e){var t,n=e[0].toLowerCase(),o={red:"e61919",orange:"e68019",yellow:"e5e619",lime:"80e619",green:"19e619",cyan:"19e5e6",aqua:"19e5e6",blue:"197fe6",navy:"1919e6",purple:"7f19e6",fuchsia:"e619e5",magenta:"e619e5",white:"fff",black:"000",gray:"888",grey:"888"};return t=Object.hasOwnProperty.call(o,n)?"#"+o[n]:n,{colour:t}}},number:{fn:function(e){return{value:parseFloat(e[0])}}},addition:{fn:i},subtraction:{fn:i},multiplication:{fn:i},division:{fn:i},inequality:{fn:function(e){return{operator:e[0]}}},augmentedAssign:{fn:function(e){return{operator:e[0][0]}}},identifier:{fn:t("name"),cannotFollow:["text"]}},["boolean","is","to","into","and","or","not","isNot","contains","isIn"].reduce(function(e,t){return e[t]={fn:i,cannotFollow:["text"]},e},{}),["comma","spread","addition","subtraction","multiplication","division"].reduce(function(e,t){return e[t]={fn:i},e},{})));a.push.apply(a,_toConsumableArray(Object.keys(s)).concat(_toConsumableArray(Object.keys(c)),_toConsumableArray(Object.keys(u)))),l.push.apply(l,_toConsumableArray(Object.keys(u)).concat(_toConsumableArray(Object.keys(p))));var d=Object.assign({},s,c,u,p);return Object.keys(d).forEach(function(e){var t=n[e];d[e].pattern="string"!=typeof t?t:new RegExp("^(?:"+t+")","i"),n[e+"Peek"]&&(d[e].peek=n[e+"Peek"])}),Object.assign(e.rules,d),e.startMode=a,e}function t(t){var o=Object.freeze({lex:e(t).lex,Patterns:n});return o}var n=void 0;Object.assign=Object.assign||function(e){for(var t=1;tHTML tags

are available.","To display special symbols without them being transformed, put them between `backticks`.","To link to another passage, write the link text and the passage name like this: [[link text->passage name]]\nor this: [[passage name<-link text]]\nor this: [[link text]].","Macros like (set:) and (display:) are the programming of your passage. If you've (set:) a $variable, you can just enter its name to print it out.","To make a 'hook', put [single square brackets] around text - or leave it empty [] - then put a macro like (if:), a $variable, or a |nametag> outside the front, |like>[so].","Hooks can be used for many things: showing text (if:) something happened, applying a (text-style:), making a place to (append:) text later on, and much more!","Consult the Harlowe documentation for more information."].join("\n\n"))),{pos:0}},blankLine:function(e){e.pos++},token:function(n,o){c&&c();var r=a.pathAt(o.pos),i=r[0];if(!i)return o.pos++,n.next(),null;for(;i===i.tokenAt(o.pos)&&!n.eol();)o.pos++,n.next();n.eol()&&o.pos++;for(var l={},s="",u=0;u1&&(d+="-"+l[d]),p){case"macroName":-1===t.indexOf(e(r[u].text.slice(0,-1)))&&(d+=" harlowe-error")}s+=d+" "}return s}}});var o=document.querySelector("style#cm-harlowe");o||(o=document.createElement("style"),o.setAttribute("id","cm-harlowe"),document.head.appendChild(o)),o.innerHTML=function(){function e(e,t,n){return function(o){return"background-color: hsla("+e+","+t+"%,"+n+"%,"+o+");"}}var t=e(40,100,50),n=e(220,100,50),o=function(t){return e(320,44,50)(t)+"color: #a84186;"},r="color: firebrick !important; background-color: hsla(17, 100%, 74%, 0.74) !important;",i="font-weight:100; color: hsla(0,0,0,0.5)";return{root:"box-sizing:border-box;",cursor:"border-bottom: 2px solid darkgray;",hook:t(.05),"hook-2":t(.1),"hook-3":t(.15),"hook-4":t(.2),"hook-5":t(.25),"hook-6":t(.3),"hook-7":t(.35),"hook-8":t(.4),"^=hook , ^=hook-":"font-weight:bold;",error:r,macro:o(.05),"macro-2":o(.1),"macro-3":o(.15),"macro-4":o(.2),"macro-5":o(.25),"macro-6":o(.3),"macro-7":o(.35),"macro-8":o(.4),macroName:"font-style:italic;","^=macro ":"font-weight:bold;","bold, strong":"font-weight:bold;","italic, em":"font-style:italic;",sup:"vertical-align: super;font-size:0.8em;",verbatim:"background-color: hsla(0,0%,50%,0.1);","^=bold, ^=strong, ^=italic, ^=em, ^=sup, ^=verbatim":i,"^=collapsed":"font-weight:bold; color: hsl(201, 100%, 30%);",collapsed:n(.025),"collapsed.hook":n(.05),"collapsed.hook-2":n(.1),"collapsed.hook-3":n(.15),"collapsed.hook-4":n(.2),"collapsed.hook-5":n(.25),"collapsed.hook-6":n(.3),"collapsed.hook-7":n(.35),"collapsed.hook-8":n(.4),"twineLink:not(.text)":"color: #3333cc;",tag:"color: #4d4d9d;",boolean:"color: #626262;",string:"color: #008282;",number:"color: #A15000;",variable:"color: #005682;",hookRef:"color: #007f54;","variableOccurrence, hookOccurrence":"background: #7fffd4 !important;",heading:"font-weight:bold;",hr:"display:block; background-image: linear-gradient(0deg, transparent, transparent 45%, silver 45%, transparent 55%, transparent);",align:"display:block; color: hsl(14, 99%, 27%); background-color: hsla(14, 99%, 87%, 0.2);",escapedLine:"font-weight:bold; color: hsl(51, 100%, 30%);","identifier, property, belongingProperty, itsProperty, belongingItProperty, belongingItOperator":"color: #0076b2;",toString:function(){var e=this;return Object.keys(this).reduce(function(t,n){var o;return"toString"===n?t:(o=n.split(", ").map(function e(t){return t.indexOf(".")>-1?t.split(/\./g).map(e).join(""):0===t.indexOf("^=")?"[class^='cm-harlowe-"+t.slice(2)+"']":".cm-harlowe-"+t}),t+o.join(", ")+"{"+e[n]+"}")},"")}}+""}()}.call(eval("this"));}}); +window.storyFormat({"name":"Harlowe","version":"1.2.3","author":"Leon Arnott","description":"The default story format for Twine 2. See its documentation.","image":"icon.svg","url":"http://twinery.org/","license":"Zlib","proofing":false,"source":"\n\n\n\n{{STORY_NAME}}\n\n\n\n\n\n\n\n{{STORY_DATA}}\n\n\n\n\n\n\n","setup": function(){"use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t-1)||e.cannotFollow&&(-1!==e.cannotFollow.indexOf(n&&n.type)||e.cannotFollow.indexOf("text")>-1&&o)||e.peek&&e.peek!==t.slice(0,e.peek.length))}function o(e){for(var t=e.innerText,o=[],i=0,l=i,s=t.length,c=null;s>i;){for(var u=t.slice(i),p=(o.length?o[0]:e).innerMode,d=0,f=p.length;f>d;d+=1){var h=a[p[d]];if(n(h,u,c,i>l)&&h.pattern.test(u)){var m=h.pattern.exec(u),g=h.fn(m),k=!1,y=0;if(g.matches){for(;y-1&&(y=o.length-1)}if(y>=o.length&&!g.isFront)continue}i>l&&e.addChild({type:"text",text:t.slice(l,i),innerMode:p}),c=e.addChild(g),i+=c.text.length,l=i,k&&(r(e,c,o[y]),o=o.slice(y+1)),c.isFrontToken()&&o.unshift(c);break}}d===f&&(i+=1,null===c&&(c={type:"text"}))}for(i>l&&e.addChild({type:"text",text:t.slice(l,i),innerMode:(o.length?o[0]:e).innerMode});o.length>0;)o.shift().demote();return e}function r(e,n,o){var r=e.children.indexOf(n),i=e.children.indexOf(o);n.children=e.children.splice(i+1,r-(i+1)),n.children.forEach(function(e){t(n,e)}),n.type=n.matches[o.type],n.innerText="";for(var a=0,l=n.children.length;l>a;a++)n.innerText+=n.children[a].text;n.start=o.start,n.text=o.text+n.innerText+n.text,Object.keys(o).forEach(function(e){Object.hasOwnProperty.call(n,e)||(n[e]=o[e])}),n.isFront&&(n.isFront=!1),e.children.splice(i,1),t(e,n)}var i=void 0,a={};e.prototype={constructor:e,addChild:function(n){var r=this.lastChildEnd(),i=new e({start:r,end:n.text&&r+n.text.length,children:[]},n);return i.innerText&&o(i),this.children.push(i),t(this,i),i},lastChild:function(){return this.children?this.children[this.children.length-1]||null:null},lastChildEnd:function(){var e=this.lastChild();return e?e.end:this.start+Math.max(0,this.text.indexOf(this.innerText))},tokenAt:function(e){if(e=this.end)return null;if(this.childAt)return this.childAt[e]&&this.childAt[e].tokenAt(e)||this;if(this.children.length)for(var t=0;t=this.end)return[];if(this.childAt)return(this.childAt[e]&&this.childAt[e].pathAt(e)||[]).concat(this);var t=[];if(this.children.length)for(var n=0;n=this.end?null:this.children?this.children.reduce(function(t,n){return t||(e>=n.start&&e0&&(e+="["+this.children+"]"),e}},i={lex:function(t,n){return o(new e({type:"root",start:n||0,end:t.length,text:t,innerText:t,children:[],childAt:{},innerMode:i.startMode}))},rules:a},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=i:"function"==typeof define&&define.amd?define("lexer",[],function(){return i}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Lexer=i):this.TwineLexer=i}).call(eval("this")||("undefined"!=typeof global?global:window)),function(){function e(t){return t&&"object"===("undefined"==typeof t?"undefined":_typeof(t))?(Object.keys(t).forEach(function(n){t[n]=e(t[n])}),t):(t+"").replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function t(){return"[^"+Array.apply(0,arguments).map(e).join("")+"]*"}function n(e){return function(){return"("+e+Array.apply(0,arguments).join("|")+")"}}var o=void 0,r=n("?:"),i=n("?!"),a=n("?="),l="[ \\f\\t\\v\xa0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000]*",s=l.replace("*","+"),c="\\b",u="\\\\\\n\\\\?|\\n\\\\",p="\\n(?!\\\\)",d="[\\w\\-\xc0-\xde\xdf-\xff\u0150\u0170\u0151\u0171]",f="[\\w\xc0-\xde\xdf-\xff\u0150\u0170\u0151\u0171]",h=r("\\n","$"),m="("+r(u,"[^\\n]")+"+)",g="\\*",k=l+"("+g+"+)"+s+m+h,y="(?:0\\.)",b=l+"("+y+"+)"+s+m+h,v=l+"-{3,}"+l+h,x=l+"(#{1,6})"+l+m+h,w=l+"(==+>|<=+|=+><=+|<==+>)"+l+h,O={opener:"\\[\\[(?!\\[)",text:"("+t("]")+")",rightSeparator:r("\\->","\\|"),leftSeparator:"<\\-",closer:"\\]\\]",legacySeparator:"\\|",legacyText:"("+r("[^\\|\\]]","\\]"+i("\\]"))+"+)"},F=d.replace("\\-","")+"*"+d.replace("\\-","").replace("\\w","a-zA-Z")+d.replace("\\-","")+"*",A="\\$("+F+")",P="'s"+s+"("+F+")",T="("+F+")"+s+"of"+c+i("it"+c),C="'s"+s,L="of"+c,j=r("it","time")+c,S="its"+s+"("+F+")",M="its"+s,B="("+F+")"+s+"of"+s+"it"+c,E="of"+c+s+"it"+c,I={opener:"\\(",name:"("+r(d.replace("]","\\/]")+d+"*",A)+"):",closer:"\\)"},R="<<[^>\\s]+\\s*(?:\\\\.|'(?:[^'\\\\]*\\\\.)*[^'\\\\]*'|\"(?:[^\"\\\\]*\\\\.)*[^\"\\\\]*\"|[^'\"\\\\>]|>(?!>))*>>",_={name:"[a-zA-Z][\\w\\-]*",attrs:"(?:\"[^\"]*\"|'[^']*'|[^'\">])*?"},N="\\|("+d.replace("]","_]")+"*)>",q="<("+d.replace("]","_]")+"*)\\|",z="\\b(\\d+(?:\\.\\d+)?(?:[eE][+\\-]?\\d+)?|NaN)"+i("m?s")+"\\b";O.main=O.opener+r(O.text+O.rightSeparator,O.text.replace("*","*?")+O.leftSeparator)+O.text,o={upperLetter:"[A-Z\xc0-\xde\u0150\u0170]",lowerLetter:"[a-z0-9_\\-\xdf-\xff\u0151\u0171]",anyLetter:d,anyLetterStrict:f,whitespace:s,escapedLine:u,br:p,commentFront:"",tag:"<\\/?"+_.name+_.attrs+">",tagPeek:"<",scriptStyleTag:"<("+r("script","style")+")"+_.attrs+">[^]*?<\\/\\1>",scriptStyleTagOpener:"<",url:"("+r("https?","mailto","javascript","ftp","data")+":\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])",bullet:g,hr:v,heading:x,align:w,bulleted:k,numbered:b,delOpener:e("~~"),italicOpener:e("//"),boldOpener:e("''"),supOpener:e("^^"),strongFront:e("**"),strongBack:e("**"),emFront:e("*"),emBack:e("*"),verbatimOpener:"`+",collapsedFront:"{",collapsedBack:"}",hookAppendedFront:"\\[",hookPrependedFront:N+"\\[",hookAnonymousFront:"\\[",hookBack:"\\]"+i(q),hookAppendedBack:"\\]"+q,passageLink:O.main+O.closer,passageLinkPeek:"[[",legacyLink:O.opener+O.legacyText+O.legacySeparator+O.legacyText+O.closer,legacyLinkPeek:"[[",simpleLink:O.opener+O.legacyText+O.closer,simpleLinkPeek:"[[",macroFront:I.opener+a(I.name),macroFrontPeek:"(",macroName:I.name,groupingFront:"\\("+i(I.name),groupingFrontPeek:"(",groupingBack:"\\)",twine1Macro:R,twine1MacroPeek:"<<",property:P,propertyPeek:"'s",belongingProperty:T,possessiveOperator:C,belongingOperator:L,belongingOperatorPeek:"of",itsOperator:M,itsOperatorPeek:"its",belongingItOperator:E,belongingItOperatorPeek:"of",variable:A,variablePeek:"$",hookRef:"\\?("+d+"+)\\b",hookRefPeek:"?",cssTime:"(\\d+\\.?\\d*|\\d*\\.?\\d+)(m?s)"+c,colour:r(r("Red","Orange","Yellow","Lime","Green","Cyan","Aqua","Blue","Navy","Purple","Fuchsia","Magenta","White","Gray","Grey","Black"),"#[\\dA-Fa-f]{3}(?:[\\dA-Fa-f]{3})?"),number:z,boolean:r("true","false")+c,identifier:j,itsProperty:S,itsPropertyPeek:"its",belongingItProperty:B,escapedStringChar:"\\\\[^\\n]",singleStringOpener:"'",doubleStringOpener:'"',is:"is"+i(" not"," in")+c,isNot:"is not"+c,and:"and"+c,or:"or"+c,not:"not"+c,inequality:r("<(?!=)","<=",">(?!=)",">="),isIn:"is in"+c,contains:"contains"+c,addition:e("+")+i("="),subtraction:e("-")+i("="),multiplication:e("*")+i("="),division:r("/","%")+i("="),comma:",",spread:"\\.\\.\\."+i("\\."),to:r("to"+c,"="),into:"into"+c,augmentedAssign:r("\\+","\\-","\\*","\\/","%")+"="},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=o:"function"==typeof define&&define.amd?define("patterns",[],function(){return o}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Patterns=o):this.Patterns=o}.call(eval("this")||("undefined"!=typeof global?global:window)),function(){function e(e){function t(e){return e=e||"innerText",function(t){var n=t.reduceRight(function(e,t,n){return e||(n?t:"")},""),o={};return o[e]=n,o}}function o(e,t){var n={};return n[e]=t,function(){return{isFront:!0,matches:n,cannotCross:["verbatimOpener"]}}}function r(e,t){return Object.keys(t).forEach(function(n){var o=t[n].fn;t[n].fn=function(t){var r=o(t);return r.text||(r.text=t[0]),r.type||(r.type=n),r.innerMode||(r.innerMode=e),r}}),t}var i=Object.bind(0,null),a=[],l=[],s=r(a,{hr:{fn:i},bulleted:{fn:function(e){return{depth:e[1].length,innerText:e[2]}}},numbered:{fn:function(e){return{depth:e[1].length/2,innerText:e[2]}}},heading:{fn:function(e){return{depth:e[1].length,innerText:e[2]}}},align:{fn:function(e){var t=void 0,n=e[1],o=n.indexOf("><");return~o?(t=Math.round(o/(n.length-2)*50),25===t&&(t="center")):"<"===n[0]&&">"===n.slice(-1)?t="justify":n.indexOf(">")>-1?t="right":n.indexOf("<")>-1&&(t="left"),{align:t}}}});Object.keys(s).forEach(function(e){s[e].canFollow=[null,"br","hr","bulleted","numbered","heading","align"],s[e].cannotFollow=["text"]});var c=r(a,{twine1Macro:{fn:function(){return{type:"error",message:"Harlowe macros use a different syntax to Twine 1 and SugarCube macros."}}},br:{fn:i},emBack:{fn:function(){return{matches:{emFront:"em"},cannotCross:["verbatimOpener"]}}},strongBack:{fn:function(){return{matches:{strongFront:"strong"},cannotCross:["verbatimOpener"]}}},strongFront:{fn:function(){return{isFront:!0}}},emFront:{fn:function(){return{isFront:!0}}},boldOpener:{fn:o("boldOpener","bold")},italicOpener:{fn:o("italicOpener","italic")},delOpener:{fn:o("delOpener","del")},supOpener:{fn:o("supOpener","sup")},commentFront:{fn:function(){return{isFront:!0}}},commentBack:{fn:function(){return{matches:{commentFront:"comment"}}}},scriptStyleTag:{fn:i},tag:{fn:i},url:{fn:i},passageLink:{fn:function(e){var t=e[1],n=e[2],o=e[3];return{type:"twineLink",innerText:n?o:t,passage:t?o:n}}},simpleLink:{fn:function(e){return{type:"twineLink",innerText:e[1],passage:e[1]}}},hookPrependedFront:{fn:function(e){return{name:e[1],isFront:!0,tagPosition:"prepended"}}},hookAnonymousFront:{fn:function(){return{isFront:!0,demote:function(){this.error("This tagged hook doesn't have a matching ].")}}},canFollow:["macro","variable"]},hookAppendedFront:{fn:function(){return{isFront:!0}},cannotFollow:["macro","variable"]},hookBack:{fn:function(){return{type:"hookAppendedBack",matches:{hookPrependedFront:"hook",hookAnonymousFront:"hook"},cannotCross:["verbatimOpener"]}}},hookAppendedBack:{fn:function(e){return{name:e[1],tagPosition:"appended",matches:{hookAppendedFront:"hook"},cannotCross:["verbatimOpener"]}}},verbatimOpener:{fn:function(e){var t=e[0].length,n={};return n["verbatim"+t]="verbatim",{type:"verbatim"+t,isFront:!0,matches:n}}},collapsedFront:{fn:function(){return{isFront:!0}}},collapsedBack:{fn:function(){return{matches:{collapsedFront:"collapsed"},cannotCross:["verbatimOpener"]}}},escapedLine:{fn:i},legacyLink:{fn:function(e){return{type:"twineLink",innerText:e[1],passage:e[2]}}}}),u=r(l,{macroFront:{fn:function(e){return{isFront:!0,name:e[1]}}},groupingBack:{fn:function(){return{matches:{groupingFront:"grouping",macroFront:"macro"},cannotCross:["singleStringOpener","doubleStringOpener"]}}},hookRef:{fn:t("name")},variable:{fn:t("name")},whitespace:{fn:i,cannotFollow:"text"}}),p=r(l,Object.assign({macroName:{canFollow:["macroFront"],fn:function(e){return e[2]?{isMethodCall:!0,innerText:e[2]}:{isMethodCall:!1}}},groupingFront:{fn:function(){return{isFront:!0}}},property:{fn:t("name"),canFollow:["variable","hookRef","property","itsProperty","belongingItProperty","macro","grouping","string","boolean","number"]},possessiveOperator:{fn:i},itsProperty:{cannotFollow:["text"],fn:t("name")},itsOperator:{cannotFollow:["text"],fn:i},belongingItProperty:{cannotFollow:["text"],fn:t("name")},belongingItOperator:{cannotFollow:["text"],fn:i},belongingProperty:{cannotFollow:["text"],fn:t("name")},belongingOperator:{cannotFollow:["text"],fn:i},escapedStringChar:{fn:function(){return{type:"text"}}},singleStringOpener:{fn:function(){return{isFront:!0,matches:{singleStringOpener:"string"}}}},doubleStringOpener:{fn:function(){return{isFront:!0,matches:{doubleStringOpener:"string"}}}},cssTime:{fn:function(e){return{value:+e[1]*("s"===e[2].toLowerCase()?1e3:1)}}},colour:{cannotFollow:["text"],fn:function(e){var t,n=e[0].toLowerCase(),o={red:"e61919",orange:"e68019",yellow:"e5e619",lime:"80e619",green:"19e619",cyan:"19e5e6",aqua:"19e5e6",blue:"197fe6",navy:"1919e6",purple:"7f19e6",fuchsia:"e619e5",magenta:"e619e5",white:"fff",black:"000",gray:"888",grey:"888"};return t=Object.hasOwnProperty.call(o,n)?"#"+o[n]:n,{colour:t}}},number:{fn:function(e){return{value:parseFloat(e[0])}}},addition:{fn:i},subtraction:{fn:i},multiplication:{fn:i},division:{fn:i},inequality:{fn:function(e){return{operator:e[0]}}},augmentedAssign:{fn:function(e){return{operator:e[0][0]}}},identifier:{fn:t("name"),cannotFollow:["text"]}},["boolean","is","to","into","and","or","not","isNot","contains","isIn"].reduce(function(e,t){return e[t]={fn:i,cannotFollow:["text"]},e},{}),["comma","spread","addition","subtraction","multiplication","division"].reduce(function(e,t){return e[t]={fn:i},e},{})));a.push.apply(a,_toConsumableArray(Object.keys(s)).concat(_toConsumableArray(Object.keys(c)),_toConsumableArray(Object.keys(u)))),l.push.apply(l,_toConsumableArray(Object.keys(u)).concat(_toConsumableArray(Object.keys(p))));var d=Object.assign({},s,c,u,p);return Object.keys(d).forEach(function(e){var t=n[e];d[e].pattern="string"!=typeof t?t:new RegExp("^(?:"+t+")","i"),n[e+"Peek"]&&(d[e].peek=n[e+"Peek"])}),Object.assign(e.rules,d),e.startMode=a,e}function t(t){var o=Object.freeze({lex:e(t).lex,Patterns:n});return o}var n=void 0;Object.assign=Object.assign||function(e){for(var t=1;tHTML tags

are available.","To display special symbols without them being transformed, put them between `backticks`.","To link to another passage, write the link text and the passage name like this: [[link text->passage name]]\nor this: [[passage name<-link text]]\nor this: [[link text]].","Macros like (set:) and (display:) are the programming of your passage. If you've (set:) a $variable, you can just enter its name to print it out.","To make a 'hook', put [single square brackets] around text - or leave it empty [] - then put a macro like (if:), a $variable, or a |nametag> outside the front, |like>[so].","Hooks can be used for many things: showing text (if:) something happened, applying a (text-style:), making a place to (append:) text later on, and much more!","Consult the Harlowe documentation for more information."].join("\n\n"))),{pos:0}},blankLine:function(e){e.pos++},token:function(n,o){c&&c();var r=a.pathAt(o.pos),i=r[0];if(!i)return o.pos++,n.next(),null;for(;i===i.tokenAt(o.pos)&&!n.eol();)o.pos++,n.next();n.eol()&&o.pos++;for(var l={},s="",u=0;u1&&(d+="-"+l[d]),p){case"macroName":-1===t.indexOf(e(r[u].text.slice(0,-1)))&&(d+=" harlowe-1-error")}s+=d+" "}return s}}});var o=document.querySelector("style#cm-harlowe-1");o||(o=document.createElement("style"),o.setAttribute("id","cm-harlowe-1"),document.head.appendChild(o)),o.innerHTML=function(){function e(e,t,n){return function(o){return"background-color: hsla("+e+","+t+"%,"+n+"%,"+o+");"}}var t=e(40,100,50),n=e(220,100,50),o=function(t){return e(320,44,50)(t)+"color: #a84186;"},r="color: firebrick !important; background-color: hsla(17, 100%, 74%, 0.74) !important;",i="font-weight:100; color: hsla(0,0,0,0.5)";return{root:"box-sizing:border-box;",cursor:"border-bottom: 2px solid darkgray;",hook:t(.05),"hook-2":t(.1),"hook-3":t(.15),"hook-4":t(.2),"hook-5":t(.25),"hook-6":t(.3),"hook-7":t(.35),"hook-8":t(.4),"^=hook , ^=hook-":"font-weight:bold;",error:r,macro:o(.05),"macro-2":o(.1),"macro-3":o(.15),"macro-4":o(.2),"macro-5":o(.25),"macro-6":o(.3),"macro-7":o(.35),"macro-8":o(.4),macroName:"font-style:italic;","^=macro ":"font-weight:bold;","bold, strong":"font-weight:bold;","italic, em":"font-style:italic;",sup:"vertical-align: super;font-size:0.8em;",verbatim:"background-color: hsla(0,0%,50%,0.1);","^=bold, ^=strong, ^=italic, ^=em, ^=sup, ^=verbatim":i,"^=collapsed":"font-weight:bold; color: hsl(201, 100%, 30%);",collapsed:n(.025),"collapsed.hook":n(.05),"collapsed.hook-2":n(.1),"collapsed.hook-3":n(.15),"collapsed.hook-4":n(.2),"collapsed.hook-5":n(.25),"collapsed.hook-6":n(.3),"collapsed.hook-7":n(.35),"collapsed.hook-8":n(.4),"twineLink:not(.text)":"color: #3333cc;",tag:"color: #4d4d9d;",boolean:"color: #626262;",string:"color: #008282;",number:"color: #A15000;",variable:"color: #005682;",hookRef:"color: #007f54;","variableOccurrence, hookOccurrence":"background: #7fffd4 !important;",heading:"font-weight:bold;",hr:"display:block; background-image: linear-gradient(0deg, transparent, transparent 45%, silver 45%, transparent 55%, transparent);",align:"display:block; color: hsl(14, 99%, 27%); background-color: hsla(14, 99%, 87%, 0.2);",escapedLine:"font-weight:bold; color: hsl(51, 100%, 30%);","identifier, property, belongingProperty, itsProperty, belongingItProperty, belongingItOperator":"color: #0076b2;",toString:function(){var e=this;return Object.keys(this).reduce(function(t,n){var o;return"toString"===n?t:(o=n.split(", ").map(function e(t){return t.indexOf(".")>-1?t.split(/\./g).map(e).join(""):0===t.indexOf("^=")?"[class^='cm-harlowe-1-"+t.slice(2)+"']":".cm-harlowe-1-"+t}),t+o.join(", ")+"{"+e[n]+"}")},"")}}+""}()}.call(eval("this"));}}); diff --git a/story-formats/harlowe-2.0.0/format.js b/story-formats/harlowe-2.0.0/format.js index f2a0e6de5..f1a224ed0 100644 --- a/story-formats/harlowe-2.0.0/format.js +++ b/story-formats/harlowe-2.0.0/format.js @@ -1 +1,2 @@ -window.storyFormat({"name":"Harlowe","version":"2.0.0","author":"Leon Arnott","description":"The default story format for Twine 2. See its documentation.","image":"icon.svg","url":"http://twinery.org/","license":"Zlib","proofing":false,"source":"\n\n\n\n{{STORY_NAME}}\n\n\n\n\n\n\n\n{{STORY_DATA}}\n\n\n\n\n\n\n","setup": function(){"use strict";}}); \ No newline at end of file +window.storyFormat({"name":"Harlowe","version":"2.0.0","author":"Leon Arnott","description":"The default story format for Twine 2. See its documentation.","image":"icon.svg","url":"http://twinery.org/","license":"Zlib","proofing":false,"source":"\n\n\n\n{{STORY_NAME}}\n\n\n\n\n\n\n\n{{STORY_DATA}}\n\n\n\n\n\n\n","setup": function(){"use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var r=0,n=Array(e.length);r-1)||e.cannotFollow&&(-1!==e.cannotFollow.indexOf(n&&n.type)||e.cannotFollow.indexOf("text")>-1&&t)||e.peek&&e.peek.toLowerCase()!==r.slice(0,e.peek.length).toLowerCase())}function t(e){for(var r=e.innerText,t=[],o=0,s=o,u=r.length,l=null;u>o;){for(var m=r.slice(o),c=(t.length?t[0]:e).innerMode,g=0,p=c.length;p>g;g+=1){var d=i[c[g]];if(n(d,m,l,o>s)&&d.pattern.test(m)){var h=d.pattern.exec(m),f=d.fn(h),y=!1,b=0;if(f.matches){for(;b-1&&(b=t.length-1)}if(b>=t.length&&!f.isFront)continue}o>s&&e.addChild({type:"text",text:r.slice(s,o),innerMode:c}),l=e.addChild(f),o+=l.text.length,s=o,y&&(a(e,l,t[b]),t=t.slice(b+1)),l.isFrontToken()&&t.unshift(l);break}}g===p&&(o+=1,null===l&&(l={type:"text"}))}for(o>s&&e.addChild({type:"text",text:r.slice(s,o),innerMode:(t.length?t[0]:e).innerMode});t.length>0;)t.shift().demote();return e}function a(e,n,t){var a=e.children.indexOf(n),o=e.children.indexOf(t);n.children=e.children.splice(o+1,a-(o+1)),n.children.forEach(function(e){r(n,e)}),n.type=n.matches[t.type],n.innerText="";for(var i=0,s=n.children.length;s>i;i++)n.innerText+=n.children[i].text;n.start=t.start,n.text=t.text+n.innerText+n.text,Object.keys(t).forEach(function(e){Object.hasOwnProperty.call(n,e)||(n[e]=t[e])}),n.isFront&&(n.isFront=!1),e.children.splice(o,1),r(e,n)}var o=void 0,i={};e.prototype={constructor:e,addChild:function(n){var a=this.lastChildEnd(),o=new e({start:a,end:n.text&&a+n.text.length,children:[]},n);return o.innerText&&t(o),this.children.push(o),r(this,o),o},lastChild:function(){return this.children?this.children[this.children.length-1]||null:null},lastChildEnd:function(){var e=this.lastChild();return e?e.end:this.start+Math.max(0,this.text.indexOf(this.innerText))},tokenAt:function(e){if(e=this.end)return null;if(this.childAt)return this.childAt[e]&&this.childAt[e].tokenAt(e)||this;if(this.children.length)for(var r=0;r=this.end)return[];if(this.childAt)return(this.childAt[e]&&this.childAt[e].pathAt(e)||[]).concat(this);var r=[];if(this.children.length)for(var n=0;n=this.end?null:this.children?this.children.reduce(function(r,n){return r||(e>=n.start&&e0&&(e+="["+this.children+"]"),e}},o={lex:function(r,n){return t(new e({type:"root",start:n||0,end:r.length,text:r,innerText:r,children:[],childAt:{},innerMode:o.modes.start}))},rules:i,modes:{}},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=o:"function"==typeof define&&define.amd?define("lexer",[],function(){return o}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Lexer=o):this.TwineLexer=o}).call(eval("this")||("undefined"!=typeof global?global:window)),function(){function e(r){return r&&"object"===("undefined"==typeof r?"undefined":_typeof(r))?(Object.keys(r).forEach(function(n){r[n]=e(r[n])}),r):(r+"").replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}function r(){return"[^"+Array.apply(0,arguments).map(e).join("")+"]*"}function n(e){return function(){return"("+e+Array.apply(0,arguments).join("|")+")"}}var t=void 0,a=n("?:"),o=n("?!"),i=n("?="),s="[ \\f\\t\\v\\u00a0\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000]*",u=s.replace("*","+"),l="\\b",m="\\\\\\n\\\\?|\\n\\\\",c="\\n(?!\\\\)",g="[\\w\\-\\u00c0-\\u00de\\u00df-\\u00ff\\u0150\\u0170\\u0151\\u0171\\uD800-\\uDFFF]",p=g.replace("\\-",""),d=a("\\n","$"),h="("+a(m,"[^\\n]")+"+)",f="\\*",y=s+"("+f+"+)"+u+h+d,b="(?:0\\.)",k=s+"("+b+"+)"+u+h+d,N=s+"-{3,}"+s+d,C=s+"(#{1,6})"+s+h+d,T=s+"(==+>|<=+|=+><=+|<==+>)"+s+d,S=s+"(=+\\|+|\\|+=+|=+\\|+=+|\\|=+\\|)"+s+d,v={opener:"\\[\\[(?!\\[)",text:"("+r("]")+")",rightSeparator:a("\\->","\\|"),leftSeparator:"<\\-",closer:"\\]\\]",legacySeparator:"\\|",legacyText:"("+a("[^\\|\\]]","\\]"+o("\\]"))+"+)"},x=p+"*"+p.replace("\\w","a-zA-Z")+p+"*",A="\\$("+x+")",w="'s"+u+"("+x+")",O="("+x+")"+u+"of"+l+o("it"+l),F="'s"+u,L="of"+l,P=a("it","time")+l,H="its"+u+"("+x+")",j="its"+u,B="("+x+")"+u+"of"+u+"it"+l,M="of"+l+u+"it"+l,V={opener:"\\(",name:"("+a(g+"+",A)+"):"+o("\\/"),closer:"\\)"},I="<<[^>\\s]+\\s*(?:\\\\.|'(?:[^'\\\\]*\\\\.)*[^'\\\\]*'|\"(?:[^\"\\\\]*\\\\.)*[^\"\\\\]*\"|[^'\"\\\\>]|>(?!>))*>>",D=a("=<","=>","[gl]te?"+l,"n?eq"+l,"isnot"+l,"are"+l,"x"+l),E={name:"[a-zA-Z][\\w\\-]*",attrs:"(?:\"[^\"]*\"|'[^']*'|[^'\">])*?"},_="\\|("+g+"+)(>|\\))",R="(<|\\()("+g+"+)\\|",q="_("+x+")"+l,$="\\b(\\-?\\d+(?:\\.\\d+)?(?:[eE][+\\-]?\\d+)?|NaN)"+o("m?s")+l;v.main=v.opener+a(v.text+v.rightSeparator,v.text.replace("*","*?")+v.leftSeparator)+v.text,t={upperLetter:"[A-Z\\u00c0-\\u00de\\u0150\\u0170]",lowerLetter:"[a-z0-9_\\-\\u00df-\\u00ff\\u0151\\u0171]",anyLetter:g,anyLetterStrict:p,whitespace:u,escapedLine:m,br:c,commentFront:"",tag:"<\\/?"+E.name+E.attrs+">",tagPeek:"<",scriptStyleTag:"<("+a("script","style")+")"+E.attrs+">[^]*?<\\/\\1>",scriptStyleTagOpener:"<",url:"("+a("https?","mailto","javascript","ftp","data")+":\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])",bullet:f,hr:N,heading:C,align:T,column:S,bulleted:y,numbered:k,delOpener:e("~~"),italicOpener:e("//"),boldOpener:e("''"),supOpener:e("^^"),strongFront:e("**"),strongBack:e("**"),emFront:e("*"),emBack:e("*"),verbatimOpener:"`+",collapsedFront:"{",collapsedBack:"}",hookAppendedFront:"\\[",hookPrependedFront:_+"\\[",hookFront:"\\[",hookBack:"\\]"+o(R),hookAppendedBack:"\\]"+R,passageLink:v.main+v.closer,passageLinkPeek:"[[",legacyLink:v.opener+v.legacyText+v.legacySeparator+v.legacyText+v.closer,legacyLinkPeek:"[[",simpleLink:v.opener+v.legacyText+v.closer,simpleLinkPeek:"[[",macroFront:V.opener+i(V.name),macroFrontPeek:"(",macroName:V.name,groupingFront:"\\("+o(V.name),groupingFrontPeek:"(",groupingBack:"\\)",twine1Macro:I,twine1MacroPeek:"<<",property:w,propertyPeek:"'s",belongingProperty:O,possessiveOperator:F,belongingOperator:L,belongingOperatorPeek:"of",itsOperator:j,itsOperatorPeek:"its",belongingItOperator:M,belongingItOperatorPeek:"of",variable:A,variablePeek:"$",tempVariable:q,tempVariablePeek:"_",hookRef:"\\?("+g+"+)\\b",hookRefPeek:"?",cssTime:"(\\d+\\.?\\d*|\\d*\\.?\\d+)(m?s)"+l,colour:a(a("Red","Orange","Yellow","Lime","Green","Cyan","Aqua","Blue","Navy","Purple","Fuchsia","Magenta","White","Gray","Grey","Black"),"#[\\dA-Fa-f]{3}(?:[\\dA-Fa-f]{3})?"),number:$,boolean:a("true","false")+l,identifier:P,itsProperty:H,itsPropertyPeek:"its",belongingItProperty:B,escapedStringChar:"\\\\[^\\n]",singleStringOpener:"'",doubleStringOpener:'"',is:"is"+o(u+"not",u+"in",u+"<",u+">")+l,isNot:"is"+u+"not"+l,and:"and"+l,or:"or"+l,not:"not"+l,inequality:"((?:is(?:"+u+"not)?"+s+")*)("+a("<(?!=)","<=",">(?!=)",">=")+")",isIn:"is"+u+"in"+l,contains:"contains"+l,addition:e("+")+o("="),subtraction:e("-")+o("=","\\d"),multiplication:e("*")+o("="),division:a("/","%")+o("="),comma:",",spread:"\\.\\.\\."+o("\\."),to:a("to"+l,"="),into:"into"+l,making:"making"+l,where:"where"+l,via:"via"+l,with:"with"+l,each:"each"+l,augmentedAssign:a("\\+","\\-","\\*","\\/","%")+"=",incorrectOperator:D},"object"===("undefined"==typeof module?"undefined":_typeof(module))?module.exports=t:"function"==typeof define&&define.amd?define("patterns",[],function(){return t}):this&&this.loaded?(this.modules||(this.modules={}),this.modules.Patterns=t):this.Patterns=t}.call(eval("this")||("undefined"!=typeof global?global:window)),function(){function e(e){function r(e){return e=e||"innerText",function(r){var n=r.reduceRight(function(e,r,n){return e||(n?r:"")},""),t={};return t[e]=n,t}}function t(e,r){var n={};return n[e]=r,function(){return{isFront:!0,matches:n,cannotCross:["verbatimOpener"]}}}function a(e,r){return Object.keys(r).forEach(function(n){var t=r[n].fn;r[n].fn=function(r){var a=t(r);return a.text||(a.text=r[0]),a.type||(a.type=n),a.innerMode||(a.innerMode=e),a}}),r}var o=Object.bind(0,null),i=[],s=[],u=a(i,{hr:{fn:o},bulleted:{fn:function(e){return{depth:e[1].length,innerText:e[2]}}},numbered:{fn:function(e){return{depth:e[1].length/2,innerText:e[2]}}},heading:{fn:function(e){return{depth:e[1].length,innerText:e[2]}}},align:{fn:function(e){var r=void 0,n=e[1],t=n.indexOf("><");return~t?(r=Math.round(t/(n.length-2)*50),25===r&&(r="center")):"<"===n[0]&&">"===n.slice(-1)?r="justify":n.indexOf(">")>-1?r="right":n.indexOf("<")>-1&&(r="left"),{align:r}}},column:{fn:function(e){var r=void 0,n=e[1],t=n.indexOf("|");return t&&t-1}}},augmentedAssign:{fn:function(e){return{operator:e[0][0]}}},identifier:{fn:r("name"),cannotFollow:["text"]},whitespace:{fn:o,cannotFollow:"text"},incorrectOperator:{fn:function(e){var r={"=>":">=","=<":"<=",gte:">=",lte:"<=",gt:">",lt:"<",eq:"is",isnot:"is not",neq:"is not",are:"is",x:"*"}[e[0].toLowerCase()];return{type:"error",message:"Please say "+(r?"'"+r+"'":"something else")+" instead of '"+e[0]+"'."}},cannotFollow:"text"}},["boolean","is","to","into","where","via","with","making","each","and","or","not","isNot","contains","isIn"].reduce(function(e,r){return e[r]={fn:o,cannotFollow:["text"]},e},{}),["comma","spread","addition","subtraction","multiplication","division"].reduce(function(e,r){return e[r]={fn:o},e},{})));i.push.apply(i,_toConsumableArray(Object.keys(u)).concat(_toConsumableArray(Object.keys(m)),_toConsumableArray(Object.keys(l)))),s.push.apply(s,_toConsumableArray(Object.keys(m)).concat(_toConsumableArray(Object.keys(c))));var g=Object.assign({},u,l,m,c);return Object.keys(g).forEach(function(e){var r=n[e];g[e].pattern="string"!=typeof r?r:new RegExp("^(?:"+r+")","i"),n[e+"Peek"]&&(g[e].peek=n[e+"Peek"])}),Object.assign(e.rules,g),e.modes.start=e.modes.markup=i,e.modes.macro=s,e}function r(r){return Object.freeze({lex:e(r).lex,Patterns:n})}var n=void 0;Object.assign=Object.assign||function(e){for(var r=1;r Command":{name:"display",sig:" String",returnType:"Command",aka:[]},"(print: Any) -> Command":{name:"print",sig:" Any",returnType:"Command",aka:[]},"(show: ...HookName) -> Command":{name:"show",sig:" ...HookName",returnType:"Command",aka:[]},"(go-to: String) -> Command":{name:"go-to",sig:" String",returnType:"Command",aka:[]},"(undo:) -> Command":{name:"undo",sig:"",returnType:"Command",aka:[]},"(live: [Number]) -> Changer":{name:"live",sig:" [Number]",returnType:"Changer",aka:[]},"(stop:) -> Command":{name:"stop",sig:"",returnType:"Command",aka:[]},"(save-game: String, [String]) -> Boolean":{name:"save-game",sig:" String, [String]",returnType:"Boolean",aka:[]},"(load-game: String) -> Command":{name:"load-game",sig:" String",returnType:"Command",aka:[]},"(alert: String) -> Command":{name:"alert",sig:" String",returnType:"Command",aka:[]},"(prompt: String, String) -> String":{name:"prompt",sig:" String, String",returnType:"String",aka:[]},"(confirm: String) -> Boolean":{name:"confirm",sig:" String",returnType:"Boolean",aka:[]},"(open-url: String) -> Command":{name:"open-url",sig:" String",returnType:"Command",aka:[]},"(reload:) -> Command":{name:"reload",sig:"",returnType:"Command",aka:[]},"(goto-url: String) -> Command":{name:"goto-url",sig:" String",returnType:"Command",aka:[]},"(page-url:) -> String":{name:"page-url",sig:"",returnType:"String",aka:[]},"(set: ...VariableToValue) -> Instant":{name:"set",sig:" ...VariableToValue",returnType:"Instant",aka:[]},"(put: ...VariableToValue) -> Instant":{name:"put",sig:" ...VariableToValue",returnType:"Instant",aka:[]},"(move: ...VariableToValue) -> Instant":{name:"move",sig:" ...VariableToValue",returnType:"Instant",aka:[]},"(a: [...Any]) -> Array":{name:"a",sig:" [...Any]",returnType:"Array",aka:["array"]},"(range: Number, Number) -> Array":{name:"range",sig:" Number, Number",returnType:"Array",aka:[]},"(subarray: Array, Number, Number) -> Array":{name:"subarray",sig:" Array, Number, Number",returnType:"Array",aka:[]},"(shuffled: Any, Any, [...Any]) -> Array":{name:"shuffled",sig:" Any, Any, [...Any]",returnType:"Array",aka:[]},"(sorted: Number or String, ...Number or String) -> Array":{name:"sorted",sig:" Number or String, ...Number or String",returnType:"Array",aka:[]},"(rotated: Number, [...Any]) -> Array":{name:"rotated",sig:" Number, [...Any]",returnType:"Array",aka:[]},"(repeated: Number, ...Any) -> Array":{name:"repeated",sig:" Number, ...Any",returnType:"Array",aka:[]},"(interlaced: Array, ...Array) -> Array":{name:"interlaced",sig:" Array, ...Array",returnType:"Array",aka:[]},"(altered: Lambda, ...Any) -> Array":{name:"altered",sig:" Lambda, ...Any",returnType:"Array",aka:[]},"(find: Lambda, ...Any) -> Array":{name:"find",sig:" Lambda, ...Any",returnType:"Array",aka:[]},"(all-pass: Lambda, ...Any) -> Boolean":{name:"all-pass",sig:" Lambda, ...Any",returnType:"Boolean",aka:[]},"(some-pass: Lambda, ...Any) -> Boolean":{name:"some-pass",sig:" Lambda, ...Any",returnType:"Boolean",aka:[]},"(none-pass: Lambda, ...Any) -> Boolean":{name:"none-pass",sig:" Lambda, ...Any",returnType:"Boolean",aka:[]},"(folded: Lambda, ...Any) -> Any":{name:"folded",sig:" Lambda, ...Any",returnType:"Any",aka:[]},"(datanames: Datamap) -> Array":{name:"datanames",sig:" Datamap",returnType:"Array",aka:[]},"(datavalues: Datamap) -> Array":{name:"datavalues",sig:" Datamap",returnType:"Array",aka:[]},"(dataentries: Datamap) -> Array":{name:"dataentries",sig:" Datamap",returnType:"Array",aka:[]},"(history:) -> Array":{name:"history",sig:"",returnType:"Array",aka:[]},"(passage: [String]) -> Datamap":{name:"passage",sig:" [String]",returnType:"Datamap",aka:[]},"(saved-games:) -> Datamap":{name:"saved-games",sig:"",returnType:"Datamap",aka:[]},"(dm: [...Any]) -> Datamap":{name:"dm",sig:" [...Any]",returnType:"Datamap",aka:["datamap"]},"(ds: [...Any]) -> Dataset":{name:"ds",sig:" [...Any]",returnType:"Dataset",aka:["dataset"]},"(count: Array or String, ...Any) -> Number":{name:"count",sig:" Array or String, ...Any",returnType:"Number",aka:[]},"(enchant: HookName or String, Changer) -> Command":{name:"enchant",sig:" HookName or String, Changer",returnType:"Command",aka:[]},"(replace: ...HookName or String) -> Changer":{name:"replace",sig:" ...HookName or String",returnType:"Changer",aka:[]},"(append: ...HookName or String) -> Changer":{name:"append",sig:" ...HookName or String",returnType:"Changer",aka:[]},"(prepend: ...HookName or String) -> Changer":{name:"prepend",sig:" ...HookName or String",returnType:"Changer",aka:[]},"(click: HookName or String) -> Changer":{name:"click",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseover: HookName or String) -> Changer":{name:"mouseover",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseout: HookName or String) -> Changer":{name:"mouseout",sig:" HookName or String",returnType:"Changer",aka:[]},"(click-replace: HookName or String) -> Changer":{name:"click-replace",sig:" HookName or String",returnType:"Changer",aka:[]},"(click-append: HookName or String) -> Changer":{name:"click-append",sig:" HookName or String",returnType:"Changer",aka:[]},"(click-prepend: HookName or String) -> Changer":{name:"click-prepend",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseover-replace: HookName or String) -> Changer":{name:"mouseover-replace",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseover-append: HookName or String) -> Changer":{name:"mouseover-append",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseover-prepend: HookName or String) -> Changer":{name:"mouseover-prepend",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseout-replace: HookName or String) -> Changer":{name:"mouseout-replace",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseout-append: HookName or String) -> Changer":{name:"mouseout-append",sig:" HookName or String",returnType:"Changer",aka:[]},"(mouseout-prepend: HookName or String) -> Changer":{name:"mouseout-prepend",sig:" HookName or String",returnType:"Changer",aka:[]},"(link: String) -> Changer":{name:"link",sig:" String",returnType:"Changer",aka:["link-replace"]},"(link-reveal: String) -> Changer":{name:"link-reveal",sig:" String",returnType:"Changer",aka:[]},"(link-repeat: String) -> Changer":{name:"link-repeat",sig:" String",returnType:"Changer",aka:[]},"(link-goto: String, [String]) -> Command":{name:"link-goto",sig:" String, [String]",returnType:"Command",aka:[]},"(link-undo: String) -> Command":{name:"link-undo",sig:" String",returnType:"Command",aka:[]},"(if: Boolean) -> Changer":{name:"if",sig:" Boolean",returnType:"Changer",aka:[]},"(unless: Boolean) -> Changer":{name:"unless",sig:" Boolean",returnType:"Changer",aka:[]},"(else-if: Boolean) -> Changer":{name:"else-if",sig:" Boolean",returnType:"Changer",aka:[]},"(else:) -> Changer":{name:"else",sig:"",returnType:"Changer",aka:[]},"(hidden:) -> Changer":{name:"hidden",sig:"",returnType:"Changer",aka:[]},"(hook: String) -> Changer":{name:"hook",sig:" String",returnType:"Changer",aka:[]},"(for: Lambda, ...Any) -> Changer":{name:"for",sig:" Lambda, ...Any",returnType:"Changer",aka:["loop"]},"(transition: String) -> Changer":{name:"transition",sig:" String",returnType:"Changer",aka:["t8n"]},"(transition-time: Number) -> Changer":{name:"transition-time",sig:" Number",returnType:"Changer",aka:["t8n-time"]},"(font: String) -> Changer":{name:"font",sig:" String",returnType:"Changer",aka:[]},"(align: String) -> Changer":{name:"align",sig:" String",returnType:"Changer",aka:[]},"(text-colour: String or Colour) -> Changer":{name:"text-colour",sig:" String or Colour",returnType:"Changer",aka:["colour"]},"(text-rotate: Number) -> Changer":{name:"text-rotate",sig:" Number",returnType:"Changer",aka:[]},"(background: Colour or String) -> Changer":{name:"background",sig:" Colour or String",returnType:"Changer",aka:[]},"(text-style: String) -> Changer":{name:"text-style",sig:" String",returnType:"Changer",aka:[]},"(hover-style: Changer) -> Changer":{name:"hover-style",sig:" Changer",returnType:"Changer",aka:[]},"(css: String) -> Changer":{name:"css",sig:" String",returnType:"Changer",aka:[]},"(text: ...[Number or String or Boolean or Array]) -> String":{name:"text",sig:" ...[Number or String or Boolean or Array]",returnType:"String",aka:["string"]},"(substring: String, Number, Number) -> String":{name:"substring",sig:" String, Number, Number",returnType:"String",aka:[]},"(lowercase: String) -> String":{name:"lowercase",sig:" String",returnType:"String",aka:[]},"(uppercase: String) -> String":{name:"uppercase",sig:" String",returnType:"String",aka:[]},"(lowerfirst: String) -> String":{name:"lowerfirst",sig:" String",returnType:"String",aka:[]},"(upperfirst: String) -> String":{name:"upperfirst",sig:" String",returnType:"String",aka:[]},"(words: String) -> Array":{name:"words",sig:" String",returnType:"Array",aka:[]},"(num: String) -> Number":{name:"num",sig:" String",returnType:"Number",aka:["number"]},"(rgb: Number, Number, Number) -> Colour":{name:"rgb",sig:" Number, Number, Number",returnType:"Colour",aka:[]},"(rgba: Number, Number, Number, Number) -> Colour":{name:"rgba",sig:" Number, Number, Number, Number",returnType:"Colour",aka:[]},"(hsl: Number, Number, Number) -> Colour":{name:"hsl",sig:" Number, Number, Number",returnType:"Colour",aka:[]},"(hsla: Number, Number, Number, Number) -> Colour":{name:"hsla",sig:" Number, Number, Number, Number",returnType:"Colour",aka:[]},"(weekday:) -> String":{name:"weekday",sig:"",returnType:"String",aka:[]},"(monthday:) -> Number":{name:"monthday",sig:"",returnType:"Number",aka:[]},"(current-time:) -> String":{name:"current-time",sig:"",returnType:"String",aka:[]},"(current-date:) -> String":{name:"current-date",sig:"",returnType:"String",aka:[]},"(min: ...Number) -> Number":{name:"min",sig:" ...Number",returnType:"Number",aka:[]},"(max: ...Number) -> Number":{name:"max",sig:" ...Number",returnType:"Number",aka:[]},"(abs: Number) -> Number":{name:"abs",sig:" Number",returnType:"Number",aka:[]},"(sign: Number) -> Number":{name:"sign",sig:" Number",returnType:"Number",aka:[]},"(sin: Number) -> Number":{name:"sin",sig:" Number",returnType:"Number",aka:[]},"(cos: Number) -> Number":{name:"cos",sig:" Number",returnType:"Number",aka:[]},"(tan: Number) -> Number":{name:"tan",sig:" Number",returnType:"Number",aka:[]},"(floor: Number) -> Number":{name:"floor",sig:" Number",returnType:"Number",aka:[]},"(round: Number) -> Number":{name:"round",sig:" Number",returnType:"Number",aka:[]},"(ceil: Number) -> Number":{name:"ceil",sig:" Number",returnType:"Number",aka:[]},"(pow: Number, Number) -> Number":{name:"pow",sig:" Number, Number",returnType:"Number",aka:[]},"(exp: Number, Number) -> Number":{name:"exp",sig:" Number, Number",returnType:"Number",aka:[]},"(sqrt: Number) -> Number":{name:"sqrt",sig:" Number",returnType:"Number",aka:[]},"(log: Number) -> Number":{name:"log",sig:" Number",returnType:"Number",aka:[]},"(log10: Number) -> Number":{name:"log10",sig:" Number",returnType:"Number",aka:[]},"(log2: Number) -> Number":{name:"log2",sig:" Number",returnType:"Number",aka:[]},"(random: Number, [Number]) -> Number":{name:"random",sig:" Number, [Number]",returnType:"Number",aka:[]},"(either: ...Any) -> Any":{name:"either",sig:" ...Any",returnType:"Any",aka:[]}},n=r instanceof Object&&Object.keys(r).reduce(function(e,n){return e.concat.apply(e,[r[n].name].concat(_toConsumableArray(r[n].aka)))},[]).map(e),t=void 0;"function"==typeof define&&define.amd?define("markup",[],function(e){t=e.lex}):this&&this.loaded&&this.modules&&(t=this.modules.Markup.lex),window.CodeMirror&&CodeMirror.defineMode("harlowe-2",function(){function r(e,r){if(e.update){var n=e.from.line,t=r.split("\n").slice(0,e.from.line+1);return t[n]=t[n].slice(0,e.from.ch)+e.text[0],t=t.concat(e.text.slice(1)),e.update({line:0,ch:0},e.to,t),t.join("\n")}}function a(e){u.length&&(u.forEach(function(e){return e.clear()}),u=[]);var r=i.tokenAt(e.indexFromPos(e.getCursor()));if(r){if(u.push(e.markText(e.posFromIndex(r.start),e.posFromIndex(r.end),{className:"cm-harlowe-2-cursor"})),"variable"===r.type||"tempVariable"===r.type||"hookRef"===r.type||"hook"===r.type){var n="hook"===r.type?"hookRef":r.type;s[n].forEach(function(n){n!==r&&n.name===r.name&&u.push(e.markText(e.posFromIndex(n.start),e.posFromIndex(n.end),{className:"cm-harlowe-2-variableOccurrence"}))})}("hookRef"===r.type||"hook"===r.type)&&s.hook.forEach(function(n){if(n!==r&&n.name===r.name){var t="appended"===n.tagPosition?n.end-n.name.length-1:n.start+1;u.push(e.markText(e.posFromIndex(t),e.posFromIndex(t+n.name.length),{className:"cm-harlowe-2-hookOccurrence"}))}})}}var o=void 0,i=void 0,s={variable:[],tempVariable:[],hook:[],hookRef:[],populate:function(){var e=this;this.variable=[],this.tempVariable=[],this.hook=[],this.hookRef=[];var r=function r(n){("variable"===n.type||"tempVariable"===n.type||"hook"===n.type||"hookRef"===n.type)&&e[n.type].push(n),n.children.forEach(r)};i.children.forEach(r)}},u=[],l=function(){var e=o.doc;i=t(e.getValue()),s.populate(),e.on("beforeChange",function(n,t){var a=e.getValue();r(t,a)}),e.on("change",function(){var r=e.getValue();i=t(r),s.populate()}),e.on("swapDoc",l),e.on("cursorActivity",a),l=null};return{startState:function(){return o||(o=CodeMirror.modes["harlowe-2"].cm,o.setOption("placeholder",["Enter the body text of your passage here.","''Bold'', //italics//, ^^superscript^^, ~~strikethrough~~, and

HTML tags

are available.","To display special symbols without them being transformed, put them between `backticks`.","To link to another passage, write the link text and the passage name like this: [[link text->passage name]]\nor this: [[passage name<-link text]]\nor this: [[link text]].","Macros like (set:) and (display:) are the programming of your passage. If you've (set:) a $variable, you can just enter its name to print it out.","To make a 'hook', put [single square brackets] around text - or leave it empty [] - then put a macro like (if:), a $variable, or a |nametag> outside the front, |like>[so].","Hooks can be used for many things: showing text (if:) something happened, applying a (text-style:), making a place to (append:) text later on, and much more!","Consult the Harlowe documentation for more information."].join("\n\n")),o.setOption("lineNumbers",!0),o.setOption("lineNumberFormatter",function(){return"\u2022"})),{pos:0}},blankLine:function(e){e.pos++},token:function(r,t){l&&l();var a=i.pathAt(t.pos),o=a[0];if(!o)return t.pos++,r.next(),null;for(;o===o.tokenAt(t.pos)&&!r.eol();)t.pos++,r.next();r.eol()&&t.pos++;for(var s={},u="",m=0;m1&&(g+="-"+s[g]),c){case"macroName":-1===n.indexOf(e(a[m].text.slice(0,-1)))&&(g+=" harlowe-2-error")}u+=g+" "}return u}}});var a=document.querySelector("style#cm-harlowe-2");a||(a=document.createElement("style"),a.setAttribute("id","cm-harlowe-2"),document.head.appendChild(a)),a.innerHTML=function(){var e=function(e,r,n){return function(t){return"background-color: hsla("+e+","+r+"%,"+n+"%,"+t+");"}},r=e(40,100,50),n=e(220,100,50),t=function(r){return e(320,44,50)(r)+"color: #a84186;"},a="color: firebrick !important; background-color: hsla(17, 100%, 74%, 0.74) !important;",o="font-weight:100; color: hsla(0,0,0,0.5)";return{root:"box-sizing:border-box;","cursor:not([class^='cm-harlowe-2-text cm-harlowe-2-root'])":"border-bottom: 2px solid darkgray;",CodeMirror:"padding: 0 !important","CodeMirror-linenumber":"color: #ccc;",hook:r(.05),"hook-2":r(.1),"hook-3":r(.15),"hook-4":r(.2),"hook-5":r(.25),"hook-6":r(.3),"hook-7":r(.35),"hook-8":r(.4),"^=hook , ^=hook-":"font-weight:bold;","error:not([class*='cm-harlowe-2-string'])":a,macro:t(.05),"macro-2":t(.1),"macro-3":t(.15),"macro-4":t(.2),"macro-5":t(.25),"macro-6":t(.3),"macro-7":t(.35),"macro-8":t(.4),macroName:"font-style:italic;","^=macro ":"font-weight:bold;","bold, strong":"font-weight:bold;","italic, em":"font-style:italic;",sup:"vertical-align: super;font-size:0.8em;",verbatim:"background-color: hsla(0,0%,50%,0.1);","^=bold, ^=strong, ^=italic, ^=em, ^=sup, ^=verbatim":o, +"^=string":"font-style:italic; display:inline-block; transform: scaleX(-1);","string + ^=string":"transform: none;","^=collapsed":"font-weight:bold; color: hsl(201, 100%, 30%);",collapsed:n(.025),"collapsed.hook":n(.05),"collapsed.hook-2":n(.1),"collapsed.hook-3":n(.15),"collapsed.hook-4":n(.2),"collapsed.hook-5":n(.25),"collapsed.hook-6":n(.3),"collapsed.hook-7":n(.35),"collapsed.hook-8":n(.4),"twineLink:not(.text)":"color: #3333cc;",tag:"color: #4d4d9d;",boolean:"color: #626262;",string:"color: #008282;",number:"color: #A15000;",variable:"color: #0076b2;",tempVariable:"color: #1a6e97;",hookRef:"color: #007f54;","variableOccurrence, hookOccurrence":"background: #9fdfc9 !important;",where:"color: #007f00; font-style:italic;",via:"color: #007f00; font-style:italic;",with:"color: #007f00; font-style:italic;",making:"color: #007f00; font-style:italic;",each:"color: #007f00; font-style:italic;",heading:"font-weight:bold;",hr:"display:block; background-image: linear-gradient(0deg, transparent, transparent 45%, silver 45%, transparent 55%, transparent);",align:"display:block; color: hsl(14, 99%, 37%); background-color: hsla(14, 99%, 87%, 0.2);",column:"display:block; color: hsl(204, 99%, 37%); background-color: hsla(204, 99%, 87%, 0.2);",escapedLine:"font-weight:bold; color: hsl(51, 100%, 30%);","identifier, property, belongingProperty, itsProperty, belongingItProperty, belongingItOperator":"color: #0076b2;",toString:function(){var e=this;return Object.keys(this).reduce(function(r,n){var t;return"toString"===n?r:"CodeMirror"===n.slice(0,10)?r+"."+n+"{"+e[n]+"}":(t=n.split(", ").map(function e(r){return r.indexOf(".")>-1?r.split(/\./g).map(e).join(""):r.indexOf(" + ")>-1?r.split(/ \+ /g).map(e).join(" + "):0===r.indexOf("^=")?"[class^='cm-harlowe-2-"+r.slice(2)+"']":".cm-harlowe-2-"+r}),r+t.join(", ")+"{"+e[n]+"}")},"")}}+""}()}.call(eval("this"));}}); \ No newline at end of file diff --git a/story-formats/sugarcube-2.12.1/format.js b/story-formats/sugarcube-2.12.1/format.js deleted file mode 100755 index 209435e1e..000000000 --- a/story-formats/sugarcube-2.12.1/format.js +++ /dev/null @@ -1 +0,0 @@ -window.storyFormat({"name":"SugarCube","version":"2.12.1","description":"A Twine 2 port of the Twine 1 story format by the same name. See its documentation.","author":"Thomas Michael Edwards","image":"icon.svg","url":"http://www.motoslave.net/sugarcube/","license":"Simplified BSD License","proofing":false,"source":"\n\n\n\n{{STORY_NAME}}\n\n\n\n\n\n\n\n\n\n\n\n\n\t
\n\t\t
\n\t\t
Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
\n\t\t
Loading…
\n\t
\n\t\n\t\n\n\n"}); \ No newline at end of file diff --git a/story-formats/sugarcube-2.12.1/LICENSE b/story-formats/sugarcube-2.14.0/LICENSE old mode 100755 new mode 100644 similarity index 95% rename from story-formats/sugarcube-2.12.1/LICENSE rename to story-formats/sugarcube-2.14.0/LICENSE index 16c827dd2..85a5baca3 --- a/story-formats/sugarcube-2.12.1/LICENSE +++ b/story-formats/sugarcube-2.14.0/LICENSE @@ -1,5 +1,5 @@ -Copyright (c) 2013-2016 Thomas Michael Edwards . +Copyright (c) 2013-2017 Thomas Michael Edwards . All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/story-formats/sugarcube-2.14.0/format.js b/story-formats/sugarcube-2.14.0/format.js new file mode 100644 index 000000000..60f1938f0 --- /dev/null +++ b/story-formats/sugarcube-2.14.0/format.js @@ -0,0 +1 @@ +window.storyFormat({"name":"SugarCube","version":"2.14.0","description":"A Twine 2 port of the Twine 1 story format by the same name. See its documentation.","author":"Thomas Michael Edwards","image":"icon.svg","url":"http://www.motoslave.net/sugarcube/","license":"Simplified BSD License","proofing":false,"source":"\n\n\n\n{{STORY_NAME}}\n\n\n\n\n\n\n\n\n\n\n\n\n\t
\n\t\t
\n\t\t
Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
\n\t\t
Loading…
\n\t
\n\t\n\t\n\n\n"}); \ No newline at end of file diff --git a/story-formats/sugarcube-2.12.1/icon.svg b/story-formats/sugarcube-2.14.0/icon.svg old mode 100755 new mode 100644 similarity index 100% rename from story-formats/sugarcube-2.12.1/icon.svg rename to story-formats/sugarcube-2.14.0/icon.svg diff --git a/webpack.config.cdn.js b/webpack.config.cdn.js index 3a75ff7ba..83181b58d 100644 --- a/webpack.config.cdn.js +++ b/webpack.config.cdn.js @@ -6,6 +6,11 @@ config.output.path = 'dist/web-cdn'; config.plugins.find(plugin => plugin.options && plugin.options.template).options.cdn = true; +config.module.rules.pop(); + +config.module.rules[config.module.rules.length - 1].test = + /\.(eot|png|svg|ttf|woff|woff2)(\?.*)?$/; + /* Externalize a bunch of dependencies. */ Object.assign( diff --git a/webpack.config.js b/webpack.config.js index b7f68ece7..24e26a381 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -11,25 +11,51 @@ module.exports = { path: 'build/', filename: 'twine.js' }, + stats: 'none', module: { - loaders: [ + rules: [ /* Inline any resurces below 10k in size. */ - { test: /\.(eot|png|svg|ttf|woff|woff2)(\?.*)?$/, loader: 'url-loader?limit=10000&name=rsrc/[name].[hash].[ext]' }, + { + test: /\.(eot|png|svg|ttf|woff|woff2)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: 'rsrc/[name].[hash].[ext]' + } + }, /* We must exclude the top-level template, as I think the HTML plugin is expecting a string as output, not a function. */ - { test: /\.ejs$/, exclude: /index\.ejs$/, loader: 'ejs' }, - { test: /\.html$/, loader: 'html' }, - { test: /\.less$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader!less-loader') }, - { test: /\.json$/, loader: 'json' } - ], - }, - lessLoader: { - lessPlugins: [ - new Autoprefixer({ browsers: ['iOS 1-9', 'last 2 versions'] }) + { + test: /\.ejs$/, + exclude: /index\.ejs$/, + loader: 'ejs-loader' + }, + { + test: /\.html$/, + loader: 'html-loader' + }, + { + test: /\.less$/, + loader: ExtractTextPlugin.extract({ + use: [ + 'css-loader', + { + loader: 'less-loader', + options: { + plugins: [ + new Autoprefixer({ + browsers: ['iOS 1-9', 'last 2 versions'] + }) + ] + } + } + ] + }) + } ] }, /* diff --git a/webpack.config.release.js b/webpack.config.release.js index bea493ecc..d0c7fe694 100644 --- a/webpack.config.release.js +++ b/webpack.config.release.js @@ -6,11 +6,11 @@ config.output.path = 'dist/web'; /* Transpile down to ES5. */ -config.module.loaders.push({ +config.module.rules.push({ test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader', - query: { + options: { presets: ['es2015'] } }); @@ -20,14 +20,18 @@ Base64 encode all fonts to work around a bug in NW.js -- see https://github.com/nwjs/nw.js/issues/5080 */ -config.module.loaders.splice(0, 1); +config.module.rules.splice(0, 1); -config.module.loaders.push({ +config.module.rules.push({ test: /\.(png|svg)(\?.*)?$/, - loader: 'url-loader?limit=10000&name=rsrc/[name].[hash].[ext]' + loader: 'url-loader', + options: { + limit: 10000, + name: 'rsrc/[name].[hash].[ext]' + } }); -config.module.loaders.push({ +config.module.rules.push({ test: /\.(woff|woff2|ttf|eot|svg)(\?.*)?$/, exclude: /img/, loader: 'base64-font-loader' @@ -41,5 +45,4 @@ config.plugins.push(new UglifyPlugin({ minimize: true })); //config.lessLoader.lessPlugins.push(new CleanPlugin()); - module.exports = config;