Compare commits

...

49 Commits

Author SHA1 Message Date
Dan Brown
0c802d1f86 Updated assets and version for release v0.17.4 2017-07-28 13:04:21 +01:00
Dan Brown
b7a96c6466 Merge branch 'master' into release 2017-07-28 13:03:36 +01:00
Dan Brown
9126da6299 Updated dev command details
Closes #453
2017-07-28 11:32:42 +01:00
Dan Brown
fea139d8e7 Merge branch 'master' of github.com:BookStackApp/BookStack 2017-07-27 19:09:44 +01:00
Dan Brown
ac7a8a8e1e Expanded the available editor shortcuts in both editors
Adds formatting on ctrl+nums for everything on formats dropdown.
Closes #85.
2017-07-27 19:07:58 +01:00
Dan Brown
bbaa2f4cda Merge pull request #435 from JachuPL/polish-localization
Polish translation
2017-07-27 16:48:19 +01:00
Dan Brown
9d61eecd81 Merge branch 'Cyber-Duck-master' 2017-07-27 16:29:09 +01:00
Dan Brown
21247e10d0 Reverted travis changes and added html escaping 2017-07-27 16:28:23 +01:00
Dan Brown
c1fc06ae34 Merge branch 'master' of git://github.com/Cyber-Duck/BookStack into Cyber-Duck-master 2017-07-27 16:20:38 +01:00
Dan Brown
a0eb3d1079 Merge pull request #446 from Joorem/french-spelling
French spelling
2017-07-27 16:18:57 +01:00
Dan Brown
164aea3a3a Merge pull request #448 from 10bass/subdir-search-fix
Update search.js
2017-07-27 16:17:57 +01:00
Dan Brown
ec83f83017 Added breadcrumbs to pages in entity select
Fixes #391
2017-07-27 16:10:58 +01:00
Dan Brown
5cd08ab2f5 Fixed custom plugin when developing 2017-07-27 15:43:17 +01:00
Dan Brown
072f6b103e Vastly sped up gulp watch and added livereload 2017-07-27 15:14:53 +01:00
10bass
b4dcde252b Update search.js
Trying to apply an exact match or tag would previously redirect to /search, regardless of the installation path.
2017-07-24 20:06:15 -04:00
Jérôme Le Gal
0b2c3c1aa7 settings.php: add missing french translation 2017-07-22 23:45:09 +02:00
Jérôme Le Gal
0dc9d0bed7 errors.php: add missing french translation 2017-07-22 23:45:09 +02:00
Jérôme Le Gal
a2a2e37797 settings.php: fix some spelling issues in french translation 2017-07-22 23:45:09 +02:00
Jérôme Le Gal
3d9819f97c passwords.php: fix some spelling issues in french translation 2017-07-22 23:45:09 +02:00
Jérôme Le Gal
b2b4a24d7c errors.php: fix some spelling issues in french translation 2017-07-22 23:45:08 +02:00
Jérôme Le Gal
7557d6d619 entities.php: fix some spelling issues in french translation 2017-07-22 23:45:08 +02:00
Jérôme Le Gal
57eeb9b0a3 common.php: fix some spelling issues in french translation 2017-07-22 23:45:08 +02:00
Jérôme Le Gal
813c7d5902 auth.php: fix some spelling issues in french translation 2017-07-22 23:45:08 +02:00
Dan Brown
4b645a82c7 Updated version for release 2017-07-22 17:27:01 +01:00
Dan Brown
d599b77b6f Merge branch 'master' into release 2017-07-22 17:26:44 +01:00
Dan Brown
f200b4183d Defined LDAP constant for testing without LDAP installed 2017-07-22 17:22:31 +01:00
Dan Brown
33642c20ec Fixed faulty text rendering calls and LDAP tests 2017-07-22 17:10:52 +01:00
Dan Brown
26e93dc8c1 Updated assets and version for release v0.17.2 2017-07-22 16:49:07 +01:00
Dan Brown
a4c9a8491b Merge branch 'master' into release 2017-07-22 16:46:57 +01:00
Dan Brown
2704962277 Updated utfmb4 upgrade command 2017-07-22 16:19:17 +01:00
Dan Brown
6bcd89acf7 Moved utf8mb4 migration to command instead of migration
To prevent errors upon migration.
Command generates out the SQL syntax to make the change instead
so the upgrade can be done manually.

In reference to #425
2017-07-22 15:54:17 +01:00
Dan Brown
433cb9b3b2 Improved breadcrumb responsiveness
Closes #426
2017-07-22 15:20:36 +01:00
Dan Brown
7f43372dd4 Fixed broken code block rendering when using DOMPDF
Fixes #427
2017-07-22 14:34:17 +01:00
Dan Brown
b12e2ceada Added included content into page's text view
Allows rendered content to be shown in listings and used in searches.
Also prevented angular tags in content being parsed in listings.

Fixes #442
2017-07-22 14:21:56 +01:00
Dan Brown
bc067e9ad4 Updated dropdowns to hide after option click
Fixes #429
2017-07-22 14:03:06 +01:00
Clément Blanco
245294fbc5 Trying to make the tests green. 2017-07-17 14:42:08 +01:00
Clément Blanco
f38bc75ab4 Trying to make the tests green. 2017-07-17 14:21:41 +01:00
Clément Blanco
3407900abb Trying to make the tests green. 2017-07-17 14:18:03 +01:00
Clément Blanco
684c20c4ea Trying to make the tests green. 2017-07-17 14:09:21 +01:00
Clément Blanco
6ef522df7e Trying to make the tests green. 2017-07-17 14:05:41 +01:00
Clément Blanco
3b771f2976 Trying to make the tests green. 2017-07-17 14:03:31 +01:00
Clément Blanco
afc56c12fe Trying to make the tests green. 2017-07-17 14:01:10 +01:00
Clément Blanco
5eeed03dcd Trying to make the tests green. 2017-07-17 13:53:02 +01:00
Clément Blanco
0d98b4ce5e Trying to make the tests green. 2017-07-17 13:37:15 +01:00
Clément Blanco
ae2ec43a82 Avoid having to wait until all tests are processed to exit upon error/failure. 2017-07-17 13:35:38 +01:00
Clément Blanco
265ed34ffd Update travis.yml to try and solve the test issue around LDAP. 2017-07-17 13:34:19 +01:00
Clément Blanco
711dcb4a48 Update travis.yml to try and solve the test issue around LDAP. 2017-07-17 13:29:29 +01:00
Clément Blanco
67bc7007aa Support new lines for book/chapter descriptions
Avoid ignoring new lines when renderring the book/chapter descriptions on their respective detailed views.
2017-07-14 16:05:46 +01:00
JachuPL
9e0c931573 Polish translation 2017-07-13 16:00:42 +02:00
44 changed files with 1230 additions and 199 deletions

View File

@@ -25,4 +25,4 @@ after_failure:
- cat storage/logs/laravel.log
script:
- phpunit
- phpunit

View File

@@ -0,0 +1,57 @@
<?php
namespace BookStack\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class UpgradeDatabaseEncoding extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'bookstack:db-utf8mb4 {--database= : The database connection to use.}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Generate SQL commands to upgrade the database to UTF8mb4';
/**
* Create a new command instance.
*
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$connection = DB::getDefaultConnection();
if ($this->option('database') !== null) {
DB::setDefaultConnection($this->option('database'));
}
$database = DB::getDatabaseName();
$tables = DB::select('SHOW TABLES');
$this->line('ALTER DATABASE `'.$database.'` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;');
$this->line('USE `'.$database.'`;');
$key = 'Tables_in_' . $database;
foreach ($tables as $table) {
$tableName = $table->$key;
$this->line('ALTER TABLE `'.$tableName.'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;');
}
DB::setDefaultConnection($connection);
}
}

View File

@@ -15,7 +15,8 @@ class Kernel extends ConsoleKernel
Commands\ClearActivity::class,
Commands\ClearRevisions::class,
Commands\RegeneratePermissions::class,
Commands\RegenerateSearch::class
Commands\RegenerateSearch::class,
Commands\UpgradeDatabaseEncoding::class
];
/**

View File

@@ -571,7 +571,7 @@ class EntityRepo
$draftPage->slug = $this->findSuitableSlug('page', $draftPage->name, false, $draftPage->book->id);
$draftPage->html = $this->formatHtml($input['html']);
$draftPage->text = strip_tags($draftPage->html);
$draftPage->text = $this->pageToPlainText($draftPage);
$draftPage->draft = false;
$draftPage->revision_count = 1;
@@ -713,6 +713,17 @@ class EntityRepo
return $content;
}
/**
* Get the plain text version of a page's content.
* @param Page $page
* @return string
*/
public function pageToPlainText(Page $page)
{
$html = $this->renderPage($page);
return strip_tags($html);
}
/**
* Get a new draft page instance.
* @param Book $book
@@ -816,7 +827,7 @@ class EntityRepo
$userId = user()->id;
$page->fill($input);
$page->html = $this->formatHtml($input['html']);
$page->text = strip_tags($page->html);
$page->text = $this->pageToPlainText($page);
if (setting('app-editor') !== 'markdown') $page->markdown = '';
$page->updated_by = $userId;
$page->revision_count++;
@@ -933,7 +944,7 @@ class EntityRepo
$revision = $page->revisions()->where('id', '=', $revisionId)->first();
$page->fill($revision->toArray());
$page->slug = $this->findSuitableSlug('page', $page->name, $page->id, $book->id);
$page->text = strip_tags($page->html);
$page->text = $this->pageToPlainText($page);
$page->updated_by = user()->id;
$page->save();
$this->searchService->indexEntity($page);
@@ -953,7 +964,7 @@ class EntityRepo
if ($page->draft) {
$page->fill($data);
if (isset($data['html'])) {
$page->text = strip_tags($data['html']);
$page->text = $this->pageToPlainText($page);
}
$page->save();
return $page;

View File

@@ -58,7 +58,7 @@ return [
*/
'locale' => env('APP_LANG', 'en'),
'locales' => ['en', 'de', 'es', 'fr', 'nl', 'pt_BR', 'sk', 'ja'],
'locales' => ['en', 'de', 'es', 'fr', 'nl', 'pt_BR', 'sk', 'ja', 'pl'],
/*
|--------------------------------------------------------------------------

View File

@@ -1,7 +1,5 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class UpdateDbEncodingToUt8mb4 extends Migration
@@ -13,16 +11,9 @@ class UpdateDbEncodingToUt8mb4 extends Migration
*/
public function up()
{
$database = DB::getDatabaseName();
$tables = DB::select('SHOW TABLES');
$pdo = DB::getPdo();
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$pdo->exec('ALTER DATABASE `'.$database.'` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci');
$key = 'Tables_in_' . $database;
foreach ($tables as $table) {
$tableName = $table->$key;
$pdo->exec('ALTER TABLE `'.$tableName.'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci');
}
// Migration removed due to issues during live migration.
// Instead you can run the command `artisan bookstack:db-utf8mb4`
// which will generate out the SQL request to upgrade your DB to utf8mb4.
}
/**
@@ -32,15 +23,6 @@ class UpdateDbEncodingToUt8mb4 extends Migration
*/
public function down()
{
$database = DB::getDatabaseName();
$tables = DB::select('SHOW TABLES');
$pdo = DB::getPdo();
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$pdo->exec('ALTER DATABASE `'.$database.'` CHARACTER SET utf8 COLLATE utf8_unicode_ci');
$key = 'Tables_in_' . $database;
foreach ($tables as $table) {
$tableName = $table->$key;
$pdo->exec('ALTER TABLE `'.$tableName.'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci');
}
//
}
}

View File

@@ -12,8 +12,10 @@ const babelify = require("babelify");
const watchify = require("watchify");
const envify = require("envify");
const gutil = require("gulp-util");
const liveReload = require('gulp-livereload');
if (argv.production) process.env.NODE_ENV = 'production';
let isProduction = argv.production || process.env.NODE_ENV === 'production';
gulp.task('styles', () => {
let chain = gulp.src(['resources/assets/sass/**/*.scss'])
@@ -24,31 +26,40 @@ gulp.task('styles', () => {
}}))
.pipe(sass())
.pipe(autoprefixer('last 2 versions'));
if (argv.production) chain = chain.pipe(minifycss());
return chain.pipe(gulp.dest('public/css/'));
if (isProduction) chain = chain.pipe(minifycss());
return chain.pipe(gulp.dest('public/css/')).pipe(liveReload());
});
function scriptTask(watch=false) {
function scriptTask(watch = false) {
let props = {
basedir: 'resources/assets/js',
debug: true,
entries: ['global.js']
entries: ['global.js'],
fast: !isProduction,
cache: {},
packageCache: {},
};
let bundler = watch ? watchify(browserify(props), { poll: true }) : browserify(props);
bundler.transform(envify, {global: true}).transform(babelify, {presets: ['es2015']});
if (isProduction) {
bundler.transform(envify, {global: true}).transform(babelify, {presets: ['es2015']});
}
function rebundle() {
let stream = bundler.bundle();
stream = stream.pipe(source('common.js'));
if (argv.production) stream = stream.pipe(buffer()).pipe(uglify());
return stream.pipe(gulp.dest('public/js/'));
if (isProduction) stream = stream.pipe(buffer()).pipe(uglify());
return stream.pipe(gulp.dest('public/js/')).pipe(liveReload());
}
bundler.on('update', function() {
rebundle();
gutil.log('Rebundle...');
gutil.log('Rebundling assets...');
});
bundler.on('log', gutil.log);
return rebundle();
}
@@ -57,6 +68,7 @@ gulp.task('scripts', () => {scriptTask(false)});
gulp.task('scripts-watch', () => {scriptTask(true)});
gulp.task('default', ['styles', 'scripts-watch'], () => {
liveReload.listen();
gulp.watch("resources/assets/sass/**/*.scss", ['styles']);
});

View File

@@ -4,7 +4,8 @@
"build": "gulp build",
"production": "gulp build --production",
"dev": "gulp",
"watch": "gulp"
"watch": "gulp",
"permissions": "chown -R $USER:$USER bootstrap/cache storage public/uploads"
},
"devDependencies": {
"babelify": "^7.3.0",
@@ -13,6 +14,7 @@
"gulp": "3.9.1",
"gulp-autoprefixer": "3.1.1",
"gulp-clean-css": "^3.0.4",
"gulp-livereload": "^3.8.1",
"gulp-minify-css": "1.2.4",
"gulp-plumber": "1.1.0",
"gulp-sass": "3.1.0",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -22,9 +22,12 @@ All development on BookStack is currently done on the master branch. When it's t
SASS is used to help the CSS development and the JavaScript is run through browserify/babel to allow for writing ES6 code. Both of these are done using gulp. To run the build task you can use the following commands:
``` bash
# Build and minify for production
# Build assets for development
npm run-script build
# Build and minify assets for production
npm run-script production
# Build for dev (With sourcemaps) and watch for changes
npm run-script dev
```

View File

@@ -379,7 +379,7 @@ module.exports = function (ngApp, events) {
*/
$scope.discardDraft = function () {
let url = window.baseUrl('/ajax/page/' + pageId);
$http.get(url).then((responseData) => {
$http.get(url).then(responseData => {
if (autoSave) $interval.cancel(autoSave);
$scope.draftText = trans('entities.pages_editing_page');
$scope.isUpdateDraft = false;

View File

@@ -123,25 +123,31 @@ module.exports = function (ngApp, events) {
restrict: 'A',
link: function (scope, element, attrs) {
const menu = element.find('ul');
element.find('[dropdown-toggle]').on('click', function () {
function hide() {
menu.hide();
menu.removeClass('anim menuIn');
}
function show() {
menu.show().addClass('anim menuIn');
element.mouseleave(hide);
// Focus on input if exist in dropdown and hide on enter press
let inputs = menu.find('input');
let hasInput = inputs.length > 0;
if (hasInput) {
inputs.first().focus();
element.on('keypress', 'input', event => {
if (event.keyCode === 13) {
event.preventDefault();
menu.hide();
menu.removeClass('anim menuIn');
return false;
}
});
}
element.mouseleave(function () {
menu.hide();
menu.removeClass('anim menuIn');
});
if (inputs.length > 0) inputs.first().focus();
}
// Hide menu on option click
element.on('click', '> ul a', hide);
// Show dropdown on toggle click.
element.find('[dropdown-toggle]').on('click', show);
// Hide menu on enter press in inputs
element.on('keypress', 'input', event => {
if (event.keyCode !== 13) return true;
event.preventDefault();
hide();
return false;
});
}
};
@@ -187,30 +193,6 @@ module.exports = function (ngApp, events) {
}
scope.tinymce.extraSetups.push(tinyMceSetup);
// Custom tinyMCE plugins
tinymce.PluginManager.add('customhr', function (editor) {
editor.addCommand('InsertHorizontalRule', function () {
let hrElem = document.createElement('hr');
let cNode = editor.selection.getNode();
let parentNode = cNode.parentNode;
parentNode.insertBefore(hrElem, cNode);
});
editor.addButton('hr', {
icon: 'hr',
tooltip: 'Horizontal line',
cmd: 'InsertHorizontalRule'
});
editor.addMenuItem('hr', {
icon: 'hr',
text: 'Horizontal line',
cmd: 'InsertHorizontalRule',
context: 'insert'
});
});
tinymce.init(scope.tinymce);
}
}
@@ -251,6 +233,21 @@ module.exports = function (ngApp, events) {
extraKeys[`${metaKey}-S`] = function(cm) {scope.$emit('save-draft');};
// Show link selector
extraKeys[`Shift-${metaKey}-K`] = function(cm) {showLinkSelector()};
// Insert Link
extraKeys[`${metaKey}-K`] = function(cm) {insertLink()};
// FormatShortcuts
extraKeys[`${metaKey}-1`] = function(cm) {replaceLineStart('##');};
extraKeys[`${metaKey}-2`] = function(cm) {replaceLineStart('###');};
extraKeys[`${metaKey}-3`] = function(cm) {replaceLineStart('####');};
extraKeys[`${metaKey}-4`] = function(cm) {replaceLineStart('#####');};
extraKeys[`${metaKey}-5`] = function(cm) {replaceLineStart('');};
extraKeys[`${metaKey}-d`] = function(cm) {replaceLineStart('');};
extraKeys[`${metaKey}-6`] = function(cm) {replaceLineStart('>');};
extraKeys[`${metaKey}-q`] = function(cm) {replaceLineStart('>');};
extraKeys[`${metaKey}-7`] = function(cm) {wrapSelection('\n```\n', '\n```');};
extraKeys[`${metaKey}-8`] = function(cm) {wrapSelection('`', '`');};
extraKeys[`Shift-${metaKey}-E`] = function(cm) {wrapSelection('`', '`');};
extraKeys[`${metaKey}-9`] = function(cm) {wrapSelection('<p class="callout info">', '</div>');};
cm.setOption('extraKeys', extraKeys);
// Update data on content change
@@ -303,6 +300,73 @@ module.exports = function (ngApp, events) {
cm.setSelections(cursor);
}
// Helper to replace the start of the line
function replaceLineStart(newStart) {
let cursor = cm.getCursor();
let lineContent = cm.getLine(cursor.line);
let lineLen = lineContent.length;
let lineStart = lineContent.split(' ')[0];
// Remove symbol if already set
if (lineStart === newStart) {
lineContent = lineContent.replace(`${newStart} `, '');
cm.replaceRange(lineContent, {line: cursor.line, ch: 0}, {line: cursor.line, ch: lineLen});
cm.setCursor({line: cursor.line, ch: cursor.ch - (newStart.length + 1)});
return;
}
let alreadySymbol = /^[#>`]/.test(lineStart);
let posDif = 0;
if (alreadySymbol) {
posDif = newStart.length - lineStart.length;
lineContent = lineContent.replace(lineStart, newStart).trim();
} else if (newStart !== '') {
posDif = newStart.length + 1;
lineContent = newStart + ' ' + lineContent;
}
cm.replaceRange(lineContent, {line: cursor.line, ch: 0}, {line: cursor.line, ch: lineLen});
cm.setCursor({line: cursor.line, ch: cursor.ch + posDif});
}
function wrapLine(start, end) {
let cursor = cm.getCursor();
let lineContent = cm.getLine(cursor.line);
let lineLen = lineContent.length;
let newLineContent = lineContent;
if (lineContent.indexOf(start) === 0 && lineContent.slice(-end.length) === end) {
newLineContent = lineContent.slice(start.length, lineContent.length - end.length);
} else {
newLineContent = `${start}${lineContent}${end}`;
}
cm.replaceRange(newLineContent, {line: cursor.line, ch: 0}, {line: cursor.line, ch: lineLen});
cm.setCursor({line: cursor.line, ch: cursor.ch + (newLineContent.length - lineLen)});
}
function wrapSelection(start, end) {
let selection = cm.getSelection();
if (selection === '') return wrapLine(start, end);
let newSelection = selection;
let frontDiff = 0;
let endDiff = 0;
if (selection.indexOf(start) === 0 && selection.slice(-end.length) === end) {
newSelection = selection.slice(start.length, selection.length - end.length);
endDiff = -(end.length + start.length);
} else {
newSelection = `${start}${selection}${end}`;
endDiff = start.length + end.length;
}
let selections = cm.listSelections()[0];
cm.replaceSelection(newSelection);
let headFirst = selections.head.ch <= selections.anchor.ch;
selections.head.ch += headFirst ? frontDiff : endDiff;
selections.anchor.ch += headFirst ? endDiff : frontDiff;
cm.setSelections([selections]);
}
// Handle image upload and add image into markdown content
function uploadImage(file) {
if (file === null || file.type.indexOf('image') !== 0) return;
@@ -345,6 +409,16 @@ module.exports = function (ngApp, events) {
});
}
function insertLink() {
let cursorPos = cm.getCursor('from');
let selectedText = cm.getSelection() || '';
let newText = `[${selectedText}]()`;
cm.focus();
cm.replaceSelection(newText);
let cursorPosDiff = (selectedText === '') ? -3 : -1;
cm.setCursor(cursorPos.line, cursorPos.ch + newText.length+cursorPosDiff);
}
// Show the image manager and handle image insertion
function showImageManager() {
let cursorPos = cm.getCursor('from');

View File

@@ -52,14 +52,36 @@ function editorPaste(e, editor) {
function registerEditorShortcuts(editor) {
// Headers
for (let i = 1; i < 5; i++) {
editor.addShortcut('meta+' + i, '', ['FormatBlock', false, 'h' + i]);
editor.shortcuts.add('meta+' + i, '', ['FormatBlock', false, 'h' + (i+1)]);
}
// Other block shortcuts
editor.addShortcut('meta+q', '', ['FormatBlock', false, 'blockquote']);
editor.addShortcut('meta+d', '', ['FormatBlock', false, 'p']);
editor.addShortcut('meta+e', '', ['codeeditor', false, 'pre']);
editor.addShortcut('meta+shift+E', '', ['FormatBlock', false, 'code']);
editor.shortcuts.add('meta+5', '', ['FormatBlock', false, 'p']);
editor.shortcuts.add('meta+d', '', ['FormatBlock', false, 'p']);
editor.shortcuts.add('meta+6', '', ['FormatBlock', false, 'blockquote']);
editor.shortcuts.add('meta+q', '', ['FormatBlock', false, 'blockquote']);
editor.shortcuts.add('meta+7', '', ['codeeditor', false, 'pre']);
editor.shortcuts.add('meta+e', '', ['codeeditor', false, 'pre']);
editor.shortcuts.add('meta+8', '', ['FormatBlock', false, 'code']);
editor.shortcuts.add('meta+shift+E', '', ['FormatBlock', false, 'code']);
// Loop through callout styles
editor.shortcuts.add('meta+9', '', function() {
let selectedNode = editor.selection.getNode();
let formats = ['info', 'success', 'warning', 'danger'];
if (!selectedNode || selectedNode.className.indexOf('callout') === -1) {
editor.formatter.apply('calloutinfo');
return;
}
for (let i = 0; i < formats.length; i++) {
if (selectedNode.className.indexOf(formats[i]) === -1) continue;
let newFormat = (i === formats.length -1) ? formats[0] : formats[i+1];
editor.formatter.apply('callout' + newFormat);
return;
}
editor.formatter.apply('p');
});
}
@@ -120,7 +142,7 @@ function codePlugin() {
$codeMirrorContainer.replaceWith($pre);
}
window.tinymce.PluginManager.add('codeeditor', (editor, url) => {
window.tinymce.PluginManager.add('codeeditor', function(editor, url) {
let $ = editor.$;
@@ -173,7 +195,32 @@ function codePlugin() {
});
}
function hrPlugin() {
window.tinymce.PluginManager.add('customhr', function (editor) {
editor.addCommand('InsertHorizontalRule', function () {
let hrElem = document.createElement('hr');
let cNode = editor.selection.getNode();
let parentNode = cNode.parentNode;
parentNode.insertBefore(hrElem, cNode);
});
editor.addButton('hr', {
icon: 'hr',
tooltip: 'Horizontal line',
cmd: 'InsertHorizontalRule'
});
editor.addMenuItem('hr', {
icon: 'hr',
text: 'Horizontal line',
cmd: 'InsertHorizontalRule',
context: 'insert'
});
});
}
module.exports = function() {
hrPlugin();
codePlugin();
let settings = {
selector: '#html-editor',
@@ -207,10 +254,10 @@ module.exports = function() {
{title: "Code Block", icon: "code", cmd: 'codeeditor', format: 'codeeditor'},
{title: "Inline Code", icon: "code", inline: "code"},
{title: "Callouts", items: [
{title: "Success", block: 'p', exact: true, attributes : {'class' : 'callout success'}},
{title: "Info", block: 'p', exact: true, attributes : {'class' : 'callout info'}},
{title: "Warning", block: 'p', exact: true, attributes : {'class' : 'callout warning'}},
{title: "Danger", block: 'p', exact: true, attributes : {'class' : 'callout danger'}}
{title: "Info", format: 'calloutinfo'},
{title: "Success", format: 'calloutsuccess'},
{title: "Warning", format: 'calloutwarning'},
{title: "Danger", format: 'calloutdanger'}
]},
],
style_formats_merge: false,
@@ -219,6 +266,10 @@ module.exports = function() {
alignleft: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-left'},
aligncenter: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-center'},
alignright: {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-right'},
calloutsuccess: {block: 'p', exact: true, attributes: {class: 'callout success'}},
calloutinfo: {block: 'p', exact: true, attributes: {class: 'callout info'}},
calloutwarning: {block: 'p', exact: true, attributes: {class: 'callout warning'}},
calloutdanger: {block: 'p', exact: true, attributes: {class: 'callout danger'}}
},
file_browser_callback: function (field_name, url, type, win) {

View File

@@ -149,7 +149,7 @@ let methods = {
updateSearch(e) {
e.preventDefault();
window.location = '/search?term=' + encodeURIComponent(this.termString);
window.location = window.baseUrl('/search?term=' + encodeURIComponent(this.termString));
},
enableDate(optionName) {
@@ -192,4 +192,4 @@ function created() {
module.exports = {
data, computed, methods, created
};
};

View File

@@ -142,7 +142,6 @@ form.search-box {
color: #aaa;
padding: 0 $-xs;
}
.faded {
a, button, span, span > div {
color: #666;
@@ -178,6 +177,8 @@ form.search-box {
padding-left: 0;
}
}
.action-buttons .dropdown-container:last-child a {
padding-right: 0;
padding-left: $-s;
@@ -196,6 +197,25 @@ form.search-box {
}
}
@include smaller-than($m) {
.breadcrumbs .text-button, .action-buttons .text-button {
padding: $-s $-xs;
}
.action-buttons .dropdown-container:last-child a {
padding-left: $-xs;
}
.breadcrumbs .text-button {
font-size: 0;
}
.breadcrumbs a i {
font-size: $fs-m;
padding-right: 0;
}
.breadcrumbs span.sep {
padding: 0 $-xxs;
}
}
.nav-tabs {
text-align: center;
a, .tab-item {

View File

@@ -152,6 +152,14 @@ pre {
}
}
@media print {
pre {
padding-left: 12px;
}
pre:after {
display: none;
}
}
blockquote {
display: block;

View File

@@ -122,6 +122,7 @@ return [
'pt_BR' => 'Português do Brasil',
'sk' => 'Slovensky',
'ja' => '日本語',
'pl' => 'Polski',
]
///////////////////////////////////
];

View File

@@ -10,7 +10,7 @@ return [
| these language lines according to your application's requirements.
|
*/
'failed' => 'Ces informations ne correspondent a aucun compte.',
'failed' => 'Ces informations ne correspondent à aucun compte.',
'throttle' => "Trop d'essais, veuillez réessayer dans :seconds secondes.",
/**
@@ -26,7 +26,7 @@ return [
'password' => 'Mot de passe',
'password_confirm' => 'Confirmez le mot de passe',
'password_hint' => 'Doit faire plus de 5 caractères',
'forgot_password' => 'Mot de passe oublié?',
'forgot_password' => 'Mot de passe oublié ?',
'remember_me' => 'Se souvenir de moi',
'ldap_email_hint' => "Merci d'entrer une adresse e-mail pour ce compte",
'create_account' => 'Créer un compte',
@@ -35,9 +35,9 @@ return [
'social_registration_text' => "S'inscrire et se connecter avec un réseau social",
'register_thanks' => 'Merci pour votre enregistrement',
'register_confirm' => 'Vérifiez vos e-mails et cliquer sur le lien de confirmation pour rejoindre :appName.',
'register_confirm' => 'Vérifiez vos e-mails et cliquez sur le lien de confirmation pour rejoindre :appName.',
'registrations_disabled' => "L'inscription est désactivée pour le moment",
'registration_email_domain_invalid' => 'Cette adresse e-mail ne peux pas adcéder à l\'application',
'registration_email_domain_invalid' => 'Cette adresse e-mail ne peut pas accéder à l\'application',
'register_success' => 'Merci pour votre inscription. Vous êtes maintenant inscrit(e) et connecté(e)',
@@ -51,7 +51,7 @@ return [
'reset_password_success' => 'Votre mot de passe a été réinitialisé avec succès.',
'email_reset_subject' => 'Réinitialisez votre mot de passe pour :appName',
'email_reset_text' => 'Vous recevez cet e-mail parceque nous avons reçu une demande de réinitialisation pour votre compte',
'email_reset_text' => 'Vous recevez cet e-mail parce que nous avons reçu une demande de réinitialisation pour votre compte',
'email_reset_not_requested' => 'Si vous n\'avez pas effectué cette demande, vous pouvez ignorer cet e-mail.',
@@ -59,11 +59,11 @@ return [
* Email Confirmation
*/
'email_confirm_subject' => 'Confirmez votre adresse e-mail pour :appName',
'email_confirm_greeting' => 'Merci d\'avoir rejoint :appName!',
'email_confirm_text' => 'Merci de confirmer en cliquant sur le lien ci-dessous:',
'email_confirm_greeting' => 'Merci d\'avoir rejoint :appName !',
'email_confirm_text' => 'Merci de confirmer en cliquant sur le lien ci-dessous :',
'email_confirm_action' => 'Confirmez votre adresse e-mail',
'email_confirm_send_error' => 'La confirmation par e-mail est requise mais le système n\'a pas pu envoyer l\'e-mail. Contactez l\'administrateur système.',
'email_confirm_success' => 'Votre adresse e-mail a été confirmée!',
'email_confirm_success' => 'Votre adresse e-mail a été confirmée !',
'email_confirm_resent' => 'L\'e-mail de confirmation a été ré-envoyé. Vérifiez votre boîte de récéption.',
'email_not_confirmed' => 'Adresse e-mail non confirmée',

View File

@@ -9,7 +9,7 @@ return [
'back' => 'Retour',
'save' => 'Enregistrer',
'continue' => 'Continuer',
'select' => 'Selectionner',
'select' => 'Sélectionner',
/**
* Form Labels
@@ -53,6 +53,6 @@ return [
/**
* Email Content
*/
'email_action_help' => 'Si vous rencontrez des problèmes pour cliquer le bouton ":actionText", copiez et collez l\'adresse ci-dessous dans votre navigateur:',
'email_action_help' => 'Si vous rencontrez des problèmes pour cliquer sur le bouton ":actionText", copiez et collez l\'adresse ci-dessous dans votre navigateur :',
'email_rights' => 'Tous droits réservés',
];

View File

@@ -12,7 +12,7 @@ return [
'recently_update' => 'Mis à jour récemment',
'recently_viewed' => 'Vus récemment',
'recent_activity' => 'Activité récente',
'create_now' => 'En créer un récemment',
'create_now' => 'En créer un maintenant',
'revisions' => 'Révisions',
'meta_created' => 'Créé :timeLength',
'meta_created_name' => 'Créé :timeLength par :user',
@@ -59,8 +59,8 @@ return [
'books_create' => 'Créer un nouveau livre',
'books_delete' => 'Supprimer un livre',
'books_delete_named' => 'Supprimer le livre :bookName',
'books_delete_explain' => 'Ceci va supprimer le livre nommé \':bookName\', Tous les chapitres et pages seront supprimés.',
'books_delete_confirmation' => 'Êtes-vous sûr(e) de vouloir supprimer ce livre?',
'books_delete_explain' => 'Ceci va supprimer le livre nommé \':bookName\', tous les chapitres et pages seront supprimés.',
'books_delete_confirmation' => 'Êtes-vous sûr(e) de vouloir supprimer ce livre ?',
'books_edit' => 'Modifier le livre',
'books_edit_named' => 'Modifier le livre :bookName',
'books_form_book_name' => 'Nom du livre',
@@ -90,18 +90,18 @@ return [
'chapters_create' => 'Créer un nouveau chapitre',
'chapters_delete' => 'Supprimer le chapitre',
'chapters_delete_named' => 'Supprimer le chapitre :chapterName',
'chapters_delete_explain' => 'Ceci va supprimer le chapitre \':chapterName\', Toutes les pages seront déplacée dans le livre parent.',
'chapters_delete_confirm' => 'Etes-vous sûr(e) de vouloir supprimer ce chapitre?',
'chapters_delete_explain' => 'Ceci va supprimer le chapitre \':chapterName\', toutes les pages seront déplacées dans le livre parent.',
'chapters_delete_confirm' => 'Etes-vous sûr(e) de vouloir supprimer ce chapitre ?',
'chapters_edit' => 'Modifier le chapitre',
'chapters_edit_named' => 'Modifier le chapitre :chapterName',
'chapters_save' => 'Enregistrer le chapitre',
'chapters_move' => 'Déplace le chapitre',
'chapters_move' => 'Déplacer le chapitre',
'chapters_move_named' => 'Déplacer le chapitre :chapterName',
'chapter_move_success' => 'Chapitre déplacé dans :bookName',
'chapters_permissions' => 'Permissions du chapitre',
'chapters_empty' => 'Il n\'y a pas de pages dans ce chapitre actuellement.',
'chapters_empty' => 'Il n\'y a pas de page dans ce chapitre actuellement.',
'chapters_permissions_active' => 'Permissions du chapitre activées',
'chapters_permissions_success' => 'Permissions du chapitres mises à jour',
'chapters_permissions_success' => 'Permissions du chapitre mises à jour',
/**
* Pages
@@ -118,8 +118,8 @@ return [
'pages_delete_draft' => 'Supprimer le brouillon',
'pages_delete_success' => 'Page supprimée',
'pages_delete_draft_success' => 'Brouillon supprimé',
'pages_delete_confirm' => 'Êtes-vous sûr(e) de vouloir supprimer cette page?',
'pages_delete_draft_confirm' => 'Êtes-vous sûr(e) de vouloir supprimer ce brouillon?',
'pages_delete_confirm' => 'Êtes-vous sûr(e) de vouloir supprimer cette page ?',
'pages_delete_draft_confirm' => 'Êtes-vous sûr(e) de vouloir supprimer ce brouillon ?',
'pages_editing_named' => 'Modification de la page :pageName',
'pages_edit_toggle_header' => 'Afficher/cacher l\'en-tête',
'pages_edit_save_draft' => 'Enregistrer le brouillon',
@@ -131,7 +131,7 @@ return [
'pages_edit_discard_draft' => 'Ecarter le brouillon',
'pages_edit_set_changelog' => 'Remplir le journal des changements',
'pages_edit_enter_changelog_desc' => 'Entrez une brève description des changements effectués',
'pages_edit_enter_changelog' => 'Entrez dans le journal des changements',
'pages_edit_enter_changelog' => 'Entrer dans le journal des changements',
'pages_save' => 'Enregistrez la page',
'pages_title' => 'Titre de la page',
'pages_name' => 'Nom de la page',
@@ -139,7 +139,7 @@ return [
'pages_md_preview' => 'Prévisualisation',
'pages_md_insert_image' => 'Insérer une image',
'pages_md_insert_link' => 'Insérer un lien',
'pages_not_in_chapter' => 'La page n\'est pas dans un chanpitre',
'pages_not_in_chapter' => 'La page n\'est pas dans un chapitre',
'pages_move' => 'Déplacer la page',
'pages_move_success' => 'Page déplacée à ":parentName"',
'pages_permissions' => 'Permissions de la page',
@@ -160,15 +160,15 @@ return [
'pages_initial_revision' => 'Publication initiale',
'pages_initial_name' => 'Nouvelle page',
'pages_editing_draft_notification' => 'Vous éditez actuellement un brouillon qui a été sauvé :timeDiff.',
'pages_draft_edited_notification' => 'La page a été mise à jour depuis votre dernière visit. Vous devriez écarter ce brouillon.',
'pages_draft_edited_notification' => 'La page a été mise à jour depuis votre dernière visite. Vous devriez écarter ce brouillon.',
'pages_draft_edit_active' => [
'start_a' => ':count utilisateurs ont commencé a éditer cette page',
'start_a' => ':count utilisateurs ont commencé à éditer cette page',
'start_b' => ':userName a commencé à éditer cette page',
'time_a' => 'depuis la dernière sauvegarde',
'time_b' => 'dans les :minCount dernières minutes',
'message' => ':start :time. Attention a ne pas écraser les mises à jour de quelqu\'un d\'autre!',
'message' => ':start :time. Attention à ne pas écraser les mises à jour de quelqu\'un d\'autre !',
],
'pages_draft_discarded' => 'Brouuillon écarté, la page est dans sa version actuelle.',
'pages_draft_discarded' => 'Brouillon écarté, la page est dans sa version actuelle.',
/**
* Editor sidebar
@@ -210,7 +210,7 @@ return [
*/
'profile_user_for_x' => 'Utilisateur depuis :time',
'profile_created_content' => 'Contenu créé',
'profile_not_created_pages' => ':userName n\'a pas créé de pages',
'profile_not_created_chapters' => ':userName n\'a pas créé de chapitres',
'profile_not_created_books' => ':userName n\'a pas créé de livres',
'profile_not_created_pages' => ':userName n\'a pas créé de page',
'profile_not_created_chapters' => ':userName n\'a pas créé de chapitre',
'profile_not_created_books' => ':userName n\'a pas créé de livre',
];

View File

@@ -18,21 +18,21 @@ return [
'ldap_fail_anonymous' => 'L\'accès LDAP anonyme n\'a pas abouti',
'ldap_fail_authed' => 'L\'accès LDAP n\'a pas abouti avec cet utilisateur et ce mot de passe',
'ldap_extension_not_installed' => 'L\'extention LDAP PHP n\'est pas installée',
'ldap_cannot_connect' => 'Cannot connect to ldap server, Initial connection failed',
'social_no_action_defined' => 'No action defined',
'social_account_in_use' => 'Cet compte :socialAccount est déjà utilisé. Essayez de vous connecter via :socialAccount.',
'social_account_email_in_use' => 'L\'email :email Est déjà utilisé. Si vous avez déjà un compte :socialAccount, vous pouvez le joindre à votre profil existant.',
'ldap_cannot_connect' => 'Impossible de se connecter au serveur LDAP, la connexion initiale a échoué',
'social_no_action_defined' => 'Pas d\'action définie',
'social_account_in_use' => 'Ce compte :socialAccount est déjà utilisé. Essayez de vous connecter via :socialAccount.',
'social_account_email_in_use' => 'L\'email :email est déjà utilisé. Si vous avez déjà un compte :socialAccount, vous pouvez le joindre à votre profil existant.',
'social_account_existing' => 'Ce compte :socialAccount est déjà rattaché à votre profil.',
'social_account_already_used_existing' => 'Ce compte :socialAccount est déjà utilisé par un autre utilisateur.',
'social_account_not_used' => 'Ce compte :socialAccount n\'est lié à aucun utilisateur. ',
'social_account_register_instructions' => 'Si vous n\'avez pas encore de compte, vous pouvez le lier avec l\'option :socialAccount.',
'social_driver_not_found' => 'Social driver not found',
'social_driver_not_configured' => 'Your :socialAccount social settings are not configured correctly.',
'social_driver_not_found' => 'Pilote de compte social absent',
'social_driver_not_configured' => 'Vos préférences pour le compte :socialAccount sont incorrectes.',
// System
'path_not_writable' => 'File path :filePath could not be uploaded to. Ensure it is writable to the server.',
'path_not_writable' => 'Impossible d\'écrire dans :filePath. Assurez-vous d\'avoir les droits d\'écriture sur le serveur',
'cannot_get_image_from_url' => 'Impossible de récupérer l\'image depuis :url',
'cannot_create_thumbs' => 'Le serveur ne peux pas créer de miniatures, vérifier que l\extensions GD PHP est installée.',
'cannot_create_thumbs' => 'Le serveur ne peut pas créer de miniature, vérifier que l\'extension PHP GD est installée.',
'server_upload_limit' => 'La taille du fichier est trop grande.',
'image_upload_error' => 'Une erreur est survenue pendant l\'envoi de l\'image',
@@ -57,7 +57,7 @@ return [
// Roles
'role_cannot_be_edited' => 'Ce rôle ne peut pas être modifié',
'role_system_cannot_be_deleted' => 'Ceci est un rôle du système et on ne peut pas le supprimer',
'role_system_cannot_be_deleted' => 'Ceci est un rôle du système et ne peut pas être supprimé',
'role_registration_default_cannot_delete' => 'Ce rôle ne peut pas être supprimé tant qu\'il est le rôle par défaut',
// Error pages

View File

@@ -16,7 +16,7 @@ return [
'password' => 'Les mots de passe doivent faire au moins 6 caractères et correspondre à la confirmation.',
'user' => "Nous n'avons pas trouvé d'utilisateur avec cette adresse.",
'token' => 'Le jeton de réinitialisation est invalide.',
'sent' => 'Nous vous avons envoyé un lien de réinitialisation de mot de passe!',
'reset' => 'Votre mot de passe a été réinitialisé!',
'sent' => 'Nous vous avons envoyé un lien de réinitialisation de mot de passe !',
'reset' => 'Votre mot de passe a été réinitialisé !',
];

View File

@@ -19,27 +19,27 @@ return [
'app_settings' => 'Préférences de l\'application',
'app_name' => 'Nom de l\'application',
'app_name_desc' => 'Ce nom est affiché dans l\'en-tête et les e-mails.',
'app_name_header' => 'Afficher le nom dans l\'en-tête?',
'app_public_viewing' => 'Accepter le visionnage public des pages?',
'app_secure_images' => 'Activer l\'ajout d\'image sécurisé?',
'app_name_header' => 'Afficher le nom dans l\'en-tête ?',
'app_public_viewing' => 'Accepter le visionnage public des pages ?',
'app_secure_images' => 'Activer l\'ajout d\'image sécurisé ?',
'app_secure_images_desc' => 'Pour des questions de performances, toutes les images sont publiques. Cette option ajoute une chaîne aléatoire difficile à deviner dans les URLs des images.',
'app_editor' => 'Editeur des pages',
'app_editor_desc' => 'Sélectionnez l\'éditeur qui sera utilisé pour modifier les pages.',
'app_custom_html' => 'HTML personnalisé dans l\'en-tête',
'app_custom_html_desc' => 'Le contenu inséré ici sera jouté en bas de la balise <head> de toutes les pages. Vous pouvez l\'utiliser pour ajouter du CSS personnalisé ou un tracker analytique.',
'app_custom_html_desc' => 'Le contenu inséré ici sera ajouté en bas de la balise <head> de toutes les pages. Vous pouvez l\'utiliser pour ajouter du CSS personnalisé ou un tracker analytique.',
'app_logo' => 'Logo de l\'Application',
'app_logo_desc' => 'Cette image doit faire 43px de hauteur. <br>Les images plus larges seront réduites.',
'app_primary_color' => 'Couleur principale de l\'application',
'app_primary_color_desc' => 'This should be a hex value. <br>Leave empty to reset to the default color.',
'app_primary_color_desc' => 'Cela devrait être une valeur hexadécimale. <br>Laisser vide pour rétablir la couleur par défaut.',
/**
* Registration settings
*/
'reg_settings' => 'Préférence pour l\'inscription',
'reg_allow' => 'Accepter l\'inscription?',
'reg_allow' => 'Accepter l\'inscription ?',
'reg_default_role' => 'Rôle par défaut lors de l\'inscription',
'reg_confirm_email' => 'Obliger la confirmation par e-mail?',
'reg_confirm_email' => 'Obliger la confirmation par e-mail ?',
'reg_confirm_email_desc' => 'Si la restriction de domaine est activée, la confirmation sera automatiquement obligatoire et cette valeur sera ignorée.',
'reg_confirm_restrict_domain' => 'Restreindre l\'inscription à un domaine',
'reg_confirm_restrict_domain_desc' => 'Entrez une liste de domaines acceptés lors de l\'inscription, séparés par une virgule. Les utilisateur recevront un e-mail de confirmation à cette adresse. <br> Les utilisateurs pourront changer leur adresse après inscription s\'ils le souhaitent.',
@@ -57,17 +57,17 @@ return [
'role_delete_confirm' => 'Ceci va supprimer le rôle \':roleName\'.',
'role_delete_users_assigned' => 'Ce rôle a :userCount utilisateurs assignés. Vous pouvez choisir un rôle de remplacement pour ces utilisateurs.',
'role_delete_no_migration' => "Ne pas assigner de nouveau rôle",
'role_delete_sure' => 'Êtes vous sûr(e) de vouloir supprimer ce rôle?',
'role_delete_sure' => 'Êtes vous sûr(e) de vouloir supprimer ce rôle ?',
'role_delete_success' => 'Le rôle a été supprimé avec succès',
'role_edit' => 'Modifier le rôle',
'role_details' => 'Détails du rôle',
'role_name' => 'Nom du Rôle',
'role_name' => 'Nom du rôle',
'role_desc' => 'Courte description du rôle',
'role_system' => 'Permissions système',
'role_manage_users' => 'Gérer les utilisateurs',
'role_manage_roles' => 'Gérer les rôles et permissions',
'role_manage_entity_permissions' => 'Gérer les permissions sur les livres, chapitres et pages',
'role_manage_own_entity_permissions' => 'Gérer les permissions de ses propres livres chapitres et pages',
'role_manage_own_entity_permissions' => 'Gérer les permissions de ses propres livres, chapitres, et pages',
'role_manage_settings' => 'Gérer les préférences de l\'application',
'role_asset' => 'Asset Permissions',
'role_asset_desc' => 'These permissions control default access to the assets within the system. Permissions on Books, Chapters and Pages will override these permissions.',
@@ -94,7 +94,7 @@ return [
'users_delete' => 'Supprimer un utilisateur',
'users_delete_named' => 'Supprimer l\'utilisateur :userName',
'users_delete_warning' => 'Ceci va supprimer \':userName\' du système.',
'users_delete_confirm' => 'Êtes-vous sûr(e) de vouloir supprimer cet utilisateur?',
'users_delete_confirm' => 'Êtes-vous sûr(e) de vouloir supprimer cet utilisateur ?',
'users_delete_success' => 'Utilisateurs supprimés avec succès',
'users_edit' => 'Modifier l\'utilisateur',
'users_edit_profile' => 'Modifier le profil',
@@ -106,7 +106,7 @@ return [
'users_social_accounts_info' => 'Vous pouvez connecter des réseaux sociaux à votre compte pour vous connecter plus rapidement. Déconnecter un compte n\'enlèvera pas les accès autorisés précédemment sur votre compte de réseau social.',
'users_social_connect' => 'Connecter le compte',
'users_social_disconnect' => 'Déconnecter le compte',
'users_social_connected' => 'Votre compte :socialAccount a élté ajouté avec succès.',
'users_social_connected' => 'Votre compte :socialAccount a été ajouté avec succès.',
'users_social_disconnected' => 'Votre compte :socialAccount a été déconnecté avec succès',
];

View File

@@ -0,0 +1,40 @@
<?php
return [
/**
* Activity text strings.
* Is used for all the text within activity logs & notifications.
*/
// Pages
'page_create' => 'utworzono stronę',
'page_create_notification' => 'Strona utworzona pomyślnie',
'page_update' => 'zaktualizowano stronę',
'page_update_notification' => 'Strona zaktualizowana pomyślnie',
'page_delete' => 'usunięto stronę',
'page_delete_notification' => 'Strona usunięta pomyślnie',
'page_restore' => 'przywrócono stronę',
'page_restore_notification' => 'Stronga przywrócona pomyślnie',
'page_move' => 'przeniesiono stronę',
// Chapters
'chapter_create' => 'utworzono rozdział',
'chapter_create_notification' => 'Rozdział utworzony pomyślnie',
'chapter_update' => 'zaktualizowano rozdział',
'chapter_update_notification' => 'Rozdział zaktualizowany pomyślnie',
'chapter_delete' => 'usunięto rozdział',
'chapter_delete_notification' => 'Rozdział usunięty pomyślnie',
'chapter_move' => 'przeniesiono rozdział',
// Books
'book_create' => 'utworzono księgę',
'book_create_notification' => 'Księga utworzona pomyślnie',
'book_update' => 'zaktualizowano księgę',
'book_update_notification' => 'Księga zaktualizowana pomyślnie',
'book_delete' => 'usunięto księgę',
'book_delete_notification' => 'Księga usunięta pomyślnie',
'book_sort' => 'posortowano księgę',
'book_sort_notification' => 'Księga posortowana pomyślnie',
];

View File

@@ -0,0 +1,76 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'These credentials do not match our records.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
/**
* Login & Register
*/
'sign_up' => 'Zarejestruj się',
'log_in' => 'Zaloguj się',
'log_in_with' => 'Zaloguj się za pomocą :socialDriver',
'sign_up_with' => 'Zarejestruj się za pomocą :socialDriver',
'logout' => 'Wyloguj',
'name' => 'Imię',
'username' => 'Nazwa użytkownika',
'email' => 'Email',
'password' => 'Hasło',
'password_confirm' => 'Potwierdzenie hasła',
'password_hint' => 'Musi mieć więcej niż 5 znaków',
'forgot_password' => 'Przypomnij hasło',
'remember_me' => 'Zapamiętaj mnie',
'ldap_email_hint' => 'Wprowadź adres email dla tego konta.',
'create_account' => 'Utwórz konto',
'social_login' => 'Logowanie za pomocą konta społecznościowego',
'social_registration' => 'Rejestracja za pomocą konta społecznościowego',
'social_registration_text' => 'Zarejestruj się za pomocą innej usługi.',
'register_thanks' => 'Dziękujemy za rejestrację!',
'register_confirm' => 'Sprawdź podany adres e-mail i kliknij w link, by uzyskać dostęp do :appName.',
'registrations_disabled' => 'Rejestracja jest obecnie zablokowana.',
'registration_email_domain_invalid' => 'Adresy e-mail z tej domeny nie mają dostępu do tej aplikacji',
'register_success' => 'Dziękujemy za rejestrację! Zalogowano Cię automatycznie.',
/**
* Password Reset
*/
'reset_password' => 'Resetowanie hasła',
'reset_password_send_instructions' => 'Wprowadź adres e-mail powiązany z Twoim kontem, by otrzymać link do resetowania hasła.',
'reset_password_send_button' => 'Wyślij link do resetowania hasła',
'reset_password_sent_success' => 'Wysłano link do resetowania hasła na adres :email.',
'reset_password_success' => 'Hasło zostało zresetowane pomyślnie.',
'email_reset_subject' => 'Resetowanie hasła do :appName',
'email_reset_text' => 'Otrzymujesz tę wiadomość ponieważ ktoś zażądał zresetowania hasła do Twojego konta.',
'email_reset_not_requested' => 'Jeśli to nie Ty złożyłeś żądanie zresetowania hasła, zignoruj tę wiadomość.',
/**
* Email Confirmation
*/
'email_confirm_subject' => 'Potwierdź swój adres email w :appName',
'email_confirm_greeting' => 'Dziękujemy za dołączenie do :appName!',
'email_confirm_text' => 'Prosimy byś potwierdził swoje hasło klikając przycisk poniżej:',
'email_confirm_action' => 'Potwierdź email',
'email_confirm_send_error' => 'Wymagane jest potwierdzenie hasła, lecz wiadomość nie mogła zostać wysłana. Skontaktuj się z administratorem w celu upewnienia się, że skrzynka została skonfigurowana prawidłowo.',
'email_confirm_success' => 'Adres email został potwierdzony!',
'email_confirm_resent' => 'Wiadomość potwierdzająca została wysłana, sprawdź swoją skrzynkę.',
'email_not_confirmed' => 'Adres email niepotwierdzony',
'email_not_confirmed_text' => 'Twój adres email nie został jeszcze potwierdzony.',
'email_not_confirmed_click_link' => 'Aby potwierdzić swoje konto kliknij w link wysłany w wiadomości po rejestracji.',
'email_not_confirmed_resend' => 'Jeśli wiadomość do Ciebie nie dotarła możesz wysłać ją ponownie wypełniając formularz poniżej.',
'email_not_confirmed_resend_button' => 'Wyślij ponownie wiadomość z potwierdzeniem',
];

View File

@@ -0,0 +1,59 @@
<?php
return [
/**
* Buttons
*/
'cancel' => 'Anuluj',
'confirm' => 'Zatwierdź',
'back' => 'Wstecz',
'save' => 'Zapisz',
'continue' => 'Kontynuuj',
'select' => 'Wybierz',
/**
* Form Labels
*/
'name' => 'Nazwa',
'description' => 'Opis',
'role' => 'Rola',
/**
* Actions
*/
'actions' => 'Akcje',
'view' => 'Widok',
'create' => 'Utwórz',
'update' => 'Zaktualizuj',
'edit' => 'Edytuj',
'sort' => 'Sortuj',
'move' => 'Przenieś',
'delete' => 'Usuń',
'search' => 'Szukaj',
'search_clear' => 'Wyczyść wyszukiwanie',
'reset' => 'Resetuj',
'remove' => 'Usuń',
'add' => 'Dodaj',
/**
* Misc
*/
'deleted_user' => 'Użytkownik usunięty',
'no_activity' => 'Brak aktywności do pokazania',
'no_items' => 'Brak elementów do wyświetlenia',
'back_to_top' => 'Powrót na górę',
'toggle_details' => 'Włącz/wyłącz szczegóły',
/**
* Header
*/
'view_profile' => 'Zobacz profil',
'edit_profile' => 'Edytuj profil',
/**
* Email Content
*/
'email_action_help' => 'Jeśli masz problem z kliknięciem przycisku ":actionText", skopiuj i wklej poniższy adres URL w nowej karcie swojej przeglądarki:',
'email_rights' => 'Wszelkie prawa zastrzeżone',
];

View File

@@ -0,0 +1,32 @@
<?php
return [
/**
* Image Manager
*/
'image_select' => 'Wybór obrazka',
'image_all' => 'Wszystkie',
'image_all_title' => 'Zobacz wszystkie obrazki',
'image_book_title' => 'Zobacz obrazki zapisane w tej księdze',
'image_page_title' => 'Zobacz obrazki zapisane na tej stronie',
'image_search_hint' => 'Szukaj po nazwie obrazka',
'image_uploaded' => 'Udostępniono :uploadedDate',
'image_load_more' => 'Wczytaj więcej',
'image_image_name' => 'Nazwa obrazka',
'image_delete_confirm' => 'Ten obrazek jest używany na stronach poniżej, kliknij ponownie Usuń by potwierdzić usunięcie obrazka.',
'image_select_image' => 'Wybierz obrazek',
'image_dropzone' => 'Upuść obrazki tutaj lub kliknij by wybrać obrazki do udostępnienia',
'images_deleted' => 'Usunięte obrazki',
'image_preview' => 'Podgląd obrazka',
'image_upload_success' => 'Obrazek wysłany pomyślnie',
'image_update_success' => 'Szczegóły obrazka zaktualizowane pomyślnie',
'image_delete_success' => 'Obrazek usunięty pomyślnie',
/**
* Code editor
*/
'code_editor' => 'Edytuj kod',
'code_language' => 'Język kodu',
'code_content' => 'Zawartość kodu',
'code_save' => 'Zapisz kod',
];

View File

@@ -0,0 +1,237 @@
<?php
return [
/**
* Shared
*/
'recently_created' => 'Ostatnio utworzone',
'recently_created_pages' => 'Ostatnio utworzone strony',
'recently_updated_pages' => 'Ostatnio zaktualizowane strony',
'recently_created_chapters' => 'Ostatnio utworzone rozdziały',
'recently_created_books' => 'Ostatnio utworzone księgi',
'recently_update' => 'Ostatnio zaktualizowane',
'recently_viewed' => 'Ostatnio wyświetlane',
'recent_activity' => 'Ostatnia aktywność',
'create_now' => 'Utwórz teraz',
'revisions' => 'Rewizje',
'meta_revision' => 'Rewizja #:revisionCount',
'meta_created' => 'Utworzono :timeLength',
'meta_created_name' => 'Utworzono :timeLength przez :user',
'meta_updated' => 'Zaktualizowano :timeLength',
'meta_updated_name' => 'Zaktualizowano :timeLength przez :user',
'x_pages' => ':count stron',
'entity_select' => 'Wybór encji',
'images' => 'Obrazki',
'my_recent_drafts' => 'Moje ostatnie szkice',
'my_recently_viewed' => 'Moje ostatnio wyświetlane',
'no_pages_viewed' => 'Nie wyświetlano żadnych stron',
'no_pages_recently_created' => 'Nie utworzono ostatnio żadnych stron',
'no_pages_recently_updated' => 'Nie zaktualizowano ostatnio żadnych stron',
'export' => 'Eksportuj',
'export_html' => 'Plik HTML',
'export_pdf' => 'Plik PDF',
'export_text' => 'Plik tekstowy',
/**
* Permissions and restrictions
*/
'permissions' => 'Uprawnienia',
'permissions_intro' => 'Jeśli odblokowane, te uprawnienia będą miały priorytet względem pozostałych ustawionych uprawnień ról.',
'permissions_enable' => 'Odblokuj własne uprawnienia',
'permissions_save' => 'Zapisz uprawnienia',
/**
* Search
*/
'search_results' => 'Wyniki wyszukiwania',
'search_total_results_found' => ':count znalezionych wyników|:count ogółem znalezionych wyników',
'search_clear' => 'Wyczyść wyszukiwanie',
'search_no_pages' => 'Brak stron spełniających zadane kryterium',
'search_for_term' => 'Szukaj :term',
'search_more' => 'Więcej wyników',
'search_filters' => 'Filtry wyszukiwania',
'search_content_type' => 'Rodziaj treści',
'search_exact_matches' => 'Dokładne frazy',
'search_tags' => 'Tagi wyszukiwania',
'search_viewed_by_me' => 'Wyświetlone przeze mnie',
'search_not_viewed_by_me' => 'Niewyświetlone przeze mnie',
'search_permissions_set' => 'Zbiór uprawnień',
'search_created_by_me' => 'Utworzone przeze mnie',
'search_updated_by_me' => 'Zaktualizowane przeze mnie',
'search_updated_before' => 'Zaktualizowane przed',
'search_updated_after' => 'Zaktualizowane po',
'search_created_before' => 'Utworzone przed',
'search_created_after' => 'Utworzone po',
'search_set_date' => 'Ustaw datę',
'search_update' => 'Zaktualizuj wyszukiwanie',
/**
* Books
*/
'book' => 'Księga',
'books' => 'Księgi',
'books_empty' => 'Brak utworzonych ksiąg',
'books_popular' => 'Popularne księgi',
'books_recent' => 'Ostatnie księgi',
'books_popular_empty' => 'Najbardziej popularne księgi zostaną wyświetlone w tym miejscu.',
'books_create' => 'Utwórz księgę',
'books_delete' => 'Usuń księgę',
'books_delete_named' => 'Usuń księgę :bookName',
'books_delete_explain' => 'To spowoduje usunięcie księgi \':bookName\', Wszystkie strony i rozdziały zostaną usunięte.',
'books_delete_confirmation' => 'Czy na pewno chcesz usunąc tę księgę?',
'books_edit' => 'Edytuj księgę',
'books_edit_named' => 'Edytuj księgę :bookName',
'books_form_book_name' => 'Nazwa księgi',
'books_save' => 'Zapisz księgę',
'books_permissions' => 'Uprawnienia księgi',
'books_permissions_updated' => 'Zaktualizowano uprawnienia księgi',
'books_empty_contents' => 'Brak stron lub rozdziałów w tej księdze.',
'books_empty_create_page' => 'Utwórz nową stronę',
'books_empty_or' => 'lub',
'books_empty_sort_current_book' => 'posortuj bieżącą księgę',
'books_empty_add_chapter' => 'Dodaj rozdział',
'books_permissions_active' => 'Uprawnienia księgi aktywne',
'books_search_this' => 'Wyszukaj w tej księdze',
'books_navigation' => 'Nawigacja po księdze',
'books_sort' => 'Sortuj zawartość Księgi',
'books_sort_named' => 'Sortuj księgę :bookName',
'books_sort_show_other' => 'Pokaż inne księgi',
'books_sort_save' => 'Zapisz nowy porządek',
/**
* Chapters
*/
'chapter' => 'Rozdział',
'chapters' => 'Rozdziały',
'chapters_popular' => 'Popularne rozdziały',
'chapters_new' => 'Nowy rozdział',
'chapters_create' => 'Utwórz nowy rozdział',
'chapters_delete' => 'Usuń rozdział',
'chapters_delete_named' => 'Usuń rozdział :chapterName',
'chapters_delete_explain' => 'To spowoduje usunięcie rozdziału \':chapterName\', Wszystkie strony zostaną usunięte
i dodane bezpośrednio do księgi macierzystej.',
'chapters_delete_confirm' => 'Czy na pewno chcesz usunąć ten rozdział?',
'chapters_edit' => 'Edytuj rozdział',
'chapters_edit_named' => 'Edytuj rozdział :chapterName',
'chapters_save' => 'Zapisz rozdział',
'chapters_move' => 'Przenieś rozdział',
'chapters_move_named' => 'Przenieś rozdział :chapterName',
'chapter_move_success' => 'Rozdział przeniesiony do :bookName',
'chapters_permissions' => 'Uprawienia rozdziału',
'chapters_empty' => 'Brak stron w tym rozdziale.',
'chapters_permissions_active' => 'Uprawnienia rozdziału aktywne',
'chapters_permissions_success' => 'Zaktualizowano uprawnienia rozdziału',
'chapters_search_this' => 'Przeszukaj ten rozdział',
/**
* Pages
*/
'page' => 'Strona',
'pages' => 'Strony',
'pages_popular' => 'Popularne strony',
'pages_new' => 'Nowa strona',
'pages_attachments' => 'Załączniki',
'pages_navigation' => 'Nawigacja po stronie',
'pages_delete' => 'Usuń stronę',
'pages_delete_named' => 'Usuń stronę :pageName',
'pages_delete_draft_named' => 'Usuń szkic strony :pageName',
'pages_delete_draft' => 'Usuń szkic strony',
'pages_delete_success' => 'Strona usunięta pomyślnie',
'pages_delete_draft_success' => 'Szkic strony usunięty pomyślnie',
'pages_delete_confirm' => 'Czy na pewno chcesz usunąć tę stron?',
'pages_delete_draft_confirm' => 'Czy na pewno chcesz usunąć szkic strony?',
'pages_editing_named' => 'Edytowanie strony :pageName',
'pages_edit_toggle_header' => 'Włącz/wyłącz nagłówek',
'pages_edit_save_draft' => 'Zapisz szkic',
'pages_edit_draft' => 'Edytuj szkic strony',
'pages_editing_draft' => 'Edytowanie szkicu strony',
'pages_editing_page' => 'Edytowanie strony',
'pages_edit_draft_save_at' => 'Szkic zapisany ',
'pages_edit_delete_draft' => 'Usuń szkic',
'pages_edit_discard_draft' => 'Porzuć szkic',
'pages_edit_set_changelog' => 'Ustaw log zmian',
'pages_edit_enter_changelog_desc' => 'Opisz zmiany, które zostały wprowadzone',
'pages_edit_enter_changelog' => 'Wyświetl log zmian',
'pages_save' => 'Zapisz stronę',
'pages_title' => 'Tytuł strony',
'pages_name' => 'Nazwa strony',
'pages_md_editor' => 'Edytor',
'pages_md_preview' => 'Podgląd',
'pages_md_insert_image' => 'Wstaw obrazek',
'pages_md_insert_link' => 'Wstaw łącze do encji',
'pages_not_in_chapter' => 'Strona nie została umieszczona w rozdziale',
'pages_move' => 'Przenieś stronę',
'pages_move_success' => 'Strona przeniesiona do ":parentName"',
'pages_permissions' => 'Uprawnienia strony',
'pages_permissions_success' => 'Zaktualizowano uprawnienia strony',
'pages_revisions' => 'Rewizje strony',
'pages_revisions_named' => 'Rewizje strony :pageName',
'pages_revision_named' => 'Rewizja stroony :pageName',
'pages_revisions_created_by' => 'Utworzona przez',
'pages_revisions_date' => 'Data rewizji',
'pages_revisions_number' => '#',
'pages_revisions_changelog' => 'Log zmian',
'pages_revisions_changes' => 'Zmiany',
'pages_revisions_current' => 'Obecna wersja',
'pages_revisions_preview' => 'Podgląd',
'pages_revisions_restore' => 'Przywróć',
'pages_revisions_none' => 'Ta strona nie posiada żadnych rewizji',
'pages_copy_link' => 'Kopiuj link',
'pages_permissions_active' => 'Uprawnienia strony aktywne',
'pages_initial_revision' => 'Wydanie pierwotne',
'pages_initial_name' => 'Nowa strona',
'pages_editing_draft_notification' => 'Edytujesz obecnie szkic, który był ostatnio zapisany :timeDiff.',
'pages_draft_edited_notification' => 'Od tego czasu ta strona była zmieniana. Zalecane jest odrzucenie tego szkicu.',
'pages_draft_edit_active' => [
'start_a' => ':count użytkowników rozpoczęło edytowanie tej strony',
'start_b' => ':userName edytuje stronę',
'time_a' => ' od czasu ostatniej edycji',
'time_b' => 'w ciągu ostatnich :minCount minut',
'message' => ':start :time. Pamiętaj by nie nadpisywać czyichś zmian!',
],
'pages_draft_discarded' => 'Szkic odrzucony, edytor został uzupełniony najnowszą wersją strony',
/**
* Editor sidebar
*/
'page_tags' => 'Tagi strony',
'tag' => 'Tag',
'tags' => '',
'tag_value' => 'Wartość tagu (opcjonalnie)',
'tags_explain' => "Dodaj tagi by skategoryzować zawartość. \n W celu dokładniejszej organizacji zawartości możesz dodać wartości do tagów.",
'tags_add' => 'Dodaj kolejny tag',
'attachments' => 'Załączniki',
'attachments_explain' => 'Udostępnij kilka plików lub załącz link. Będą one widoczne na marginesie strony.',
'attachments_explain_instant_save' => 'Zmiany są zapisywane natychmiastowo.',
'attachments_items' => 'Załączniki',
'attachments_upload' => 'Dodaj plik',
'attachments_link' => 'Dodaj link',
'attachments_set_link' => 'Ustaw link',
'attachments_delete_confirm' => 'Kliknij ponownie Usuń by potwierdzić usunięcie załącznika.',
'attachments_dropzone' => 'Upuść pliki lub kliknij tutaj by udostępnić pliki',
'attachments_no_files' => 'Nie udostępniono plików',
'attachments_explain_link' => 'Możesz załączyć link jeśli nie chcesz udostępniać pliku. Może być to link do innej strony lub link do pliku w chmurze.',
'attachments_link_name' => 'Nazwa linku',
'attachment_link' => 'Link do załącznika',
'attachments_link_url' => 'Link do pliku',
'attachments_link_url_hint' => 'Strona lub plik',
'attach' => 'Załącz',
'attachments_edit_file' => 'Edytuj plik',
'attachments_edit_file_name' => 'Nazwa pliku',
'attachments_edit_drop_upload' => 'Upuść pliki lub kliknij tutaj by udostępnić pliki i nadpisać istniejące',
'attachments_order_updated' => 'Kolejność załączników zaktualizowana',
'attachments_updated_success' => 'Szczegóły załączników zaktualizowane',
'attachments_deleted' => 'Załączniki usunięte',
'attachments_file_uploaded' => 'Plik załączony pomyślnie',
'attachments_file_updated' => 'Plik zaktualizowany pomyślnie',
'attachments_link_attached' => 'Link pomyślnie dodany do strony',
/**
* Profile View
*/
'profile_user_for_x' => 'Użytkownik od :time',
'profile_created_content' => 'Utworzona zawartość',
'profile_not_created_pages' => ':userName nie utworzył żadnych stron',
'profile_not_created_chapters' => ':userName nie utworzył żadnych rozdziałów',
'profile_not_created_books' => ':userName nie utworzył żadnych ksiąg',
];

View File

@@ -0,0 +1,70 @@
<?php
return [
/**
* Error text strings.
*/
// Permissions
'permission' => 'Nie masz uprawnień do wyświetlenia tej strony.',
'permissionJson' => 'Nie masz uprawnień do wykonania tej akcji.',
// Auth
'error_user_exists_different_creds' => 'Użytkownik o adresie :email już istnieje.',
'email_already_confirmed' => 'Email został potwierdzony, spróbuj się zalogować.',
'email_confirmation_invalid' => 'Ten token jest nieprawidłowy lub został już wykorzystany. Spróbuj zarejestrować się ponownie.',
'email_confirmation_expired' => 'Ten token potwierdzający wygasł. Wysłaliśmy Ci kolejny.',
'ldap_fail_anonymous' => 'Dostęp LDAP przy użyciu anonimowego powiązania nie powiódł się',
'ldap_fail_authed' => 'Dostęp LDAP przy użyciu tego dn i hasła nie powiódł się',
'ldap_extension_not_installed' => 'Rozszerzenie LDAP PHP nie zostało zainstalowane',
'ldap_cannot_connect' => 'Nie można połączyć z serwerem LDAP, połączenie nie zostało ustanowione',
'social_no_action_defined' => 'Brak zdefiniowanej akcji',
'social_account_in_use' => 'To konto :socialAccount jest już w użyciu, spróbuj zalogować się za pomocą opcji :socialAccount.',
'social_account_email_in_use' => 'Email :email jest już w użyciu. Jeśli masz już konto, połącz konto :socialAccount z poziomu ustawień profilu.',
'social_account_existing' => 'Konto :socialAccount jest już połączone z Twoim profilem',
'social_account_already_used_existing' => 'Konto :socialAccount jest już używane przez innego użytkownika.',
'social_account_not_used' => 'To konto :socialAccount nie jest połączone z żadnym użytkownikiem. Połącz je ze swoim kontem w ustawieniach profilu. ',
'social_account_register_instructions' => 'Jeśli nie masz jeszcze konta, możesz zarejestrować je używając opcji :socialAccount.',
'social_driver_not_found' => 'Funkcja społecznościowa nie została odnaleziona',
'social_driver_not_configured' => 'Ustawienia konta :socialAccount nie są poprawne.',
// System
'path_not_writable' => 'Zapis do ścieżki :filePath jest niemożliwy. Upewnij się że aplikacja ma prawa do zapisu w niej.',
'cannot_get_image_from_url' => 'Nie można pobrać obrazka z :url',
'cannot_create_thumbs' => 'Serwer nie może utworzyć miniaturek. Upewnij się że rozszerzenie GD PHP zostało zainstalowane.',
'server_upload_limit' => 'Serwer nie pozwala na przyjęcie pliku o tym rozmiarze. Spróbuj udostępnić coś o mniejszym rozmiarze.',
'image_upload_error' => 'Wystąpił błąd podczas udostępniania obrazka',
// Attachments
'attachment_page_mismatch' => 'Niezgodność stron podczas aktualizacji załącznika',
// Pages
'page_draft_autosave_fail' => 'Zapis szkicu nie powiódł się. Upewnij się że posiadasz połączenie z internetem.',
// Entities
'entity_not_found' => 'Encja nie została odnaleziona',
'book_not_found' => 'Księga nie została odnaleziona',
'page_not_found' => 'Strona nie została odnaleziona',
'chapter_not_found' => 'Rozdział nie został odnaleziony',
'selected_book_not_found' => 'Wybrana księga nie została odnaleziona',
'selected_book_chapter_not_found' => 'Wybrana księga lub rozdział nie zostały odnalezione',
'guests_cannot_save_drafts' => 'Goście nie mogą zapisywać szkiców',
// Users
'users_cannot_delete_only_admin' => 'Nie możesz usunąć jedynego administratora',
'users_cannot_delete_guest' => 'Nie możesz usunąć użytkownika-gościa',
// Roles
'role_cannot_be_edited' => 'Ta rola nie może być edytowana',
'role_system_cannot_be_deleted' => 'Ta rola jest rolą systemową i nie może zostać usunięta',
'role_registration_default_cannot_delete' => 'Ta rola nie może zostać usunięta jeśli jest ustawiona jako domyślna rola użytkownika',
// Error pages
'404_page_not_found' => 'Strona nie została odnaleziona',
'sorry_page_not_found' => 'Przepraszamy, ale strona której szukasz nie została odnaleziona.',
'return_home' => 'Powrót do strony głównej',
'error_occurred' => 'Wystąpił błąd',
'app_down' => ':appName jest aktualnie wyłączona',
'back_soon' => 'Niedługo zostanie uruchomiona ponownie.',
];

View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Poprzednia',
'next' => 'Następna &raquo;',
];

View File

@@ -0,0 +1,22 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reminder Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => 'Hasło musi zawierać co najmniej 6 znaków i być zgodne z powtórzeniem.',
'user' => "Nie znaleziono użytkownika o takim adresie email.",
'token' => 'Ten token resetowania hasła jest nieprawidłowy.',
'sent' => 'Wysłaliśmy Ci link do resetowania hasła!',
'reset' => 'Twoje hasło zostało zresetowane!',
];

View File

@@ -0,0 +1,111 @@
<?php
return [
/**
* Settings text strings
* Contains all text strings used in the general settings sections of BookStack
* including users and roles.
*/
'settings' => 'Ustawienia',
'settings_save' => 'Zapisz ustawienia',
'settings_save_success' => 'Ustawienia zapisane',
/**
* App settings
*/
'app_settings' => 'Ustawienia aplikacji',
'app_name' => 'Nazwa aplikacji',
'app_name_desc' => 'Ta nazwa jest wyświetlana w nagłówku i emailach.',
'app_name_header' => 'Pokazać nazwę aplikacji w nagłówku?',
'app_public_viewing' => 'Zezwolić na publiczne przeglądanie?',
'app_secure_images' => 'Odblokować wyższe bezpieczeństwo obrazków?',
'app_secure_images_desc' => 'Ze względów wydajnościowych wszystkie obrazki są publiczne. Ta opcja dodaje dodatkowy, trudny do zgadnienia losowy ciąg na początku nazwy obrazka. Upewnij się że indeksowanie ścieżek jest zablokowane, by uniknąć problemów z dostępem do obrazka.',
'app_editor' => 'Edytor strony',
'app_editor_desc' => 'Wybierz edytor używany przez użytkowników do edycji zawartości.',
'app_custom_html' => 'Własna zawartość tagu <head>',
'app_custom_html_desc' => 'Zawartość dodana tutaj zostanie dołączona do sekcji <head> każdej strony. Przydatne przy nadpisywaniu styli lub dodawaniu analityki.',
'app_logo' => 'Logo aplikacji',
'app_logo_desc' => 'Ten obrazek powinien mieć nie więcej niż 43px w pionie. <br>Większe obrazki będą skalowane w dół.',
'app_primary_color' => 'Podstawowy kolor aplikacji',
'app_primary_color_desc' => 'To powinna być wartość HEX. <br>Zostaw to pole puste, by powrócić do podstawowego koloru.',
/**
* Registration settings
*/
'reg_settings' => 'Ustawienia rejestracji',
'reg_allow' => 'Zezwolić na rejestrację?',
'reg_default_role' => 'Domyślna rola użytkownika po rejestracji',
'reg_confirm_email' => 'Wymagać potwierdzenia adresu email?',
'reg_confirm_email_desc' => 'Jeśli restrykcje domenowe zostały uzupełnione potwierdzenie adresu stanie się konieczne, a poniższa wartośc zostanie zignorowana.',
'reg_confirm_restrict_domain' => 'Restrykcje domenowe dot. adresu email',
'reg_confirm_restrict_domain_desc' => 'Wprowadź listę domen adresów email rozdzieloną przecinkami, którym chciałbyś zezwolić na rejestrację. Wymusi to konieczność potwierdzenia adresu email przez użytkownika przed uzyskaniem dostępu do aplikacji. <br> Pamiętaj, że użytkownicy będą mogli zmienić adres email po rejestracji.',
'reg_confirm_restrict_domain_placeholder' => 'Brak restrykcji',
/**
* Role settings
*/
'roles' => 'Role',
'role_user_roles' => 'Role użytkownika',
'role_create' => 'Utwórz nową rolę',
'role_create_success' => 'Rola utworzona pomyślnie',
'role_delete' => 'Usuń rolę',
'role_delete_confirm' => 'To spowoduje usunięcie roli \':roleName\'.',
'role_delete_users_assigned' => 'Tę rolę ma przypisanych :userCount użytkowników. Jeśli chcesz zmigrować użytkowników z tej roli, wybierz nową poniżej.',
'role_delete_no_migration' => "Nie migruj użytkowników",
'role_delete_sure' => 'Czy na pewno chcesz usunąć tę rolę?',
'role_delete_success' => 'Rola usunięta pomyślnie',
'role_edit' => 'Edytuj rolę',
'role_details' => 'Szczegóły roli',
'role_name' => 'Nazwa roli',
'role_desc' => 'Krótki opis roli',
'role_system' => 'Uprawnienia systemowe',
'role_manage_users' => 'Zarządzanie użytkownikami',
'role_manage_roles' => 'Zarządzanie rolami i uprawnieniami ról',
'role_manage_entity_permissions' => 'Zarządzanie uprawnieniami ksiąg, rozdziałów i stron',
'role_manage_own_entity_permissions' => 'Zarządzanie uprawnieniami własnych ksiąg, rozdziałów i stron',
'role_manage_settings' => 'Zarządzanie ustawieniami aplikacji',
'role_asset' => 'Zarządzanie zasobami',
'role_asset_desc' => 'Te ustawienia kontrolują zarządzanie zasobami systemu. Uprawnienia ksiąg, rozdziałów i stron nadpisują te ustawienia.',
'role_all' => 'Wszyscy',
'role_own' => 'Własne',
'role_controlled_by_asset' => 'Kontrolowane przez zasób, do którego zostały udostępnione',
'role_save' => 'Zapisz rolę',
'role_update_success' => 'Rola zapisana pomyślnie',
'role_users' => 'Użytkownicy w tej roli',
'role_users_none' => 'Brak użytkowników zapisanych do tej roli',
/**
* Users
*/
'users' => 'Użytkownicy',
'user_profile' => 'Profil użytkownika',
'users_add_new' => 'Dodaj użytkownika',
'users_search' => 'Wyszukaj użytkownika',
'users_role' => 'Role użytkownika',
'users_external_auth_id' => 'Zewnętrzne ID autentykacji',
'users_password_warning' => 'Wypełnij poniżej tylko jeśli chcesz zmienić swoje hasło:',
'users_system_public' => 'Ten użytkownik reprezentuje każdego gościa odwiedzającego tę aplikację. Nie można się na niego zalogować, lecz jest przyznawany automatycznie.',
'users_delete' => 'Usuń użytkownika',
'users_delete_named' => 'Usuń :userName',
'users_delete_warning' => 'To usunie użytkownika \':userName\' z systemu.',
'users_delete_confirm' => 'Czy na pewno chcesz usunąć tego użytkownika?',
'users_delete_success' => 'Użytkownik usunięty pomyślnie',
'users_edit' => 'Edytuj użytkownika',
'users_edit_profile' => 'Edytuj profil',
'users_edit_success' => 'Użytkownik zaktualizowany pomyśłnie',
'users_avatar' => 'Avatar użytkownika',
'users_avatar_desc' => 'Ten obrazek powinien mieć 25px x 256px.',
'users_preferred_language' => 'Preferowany język',
'users_social_accounts' => 'Konta społecznościowe',
'users_social_accounts_info' => 'Tutaj możesz połączyć kilka kont społecznościowych w celu łatwiejszego i szybszego logowania.',
'users_social_connect' => 'Podłącz konto',
'users_social_disconnect' => 'Odłącz konto',
'users_social_connected' => ':socialAccount zostało dodane do Twojego profilu.',
'users_social_disconnected' => ':socialAccount zostało odłączone od Twojego profilu.',
];

View File

@@ -0,0 +1,108 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => ':attribute musi zostać zaakceptowany.',
'active_url' => ':attribute nie jest prawidłowym adresem URL.',
'after' => ':attribute musi być datą następującą po :date.',
'alpha' => ':attribute może zawierać wyłącznie litery.',
'alpha_dash' => ':attribute może zawierać wyłącznie litery, cyfry i myślniki.',
'alpha_num' => ':attribute może zawierać wyłącznie litery i cyfry.',
'array' => ':attribute musi być tablicą.',
'before' => ':attribute musi być datą poprzedzającą :date.',
'between' => [
'numeric' => ':attribute musi zawierać się w przedziale od :min do :max.',
'file' => 'Waga :attribute musi zawierać się pomiędzy :min i :max kilobajtów.',
'string' => 'Długość :attribute musi zawierać się pomiędzy :min i :max.',
'array' => ':attribute musi mieć od :min do :max elementów.',
],
'boolean' => ':attribute musi być wartością prawda/fałsz.',
'confirmed' => ':attribute i potwierdzenie muszą być zgodne.',
'date' => ':attribute nie jest prawidłową datą.',
'date_format' => ':attribute musi mieć format :format.',
'different' => ':attribute i :other muszą się różnić.',
'digits' => ':attribute musi mieć :digits cyfr.',
'digits_between' => ':attribute musi mieć od :min do :max cyfr.',
'email' => ':attribute musi być prawidłowym adresem e-mail.',
'filled' => ':attribute jest wymagany.',
'exists' => 'Wybrana wartość :attribute jest nieprawidłowa.',
'image' => ':attribute musi być obrazkiem.',
'in' => 'Wybrana wartość :attribute jest nieprawidłowa.',
'integer' => ':attribute musi być liczbą całkowitą.',
'ip' => ':attribute musi być prawidłowym adresem IP.',
'max' => [
'numeric' => 'Wartość :attribute nie może być większa niż :max.',
'file' => 'Wielkość :attribute nie może być większa niż :max kilobajtów.',
'string' => 'Długość :attribute nie może być większa niż :max znaków.',
'array' => 'Rozmiar :attribute nie może być większy niż :max elementów.',
],
'mimes' => ':attribute musi być plikiem typu: :values.',
'min' => [
'numeric' => 'Wartość :attribute nie może być mniejsza od :min.',
'file' => 'Wielkość :attribute nie może być mniejsza niż :min kilobajtów.',
'string' => 'Długość :attribute nie może być mniejsza niż :min znaków.',
'array' => 'Rozmiar :attribute musi posiadać co najmniej :min elementy.',
],
'not_in' => 'Wartość :attribute jest nieprawidłowa.',
'numeric' => ':attribute musi być liczbą.',
'regex' => 'Format :attribute jest nieprawidłowy.',
'required' => 'Pole :attribute jest wymagane.',
'required_if' => 'Pole :attribute jest wymagane jeśli :other ma wartość :value.',
'required_with' => 'Pole :attribute jest wymagane jeśli :values zostało wprowadzone.',
'required_with_all' => 'Pole :attribute jest wymagane jeśli :values są obecne.',
'required_without' => 'Pole :attribute jest wymagane jeśli :values nie zostało wprowadzone.',
'required_without_all' => 'Pole :attribute jest wymagane jeśli żadna z wartości :values nie została podana.',
'same' => 'Pole :attribute i :other muszą być takie same.',
'size' => [
'numeric' => ':attribute musi mieć długość :size.',
'file' => ':attribute musi mieć :size kilobajtów.',
'string' => ':attribute mmusi mieć długość :size znaków.',
'array' => ':attribute musi posiadać :size elementów.',
],
'string' => ':attribute musi być ciągiem znaków.',
'timezone' => ':attribute musi być prawidłową strefą czasową.',
'unique' => ':attribute zostało już zajęte.',
'url' => 'Format :attribute jest nieprawidłowy.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'password-confirm' => [
'required_with' => 'Potwierdzenie hasła jest wymagane.',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap attribute place-holders
| with something more reader friendly such as E-Mail Address instead
| of "email". This simply helps us make messages a little cleaner.
|
*/
'attributes' => [],
];

View File

@@ -5,10 +5,10 @@
<div class="faded-small toolbar">
<div class="container">
<div class="row">
<div class="col-sm-6 faded">
<div class="col-sm-6 col-xs-1 faded">
@include('books._breadcrumbs', ['book' => $book])
</div>
<div class="col-sm-6">
<div class="col-sm-6 col-xs-11">
<div class="action-buttons faded">
<span dropdown class="dropdown-container">
<div dropdown-toggle class="text-button text-primary"><i class="zmdi zmdi-open-in-new"></i>{{ trans('entities.export') }}</div>
@@ -50,13 +50,13 @@
</div>
<div class="container" id="entity-dashboard" entity-id="{{ $book->id }}" entity-type="book">
<div ng-non-bindable class="container" id="entity-dashboard" entity-id="{{ $book->id }}" entity-type="book">
<div class="row">
<div class="col-md-7">
<h1>{{$book->name}}</h1>
<div class="book-content" v-if="!searching">
<p class="text-muted" v-pre>{{$book->description}}</p>
<p class="text-muted" v-pre>{!! nl2br(e($book->description)) !!}</p>
<div class="page-list" v-pre>
<hr>
@@ -112,13 +112,13 @@
@endif
<div class="search-box">
<form v-on:submit="searchBook">
<form v-on:submit.prevent="searchBook">
<input v-model="searchTerm" v-on:change="checkSearchForm()" type="text" name="term" placeholder="{{ trans('entities.books_search_this') }}">
<button type="submit"><i class="zmdi zmdi-search"></i></button>
<button v-if="searching" v-cloak class="text-neg" v-on:click="clearSearch()" type="button"><i class="zmdi zmdi-close"></i></button>
</form>
</div>
<div class="activity">
<h3>{{ trans('entities.recent_activity') }}</h3>
@include('partials/activity-list', ['activity' => Activity::entityActivity($book, 20, 0)])
@@ -127,4 +127,4 @@
</div>
</div>
@stop
@stop

View File

@@ -2,7 +2,7 @@
<h4>
@if (isset($showPath) && $showPath)
<a href="{{ $chapter->book->getUrl() }}" class="text-book">
<i class="zmdi zmdi-book"></i>{{ $chapter->book->name }}
<i class="zmdi zmdi-book"></i>{{ $chapter->book->getShortName() }}
</a>
<span class="text-muted">&nbsp;&nbsp;&raquo;&nbsp;&nbsp;</span>
@endif

View File

@@ -5,10 +5,10 @@
<div class="faded-small toolbar">
<div class="container">
<div class="row">
<div class="col-sm-8 faded" ng-non-bindable>
<div class="col-sm-6 col-xs-3 faded" ng-non-bindable>
@include('chapters._breadcrumbs', ['chapter' => $chapter])
</div>
<div class="col-sm-4 faded">
<div class="col-sm-6 col-xs-9 faded">
<div class="action-buttons">
<span dropdown class="dropdown-container">
<div dropdown-toggle class="text-button text-primary"><i class="zmdi zmdi-open-in-new"></i>{{ trans('entities.export') }}</div>
@@ -47,12 +47,12 @@
</div>
<div class="container" id="entity-dashboard" entity-id="{{ $chapter->id }}" entity-type="chapter">
<div class="container" id="entity-dashboard" ng-non-bindable entity-id="{{ $chapter->id }}" entity-type="chapter">
<div class="row">
<div class="col-md-7">
<h1>{{ $chapter->name }}</h1>
<div class="chapter-content" v-if="!searching">
<p class="text-muted">{{ $chapter->description }}</p>
<p class="text-muted">{!! nl2br(e($chapter->description)) !!}</p>
@if(count($pages) > 0)
<div class="page-list">
@@ -116,7 +116,7 @@
@endif
<div class="search-box">
<form v-on:submit="searchBook">
<form v-on:submit.prevent="searchBook">
<input v-model="searchTerm" v-on:change="checkSearchForm()" type="text" name="term" placeholder="{{ trans('entities.chapters_search_this') }}">
<button type="submit"><i class="zmdi zmdi-search"></i></button>
<button v-if="searching" v-cloak class="text-neg" v-on:click="clearSearch()" type="button"><i class="zmdi zmdi-close"></i></button>

View File

@@ -1,5 +1,17 @@
<div class="page {{$page->draft ? 'draft' : ''}} entity-list-item" data-entity-type="page" data-entity-id="{{$page->id}}">
<h4>
@if (isset($showPath) && $showPath)
<a href="{{ $page->book->getUrl() }}" class="text-book">
<i class="zmdi zmdi-book"></i>{{ $page->book->getShortName() }}
</a>
<span class="text-muted">&nbsp;&nbsp;&raquo;&nbsp;&nbsp;</span>
@if($page->chapter)
<a href="{{ $page->chapter->getUrl() }}" class="text-chapter">
<i class="zmdi zmdi-collection-bookmark"></i>{{ $page->chapter->getShortName() }}
</a>
<span class="text-muted">&nbsp;&nbsp;&raquo;&nbsp;&nbsp;</span>
@endif
@endif
<a href="{{ $page->getUrl() }}" class="text-page entity-list-item-link"><i class="zmdi zmdi-file-text"></i><span class="entity-list-item-name">{{ $page->name }}</span></a>
</h4>

View File

@@ -5,10 +5,10 @@
<div class="faded-small toolbar">
<div class="container">
<div class="row">
<div class="col-sm-6 faded">
<div class="col-sm-8 col-xs-5 faded">
@include('pages._breadcrumbs', ['page' => $page])
</div>
<div class="col-sm-6 faded">
<div class="col-sm-4 col-xs-7 faded">
<div class="action-buttons">
<span dropdown class="dropdown-container">
<div dropdown-toggle class="text-button text-primary"><i class="zmdi zmdi-open-in-new"></i>{{ trans('entities.export') }}</div>

View File

@@ -2,7 +2,7 @@
@if(count($entities) > 0)
@foreach($entities as $index => $entity)
@if($entity->isA('page'))
@include('pages/list-item', ['page' => $entity])
@include('pages/list-item', ['page' => $entity, 'showPath' => true])
@elseif($entity->isA('book'))
@include('books/list-item', ['book' => $entity])
@elseif($entity->isA('chapter'))

View File

@@ -11,6 +11,7 @@ class LdapTest extends BrowserKitTest
public function setUp()
{
parent::setUp();
if (!defined('LDAP_OPT_REFERRALS')) define('LDAP_OPT_REFERRALS', 1);
app('config')->set(['auth.method' => 'ldap', 'services.ldap.base_dn' => 'dc=ldap,dc=local', 'auth.providers.users.driver' => 'ldap']);
$this->mockLdap = \Mockery::mock(\BookStack\Services\Ldap::class);
$this->app['BookStack\Services\Ldap'] = $this->mockLdap;
@@ -21,6 +22,7 @@ class LdapTest extends BrowserKitTest
{
$this->mockLdap->shouldReceive('connect')->once()->andReturn($this->resourceId);
$this->mockLdap->shouldReceive('setVersion')->once();
$this->mockLdap->shouldReceive('setOption')->times(4);
$this->mockLdap->shouldReceive('searchAndGetEntries')->times(4)
->with($this->resourceId, config('services.ldap.base_dn'), \Mockery::type('string'), \Mockery::type('array'))
->andReturn(['count' => 1, 0 => [
@@ -49,6 +51,7 @@ class LdapTest extends BrowserKitTest
$this->mockLdap->shouldReceive('connect')->once()->andReturn($this->resourceId);
$this->mockLdap->shouldReceive('setVersion')->once();
$ldapDn = 'cn=test-user,dc=test' . config('services.ldap.base_dn');
$this->mockLdap->shouldReceive('setOption')->times(2);
$this->mockLdap->shouldReceive('searchAndGetEntries')->times(2)
->with($this->resourceId, config('services.ldap.base_dn'), \Mockery::type('string'), \Mockery::type('array'))
->andReturn(['count' => 1, 0 => [
@@ -72,6 +75,7 @@ class LdapTest extends BrowserKitTest
{
$this->mockLdap->shouldReceive('connect')->once()->andReturn($this->resourceId);
$this->mockLdap->shouldReceive('setVersion')->once();
$this->mockLdap->shouldReceive('setOption')->times(2);
$this->mockLdap->shouldReceive('searchAndGetEntries')->times(2)
->with($this->resourceId, config('services.ldap.base_dn'), \Mockery::type('string'), \Mockery::type('array'))
->andReturn(['count' => 1, 0 => [
@@ -129,4 +133,4 @@ class LdapTest extends BrowserKitTest
->dontSee('External Authentication');
}
}
}

View File

@@ -1,6 +1,9 @@
<?php namespace Tests;
use BookStack\Chapter;
use BookStack\Page;
class EntitySearchTest extends TestCase
{
@@ -75,10 +78,10 @@ class EntitySearchTest extends TestCase
])
];
$pageA = \BookStack\Page::first();
$pageA = Page::first();
$pageA->tags()->saveMany($newTags);
$pageB = \BookStack\Page::all()->last();
$pageB = Page::all()->last();
$pageB->tags()->create(['name' => 'animal', 'value' => 'dog']);
$this->asEditor();
@@ -160,8 +163,8 @@ class EntitySearchTest extends TestCase
public function test_ajax_entity_search()
{
$page = \BookStack\Page::all()->last();
$notVisitedPage = \BookStack\Page::first();
$page = Page::all()->last();
$notVisitedPage = Page::first();
// Visit the page to make popular
$this->asEditor()->get($page->getUrl());
@@ -176,4 +179,20 @@ class EntitySearchTest extends TestCase
$defaultListTest->assertSee($page->name);
$defaultListTest->assertDontSee($notVisitedPage->name);
}
public function test_ajax_entity_serach_shows_breadcrumbs()
{
$chapter = Chapter::first();
$page = $chapter->pages->first();
$this->asEditor();
$pageSearch = $this->get('/ajax/search/entities?term=' . urlencode($page->name));
$pageSearch->assertSee($page->name);
$pageSearch->assertSee($chapter->getShortName());
$pageSearch->assertSee($page->book->getShortName());
$chapterSearch = $this->get('/ajax/search/entities?term=' . urlencode($chapter->name));
$chapterSearch->assertSee($chapter->name);
$chapterSearch->assertSee($chapter->book->getShortName());
}
}

View File

@@ -1 +1 @@
v0.17.1
v0.17.4