From 9d88169f3e3c39f8f9fa0d2312c11666e259a2bb Mon Sep 17 00:00:00 2001 From: Kirk Mayo Date: Wed, 4 Jul 2012 10:27:42 +1200 Subject: [PATCH 01/43] BUG: open/6875 removing DataGrid filter fields from track changes --- forms/gridfield/GridFieldFilterHeader.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forms/gridfield/GridFieldFilterHeader.php b/forms/gridfield/GridFieldFilterHeader.php index 294db9d37..821b2544d 100644 --- a/forms/gridfield/GridFieldFilterHeader.php +++ b/forms/gridfield/GridFieldFilterHeader.php @@ -120,6 +120,7 @@ class GridFieldFilterHeader implements GridField_HTMLProvider, GridField_DataMan } $field = new TextField('filter['.$columnField.']', '', $value); $field->addExtraClass('ss-gridfield-sort'); + $field->addExtraClass('no-change-track'); $field->setAttribute('placeholder', _t('GridField.FilterBy', "Filter by ") . _t('GridField.'.$metadata['title'], $metadata['title'])); @@ -144,6 +145,7 @@ class GridFieldFilterHeader implements GridField_HTMLProvider, GridField_DataMan ->setAttribute('id', 'action_reset_' . $gridField->getModelClass() . '_' . $columnField) ); $field->addExtraClass('filter-buttons'); + $field->addExtraClass('no-change-track'); }else{ $field = new LiteralField('', ''); } From c8c84b0935365745da87b4010743565f4afa5a9b Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 5 Jul 2012 13:33:02 +0200 Subject: [PATCH 02/43] Don't flush manifest in test bootstrap for performance reasons Leave the decision to the phpunit.xml config (via setting), or to the individual run via "phpunit '' flush=1". Flushing takes multiple seconds even on my fast SSD, which greatly reduces the likelyhood of developers adopting TDD. --- tests/bootstrap.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 490a1a0c2..89a4c985f 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -42,9 +42,6 @@ if(isset($_SERVER['argv'][2])) { $_REQUEST = array_merge($_REQUEST, $_GET); } -// Always flush the manifest for phpunit test runs -$_GET['flush'] = 1; - // Connect to database require_once $frameworkPath . '/core/Core.php'; require_once $frameworkPath . '/tests/FakeController.php'; @@ -65,4 +62,4 @@ $controller = new FakeController(); TestRunner::use_test_manifest(); // Remove the error handler so that PHPUnit can add its own -restore_error_handler(); +restore_error_handler(); \ No newline at end of file From 683d4202470a3af793e982e7c17f0ce19c718dda Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 5 Jul 2012 16:16:36 +0200 Subject: [PATCH 03/43] NEW Database->supportsTimezoneOverride() --- model/Database.php | 10 +++++++++- model/MySQLDatabase.php | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/model/Database.php b/model/Database.php index 8d41b6a73..d76f73853 100644 --- a/model/Database.php +++ b/model/Database.php @@ -890,7 +890,15 @@ abstract class SS_Database { * @return string SQL datetime expression to query for the interval between $date1 and $date2 in seconds which is the result of the substraction */ abstract function datetimeDifferenceClause($date1, $date2); - + + /** + * Can the database override timezone as a connection setting, + * or does it use the system timezone exclusively? + * + * @return Boolean + */ + abstract function supportsTimezoneOverride(); + /* * Does this database support transactions? * diff --git a/model/MySQLDatabase.php b/model/MySQLDatabase.php index 0d3324c40..b100b9934 100644 --- a/model/MySQLDatabase.php +++ b/model/MySQLDatabase.php @@ -87,6 +87,10 @@ class MySQLDatabase extends SS_Database { return true; } + public function supportsTimezoneOverride() { + return true; + } + /** * Get the version of MySQL. * @return string From 664903433deea72c2ae0f0e644587a1e911d5080 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 5 Jul 2012 16:20:18 +0200 Subject: [PATCH 04/43] Mark DBDatetimeTest skipped on wrong offsets, rather than error out. While well-intentioned, this test keeps causing problems due to wrong timezone settings in test mode. It shouldn't completely abort test execution, since its more of an environment sanity check than a failed test. Refactored to mark test skipped (regardless of offset, as long as its greater than 5 seconds). And skipping tests altogether on SQLite3 with new supportsTimezoneOverride() check. SapphireTest->setUp() sets the PHP timezone to UTC (see 59547745), but SQLite doesn't support this for a DB connection. Since changing it on a global UNIX system level is infeasible, the tests need to be skipped. --- tests/model/DbDatetimeTest.php | 152 ++++++++++++++++----------------- 1 file changed, 74 insertions(+), 78 deletions(-) diff --git a/tests/model/DbDatetimeTest.php b/tests/model/DbDatetimeTest.php index 3b351034a..7e0ffcd4d 100644 --- a/tests/model/DbDatetimeTest.php +++ b/tests/model/DbDatetimeTest.php @@ -6,20 +6,16 @@ class DbDatetimeTest extends FunctionalTest { protected $extraDataObjects = array('DbDatetimeTest_Team'); - private static $offset = 0; // number of seconds of php and db time are out of sync - private static $offset_thresholds = array( // throw an error if the offset exceeds 30 minutes - E_USER_ERROR => 1800, - E_USER_NOTICE => 5, - ); + protected $offset; + + protected $adapter; - private $adapter; - /** * Check if dates match more or less. This takes into the account the db query * can overflow to the next second giving offset readings. */ - private function matchesRoughly($date1, $date2, $comment = '') { - $allowedDifference = 5 + abs(self::$offset); // seconds + private function matchesRoughly($date1, $date2, $comment = '', $offset) { + $allowedDifference = 5 + abs($offset); // seconds $time1 = is_numeric($date1) ? $date1 : strtotime($date1); $time2 = is_numeric($date2) ? $date2 : strtotime($date2); @@ -31,104 +27,104 @@ class DbDatetimeTest extends FunctionalTest { $query = 'SELECT ' . $this->adapter->formattedDatetimeClause('now', '%U'); return DB::query($query)->value(); } - - function setUpOnce() { - parent::setUpOnce(); - self::$offset = time() - strtotime(DB::query('SELECT ' . DB::getConn()->now())->value()); - foreach(self::$offset_thresholds as $code => $offset) { - if(abs(self::$offset) > $offset) { - if($code == E_USER_NOTICE) { - Debug::show('The time of the database is out of sync with the webserver by ' . abs(self::$offset) . ' seconds.'); - } else { - trigger_error('The time of the database is out of sync with the webserver by ' . abs(self::$offset) . ' seconds.', $code); - } - break; - } + /** + * Needs to be run within a test*() context. + * + * @return Int Offset in seconds + */ + private function checkPreconditions() { + // number of seconds of php and db time are out of sync + $offset = time() - strtotime(DB::query('SELECT ' . DB::getConn()->now())->value()); + $threshold = 5; // seconds + + if($offset > 5) { + $this->markTestSkipped('The time of the database is out of sync with the webserver by ' . abs($offset) . ' seconds.'); } + + if(method_exists($this->adapter, 'supportsTimezoneOverride') && !$this->adapter->supportsTimezoneOverride()) { + $this->markTestSkipped("Database doesn't support timezone overrides"); + } + + return $offset; } function setUp() { parent::setUp(); $this->adapter = DB::getConn(); - $this->supportDbDatetime = method_exists($this->adapter, 'datetimeIntervalClause'); } function testCorrectNow() { - if($this->supportDbDatetime) { - $clause = $this->adapter->formattedDatetimeClause('now', '%U'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->assertRegExp('/^\d*$/', (string) $result); - $this->assertTrue($result>0); - } + $offset = $this->checkPreconditions(); + + $clause = $this->adapter->formattedDatetimeClause('now', '%U'); + $result = DB::query('SELECT ' . $clause)->value(); + $this->assertRegExp('/^\d*$/', (string) $result); + $this->assertTrue($result>0); } function testDbDatetimeFormat() { - if($this->supportDbDatetime) { - $clause = $this->adapter->formattedDatetimeClause('1973-10-14 10:30:00', '%H:%i, %d/%m/%Y'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, date('H:i, d/m/Y', strtotime('1973-10-14 10:30:00')), 'nice literal time'); + $offset = $this->checkPreconditions(); - $clause = $this->adapter->formattedDatetimeClause('now', '%d'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, date('d', $this->getDbNow()), 'todays day'); + $clause = $this->adapter->formattedDatetimeClause('1973-10-14 10:30:00', '%H:%i, %d/%m/%Y'); + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result, date('H:i, d/m/Y', strtotime('1973-10-14 10:30:00')), 'nice literal time', $offset); - $clause = $this->adapter->formattedDatetimeClause('"Created"', '%U') . ' AS test FROM "DbDateTimeTest_Team"'; - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created), 'fixture ->Created as timestamp'); - } + $clause = $this->adapter->formattedDatetimeClause('now', '%d'); + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result, date('d', $this->getDbNow()), 'todays day', $offset); + + $clause = $this->adapter->formattedDatetimeClause('"Created"', '%U') . ' AS test FROM "DbDateTimeTest_Team"'; + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result, strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created), 'fixture ->Created as timestamp', $offset); } function testDbDatetimeInterval() { - if($this->supportDbDatetime) { + $offset = $this->checkPreconditions(); - $clause = $this->adapter->datetimeIntervalClause('1973-10-14 10:30:00', '+18 Years'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, '1991-10-14 10:30:00', 'add 18 years'); + $clause = $this->adapter->datetimeIntervalClause('1973-10-14 10:30:00', '+18 Years'); + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result, '1991-10-14 10:30:00', 'add 18 years', $offset); - $clause = $this->adapter->datetimeIntervalClause('now', '+1 Day'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime('+1 Day', $this->getDbNow())), 'tomorrow'); + $clause = $this->adapter->datetimeIntervalClause('now', '+1 Day'); + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime('+1 Day', $this->getDbNow())), 'tomorrow', $offset); - $query = new SQLQuery(); - $query->setSelect(array()); - $query->selectField($this->adapter->datetimeIntervalClause('"Created"', '-15 Minutes'), 'test') - ->setFrom('"DbDateTimeTest_Team"') - ->setLimit(1); + $query = new SQLQuery(); + $query->setSelect(array()); + $query->selectField($this->adapter->datetimeIntervalClause('"Created"', '-15 Minutes'), 'test') + ->setFrom('"DbDateTimeTest_Team"') + ->setLimit(1); - $result = $query->execute()->value(); - $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created) - 900), '15 Minutes before creating fixture'); - - } + $result = $query->execute()->value(); + $this->matchesRoughly($result, date('Y-m-d H:i:s', strtotime(DataObject::get_one('DbDateTimeTest_Team')->Created) - 900), '15 Minutes before creating fixture', $offset); } function testDbDatetimeDifference() { - if($this->supportDbDatetime) { + $offset = $this->checkPreconditions(); - $clause = $this->adapter->datetimeDifferenceClause('1974-10-14 10:30:00', '1973-10-14 10:30:00'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result/86400, 365, '1974 - 1973 = 365 * 86400 sec'); + $clause = $this->adapter->datetimeDifferenceClause('1974-10-14 10:30:00', '1973-10-14 10:30:00'); + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result/86400, 365, '1974 - 1973 = 365 * 86400 sec', $offset); - $clause = $this->adapter->datetimeDifferenceClause(date('Y-m-d H:i:s', strtotime('-15 seconds')), 'now'); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, -15, '15 seconds ago - now'); + $clause = $this->adapter->datetimeDifferenceClause(date('Y-m-d H:i:s', strtotime('-15 seconds')), 'now'); + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result, -15, '15 seconds ago - now', $offset); - $clause = $this->adapter->datetimeDifferenceClause('now', $this->adapter->datetimeIntervalClause('now', '+45 Minutes')); - $result = DB::query('SELECT ' . $clause)->value(); - $this->matchesRoughly($result, -45 * 60, 'now - 45 minutes ahead'); + $clause = $this->adapter->datetimeDifferenceClause('now', $this->adapter->datetimeIntervalClause('now', '+45 Minutes')); + $result = DB::query('SELECT ' . $clause)->value(); + $this->matchesRoughly($result, -45 * 60, 'now - 45 minutes ahead', $offset); - $query = new SQLQuery(); - $query->setSelect(array()); - $query->selectField($this->adapter->datetimeDifferenceClause('"LastEdited"', '"Created"'), 'test') - ->setFrom('"DbDateTimeTest_Team"') - ->setLimit(1); + $query = new SQLQuery(); + $query->setSelect(array()); + $query->selectField($this->adapter->datetimeDifferenceClause('"LastEdited"', '"Created"'), 'test') + ->setFrom('"DbDateTimeTest_Team"') + ->setLimit(1); - $result = $query->execute()->value(); - $lastedited = Dataobject::get_one('DbDateTimeTest_Team')->LastEdited; - $created = Dataobject::get_one('DbDateTimeTest_Team')->Created; - $this->matchesRoughly($result, strtotime($lastedited) - strtotime($created), 'age of HomePage record in seconds since unix epoc'); - - } + $result = $query->execute()->value(); + $lastedited = Dataobject::get_one('DbDateTimeTest_Team')->LastEdited; + $created = Dataobject::get_one('DbDateTimeTest_Team')->Created; + $this->matchesRoughly($result, strtotime($lastedited) - strtotime($created), 'age of HomePage record in seconds since unix epoc', $offset); } } @@ -137,4 +133,4 @@ class DbDateTimeTest_Team extends DataObject implements TestOnly { static $db = array( 'Title' => 'Varchar' ); -} +} \ No newline at end of file From 64669938da908d92d5e2d77639796e9737ba5e5c Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 6 Jul 2012 12:00:38 +0200 Subject: [PATCH 05/43] Warning when running tests without flush=1 This is now the default setting for both "sake" and "phpunit" runs, because of performance reasons (every manifest flush takes multiple seconds). On the other hand, we want to make errors like missing classes more obvious to developers. See discussion in https://github.com/silverstripe/sapphire/pull/620 --- dev/TestRunner.php | 8 ++++++++ tests/bootstrap.php | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/dev/TestRunner.php b/dev/TestRunner.php index a11ec5890..697370bae 100644 --- a/dev/TestRunner.php +++ b/dev/TestRunner.php @@ -106,6 +106,14 @@ class TestRunner extends Controller { if(!PhpUnitWrapper::has_php_unit()) { die("Please install PHPUnit using pear"); } + + if(!isset($_GET['flush']) || !$_GET['flush']) { + Debug::message( + "WARNING: Manifest not flushed. " . + "Add flush=1 as an argument to discover new classes or files.\n", + false + ); + } } public function Link() { diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 89a4c985f..1904a068f 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -62,4 +62,12 @@ $controller = new FakeController(); TestRunner::use_test_manifest(); // Remove the error handler so that PHPUnit can add its own -restore_error_handler(); \ No newline at end of file +restore_error_handler(); + +if(!isset($_GET['flush']) || !$_GET['flush']) { + Debug::message( + "WARNING: Manifest not flushed. " . + "Add flush=1 as an argument to discover new classes or files.\n", + false + ); +} \ No newline at end of file From bc1c7f766ace6c99a9ffb90d083c81b8c54951a0 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 6 Jul 2012 12:42:04 +0200 Subject: [PATCH 06/43] Add sorting to GridFieldDetailFormTest fixtures Broke SQLite3 tests in some cases due to random ordering of results. --- tests/forms/gridfield/GridFieldDetailFormTest.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/forms/gridfield/GridFieldDetailFormTest.php b/tests/forms/gridfield/GridFieldDetailFormTest.php index 2936ffd3d..c5b310aa8 100644 --- a/tests/forms/gridfield/GridFieldDetailFormTest.php +++ b/tests/forms/gridfield/GridFieldDetailFormTest.php @@ -63,8 +63,8 @@ class GridFieldDetailFormTest extends FunctionalTest { $surname = $parser->getBySelector('#Form_ItemEditForm_Surname'); $this->assertFalse($response->isError()); - $this->assertEquals('Joe', (string) $firstName[0]); - $this->assertEquals('Bloggs', (string) $surname[0]); + $this->assertEquals('Jane', (string) $firstName[0]); + $this->assertEquals('Doe', (string) $surname[0]); } function testEditForm() { @@ -188,6 +188,8 @@ class GridFieldDetailFormTest_Person extends DataObject implements TestOnly { 'Categories' => 'GridFieldDetailFormTest_Category' ); + static $default_sort = 'FirstName'; + function getCMSFields() { $fields = parent::getCMSFields(); // TODO No longer necessary once FormScaffolder uses GridField @@ -209,7 +211,9 @@ class GridFieldDetailFormTest_PeopleGroup extends DataObject implements TestOnly static $has_many = array( 'People' => 'GridFieldDetailFormTest_Person' ); - + + static $default_sort = 'Name'; + function getCMSFields() { $fields = parent::getCMSFields(); // TODO No longer necessary once FormScaffolder uses GridField @@ -232,6 +236,8 @@ class GridFieldDetailFormTest_Category extends DataObject implements TestOnly { 'People' => 'GridFieldDetailFormTest_Person' ); + static $default_sort = 'Name'; + function getCMSFields() { $fields = parent::getCMSFields(); // TODO No longer necessary once FormScaffolder uses GridField From 630ab878c9f5308dba76fee2985e352b8141aa7a Mon Sep 17 00:00:00 2001 From: Kirk Mayo Date: Tue, 10 Jul 2012 14:52:34 +1200 Subject: [PATCH 07/43] BUG:fixed the misaligned edit and delete buttons in gridfield Trac 7527 --- css/GridField.css | 2 +- scss/GridField.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/css/GridField.css b/css/GridField.css index 13d4cf6e9..fc09d448a 100644 --- a/css/GridField.css +++ b/css/GridField.css @@ -45,7 +45,7 @@ .cms table.ss-gridfield-table tbody td.col-getTreeTitle span.badge.deletedonlive { color: #636363; border: 1px solid #E49393; background-color: #F2DADB; } .cms table.ss-gridfield-table tbody td.col-getTreeTitle span.badge.removedfromdraft { color: #636363; border: 1px solid #E49393; background-color: #F2DADB; } .cms table.ss-gridfield-table tbody td.col-getTreeTitle span.badge.workflow-approval { color: #56660C; border: 1px solid #7C8816; background-color: #DAE79A; } -.cms table.ss-gridfield-table tbody td button { border: none; background: none; margin: 0 0 0 2px; padding: 6px 0; width: auto; text-shadow: none; } +.cms table.ss-gridfield-table tbody td button { border: none; background: none; margin: 0 0 0 2px; padding: 1px 0; width: auto; text-shadow: none; } .cms table.ss-gridfield-table tbody td button.ui-state-hover { background: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } .cms table.ss-gridfield-table tbody td button.ui-state-active { border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } .cms table.ss-gridfield-table tbody td button.gridfield-button-delete { width: 20px; margin: 0; } diff --git a/scss/GridField.scss b/scss/GridField.scss index 68708cb0e..1c6ac9cd2 100644 --- a/scss/GridField.scss +++ b/scss/GridField.scss @@ -237,7 +237,7 @@ $gf_grid_x: 16px; border: none; background: none; margin: 0 0 0 2px; - padding: 6px 0; + padding: 1px 0; width: auto; text-shadow: none; &.ui-state-hover { From 4a9c6d1e2263968c919ecf7baaf5804209fefddb Mon Sep 17 00:00:00 2001 From: Kirk Mayo Date: Tue, 10 Jul 2012 16:57:58 +1200 Subject: [PATCH 08/43] BUGFIX:fixed action buttons on edit page content - stopped them from overlapping in ie8. --- admin/css/ie8.css | 7 +++++-- admin/scss/ie8.scss | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/admin/css/ie8.css b/admin/css/ie8.css index 2102df8cd..45d71e722 100644 --- a/admin/css/ie8.css +++ b/admin/css/ie8.css @@ -40,8 +40,8 @@ .filter-buttons button.ss-gridfield-button-filter { background-position: -18px 4px !important; } -.cms-panel .cms-panel-content-collapsed { width: 40px; } -.cms-panel .cms-panel-content-collapsed h2, .cms-panel .cms-panel-content-collapsed h3 { display: none; } +.cms-panel .cms-panel-content-collapsed { position: relative; width: 40px; } +.cms-panel .cms-panel-content-collapsed h2.cms-panel-header, .cms-panel .cms-panel-content-collapsed h3.cms-panel-header { zoom: 1; position: absolute; top: 10px; right: 10px; writing-mode: tb-rl; float: right; z-index: 5000; } .cms-content-toolbar .cms-tree-view-modes .checkboxAboveTree { margin-right: 1px; } @@ -52,3 +52,6 @@ .filter-buttons button.ss-gridfield-button-close { margin-right: -7px !important; } .col-buttons { width: 18px; } + +/* fix for actions buttons on edit page content overlapping */ +.cms-content-actions .ss-ui-buttonset button { margin-right: 0; } diff --git a/admin/scss/ie8.scss b/admin/scss/ie8.scss index 8d74e7838..0fbe309bf 100644 --- a/admin/scss/ie8.scss +++ b/admin/scss/ie8.scss @@ -39,4 +39,13 @@ .col-buttons{ width:18px; +} + +/* fix for actions buttons on edit page content overlapping */ +.cms-content-actions { + .ss-ui-buttonset { + button { + margin-right: 0; + } + } } \ No newline at end of file From e096c297b8abf5a1dd4e66be5d09b8d76fa5a698 Mon Sep 17 00:00:00 2001 From: Jeremy Bridson Date: Wed, 11 Jul 2012 09:19:50 +1200 Subject: [PATCH 09/43] BUGFIX: open ticket 7603 fixing search filtering - thought I should initialise $dataListClone --- forms/HtmlEditorField.php | 13 ++++++++----- forms/gridfield/GridFieldFilterHeader.php | 5 +++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index 1da956135..da458a3a4 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -362,11 +362,14 @@ class HtmlEditorField_Toolbar extends RequestHandler { // TODO Handle through GridState within field - currently this state set too late to be useful here (during request handling) $parentID = $this->controller->getRequest()->requestVar('ParentID'); - $fileFieldConfig = GridFieldConfig::create(); - $fileFieldConfig->addComponent(new GridFieldSortableHeader()); - $fileFieldConfig->addComponent(new GridFieldFilterHeader()); - $fileFieldConfig->addComponent(new GridFieldDataColumns()); - $fileFieldConfig->addComponent(new GridFieldPaginator(5)); + $fileFieldConfig = GridFieldConfig::create()->addComponents( + new GridFieldFilterHeader(), + new GridFieldSortableHeader(), + new GridFieldDataColumns(), + new GridFieldPaginator(5), + new GridFieldDeleteAction(), + new GridFieldDetailForm() + ); $fileField = new GridField('Files', false, null, $fileFieldConfig); $fileField->setList($this->getFiles($parentID)); $fileField->setAttribute('data-selectable', true); diff --git a/forms/gridfield/GridFieldFilterHeader.php b/forms/gridfield/GridFieldFilterHeader.php index 294db9d37..2d8db43a4 100644 --- a/forms/gridfield/GridFieldFilterHeader.php +++ b/forms/gridfield/GridFieldFilterHeader.php @@ -91,12 +91,13 @@ class GridFieldFilterHeader implements GridField_HTMLProvider, GridField_DataMan } $filterArguments = $state->Columns->toArray(); + $dataListClone = null; foreach($filterArguments as $columnName => $value ) { if($dataList->canFilterBy($columnName) && $value) { - $dataList->filter($columnName.':PartialMatch', $value); + $dataListClone = $dataList->filter($columnName.':PartialMatch', $value); } } - return $dataList; + return ($dataListClone) ? $dataListClone : $dataList; } public function getHTMLFragments($gridField) { From ac4582575259d0d3c1d3dbaeae6390c8115cd57c Mon Sep 17 00:00:00 2001 From: Kirk Mayo Date: Wed, 11 Jul 2012 10:09:10 +1200 Subject: [PATCH 10/43] BUG:fixed alignment of radio buttons on add page pane trac/7473 --- admin/css/screen.css | 23 ++++----- admin/scss/_style.scss | 104 +++++++++++++++++++++-------------------- 2 files changed, 66 insertions(+), 61 deletions(-) diff --git a/admin/css/screen.css b/admin/css/screen.css index 3b9953899..c2433c2b5 100644 --- a/admin/css/screen.css +++ b/admin/css/screen.css @@ -355,17 +355,18 @@ body.cms { overflow: hidden; } .cms-add-form .step-label .title { padding-top: 5px; font-weight: bold; text-shadow: 1px 1px 0 white; } .cms-add-form ul.SelectionGroup { padding-left: 28px; } .cms-add-form .parent-mode { padding: 8px; overflow: auto; } -.cms-add-form #PageType li { float: none; width: 100%; padding: 9px 0 9px 15px; overflow: hidden; border-bottom-width: 2px; border-bottom: 2px groove rgba(255, 255, 255, 0.8); -webkit-border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; } -.cms-add-form #PageType li:last-child { border-bottom: none; } -.cms-add-form #PageType li:hover, .cms-add-form #PageType li.selected { background-color: rgba(255, 255, 102, 0.3); } -.cms-add-form #PageType li.disabled { color: #aaaaaa; } -.cms-add-form #PageType li.disabled:hover { background: none; } -.cms-add-form #PageType li input { margin: inherit; } -.cms-add-form #PageType li label { padding-left: 0; padding-bottom: 0; } -.cms-add-form #PageType li input, .cms-add-form #PageType li label, .cms-add-form #PageType li .page-icon, .cms-add-form #PageType li .title { float: left; line-height: 1.3em; } -.cms-add-form #PageType li .page-icon { margin: 0 4px; } -.cms-add-form #PageType li .title { width: 120px; font-weight: bold; padding-right: 10px; } -.cms-add-form #PageType li .description { font-style: italic; } +.cms-add-form #PageType ul { padding-left: 20px; } +.cms-add-form #PageType ul li { float: none; width: 100%; padding: 9px 0 9px 15px; overflow: hidden; border-bottom-width: 2px; border-bottom: 2px groove rgba(255, 255, 255, 0.8); -webkit-border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; } +.cms-add-form #PageType ul li:last-child { border-bottom: none; } +.cms-add-form #PageType ul li:hover, .cms-add-form #PageType ul li.selected { background-color: rgba(255, 255, 102, 0.3); } +.cms-add-form #PageType ul li.disabled { color: #aaaaaa; } +.cms-add-form #PageType ul li.disabled:hover { background: none; } +.cms-add-form #PageType ul li input { margin: inherit; } +.cms-add-form #PageType ul li label { padding-left: 0; padding-bottom: 0; } +.cms-add-form #PageType ul li input, .cms-add-form #PageType ul li label, .cms-add-form #PageType ul li .page-icon, .cms-add-form #PageType ul li .title { float: left; line-height: 1.3em; } +.cms-add-form #PageType ul li .page-icon { margin: 0 4px; } +.cms-add-form #PageType ul li .title { width: 120px; font-weight: bold; padding-right: 10px; } +.cms-add-form #PageType ul li .description { font-style: italic; } /** -------------------------------------------- Content toolbar -------------------------------------------- */ .cms-content-toolbar { display: block; margin: 0 0 15px 0; border-bottom: 1px solid rgba(201, 205, 206, 0.8); -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); -o-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); box-shadow: 0 1px 0 rgba(255, 255, 255, 0.8); *zoom: 1; /* smaller treedropdown */ } diff --git a/admin/scss/_style.scss b/admin/scss/_style.scss index 14b3feba4..329ca0a20 100644 --- a/admin/scss/_style.scss +++ b/admin/scss/_style.scss @@ -481,59 +481,63 @@ body.cms { overflow: auto; } - #PageType li { - float: none; - width: 100%; - padding: 9px 0 9px 15px; - overflow: hidden; - border-bottom-width: 2px; - border-bottom: 2px groove lighten($color-shadow-light, 95%); - -webkit-border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; - border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; + #PageType { + ul { + padding-left: 20px; + li { + float: none; + width: 100%; + padding: 9px 0 9px 15px; + overflow: hidden; + border-bottom-width: 2px; + border-bottom: 2px groove lighten($color-shadow-light, 95%); + -webkit-border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; + border-image: url(../images/textures/bg_fieldset_elements_border.png) 2 stretch stretch; - &:last-child { - border-bottom: none; - } + &:last-child { + border-bottom: none; + } + + &:hover, &.selected { + background-color: $color-highlight-opacity; + } + + &.disabled { + color: $color-text-disabled; + &:hover { + background: none; + } + } + + input { + margin: inherit; + } + + label { + padding-left: 0; + padding-bottom: 0; + } - &:hover, &.selected { - background-color: $color-highlight-opacity; - } - - &.disabled { - color: $color-text-disabled; - &:hover { - background: none; + input, label, .page-icon, .title { + float: left; + line-height: 1.3em; + } + + .page-icon { + margin: 0 4px; + } + + .title { + width: 120px; + font-weight: bold; + padding-right: 10px; + } + + .description { + font-style: italic; + } } - } - - input { - margin: inherit; - } - - label { - padding-left: 0; - padding-bottom: 0; - } - - input, label, .page-icon, .title { - float: left; - line-height: 1.3em; - } - - .page-icon { - margin: 0 4px; - } - - .title { - width: 120px; - font-weight: bold; - padding-right: 10px; - } - - .description { - font-style: italic; - } - + } } } From f507a517e1437f4c479a1471a84b25dfe4e335b6 Mon Sep 17 00:00:00 2001 From: Will Rossiter Date: Wed, 11 Jul 2012 19:18:27 +1200 Subject: [PATCH 11/43] Update reference in docs from :Contains to :PartialMatch --- docs/en/topics/datamodel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/topics/datamodel.md b/docs/en/topics/datamodel.md index 76429d5ae..9b1bc388e 100755 --- a/docs/en/topics/datamodel.md +++ b/docs/en/topics/datamodel.md @@ -204,7 +204,7 @@ will return all members whose first name or surname contain the string 'sam'. :::php $members = Member::get()->filter(array( - 'FirstName,Surname:Contains' => 'sam' + 'FirstName,Surname:PartialMatch' => 'sam' )); If you wish to match against any of a number of values, you can pass an array as the value. This will return all From eef67b6f8761ac947dc473defd46e2c6c4dbc083 Mon Sep 17 00:00:00 2001 From: Mateusz Uzdowski Date: Tue, 10 Jul 2012 16:30:13 +1200 Subject: [PATCH 12/43] API Clean up the return values for getCurrentLink Returning a link type "internal" in the situation when no link has been detected is confusing and makes it hard to know downstream if the link was detected or not. Switched that to null. Also added target option to file downloads, as we don't currently have a mechanism to default this field to "yes" for files. --- javascript/HtmlEditorField.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/javascript/HtmlEditorField.js b/javascript/HtmlEditorField.js index 8bac10c0e..309aa1f32 100644 --- a/javascript/HtmlEditorField.js +++ b/javascript/HtmlEditorField.js @@ -631,8 +631,9 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; } }, /** - * Return information about the currently selected link, suitable for population of the link - * form. + * Return information about the currently selected link, suitable for population of the link form. + * + * Returns null if no link was currently selected. */ getCurrentLink: function() { var selectedEl = this.getSelection(), @@ -682,7 +683,8 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; return { LinkType: 'file', file: RegExp.$1, - Description: title + Description: title, + TargetBlank: target ? true : false }; } else if(href.match(/^#(.*)$/)) { return { @@ -707,9 +709,8 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; TargetBlank: target ? true : false }; } else { - return { - LinkType: 'internal' - }; + // No link/invalid link selected. + return null; } } }); From 29a039929b0505bd560a75048dee1aea550c74df Mon Sep 17 00:00:00 2001 From: Mateusz Uzdowski Date: Tue, 10 Jul 2012 16:32:39 +1200 Subject: [PATCH 13/43] Refactor the linking functionality for the TinyMCE popup. Functionality that affects the values in the form better fits in updateFromEditor function, where we expect the form to be modified. Redraw should only affect visibility parameters. Also added a more robust reset code, so we can always expect to get at least a clean form, and re-added missing "target" checkbox. --- javascript/HtmlEditorField.js | 36 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/javascript/HtmlEditorField.js b/javascript/HtmlEditorField.js index 309aa1f32..9a271a47c 100644 --- a/javascript/HtmlEditorField.js +++ b/javascript/HtmlEditorField.js @@ -468,7 +468,6 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; * which are toggled through a type dropdown. Variations share fields, so there's only one "title" field in the form. */ $('form.htmleditorfield-linkform').entwine({ - // TODO Entwine doesn't respect submits triggered by ENTER key onsubmit: function(e) { this.insertLink(); @@ -477,36 +476,27 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; }, resetFields: function() { this._super(); - this.find('fieldset :input:not(:radio)').val('').change(); + + // Reset the form using a native call. This will also correctly reset checkboxes and radio buttons. + this[0].reset(); }, - redraw: function(setDefaults) { + redraw: function() { this._super(); var linkType = this.find(':input[name=LinkType]:checked').val(), list = ['internal', 'external', 'file', 'email']; - // If we haven't selected an existing link, then just make sure we default to "internal" for the link type. - if(!linkType) { - this.find(':input[name=LinkType]').val(['internal']); - linkType = 'internal'; - } - this.addAnchorSelector(); - // Toggle field visibility and state based on type selection + // Toggle field visibility depending on the link type. this.find('div.content .field').hide(); this.find('.field#LinkType').show(); this.find('.field#' + linkType).show(); if(linkType == 'internal' || linkType == 'anchor') this.find('.field#Anchor').show(); + if(linkType !== 'email') this.find('.field#TargetBlank').show(); if(linkType == 'anchor') { this.find('.field#AnchorSelector').show(); this.find('.field#AnchorRefresh').show(); } - - this.find(':input[name=TargetBlank]').attr('disabled', (linkType == 'email')); - - if(typeof setDefaults == 'undefined' || setDefaults) { - this.find(':input[name=TargetBlank]').attr('checked', (linkType == 'file')); - } }, insertLink: function() { var href, target = null, anchor = this.find(':input[name=Anchor]').val(); @@ -614,16 +604,24 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; selector.append($('')); } }, + /** + * Updates the state of the dialog inputs to match the editor selection. + * If selection does not contain a link, resets the fields. + */ updateFromEditor: function() { var htmlTagPattern = /<\S[^><]*>/g, fieldName, data = this.getCurrentLink(); - + if(data) { for(fieldName in data) { var el = this.find(':input[name=' + fieldName + ']'), selected = data[fieldName]; // Remove html tags in the selected text that occurs on IE browsers if(typeof(selected) == 'string') selected = selected.replace(htmlTagPattern, ''); - if(el.is(':radio')) { - el.val([selected]).change(); // setting as an arry due to jQuery quirks + + // Set values and invoke the triggers (e.g. for TreeDropdownField). + if(el.is(':checkbox')) { + el.prop('checked', selected).change(); + } else if(el.is(':radio')) { + el.val([selected]).change(); } else { el.val(selected).change(); } From 7c41ff22ab227c27f25ed8f796872a50bfb71d83 Mon Sep 17 00:00:00 2001 From: Mateusz Uzdowski Date: Thu, 12 Jul 2012 14:11:47 +1200 Subject: [PATCH 14/43] BUG Change all shortcodes into the new, comma separated, format. Space delimiter is often confused by browsers, and encoded as %20 which breaks the shortcode system. Change to comma delimitation has already been implemented, this is a followup cleanup. Ref http://open.silverstripe.org/ticket/7337 --- forms/HtmlEditorField.php | 6 +++--- javascript/HtmlEditorField.js | 2 +- parsers/ShortcodeParser.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index 47b0150da..7a71fd0a5 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -63,14 +63,14 @@ class HtmlEditorField extends TextareaField { if($links = $value->getElementsByTagName('a')) foreach($links as $link) { $matches = array(); - if(preg_match('/\[sitetree_link id=([0-9]+)\]/i', $link->getAttribute('href'), $matches)) { + if(preg_match('/\[sitetree_link(?:\s*|%20|,)?id=([0-9]+)\]/i', $link->getAttribute('href'), $matches)) { if(!DataObject::get_by_id('SiteTree', $matches[1])) { $class = $link->getAttribute('class'); $link->setAttribute('class', ($class ? "$class ss-broken" : 'ss-broken')); } } - if(preg_match('/\[file_link id=([0-9]+)\]/i', $link->getAttribute('href'), $matches)) { + if(preg_match('/\[file_link(?:\s*|%20|,)?id=([0-9]+)\]/i', $link->getAttribute('href'), $matches)) { if(!DataObject::get_by_id('File', $matches[1])) { $class = $link->getAttribute('class'); $link->setAttribute('class', ($class ? "$class ss-broken" : 'ss-broken')); @@ -114,7 +114,7 @@ class HtmlEditorField extends TextareaField { $href = Director::makeRelative($link->getAttribute('href')); if($href) { - if(preg_match('/\[sitetree_link id=([0-9]+)\]/i', $href, $matches)) { + if(preg_match('/\[sitetree_link,id=([0-9]+)\]/i', $href, $matches)) { $ID = $matches[1]; // clear out any broken link classes diff --git a/javascript/HtmlEditorField.js b/javascript/HtmlEditorField.js index 9a271a47c..7f21670d6 100644 --- a/javascript/HtmlEditorField.js +++ b/javascript/HtmlEditorField.js @@ -691,7 +691,7 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; Description: title, TargetBlank: target ? true : false }; - } else if(href.match(/^\[sitetree_link\s*(?:%20)?id=([0-9]+)\]?(#.*)?$/)) { + } else if(href.match(/^\[sitetree_link(?:\s*|%20|,)?id=([0-9]+)\]?(#.*)?$/i)) { return { LinkType: 'internal', internal: RegExp.$1, diff --git a/parsers/ShortcodeParser.php b/parsers/ShortcodeParser.php index b6d2feff5..56450f8f5 100644 --- a/parsers/ShortcodeParser.php +++ b/parsers/ShortcodeParser.php @@ -29,7 +29,7 @@ * * Inbuilt Shortcodes * - * From 2.4 onwards links inserted via the CMS into a content field are in the form ''''. At runtime this is replaced by a plain link to the page with the ID in question. + * From 2.4 onwards links inserted via the CMS into a content field are in the form '''', and from 3.0 the comma is used as a separator instead ''''. At runtime this is replaced by a plain link to the page with the ID in question. * * Limitations * From c785f3c4923991b065dbda6768c68c8ea6872714 Mon Sep 17 00:00:00 2001 From: Mateusz Uzdowski Date: Thu, 12 Jul 2012 14:46:23 +1200 Subject: [PATCH 15/43] BUG Adjust the tree construction and triggers to work with IE. After Hamish's suggestion. Entwine onchange would not get executed in IE8 at all, which would have the effect of the displyed dropdown selection not being set. Change to onadd also mandates the changes to onadd on other parts of the tree component - otherwise the change event can trigger before the tree elements are added to the DOM. --- javascript/TreeDropdownField.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/javascript/TreeDropdownField.js b/javascript/TreeDropdownField.js index ab9ce3c35..224733f85 100644 --- a/javascript/TreeDropdownField.js +++ b/javascript/TreeDropdownField.js @@ -29,7 +29,7 @@ * @todo Expand title height to fit all elements */ $('.TreeDropdownField').entwine({ - onmatch: function() { + onadd: function() { this.append( '' + '' + @@ -43,9 +43,6 @@ this.getPanel().hide(); this._super(); }, - onunmatch: function() { - this._super(); - }, getPanel: function() { return this.find('.treedropdownfield-panel'); }, @@ -260,7 +257,7 @@ }); $('.TreeDropdownField.searchable').entwine({ - onmatch: function() { + onadd: function() { this._super(); var title = this.data('title'); @@ -270,9 +267,6 @@ this.setTitle(title ? title : strings.searchFieldTitle); }, - onunmatch: function() { - this._super(); - }, setTitle: function(title) { if(!title && title !== '') title = strings.fieldTitle; @@ -372,8 +366,13 @@ }); $('.TreeDropdownField input[type=hidden]').entwine({ - onchange: function() { - this.getField().updateTitle(); + onadd: function() { + this.bind('change.TreeDropdownField', function() { + $(this).getField().updateTitle(); + }); + }, + onremove: function() { + this.unbind('.TreeDropdownField'); } }); }); From 7a52a7fe418cfe017586a2c76650926ceae81df5 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Thu, 12 Jul 2012 17:10:50 +0200 Subject: [PATCH 16/43] BUG Default form submits to text/html, fixing validation (#7653) Was using text/json, which Form->httpSubmission() interprets (correctly) to returning JSON validation data. This trips up the interface, which expects HTML with the validation errors directly in the markup. --- admin/javascript/LeftAndMain.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index 387ece8f9..ca2ae96aa 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -253,8 +253,7 @@ jQuery.noConflict(); }); newForm.trigger('aftersubmitform', {status: status, xhr: xhr, formData: formData}); - }, - dataType: 'json' + } }, ajaxOptions)); return false; From 8d3d3a7229230e1a2b5c35bdff9adef745b253a8 Mon Sep 17 00:00:00 2001 From: Juerg Rast Date: Thu, 12 Jul 2012 19:56:19 +0200 Subject: [PATCH 17/43] Typo in the Filename of the CSS-File --- forms/TabSet.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forms/TabSet.php b/forms/TabSet.php index 01457e4dc..1162e204e 100644 --- a/forms/TabSet.php +++ b/forms/TabSet.php @@ -72,7 +72,7 @@ class TabSet extends CompositeField { Requirements::javascript(FRAMEWORK_DIR . '/thirdparty/jquery-ui/jquery-ui.js'); Requirements::javascript(FRAMEWORK_DIR . '/thirdparty/jquery-cookie/jquery.cookie.js'); - Requirements::css(FRAMEWORK_DIR . '/thirdparty/jquery-ui-themes/smoothness/jquery.ui.css'); + Requirements::css(FRAMEWORK_DIR . '/thirdparty/jquery-ui-themes/smoothness/jquery-ui.css'); Requirements::javascript(FRAMEWORK_DIR . '/thirdparty/jquery-entwine/dist/jquery.entwine-dist.js'); From a5a08530fc88ed0bc61cab9c0e794a76d24fbf63 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 13 Jul 2012 10:19:24 +0200 Subject: [PATCH 18/43] BUG Force "full" ajax content reload with invalid fragments When one or more fragments are requested that are not in the current DOM, we need to force loading the outermost fragment instead (currently hardcoded to "Content"). This mainly prevents history back navigation from breaking, e.g. admin/pages -> admin/pages/list -> admin/pages/list/?ParentID=99 -> admin/pages/edit/show/5 -> (back) --- admin/javascript/LeftAndMain.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index ca2ae96aa..07f26b076 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -287,7 +287,8 @@ jQuery.noConflict(); var self = this, h = window.History, state = h.getState(), fragments = state.data.pjax || 'Content', headers = {}, - contentEls = this._findFragments(fragments.split(',')); + fragmentsArr = fragments.split(','), + contentEls = this._findFragments(fragmentsArr); // For legacy IE versions (IE7 and IE8), reload without ajax // as a crude way to fix memory leaks through whole window refreshes. @@ -297,6 +298,14 @@ jQuery.noConflict(); document.location.href = state.url; return; } + + // If any of the requested Pjax fragments don't exist in the current view, + // fetch the "Content" view instead, which is the "outermost" fragment + // that can be reloaded without reloading the whole window. + if(contentEls.length < fragmentsArr.length) { + fragments = 'Content', fragmentsArr = ['Content']; + contentEls = this._findFragments(fragmentsArr); + } this.trigger('beforestatechange', {state: state, element: contentEls}); From 712f28bc78fa49018f36c5abc3c305a53c58b724 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 13 Jul 2012 11:37:35 +0200 Subject: [PATCH 19/43] Scoped deprecation messages (fixes #7645) --- admin/code/LeftAndMainDecorator.php | 2 +- control/Director.php | 2 +- core/Object.php | 12 +++++----- dev/Deprecation.php | 27 +++++++++++++++++----- filesystem/Folder.php | 2 +- forms/DropdownField.php | 4 ++-- forms/FieldList.php | 13 ++++++----- forms/FileField.php | 8 ++++++- forms/HasManyComplexTableField.php | 2 +- forms/HtmlEditorField.php | 2 +- forms/ImageField.php | 2 +- forms/ImageFormAction.php | 2 +- forms/ManyManyComplexTableField.php | 2 +- forms/PasswordField.php | 2 +- forms/SimpleImageField.php | 4 ++-- i18n/i18n.php | 3 ++- model/ComponentSet.php | 2 +- model/DataExtension.php | 2 +- model/DataList.php | 4 ++-- model/DataObject.php | 2 +- model/DataObjectDecorator.php | 2 +- model/DataObjectSet.php | 2 +- model/SQLMap.php | 2 +- tests/dev/DeprecationTest.php | 35 +++++++++++++++++++++++++---- 24 files changed, 97 insertions(+), 43 deletions(-) diff --git a/admin/code/LeftAndMainDecorator.php b/admin/code/LeftAndMainDecorator.php index b9857dd08..59169bb9d 100644 --- a/admin/code/LeftAndMainDecorator.php +++ b/admin/code/LeftAndMainDecorator.php @@ -7,7 +7,7 @@ abstract class LeftAndMainDecorator extends LeftAndMainExtension { public function __construct() { - Deprecation::notice('3.0', 'Use LeftAndMainExtension instead.'); + Deprecation::notice('3.0', 'Use LeftAndMainExtension instead.', Deprecation::SCOPE_CLASS); parent::__construct(); } diff --git a/control/Director.php b/control/Director.php index f3540abe1..bc3973503 100644 --- a/control/Director.php +++ b/control/Director.php @@ -42,7 +42,7 @@ class Director implements TemplateGlobalProvider { */ static function addRules($priority, $rules) { if ($priority != 100) { - Deprecation::notice('3.0', 'Priority argument is now ignored - use the default of 100. You should really be setting routes via _config yaml fragments though.'); + Deprecation::notice('3.0', 'Priority argument is now ignored - use the default of 100. You should really be setting routes via _config yaml fragments though.', Deprecation::SCOPE_GLOBAL); } Config::inst()->update('Director', 'rules', $rules); diff --git a/core/Object.php b/core/Object.php index 08e3d165d..b37423762 100755 --- a/core/Object.php +++ b/core/Object.php @@ -332,7 +332,7 @@ abstract class Object { * @return mixed */ public static function get_static($class, $name, $uncached = false) { - Deprecation::notice('3.1.0', 'get_static is deprecated, replaced by Config#get'); + Deprecation::notice('3.1.0', 'Replaced by Config#get'); return Config::inst()->get($class, $name, Config::FIRST_SET); } @@ -344,7 +344,7 @@ abstract class Object { * @param mixed $value */ public static function set_static($class, $name, $value) { - Deprecation::notice('3.1.0', 'set_static is deprecated, replaced by Config#update'); + Deprecation::notice('3.1.0', 'Replaced by Config#update'); Config::inst()->update($class, $name, $value); } @@ -356,7 +356,7 @@ abstract class Object { * @return mixed */ public static function uninherited_static($class, $name, $uncached = false) { - Deprecation::notice('3.1.0', 'uninherited_static is deprecated, replaced by Config#get'); + Deprecation::notice('3.1.0', 'Replaced by Config#get'); return Config::inst()->get($class, $name, Config::UNINHERITED); } @@ -373,7 +373,7 @@ abstract class Object { public static function combined_static($class, $name, $ceiling = false) { if ($ceiling) throw new Exception('Ceiling argument to combined_static is no longer supported'); - Deprecation::notice('3.1.0', 'combined_static is deprecated, replaced by Config#get'); + Deprecation::notice('3.1.0', 'Replaced by Config#get'); return Config::inst()->get($class, $name); } @@ -385,7 +385,7 @@ abstract class Object { * @param bool $replace replace existing static vars */ public static function addStaticVars($class, $properties, $replace = false) { - Deprecation::notice('3.1.0', 'addStaticVars is deprecated, replaced by Config#update'); + Deprecation::notice('3.1.0', 'Replaced by Config#update'); foreach($properties as $prop => $value) self::add_static_var($class, $prop, $value, $replace); } @@ -406,7 +406,7 @@ abstract class Object { * @param bool $replace completely replace existing static values */ public static function add_static_var($class, $name, $value, $replace = false) { - Deprecation::notice('3.1.0', 'add_static_var is deprecated, replaced by Config#remove and Config#update'); + Deprecation::notice('3.1.0', 'Replaced by Config#remove and Config#update'); if ($replace) Config::inst()->remove($class, $name); Config::inst()->update($class, $name, $value); diff --git a/dev/Deprecation.php b/dev/Deprecation.php index 071e31146..8e9a9399f 100644 --- a/dev/Deprecation.php +++ b/dev/Deprecation.php @@ -32,6 +32,10 @@ */ class Deprecation { + const SCOPE_METHOD = 1; + const SCOPE_CLASS = 2; + const SCOPE_GLOBAL = 4; + /** * * @var string @@ -119,9 +123,10 @@ class Deprecation { * @static * @param $string - The notice to raise * @param $atVersion - The version at which this notice should start being raised + * @param Boolean $scope - Notice relates to the method or class context its called in. * @return void */ - public static function notice($atVersion, $string = '') { + public static function notice($atVersion, $string = '', $scope = Deprecation::SCOPE_METHOD) { // Never raise deprecation notices in a live environment if(Director::isLive()) return; @@ -139,9 +144,16 @@ class Deprecation { // Check the version against the notice version if ($checkVersion && version_compare($checkVersion, $atVersion, '>=')) { - // Get the calling method - if (!$backtrace) $backtrace = debug_backtrace(0); - $caller = self::get_called_method_from_trace($backtrace); + // Get the calling scope + if($scope == Deprecation::SCOPE_METHOD) { + if (!$backtrace) $backtrace = debug_backtrace(0); + $caller = self::get_called_method_from_trace($backtrace); + } elseif($scope == Deprecation::SCOPE_CLASS) { + if (!$backtrace) $backtrace = debug_backtrace(0); + $caller = isset($backtrace[1]['class']) ? $backtrace[1]['class'] : '(unknown)'; + } else { + $caller = false; + } // Get the level to raise the notice as $level = self::$notice_level; @@ -152,7 +164,12 @@ class Deprecation { $string .= " Called from " . self::get_called_method_from_trace($backtrace, 2) . '.'; - user_error($caller.' is deprecated.'.($string ? ' '.$string : ''), $level); + if($caller) { + user_error($caller.' is deprecated.'.($string ? ' '.$string : ''), $level); + } else { + user_error($string, $level); + } + } } diff --git a/filesystem/Folder.php b/filesystem/Folder.php index dc8ed5472..940981acd 100644 --- a/filesystem/Folder.php +++ b/filesystem/Folder.php @@ -41,7 +41,7 @@ class Folder extends File { * @deprecated in favor of the correct name find_or_make */ public static function findOrMake($folderPath) { - Deprecation::notice('3.0', "Folder::findOrMake() is deprecated in favor of Folder::find_or_make()"); + Deprecation::notice('3.0', "Use Folder::find_or_make() instead."); return self::find_or_make($folderPath); } diff --git a/forms/DropdownField.php b/forms/DropdownField.php index 09a111e55..ec62092fa 100644 --- a/forms/DropdownField.php +++ b/forms/DropdownField.php @@ -118,10 +118,10 @@ class DropdownField extends FormField { $this->setSource($source); if($emptyString === true) { - Deprecation::notice('3.1', 'Please use setHasEmptyDefault(true) instead of passing a boolean true $emptyString argument'); + Deprecation::notice('3.1', 'Please use setHasEmptyDefault(true) instead of passing a boolean true $emptyString argument', Deprecation::SCOPE_GLOBAL); } if(is_string($emptyString)) { - Deprecation::notice('3.1', 'Please use setEmptyString() instead of passing a string $emptyString argument.'); + Deprecation::notice('3.1', 'Please use setEmptyString() instead of passing a string $emptyString argument.', Deprecation::SCOPE_GLOBAL); } if($emptyString) $this->setHasEmptyDefault(true); diff --git a/forms/FieldList.php b/forms/FieldList.php index 094d9a945..9ea578ecd 100644 --- a/forms/FieldList.php +++ b/forms/FieldList.php @@ -605,11 +605,14 @@ class FieldList extends ArrayList { foreach($this->getTabPathRewrites() as $regex => $replace) { if(preg_match($regex, $name)) { $newName = preg_replace($regex, $replace, $name); - Deprecation::notice('3.0.0', sprintf( - 'Using outdated tab path "%s", please use the new location "%s" instead', - $name, - $newName - )); + Deprecation::notice('3.0.0', + sprintf( + 'Using outdated tab path "%s", please use the new location "%s" instead', + $name, + $newName + ), + Deprecation::SCOPE_GLOBAL + ); return $newName; } } diff --git a/forms/FileField.php b/forms/FileField.php index e384ba342..21cf82dcc 100644 --- a/forms/FileField.php +++ b/forms/FileField.php @@ -102,7 +102,13 @@ class FileField extends FormField { * @param int $value The value of the field. */ function __construct($name, $title = null, $value = null) { - if(count(func_get_args()) > 3) Deprecation::notice('3.0', 'Use setRightTitle() and setFolderName() instead of constructor arguments'); + if(count(func_get_args()) > 3) { + Deprecation::notice( + '3.0', + 'Use setRightTitle() and setFolderName() instead of constructor arguments', + Deprecation::SCOPE_GLOBAL + ); + } $this->upload = new Upload(); diff --git a/forms/HasManyComplexTableField.php b/forms/HasManyComplexTableField.php index d6b25b56d..fdd569406 100644 --- a/forms/HasManyComplexTableField.php +++ b/forms/HasManyComplexTableField.php @@ -51,7 +51,7 @@ class HasManyComplexTableField extends ComplexTableField { function __construct($controller, $name, $sourceClass, $fieldList = null, $detailFormFields = null, $sourceFilter = "", $sourceSort = "", $sourceJoin = "") { parent::__construct($controller, $name, $sourceClass, $fieldList, $detailFormFields, $sourceFilter, $sourceSort, $sourceJoin); - Deprecation::notice('3.0', 'Use GridField with GridFieldConfig_RelationEditor'); + Deprecation::notice('3.0', 'Use GridField with GridFieldConfig_RelationEditor', Deprecation::SCOPE_CLASS); $this->Markable = true; diff --git a/forms/HtmlEditorField.php b/forms/HtmlEditorField.php index 7a71fd0a5..d30176139 100644 --- a/forms/HtmlEditorField.php +++ b/forms/HtmlEditorField.php @@ -46,7 +46,7 @@ class HtmlEditorField extends TextareaField { * @see TextareaField::__construct() */ public function __construct($name, $title = null, $value = '') { - if(count(func_get_args()) > 3) Deprecation::notice('3.0', 'Use setRows() and setCols() instead of constructor arguments'); + if(count(func_get_args()) > 3) Deprecation::notice('3.0', 'Use setRows() and setCols() instead of constructor arguments', Deprecation::SCOPE_GLOBAL); parent::__construct($name, $title, $value); diff --git a/forms/ImageField.php b/forms/ImageField.php index eabdd6e8e..c49871d42 100644 --- a/forms/ImageField.php +++ b/forms/ImageField.php @@ -45,7 +45,7 @@ class ImageField extends FileIFrameField { * @return Form */ public function EditFileForm() { - Deprecation::notice('3.0', 'Use UploadField'); + Deprecation::notice('3.0', 'Use UploadField', Deprecation::SCOPE_CLASS); $filter = create_function('$item', 'return (in_array("Folder", ClassInfo::ancestry($item->ClassName)) || in_array("Image", ClassInfo::ancestry($item->ClassName)));'); diff --git a/forms/ImageFormAction.php b/forms/ImageFormAction.php index d7fa72445..9932fcff1 100644 --- a/forms/ImageFormAction.php +++ b/forms/ImageFormAction.php @@ -18,7 +18,7 @@ class ImageFormAction extends FormAction { * @param form The parent form, auto-set when the field is placed inside a form */ function __construct($action, $title = "", $image = "", $hoverImage = null, $className = null, $form = null) { - Deprecation::notice('3.0', "Use FormAction with setAttribute('src', 'myimage.png') and custom JavaScript to achieve hover effect"); + Deprecation::notice('3.0', "Use FormAction with setAttribute('src', 'myimage.png') and custom JavaScript to achieve hover effect", Deprecation::SCOPE_CLASS); $this->image = $image; $this->hoverImage = $hoverImage; diff --git a/forms/ManyManyComplexTableField.php b/forms/ManyManyComplexTableField.php index d14e9b731..9592a933e 100644 --- a/forms/ManyManyComplexTableField.php +++ b/forms/ManyManyComplexTableField.php @@ -43,7 +43,7 @@ class ManyManyComplexTableField extends HasManyComplexTableField { function __construct($controller, $name, $sourceClass, $fieldList = null, $detailFormFields = null, $sourceFilter = "", $sourceSort = "", $sourceJoin = "") { - Deprecation::notice('3.0', 'Use GridField with GridFieldConfig_RelationEditor'); + Deprecation::notice('3.0', 'Use GridField with GridFieldConfig_RelationEditor', Deprecation::SCOPE_CLASS); parent::__construct($controller, $name, $sourceClass, $fieldList, $detailFormFields, $sourceFilter, $sourceSort, $sourceJoin); diff --git a/forms/PasswordField.php b/forms/PasswordField.php index 44f8886b8..6e91190f9 100644 --- a/forms/PasswordField.php +++ b/forms/PasswordField.php @@ -11,7 +11,7 @@ class PasswordField extends TextField { * maxlength */ function __construct($name, $title = null, $value = "") { - if(count(func_get_args()) > 3) Deprecation::notice('3.0', 'Use setMaxLength() instead of constructor arguments'); + if(count(func_get_args()) > 3) Deprecation::notice('3.0', 'Use setMaxLength() instead of constructor arguments', Deprecation::SCOPE_GLOBAL); parent::__construct($name, $title, $value); } diff --git a/forms/SimpleImageField.php b/forms/SimpleImageField.php index c7b79c543..3399b8ec8 100644 --- a/forms/SimpleImageField.php +++ b/forms/SimpleImageField.php @@ -69,9 +69,9 @@ class SimpleImageField extends FileField { function __construct($name, $title = null, $value = null) { - Deprecation::notice('3.0', "Use UploadField with \$myField->allowedExtensions = array('jpg', 'gif', 'png')"); + Deprecation::notice('3.0', "SimpleImageField is deprecated. Use UploadField with \$myField->allowedExtensions = array('jpg', 'gif', 'png')", Deprecation::SCOPE_CLASS); - if(count(func_get_args()) > 3) Deprecation::notice('3.0', 'Use setRightTitle() and setFolderName() instead of constructor arguments'); + if(count(func_get_args()) > 3) Deprecation::notice('3.0', 'Use setRightTitle() and setFolderName() instead of constructor arguments', Deprecation::SCOPE_GLOBAL); parent::__construct($name, $title, $value); diff --git a/i18n/i18n.php b/i18n/i18n.php index d16141e8a..4113edc03 100644 --- a/i18n/i18n.php +++ b/i18n/i18n.php @@ -1465,7 +1465,8 @@ class i18n extends Object implements TemplateGlobalProvider { if(is_numeric($context) && in_array($context, array(PR_LOW, PR_MEDIUM, PR_HIGH))) { Deprecation::notice( '3.0', - 'The $priority argument to _t() is deprecated, please use module inclusion priorities instead' + 'The $priority argument to _t() is deprecated, please use module inclusion priorities instead', + Deprecation::SCOPE_GLOBAL ); } diff --git a/model/ComponentSet.php b/model/ComponentSet.php index 9745375d2..a8e267f37 100644 --- a/model/ComponentSet.php +++ b/model/ComponentSet.php @@ -4,6 +4,6 @@ */ class ComponentSet extends DataObjectSet { function setComponentInfo($type, $ownerObj, $ownerClass, $tableName, $childClass, $joinField = null) { - Deprecation::notice('3.0', 'Use ManyManyList or HasManyList instead.'); + Deprecation::notice('3.0', 'ComponentSet is deprecated. Use ManyManyList or HasManyList instead.', Deprecation::SCOPE_CLASS); } } diff --git a/model/DataExtension.php b/model/DataExtension.php index dd60da8e9..b2dae0611 100644 --- a/model/DataExtension.php +++ b/model/DataExtension.php @@ -41,7 +41,7 @@ abstract class DataExtension extends Extension { $statics = Injector::inst()->get($extensionClass, true, $args)->$extraStaticsMethod($class, $extensionClass); if ($statics) { - Deprecation::notice('3.1.0', "$extraStaticsMethod deprecated. Just define statics on your extension, or use add_to_class"); + Deprecation::notice('3.1.0', "$extraStaticsMethod deprecated. Just define statics on your extension, or use add_to_class", Deprecation::SCOPE_GLOBAL); // TODO: This currently makes extraStatics the MOST IMPORTANT config layer, not the least foreach (self::$extendable_statics as $key => $merge) { diff --git a/model/DataList.php b/model/DataList.php index d8eb9b4ba..7711ae76a 100644 --- a/model/DataList.php +++ b/model/DataList.php @@ -141,7 +141,7 @@ class DataList extends ViewableData implements SS_List, SS_Filterable, SS_Sortab return $this; } if($limit && !is_numeric($limit)) { - Deprecation::notice('3.0', 'Please pass limits as 2 arguments, rather than an array or SQL fragment.'); + Deprecation::notice('3.0', 'Please pass limits as 2 arguments, rather than an array or SQL fragment.', Deprecation::SCOPE_GLOBAL); } $this->dataQuery->limit($limit, $offset); return $this; @@ -599,7 +599,7 @@ class DataList extends ViewableData implements SS_List, SS_Filterable, SS_Sortab * @return DataList */ public function getRange($offset, $length) { - Deprecation::notice("3.0", 'getRange($offset, $length) is deprecated. Use limit($length, $offset) instead. Note the new argument order.'); + Deprecation::notice("3.0", 'Use limit($length, $offset) instead. Note the new argument order.'); return $this->limit($length, $offset); } diff --git a/model/DataObject.php b/model/DataObject.php index faa2f0fa9..3f10d6416 100644 --- a/model/DataObject.php +++ b/model/DataObject.php @@ -2596,7 +2596,7 @@ class DataObject extends ViewableData implements DataObjectInterface, i18nEntity // Todo: Determine if we can deprecate for 3.0.0 and use DI or something instead // Todo: Make the $containerClass method redundant if($containerClass != 'DataList') { - Deprecation::notice('3.0', '$containerClass argument is deprecated.'); + Deprecation::notice('3.0', 'DataObject::get() - $containerClass argument is deprecated.', Deprecation::SCOPE_GLOBAL); } $result = DataList::create($callerClass)->where($filter)->sort($sort); diff --git a/model/DataObjectDecorator.php b/model/DataObjectDecorator.php index 051f29059..3da454b34 100644 --- a/model/DataObjectDecorator.php +++ b/model/DataObjectDecorator.php @@ -7,7 +7,7 @@ abstract class DataObjectDecorator extends DataExtension { public function __construct() { - Deprecation::notice('3.0', 'Use DataExtension instead.'); + Deprecation::notice('3.0', 'DataObjectDecorator is deprecated. Use DataExtension instead.', Deprecation::SCOPE_CLASS); parent::__construct(); } diff --git a/model/DataObjectSet.php b/model/DataObjectSet.php index bf1d8b2db..ce0dec77d 100644 --- a/model/DataObjectSet.php +++ b/model/DataObjectSet.php @@ -10,7 +10,7 @@ class DataObjectSet extends ArrayList { * @deprecated 3.0 */ public function __construct($items = array()) { - Deprecation::notice('3.0', 'Use DataList or ArrayList instead'); + Deprecation::notice('3.0', 'DataObjectSet is deprecated. Use DataList or ArrayList instead', Deprecation::SCOPE_CLASS); if ($items) { if (!is_array($items) || func_num_args() > 1) { diff --git a/model/SQLMap.php b/model/SQLMap.php index 875af1cc0..ee9bb5ebe 100644 --- a/model/SQLMap.php +++ b/model/SQLMap.php @@ -19,7 +19,7 @@ class SQLMap extends Object implements IteratorAggregate { * @param SQLQuery $query The query to generate this map. THis isn't executed until it's needed. */ public function __construct(SQLQuery $query, $keyField = "ID", $titleField = "Title") { - Deprecation::notice('3.0', 'Use SS_Map or DataList::map() instead.'); + Deprecation::notice('3.0', 'Use SS_Map or DataList::map() instead.', Deprecation::SCOPE_CLASS); if(!$query) { user_error('SQLMap constructed with null query.', E_USER_ERROR); diff --git a/tests/dev/DeprecationTest.php b/tests/dev/DeprecationTest.php index ef77668bd..2382e2e7f 100644 --- a/tests/dev/DeprecationTest.php +++ b/tests/dev/DeprecationTest.php @@ -66,13 +66,40 @@ class DeprecationTest extends SapphireTest { $this->callThatOriginatesFromFramework(); } + function testMethodNameCalculation() { + $this->assertEquals(DeprecationTest_Deprecation::get_method(), 'DeprecationTest->testMethodNameCalculation'); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage DeprecationTest->testScopeMethod is deprecated. Method scope + */ + function testScopeMethod() { + Deprecation::notification_version('2.0.0'); + Deprecation::notice('2.0.0', 'Method scope', Deprecation::SCOPE_METHOD); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage DeprecationTest is deprecated. Class scope + */ + function testScopeClass() { + Deprecation::notification_version('2.0.0'); + Deprecation::notice('2.0.0', 'Class scope', Deprecation::SCOPE_CLASS); + } + + /** + * @expectedException PHPUnit_Framework_Error + * @expectedExceptionMessage Global scope + */ + function testScopeGlobal() { + Deprecation::notification_version('2.0.0'); + Deprecation::notice('2.0.0', 'Global scope', Deprecation::SCOPE_GLOBAL); + } + protected function callThatOriginatesFromFramework() { $this->assertEquals(DeprecationTest_Deprecation::get_module(), FRAMEWORK_DIR); Deprecation::notice('2.0', 'Deprecation test passed'); } - function testMethodNameCalculation() { - $this->assertEquals(DeprecationTest_Deprecation::get_method(), 'DeprecationTest->testMethodNameCalculation'); - } - } From d0faad1a3beb0b15c68187d2de07b30c68c45015 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 13 Jul 2012 13:43:28 +0200 Subject: [PATCH 20/43] Updated translations --- lang/ar.yml | 42 +++---- lang/bg.yml | 10 +- lang/bs.yml | 8 +- lang/ca.yml | 2 +- lang/cs.yml | 2 +- lang/de.yml | 164 ++++++++++++------------- lang/el.yml | 2 +- lang/es_MX.yml | 222 ++++++++++++++++----------------- lang/fa_IR.yml | 24 ++-- lang/fi.yml | 194 ++++++++++++++--------------- lang/fr.yml | 98 +++++++-------- lang/he_IL.yml | 10 +- lang/hr.yml | 2 +- lang/ja_JP.yml | 62 +++++----- lang/km.yml | 10 +- lang/lt.yml | 2 +- lang/nb.yml | 130 ++++++++++---------- lang/nl.yml | 130 ++++++++++---------- lang/pa.yml | 2 +- lang/pl.yml | 326 ++++++++++++++++++++++++------------------------- lang/ro.yml | 128 +++++++++---------- lang/ru.yml | 10 +- lang/si.yml | 10 +- lang/sk.yml | 2 +- lang/sl.yml | 2 +- lang/sr.yml | 2 +- lang/sv.yml | 124 +++++++++---------- lang/th.yml | 14 +-- lang/uk.yml | 60 ++++----- lang/vi_VN.yml | 4 +- lang/zh_CN.yml | 102 ++++++++-------- lang/zh_TW.yml | 52 ++++---- 32 files changed, 976 insertions(+), 976 deletions(-) diff --git a/lang/ar.yml b/lang/ar.yml index b7785930f..447f7e975 100644 --- a/lang/ar.yml +++ b/lang/ar.yml @@ -7,8 +7,8 @@ ar: FILENAME: 'اسم الملف' FOLDER: Folder LASTEDIT: 'آخر التعديلات' - OWNER: 'المالك' - SIZE: 'الحجم' + OWNER: المالك + SIZE: الحجم TITLE: العنوان TYPE: النوع URL: الرابط @@ -24,7 +24,7 @@ ar: UPLOADINPROGRESS: 'Please wait… upload in progress' UPLOADOR: OR BBCodeParser: - ALIGNEMENT: 'المحاذاة' + ALIGNEMENT: المحاذاة ALIGNEMENTEXAMPLE: 'محاذاة إلى اليمين' BOLD: 'خط عريض' BOLDEXAMPLE: عريض @@ -38,7 +38,7 @@ ar: IMAGE: الصورة IMAGEDESCRIPTION: 'عرض الصورة في الموضوع' ITALIC: 'خط مائل' - ITALICEXAMPLE: 'مائل' + ITALICEXAMPLE: مائل LINK: 'رابط الموقع' LINKDESCRIPTION: 'رابط إلى موقع آخر' STRUCK: 'خط في المنتصف' @@ -56,7 +56,7 @@ ar: ANY: أي 0: لا LOGOUT: 'Log out' - 1: 'نعم' + 1: نعم CMSMain: ACCESS: 'Access to ''{title}'' section' ACCESSALLINTERFACES: 'الدخول إلى جميع واجهات إدارة المحتوى' @@ -66,7 +66,7 @@ ar: MENUTITLE: CMSProfileController CheckboxField: - لا - - 'نعم' + - نعم ComplexTableField: CLOSEPOPUP: 'إغلاق النافذة' SUCCESSADD2: 'Added {name}' @@ -87,8 +87,8 @@ ar: PLURALNAME: 'بيانات كائن' SINGULARNAME: 'بيانات كائن' Date: - DAY: 'اليوم' - DAYS: 'الأيام' + DAY: اليوم + DAYS: الأيام HOUR: ساعة HOURS: ساعات MIN: دقيقة @@ -103,7 +103,7 @@ ar: YEARS: السنوات DateField: NOTSET: 'غير محدد' - TODAY: 'اليوم' + TODAY: اليوم VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' @@ -121,15 +121,15 @@ ar: ANY: أي LOADING: Loading... File: - Content: 'المحتوى' + Content: المحتوى Filename: 'اسم الملف' INVALIDEXTENSION: 'Extension is not allowed (valid: {extensions})' INVALIDEXTENSIONSHORT: 'Extension is not allowed' NOFILESIZE: 'حجم الملف 0 بايت' NOVALIDUPLOAD: 'نوع الملف غير قابل للرفع' - Name: 'الاسم' - PLURALNAME: 'الملفات' - SINGULARNAME: 'الملف' + Name: الاسم + PLURALNAME: الملفات + SINGULARNAME: الملف TOOLARGE: 'Filesize is too large, maximum {size} allowed' TOOLARGESHORT: 'Filesize exceeds {size}' Title: العنوان @@ -139,7 +139,7 @@ ar: ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' DELETE: 'Delete {type}' DISALLOWEDFILETYPE: 'This filetype is not allowed to be uploaded' - FILE: 'ملف' + FILE: ملف FROMCOMPUTER: 'من جهازك الشخصي' FROMFILESTORE: 'من مكتبة الملفات' NOSOURCE: 'الرجاء اختيارمصدر ملف المرفق' @@ -156,7 +156,7 @@ ar: VALIDATIONPASSWORDSDONTMATCH: 'رقم المرور غير صحيح' VALIDATIONPASSWORDSNOTEMPTY: 'أرقام المرور لا يمكن أن تكون فارغة' VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character' - VALIDATOR: 'المحقق' + VALIDATOR: المحقق VALIDCURRENCY: 'Please enter a valid currency' FormField: NONE: لايوجد @@ -238,8 +238,8 @@ ar: CSSCLASSRIGHT: 'إلى اليمين ، مع التفاف النص' DETAILS: Details EMAIL: 'بريد إلكتروني' - FILE: 'ملف' - FOLDER: 'المجلد' + FILE: ملف + FOLDER: المجلد FROMCMS: 'From the CMS' FROMCOMPUTER: 'From your computer' FROMWEB: 'From the web' @@ -275,7 +275,7 @@ ar: CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' DELETED: Deleted. DropdownBatchActionsDefault: Actions - HELP: 'مساعدة' + HELP: مساعدة PAGETYPE: 'نوع الصفحة:' PERMAGAIN: 'تم خروجك من النظام بنجاح. للدخول مرة أخرى أدحل البريد الإلكتروني و الرقم السري بالأسفل' PERMALREADY: 'عذراً , لكن لا يمكنك الوصول لهذا القسم من النظام. يتوجب عليك الدخول بصلاحية أخرى' @@ -323,7 +323,7 @@ ar: ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' WELCOMEBACK: 'Welcome Back, {firstname}' YOUROLDPASSWORD: 'رقم المرور السابق' - belongs_many_many_Groups: 'المجموعات' + belongs_many_many_Groups: المجموعات db_LastVisited: 'تاريخ آخر زيارة' db_Locale: 'واجهة الموقع' db_LockedOutUntil: 'مغلق حتى تاريخ' @@ -371,8 +371,8 @@ ar: Title: 'Data Models' UPDATEDRECORDS: 'Updated {count} records.' MoneyField: - FIELDLABELAMOUNT: 'الكمية' - FIELDLABELCURRENCY: 'العملة' + FIELDLABELAMOUNT: الكمية + FIELDLABELCURRENCY: العملة NullableField: IsNullLabel: باطل NumericField: diff --git a/lang/bg.yml b/lang/bg.yml index 0c3b79523..f7f41ec2a 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -212,7 +212,7 @@ bg: RolesAddEditLink: 'Manage roles' Sort: Сортиране TITLE: 'Качване на изображението Iрамка' - has_many_Permissions: 'Разрешения' + has_many_Permissions: Разрешения many_many_Members: Членове GroupImportForm: Help1: '

Import one or more groups in CSV format (comma-separated values). Show advanced usage

' @@ -247,7 +247,7 @@ bg: IMAGEALT: 'Alternative text (alt)' IMAGEALTTEXT: 'Alternative text (alt) - shown if image cannot be displayed' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' - IMAGEDIMENSIONS: 'Размери' + IMAGEDIMENSIONS: Размери IMAGEHEIGHTPX: Височина IMAGETITLE: 'Title text (tooltip) - for additional information about the image' IMAGETITLETEXT: 'Title text (tooltip)' @@ -421,10 +421,10 @@ bg: MENUTITLE: Security MemberListCaution: 'Внимание: изтривайки потребители от този списък, ще ги премахне от всички групи и от базата данни.' NEWGROUP: 'New Group' - PERMISSIONS: 'Разрешения' - ROLES: 'Роли' + PERMISSIONS: Разрешения + ROLES: Роли ROLESDESCRIPTION: 'Ролите са предварително зададени сетове от разрешения и могат да бъдат присвоявани на групи.
Ако е нужно, те се наследяват от родителските групи.' - TABROLES: 'Роли' + TABROLES: Роли Users: Users SecurityAdmin_MemberImportForm: BtnImport: 'Import from CSV' diff --git a/lang/bs.yml b/lang/bs.yml index d9dbeaa35..72bfb7ce1 100644 --- a/lang/bs.yml +++ b/lang/bs.yml @@ -252,7 +252,7 @@ bs: IMAGETITLE: 'Title text (tooltip) - for additional information about the image' IMAGETITLETEXT: 'Title text (tooltip)' IMAGETITLETEXTDESC: 'For additional information about the image' - IMAGEWIDTHPX: 'Širina' + IMAGEWIDTHPX: Širina INSERTMEDIA: 'Insert Media' LINK: Link LINKANCHOR: 'Sidro na ovoj stranici' @@ -311,7 +311,7 @@ bs: INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' LOGGEDINAS: 'You''re logged in as {name}.' NEWPASSWORD: 'Nova šifra' - PASSWORD: 'Šifra' + PASSWORD: Šifra PLURALNAME: Members PROFILESAVESUCCESS: 'Successfully saved.' REMEMBERME: 'Zapamti me slijedeći put' @@ -448,8 +448,8 @@ bs: SORTDESC: 'Sort in descending order' TableListField: CSVEXPORT: 'Izvezi u CSV' - PRINT: 'Štampaj' - Print: 'Štampaj' + PRINT: Štampaj + Print: Štampaj SELECT: 'Select:' TimeField: VALIDATEFORMAT: 'Please enter a valid time format ({format})' diff --git a/lang/ca.yml b/lang/ca.yml index f49df8f51..bf4a7fbf4 100644 --- a/lang/ca.yml +++ b/lang/ca.yml @@ -263,7 +263,7 @@ ca: LINKINTERNAL: 'Pàgina del lloc web' LINKOPENNEWWIN: 'Obrir l''enllaç a una nova finestra?' LINKTO: 'Enllaça a' - PAGE: 'Pàgina' + PAGE: Pàgina URL: URL URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' UpdateMEDIA: 'Update Media' diff --git a/lang/cs.yml b/lang/cs.yml index 326d00b97..d00ce899e 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -252,7 +252,7 @@ cs: IMAGETITLE: 'Titul text (tooltip) - další informace o obrázku' IMAGETITLETEXT: 'Title text (tooltip)' IMAGETITLETEXTDESC: 'For additional information about the image' - IMAGEWIDTHPX: 'Šířka' + IMAGEWIDTHPX: Šířka INSERTMEDIA: 'Insert Media' LINK: 'Vložit nebo upravit odkaz' LINKANCHOR: 'Záložka (kotva) na stránce' diff --git a/lang/de.yml b/lang/de.yml index 00c009659..010ee2367 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -5,7 +5,7 @@ de: CREATED: 'Erstmalig hochgeladen' DIM: Dimensionen FILENAME: Dateiname - FOLDER: Folder + FOLDER: Ordner LASTEDIT: 'Letztmals geändert' OWNER: Eigentümer SIZE: Größe @@ -13,14 +13,14 @@ de: TYPE: Typ URL: URL AssetUploadField: - ChooseFiles: 'Choose files' - DRAGFILESHERE: 'Drag files here' - DROPAREA: 'Drop Area' - EDITALL: 'Edit all' - EDITANDORGANIZE: 'Edit & organize' - FILES: Files - TOTAL: Total - TOUPLOAD: 'Choose file(s) to upload...' + ChooseFiles: 'Dateien auswählen' + DRAGFILESHERE: 'Dateien hier ablegen' + DROPAREA: Dateiablage + EDITALL: 'Alle Bearbeiten' + EDITANDORGANIZE: Bearbeiten + FILES: Dateien + TOTAL: Gesamt + TOUPLOAD: 'Datei(en) zum Hochladen auswählen' UPLOADINPROGRESS: 'Please wait… upload in progress' UPLOADOR: ODER BBCodeParser: @@ -55,7 +55,7 @@ de: Boolean: ANY: alle 0: Nein - LOGOUT: 'Log out' + LOGOUT: Ausloggen 1: Ja CMSMain: ACCESS: 'Access to ''{title}'' section' @@ -69,7 +69,7 @@ de: - Ja ComplexTableField: CLOSEPOPUP: 'Popup schließen' - SUCCESSADD2: 'Added {name}' + SUCCESSADD2: '{name} hinzugefügt' SUCCESSEDIT: 'Gespeichert %s %s %s' ConfirmedPasswordField: ATLEAST: 'Passwords must be at least {min} characters long.' @@ -97,7 +97,7 @@ de: MONTHS: Monat SEC: Sekunden SECS: Sekunden - TIMEDIFFAGO: '{difference} ago' + TIMEDIFFAGO: 'vor {difference}' TIMEDIFFIN: 'in {difference}' YEAR: Jahr YEARS: Jahre @@ -109,17 +109,17 @@ de: VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' Director: ADD: Hinzufügen - INVALID_REQUEST: 'Invalid request' + INVALID_REQUEST: 'Ungültige Anfrage' DropdownField: CHOOSE: (Auswahl) EmailField: - VALIDATION: 'Please enter an email address' + VALIDATION: 'Bitte geben Sie eine E-Mail Adresse ein' Email_BounceRecord: PLURALNAME: 'E-Mail Rückläufer' SINGULARNAME: 'E-Mail Rückläufer' Enum: ANY: alle - LOADING: Loading... + LOADING: 'Lade Daten ...' File: Content: Inhalt Filename: Dateiname @@ -134,7 +134,7 @@ de: TOOLARGESHORT: 'Filesize exceeds {size}' Title: Titel FileIFrameField: - ATTACH: 'Attach {type}' + ATTACH: '{type} anhängen' ATTACHONCESAVED: '{type}s can be attached once you have saved the record for the first time.' ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' DELETE: 'Delete {type}' @@ -143,11 +143,11 @@ de: FROMCOMPUTER: 'Von Ihrem Computer' FROMFILESTORE: 'Aus dem Datei-Storage' NOSOURCE: 'Bitte wählen Sie eine Datei aus' - REPLACE: 'Replace {type}' + REPLACE: '{type} ersetzen' Filesystem: - IMPORT_TAB_HEADER: Import - SEARCHLISTINGS: Search - SYNCRESULTS: 'Sync complete: {createdcount} items created, {deletedcount} items deleted' + IMPORT_TAB_HEADER: Importieren + SEARCHLISTINGS: Suche + SYNCRESULTS: 'Synchronisation beendet: {createdcount} Objekte erstellt, {deletedcount} Objekte gelöscht' Form: FIELDISREQUIRED: '%s wird benötigt' TITLE: 'Image Uploading Iframe' @@ -161,41 +161,41 @@ de: FormField: NONE: keine GridAction: - DELETE_DESCRIPTION: Delete - Delete: Delete - UnlinkRelation: Unlink + DELETE_DESCRIPTION: Löschen + Delete: Löschen + UnlinkRelation: 'Verbindung entfernen' GridField: - Add: 'Add {name}' + Add: '{name} Hinzufügen' Filter: Filter - FilterBy: 'Filter by ' - Find: Find + FilterBy: 'Filter nach' + Find: Suchen LEVELUP: 'Level up' LinkExisting: 'Link Existing' - NewRecord: 'New %s' - NoItemsFound: 'No items found' + NewRecord: 'Neue(r) %s' + NoItemsFound: 'Keine Elemente gefunden.' PRINTEDAT: 'Printed at' PRINTEDBY: 'Printed by' - PlaceHolder: 'Find {type}' + PlaceHolder: '{type} Suchen' PlaceHolderWithLabels: 'Find {type} by {name}' RelationSearch: 'Relation search' - ResetFilter: Reset + ResetFilter: Zurücksetzen GridFieldAction_Delete: DeletePermissionsFailure: 'No delete permissions' NEXT: nächste PREVIOUS: vorherige GridFieldDetailForm: - Create: Create - Delete: Delete - DeletePermissionsFailure: 'No delete permissions' - Deleted: 'Deleted %s %s' + Create: Erstellen + Delete: Löschen + DeletePermissionsFailure: 'Keine Berechtigungen zum löschen' + Deleted: 'Gelöscht %s %s' HELLO: Hallo - Save: Save - Saved: 'Saved %s %s' + Save: Speichern + Saved: 'Gespeichert %s %s' TEXT1: 'Hier ist Ihr' TEXT2: 'Link zum Zurücksetzen des Passworts' TEXT3: für Group: - AddRole: 'Add a role for this group' + AddRole: 'Rolle für die Gruppe hinzufügen' CHANGEPASSWORDTEXT1: 'Sie haben ihr Passwort geändert für' CHANGEPASSWORDTEXT2: 'Sie können nun folgende Angaben benutzen um sich einzuloggen' Code: 'Gruppen Code' @@ -203,10 +203,10 @@ de: DefaultGroupTitleContentAuthors: Inhaltsautoren Description: Beschreibung EMAIL: E-Mail - GroupReminder: 'If you choose a parent group, this group will take all it''s roles' + GroupReminder: 'Bei Zuweisung einer Übergruppe werden alle ihre Rollen übernommen' HELLO: Hi Locked: 'Gesperrt?' - NoRoles: 'No roles found' + NoRoles: 'Keine Rollen gefunden' PASSWORD: Passwort Parent: Elterngruppe RolesAddEditLink: 'Rollen hinzufügen/editieren' @@ -223,13 +223,13 @@ de: Hierarchy: InfiniteLoopNotAllowed: 'Infinite loop found within the "{type}" hierarchy. Please change the parent to resolve this' HtmlEditorField: - ADDURL: 'Add URL' - ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' + ADDURL: 'URL hinzufügen' + ADJUSTDETAILSDIMENSIONS: 'Details & Dimensionen' ANCHORVALUE: Anker - BUTTONINSERT: Insert + BUTTONINSERT: Einfügen BUTTONINSERTLINK: 'Verweis einfügen' BUTTONREMOVELINK: 'Verweise entfernen' - BUTTONUpdate: Update + BUTTONUpdate: Aktualisieren CAPTIONTEXT: Beschriftungstext CSSCLASS: Ausrichtung/Stil CSSCLASSCENTER: 'Zentriert, selbstständig' @@ -241,10 +241,10 @@ de: FILE: Datei FOLDER: Ordner FROMCMS: 'From the CMS' - FROMCOMPUTER: 'From your computer' - FROMWEB: 'From the web' - FindInFolder: 'Find in Folder' - IMAGEALT: 'Alternative text (alt)' + FROMCOMPUTER: 'Von Ihrem Computer' + FROMWEB: 'Aus dem Internet' + FindInFolder: 'In Ordner suchen' + IMAGEALT: 'Alternativer Text (alt)' IMAGEALTTEXT: 'Alternativer Text (alt) - angezeigt, wenn das Bild nicht dargestellt werden kann' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' IMAGEDIMENSIONS: Dimensionen @@ -269,28 +269,28 @@ de: UpdateMEDIA: 'Update Media' ImageField: IMAGE: Bild - Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Apply Filter" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' + Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Filter anwenden" GridFieldItemEditView.ss: Go back: "Zurück" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Eine neue Zeile hinzufügen' CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' DELETED: Deleted. - DropdownBatchActionsDefault: Actions + DropdownBatchActionsDefault: Aktionen HELP: Hilfe PAGETYPE: 'Seitentyp:' PERMAGAIN: 'Sie wurden aus dem System ausgeloggt. Falls Sie sich wieder einloggen möchten, geben Sie bitte Benutzernamen und Passwort im untenstehenden Formular an.' PERMALREADY: 'Leider dürfen Sie diesen Teil des CMS nicht aufrufen. Wenn Sie sich als jemand anderes einloggen wollen, benutzen Sie bitte das nachstehende Formular.' PERMDEFAULT: 'Bitte wählen Sie eine Authentifizierungsmethode und geben Sie Ihre Benutzerdaten für den Zugang zum CMS ein.' PLEASESAVE: 'Diese Seite konnte nicht aktualisiert werden weil sie noch nicht gespeichert wurde - bitte speichern.' - PreviewButton: Preview + PreviewButton: Vorschau REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' - SAVEDUP: Saved. - VersionUnknown: unknown + SAVEDUP: Gespeichert. + VersionUnknown: unbekannt LoginAttempt: Email: E-Mail-Adresse IP: IP-Adresse Status: Status Member: - ADDGROUP: 'Add group' + ADDGROUP: 'Gruppe hinzufügen' BUTTONCHANGEPASSWORD: 'Passwort ändern' BUTTONLOGIN: Einloggen BUTTONLOGINOTHER: 'Als jemand anders einloggen' @@ -334,23 +334,23 @@ de: TITLE: 'E-Mail & Passwort' MemberDatetimeOptionsetField: AMORPM: 'AM (Ante meridiem) or PM (Post meridiem)' - Custom: Custom - DATEFORMATBAD: 'Date format is invalid' + Custom: Benutzerdefiniert + DATEFORMATBAD: 'Ungültiges Datumsformat' DAYNOLEADING: 'Day of month without leading zero' DIGITSDECFRACTIONSECOND: 'One or more digits representing a decimal fraction of a second' - FOURDIGITYEAR: 'Four-digit year' + FOURDIGITYEAR: Jahr FULLNAMEMONTH: 'Full name of month (e.g. June)' HOURNOLEADING: 'Hour without leading zero' - MINUTENOLEADING: 'Minute without leading zero' + MINUTENOLEADING: Minute MONTHNOLEADING: 'Month digit without leading zero' - Preview: Preview + Preview: Vorschau SHORTMONTH: 'Short name of month (e.g. Jun)' TOGGLEHELP: 'Toggle formatting help' TWODIGITDAY: 'Two-digit day of month' TWODIGITHOUR: 'Two digits of hour (00 through 23)' TWODIGITMINUTE: 'Two digits of minute (00 through 59)' TWODIGITMONTH: 'Two-digit month (01=January, etc.)' - TWODIGITSECOND: 'Two digits of second (00 through 59)' + TWODIGITSECOND: Sekunde TWODIGITYEAR: 'Two-digit year' MemberImportForm: Help1: '

Mitglieder im CSV-Format (kommaseparierte Werte) importieren. Erweiterte Nutzung

' @@ -362,14 +362,14 @@ de: MemberTableField: null ModelAdmin: DELETE: Löschen - DELETEDRECORDS: 'Deleted {count} records.' + DELETEDRECORDS: '{count} Datensätze wurden gelöscht.' IMPORT: 'CSV Import' - IMPORTEDRECORDS: 'Imported {count} records.' + IMPORTEDRECORDS: '{count} Datensätze wurden importiert.' NOCSVFILE: 'Wählen sie eine CSV-Datei zum Importieren' NOIMPORT: 'Kein Import notwendig.' - RESET: Reset + RESET: Zurücksetzen Title: 'Data Models' - UPDATEDRECORDS: 'Updated {count} records.' + UPDATEDRECORDS: '{count} Datensätze wurden aktualisiert.' MoneyField: FIELDLABELAMOUNT: Betrag FIELDLABELCURRENCY: Währung @@ -385,14 +385,14 @@ de: IMPORTSPECFIELDS: 'Database columns' IMPORTSPECRELATIONS: Relations PermissionCheckboxSetField: - AssignedTo: 'assigned to "{title}"' - FromGroup: 'inherited from group "{title}"' - FromRole: 'inherited from role "{title}"' + AssignedTo: 'Zugewiesen an "{title}"' + FromGroup: 'abgeleited von Gruppe "{title}"' + FromRole: 'abgeleited von Rolle "{title}"' FromRoleOnGroup: 'geerbt von Rolle "%s" für die Gruppe "%s"' Permissions: PERMISSIONS_CATEGORY: 'Rollen und Zugriffsberechtigungen' PhoneNumberField: - Back: Back + Back: Zurück VALIDATION: 'Bitte geben Sie eine gültige Telefonnummer ein' Security: ALREADYLOGGEDIN: 'Sie haben keinen Zugriff auf diese Seite. Wenn Sie ein anderes Konto besitzen, mit dem Sie auf diese Seite zugreifen können, melden Sie sich bitte unten an.' @@ -415,8 +415,8 @@ de: EDITPERMISSIONS: 'Bearbeiten der Rechte und IP-Adressen für jede Gruppe' EDITPERMISSIONS_HELP: 'Möglichkeit Berechtigungen und IP-Adressen einer Gruppen zu editieren. Erfordert Zugriff auf den Bereich "Sicherheit".' GROUPNAME: Gruppenname - IMPORTGROUPS: 'Import groups' - IMPORTUSERS: 'Import users' + IMPORTGROUPS: 'Gruppen importieren' + IMPORTUSERS: 'Benutzer importieren' MEMBERS: Mitglieder MENUTITLE: Security MemberListCaution: 'Achtung: Das Entfernen von Mitgliedern aus dieser Liste löscht diese auch aus der Datenbank sowie die entsprechenden Gruppenzuweisungen.' @@ -425,14 +425,14 @@ de: ROLES: Rollen ROLESDESCRIPTION: 'Hier können Sie der Gruppe Rollen zuweisen. Rollen sind logische Gruppierungen von Berechtigungen.' TABROLES: Rollen - Users: Users + Users: Benutzer SecurityAdmin_MemberImportForm: BtnImport: Import FileFieldLabel: 'CSV Datei (Erlaubte Dateierweiterung: *.csv)' SilverStripeNavigator: - Edit: Edit + Edit: Bearbeiten FILTER: Filter - IMPORT: Import + IMPORT: Importieren VIEWFIRST: 'Ersten anzeigen' VIEWLAST: 'Letzten anzeigen' VIEWNEXT: 'Nächsten anzeigen' @@ -443,7 +443,7 @@ de: TABMAIN: Hauptteil TableField: ADDITEM: '%s hinzufügen' - ISREQUIRED: 'In %s ''%s'' is required' + ISREQUIRED: 'In %s wird ''%s'' benötigt' SORTASC: 'Aufsteigend sortieren' SORTDESC: 'Absteigend sortieren' TableListField: @@ -457,21 +457,21 @@ de: LESS: weniger MORE: mehr UploadField: - ATTACHFILE: 'Attach a file' - ATTACHFILES: 'Attach files' - AttachFile: 'Attach a file' + ATTACHFILE: 'Datei anhängen' + ATTACHFILES: 'Dateien anhängen' + AttachFile: 'Datei anhängen' DELETEINFO: 'Löscht die Datei dauerhaft aus dem Dateisystem' DOEDIT: Speichern - DROPFILE: 'drop a file' - DROPFILES: 'drop files' - Dimensions: Dimensions + DROPFILE: 'Datei hier ablegen' + DROPFILES: 'Dateien hier ablegen' + Dimensions: Dimensionen EDITINFO: 'Diese Datei bearbeiten' - FIELDNOTSET: 'File information not found' + FIELDNOTSET: 'Dateiinformationen nicht gefunden' FROMCOMPUTER: 'Von Ihrem Computer' - FROMFILES: 'From files' + FROMFILES: 'Von "Dateien"' MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' - REMOVE: Remove + REMOVE: Entfernen REMOVEERROR: 'Fehler beim Entfernen der Datei' REMOVEINFO: 'Entfernt die Datei von hier, löscht Sie aber nicht aus dem Dateisystem.' STARTALL: 'Alle starten' diff --git a/lang/el.yml b/lang/el.yml index 2f24f873d..b6d9928ed 100644 --- a/lang/el.yml +++ b/lang/el.yml @@ -61,7 +61,7 @@ el: ACCESS: 'Access to ''{title}'' section' ACCESSALLINTERFACES: 'Access to all CMS sections' ACCESSALLINTERFACESHELP: 'Overrules more specific access settings.' - SAVE: 'Αποθήκευση' + SAVE: Αποθήκευση CMSProfileController: MENUTITLE: CMSProfileController CheckboxField: diff --git a/lang/es_MX.yml b/lang/es_MX.yml index 984539b6b..54cb85b18 100644 --- a/lang/es_MX.yml +++ b/lang/es_MX.yml @@ -5,7 +5,7 @@ es_MX: CREATED: 'Agregado por primera vez' DIM: Dimensiones FILENAME: 'Nombre del archivo' - FOLDER: Folder + FOLDER: Carpeta LASTEDIT: 'Modificado por última vez' OWNER: Propietario SIZE: Tamaño @@ -13,16 +13,16 @@ es_MX: TYPE: Tipo URL: URL AssetUploadField: - ChooseFiles: 'Choose files' - DRAGFILESHERE: 'Drag files here' - DROPAREA: 'Drop Area' - EDITALL: 'Edit all' - EDITANDORGANIZE: 'Edit & organize' - FILES: Files + ChooseFiles: 'Seleccionar archivos' + DRAGFILESHERE: 'Arrastrar archivos acá' + DROPAREA: 'Área de arrastre' + EDITALL: 'Editar todos' + EDITANDORGANIZE: 'Editar y organizar' + FILES: Archivos TOTAL: Total - TOUPLOAD: 'Choose file(s) to upload...' - UPLOADINPROGRESS: 'Please wait… upload in progress' - UPLOADOR: OR + TOUPLOAD: 'Seleccionar archivos para subir' + UPLOADINPROGRESS: 'Por favor espera, subida de archivos en progreso' + UPLOADOR: o BBCodeParser: ALIGNEMENT: Alineación ALIGNEMENTEXAMPLE: 'alineado a la derecha' @@ -63,7 +63,7 @@ es_MX: ACCESSALLINTERFACESHELP: 'Anula la configuració de acceso más específica.' SAVE: Guardar CMSProfileController: - MENUTITLE: CMSProfileController + MENUTITLE: 'Controladores de perfil del CMS' CheckboxField: - No - Sí @@ -97,19 +97,19 @@ es_MX: MONTHS: meses SEC: segundo SECS: segundos - TIMEDIFFAGO: '{difference} ago' - TIMEDIFFIN: 'in {difference}' + TIMEDIFFAGO: '{difference} atrás' + TIMEDIFFIN: 'en {difference}' YEAR: año YEARS: años DateField: NOTSET: 'no especificada' TODAY: ahora - VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' - VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' - VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' + VALIDDATEFORMAT2: 'Por favor ingresar un formato válido de fecha ({format})' + VALIDDATEMAXDATE: 'Tu fecha tiene que ser más antigua o al menos coincidir con la fecha mínima permitida ({date})' + VALIDDATEMINDATE: 'Tu fecha tiene que ser nueva o al menos coincidir con la fecha mínima permitida ({date})' Director: ADD: Agregar - INVALID_REQUEST: 'Invalid request' + INVALID_REQUEST: 'Solicitud no válida' DropdownField: CHOOSE: (Seleccione) EmailField: @@ -119,7 +119,7 @@ es_MX: SINGULARNAME: 'Correo electrónico devuelto' Enum: ANY: Cualquiera - LOADING: Loading... + LOADING: Cargando... File: Content: Contenido Filename: 'Nombre de Archivo' @@ -138,7 +138,7 @@ es_MX: ATTACHONCESAVED: '{type}s can be attached once you have saved the record for the first time.' ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' DELETE: 'Delete {type}' - DISALLOWEDFILETYPE: 'This filetype is not allowed to be uploaded' + DISALLOWEDFILETYPE: 'Este tipo de archivo no se puede subir' FILE: Archivo FROMCOMPUTER: 'Desde su Ordenador' FROMFILESTORE: 'Desde el almacén de archivos' @@ -150,7 +150,7 @@ es_MX: SYNCRESULTS: 'Sync complete: {createdcount} items created, {deletedcount} items deleted' Form: FIELDISREQUIRED: '%s es obligatorio' - TITLE: 'Image Uploading Iframe' + TITLE: 'Subidor de imágenes por iFrame' VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' VALIDATIONNOTUNIQUE: 'El valor ingresado no es único' VALIDATIONPASSWORDSDONTMATCH: 'Las contraeñas no son iguales' @@ -162,25 +162,25 @@ es_MX: NONE: ninguno GridAction: DELETE_DESCRIPTION: Delete - Delete: Delete - UnlinkRelation: Unlink + Delete: Eliminar + UnlinkRelation: Desvincular GridField: - Add: 'Add {name}' - Filter: Filter - FilterBy: 'Filter by ' - Find: Find - LEVELUP: 'Level up' - LinkExisting: 'Link Existing' - NewRecord: 'New %s' - NoItemsFound: 'No items found' - PRINTEDAT: 'Printed at' - PRINTEDBY: 'Printed by' - PlaceHolder: 'Find {type}' - PlaceHolderWithLabels: 'Find {type} by {name}' - RelationSearch: 'Relation search' - ResetFilter: Reset + Add: 'Agregar {name}' + Filter: Filtro + FilterBy: 'Filtrar por' + Find: Buscar + LEVELUP: 'Subir de nivel' + LinkExisting: 'Enlazar existente' + NewRecord: 'Nuevo %s' + NoItemsFound: 'No hay ítems encontrados' + PRINTEDAT: 'Impreso en' + PRINTEDBY: 'Imprimir por' + PlaceHolder: 'Buscar {type}' + PlaceHolderWithLabels: 'Buscar {type} por {name}' + RelationSearch: 'Buscar relación' + ResetFilter: Resetear GridFieldAction_Delete: - DeletePermissionsFailure: 'No delete permissions' + DeletePermissionsFailure: 'No borrar permisos' NEXT: Siguiente PREVIOUS: Anterior GridFieldDetailForm: @@ -195,7 +195,7 @@ es_MX: TEXT2: 'vínculo para restablecer la contraseña' TEXT3: para Group: - AddRole: 'Add a role for this group' + AddRole: 'Agrega un rol para este grupo' CHANGEPASSWORDTEXT1: 'Usted ha cambiado su contraseña' CHANGEPASSWORDTEXT2: 'Ahora puedes utilizar las siguientes credenciales para ingresar:' Code: 'Código del grupo' @@ -203,10 +203,10 @@ es_MX: DefaultGroupTitleContentAuthors: 'Autores de Contenido' Description: Descripción EMAIL: 'Correo Electrónico' - GroupReminder: 'If you choose a parent group, this group will take all it''s roles' + GroupReminder: 'Si eliges el grupo superior, este grupo tomará todos sus roles' HELLO: Hey Locked: '¿Bloqueado?' - NoRoles: 'No roles found' + NoRoles: 'No se encontraron roles' PASSWORD: Contraseña Parent: 'Grupo ascendente' RolesAddEditLink: 'Agregar/modificar roles' @@ -215,8 +215,8 @@ es_MX: has_many_Permissions: Permisos many_many_Members: Miembros GroupImportForm: - Help1: '

Import one or more groups in CSV format (comma-separated values). Show advanced usage

' - Help2: '

Advanced usage

  • Allowed columns: %s
  • Existing groups are matched by their unique Code value, and updated with any new values from the imported file
  • Group hierarchies can be created by using a ParentCode column.
  • Permission codes can be assigned by the PermissionCode column. Existing permission codes are not cleared.
' + Help1: "

Importar usuarios en formato CSV (valores separados por comas). Mostrar uso avanzado

\\n" + Help2: '

Uso Avanzado

  • Columnas permitidas: %s
  • Usuarios existents son relacionados por su Código único, y actualizados con cualquier valor nuevo desde el archivo importado.
  • Grupos pueden see asignados por la columna Grupos. Los grupos son identificados por su código, multiples grupos pueden ser separados por comas. Grupos existentes no son eliminados.
' ResultCreated: 'Created {count} groups' ResultDeleted: '%d grupos eliminados' ResultUpdated: '%d grupos actualizados' @@ -226,7 +226,7 @@ es_MX: ADDURL: 'Add URL' ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' ANCHORVALUE: Anclar - BUTTONINSERT: Insert + BUTTONINSERT: Insertar BUTTONINSERTLINK: 'Insertar enlace' BUTTONREMOVELINK: 'Quitar enlace' BUTTONUpdate: Update @@ -236,12 +236,12 @@ es_MX: CSSCLASSLEFT: 'A la izquierda, justificando texto.' CSSCLASSLEFTALONE: 'A la izquierda, en él mismo.' CSSCLASSRIGHT: 'A la derecha, justificando texto.' - DETAILS: Details + DETAILS: Detalles EMAIL: 'Dirección de correo-e' FILE: Archivo FOLDER: Carpeta - FROMCMS: 'From the CMS' - FROMCOMPUTER: 'From your computer' + FROMCMS: 'Desde el CMS' + FROMCOMPUTER: 'Desde tu computador' FROMWEB: 'From the web' FindInFolder: 'Find in Folder' IMAGEALT: 'Alternative text (alt)' @@ -249,7 +249,7 @@ es_MX: IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' IMAGEDIMENSIONS: Dimensiones IMAGEHEIGHTPX: Alto - IMAGETITLE: 'Title text (tooltip) - for additional information about the image' + IMAGETITLE: 'Título del tooltip - para información adicional acerca de la imagen' IMAGETITLETEXT: 'Title text (tooltip)' IMAGETITLETEXTDESC: 'For additional information about the image' IMAGEWIDTHPX: Ancho @@ -269,12 +269,12 @@ es_MX: UpdateMEDIA: 'Update Media' ImageField: IMAGE: Imagen - Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Apply Filter" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' + Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Filtro" GridFieldItemEditView.ss: Go back: "Volver" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Agregar un nuevo renglón' CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' DELETED: Deleted. - DropdownBatchActionsDefault: Actions + DropdownBatchActionsDefault: Acciones HELP: Ayuda PAGETYPE: 'Tipo de página:' PERMAGAIN: 'Usted ha sido desconectado del CMS. Si quiere volver a entrar, introduzca su nombre de usuario y contraseña.' @@ -284,13 +284,13 @@ es_MX: PreviewButton: Preview REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' SAVEDUP: Saved. - VersionUnknown: unknown + VersionUnknown: desconocido LoginAttempt: Email: 'Dirección de Correo Electrónico' IP: 'Dirección IP' Status: Estado Member: - ADDGROUP: 'Add group' + ADDGROUP: 'Agregar grupo' BUTTONCHANGEPASSWORD: 'Cambiar Contraseña' BUTTONLOGIN: Ingresar BUTTONLOGINOTHER: 'Ingresar como alguien más' @@ -298,7 +298,7 @@ es_MX: CONFIRMNEWPASSWORD: 'Confirmar Nueva Contraseña' CONFIRMPASSWORD: 'Confirmar contraseña' DefaultAdminFirstname: 'Administrador Predeterminado' - DefaultDateTime: default + DefaultDateTime: 'Por defecto' EMAIL: 'Correo electrónico' EMPTYNEWPASSWORD: 'La nueva contraseña no puede estar vacía, por favor, inténtelo de nuevo' ENTEREMAIL: 'Por favor ingresa una dirección de correo electrónico para conseguir una contraseña y reiniciar el enlace.' @@ -308,8 +308,8 @@ es_MX: ERRORWRONGCRED: 'No parece correcta la dirección de correo-e o la contraseña. Por favor inténtalo de nuevo.' FIRSTNAME: 'Primer Nombre' INTERFACELANG: 'Lenguaje de la interfaz' - INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' - LOGGEDINAS: 'You''re logged in as {name}.' + INVALIDNEWPASSWORD: 'No podemos acceptar see pasword: {password}' + LOGGEDINAS: 'Conectado como {name}.' NEWPASSWORD: 'Nueva contraseña' PASSWORD: Contraseña PLURALNAME: Miembros @@ -320,8 +320,8 @@ es_MX: SUBJECTPASSWORDRESET: 'Enlace para reasignar su contraseña' SURNAME: Apellido VALIDATIONMEMBEREXISTS: 'Ya existe un miembro con el mismo %s' - ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' - WELCOMEBACK: 'Welcome Back, {firstname}' + ValidationIdentifierFailed: 'No se puede sobreescribir el miembro existente #{id} con el identificador idéntico ({name} = {value}))' + WELCOMEBACK: 'Bienvenido nuevamente, {firstname}' YOUROLDPASSWORD: 'Contraseña anterior' belongs_many_many_Groups: Grupos db_LastVisited: 'Fecha de Última Visita' @@ -333,28 +333,28 @@ es_MX: MemberAuthenticator: TITLE: 'Correo-e y Contraseña' MemberDatetimeOptionsetField: - AMORPM: 'AM (Ante meridiem) or PM (Post meridiem)' - Custom: Custom - DATEFORMATBAD: 'Date format is invalid' - DAYNOLEADING: 'Day of month without leading zero' - DIGITSDECFRACTIONSECOND: 'One or more digits representing a decimal fraction of a second' - FOURDIGITYEAR: 'Four-digit year' - FULLNAMEMONTH: 'Full name of month (e.g. June)' - HOURNOLEADING: 'Hour without leading zero' - MINUTENOLEADING: 'Minute without leading zero' - MONTHNOLEADING: 'Month digit without leading zero' - Preview: Preview - SHORTMONTH: 'Short name of month (e.g. Jun)' - TOGGLEHELP: 'Toggle formatting help' - TWODIGITDAY: 'Two-digit day of month' - TWODIGITHOUR: 'Two digits of hour (00 through 23)' - TWODIGITMINUTE: 'Two digits of minute (00 through 59)' - TWODIGITMONTH: 'Two-digit month (01=January, etc.)' - TWODIGITSECOND: 'Two digits of second (00 through 59)' - TWODIGITYEAR: 'Two-digit year' + AMORPM: 'AM (ante meridian) o PM (post meridiano)' + Custom: 'A medida' + DATEFORMATBAD: 'El formato de fecha es invalido' + DAYNOLEADING: 'Dia del mes sin cero a la izquierda' + DIGITSDECFRACTIONSECOND: 'Uno o más dígitos representando una fracción decimal de un segundo' + FOURDIGITYEAR: 'Año de 4 dígitos' + FULLNAMEMONTH: 'Nombre completo del mes (ej: Junio)' + HOURNOLEADING: 'Hora sin cero a la izquierda' + MINUTENOLEADING: 'Minuto sin cero a la izquierda' + MONTHNOLEADING: 'Dígito del mes sin cero' + Preview: Previo + SHORTMONTH: 'Nombre corto del mes (ej: Jun)' + TOGGLEHELP: 'Mostrar la ayuda de formato' + TWODIGITDAY: 'Dia del mes de dos dígitos' + TWODIGITHOUR: 'Dos dígitos de la hora (00 a 23)' + TWODIGITMINUTE: 'Dos dígitos de los minutos (00 a 59)' + TWODIGITMONTH: 'Mes de 2 dígitos (01=Enero, etc.)' + TWODIGITSECOND: 'Dos dígitos de los segundos (00 a 59)' + TWODIGITYEAR: 'Año en 2 dígitos' MemberImportForm: - Help1: '

Import users in CSV format (comma-separated values). Show advanced usage

' - Help2: '

Advanced usage

  • Allowed columns: %s
  • Existing users are matched by their unique Code property, and updated with any new values from the imported file.
  • Groups can be assigned by the Groups column. Groups are identified by their Code property, multiple groups can be separated by comma. Existing group memberships are not cleared.
' + Help1: "

Importar usurious en format CSV (valores separados por comas). Mostrar uso avanzado

\\n" + Help2: "
\\n

Uso Avanzado

\\n
    \\n
  • Columnas permitidas: %s
  • \\n
  • Usuarios existents son relacionados por su Código único, y actualizados con cualquier valor nuevo desde el archivo importado.
  • \\n
  • Grupos pueden see asignados por la column Grupos. Los grupos son identificados por su código, multiples grupos pueden ser separados por comas. Grupos existentes no son eliminados.
  • \\n
\\n
" ResultCreated: 'Created {count} members' ResultDeleted: '%d miembros eliminados' ResultNone: 'Sin cambios' @@ -362,21 +362,21 @@ es_MX: MemberTableField: null ModelAdmin: DELETE: Eliminar - DELETEDRECORDS: 'Deleted {count} records.' + DELETEDRECORDS: 'Borrados {count} registros' IMPORT: 'Importar desde CSV' - IMPORTEDRECORDS: 'Imported {count} records.' + IMPORTEDRECORDS: 'Importados {count} registros' NOCSVFILE: 'Por favor navegue hasta el archivo CSV a importar' NOIMPORT: 'Nada por Importar' - RESET: Reset - Title: 'Data Models' - UPDATEDRECORDS: 'Updated {count} records.' + RESET: Reiniciar + Title: 'Modelo de datos' + UPDATEDRECORDS: 'Actualizados {count} registros' MoneyField: FIELDLABELAMOUNT: Importe FIELDLABELCURRENCY: Moneda NullableField: IsNullLabel: 'Es Nulo' NumericField: - VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field' + VALIDATION: '''{value}'' no es un número, solo números son aceptados por este campo' Permission: AdminGroup: Administrador CMS_ACCESS_CATEGORY: 'Acceder al CMS' @@ -392,7 +392,7 @@ es_MX: Permissions: PERMISSIONS_CATEGORY: 'Roles y permisos de acceso' PhoneNumberField: - Back: Back + Back: Volver VALIDATION: 'Por favor ingresa un número telefónico válido' Security: ALREADYLOGGEDIN: 'Usted no tiene acceso a esta página. Si tiene otra cuenta que pueda tener acceso a ésta página, puede abrir una sesión abajo.' @@ -409,23 +409,23 @@ es_MX: PASSWORDSENTHEADER: 'Password reset link sent to ''{email}''' PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' SecurityAdmin: - ACCESS_HELP: 'Allow viewing, adding and editing users, as well as assigning permissions and roles to them.' + ACCESS_HELP: 'Permitir la visualización, agregar y editar usuarios, así como asignar permisos y roles a ellos' APPLY_ROLES: 'Aplicar roles a grupos' - APPLY_ROLES_HELP: 'Ability to edit the roles assigned to a group. Requires the "Access to ''Users'' section" permission.' + APPLY_ROLES_HELP: 'Habilidad para editar los roles asignados a un grupo. Requiere el permiso "acceso a la sección de usuarios"' EDITPERMISSIONS: 'Editar permisos para grupos' EDITPERMISSIONS_HELP: 'Habilidad para modificar Permisos y Direcciones IP para un grupo. Requiere permiso para "Acceder a la sección de ''Seguridad´".' GROUPNAME: 'Nombre de grupo' - IMPORTGROUPS: 'Import groups' - IMPORTUSERS: 'Import users' + IMPORTGROUPS: 'Importar grupos' + IMPORTUSERS: 'Importar usuarios' MEMBERS: Miembros - MENUTITLE: Security + MENUTITLE: Seguridad MemberListCaution: 'Precaución: Al remover miembros de esta lista, debe eliminarlos de todos los grupos y de la base de datos.' NEWGROUP: 'Nuevo grupo' PERMISSIONS: Permisos ROLES: Roles - ROLESDESCRIPTION: 'Roles are predefined sets of permissions, and can be assigned to groups.
They are inherited from parent groups if required.' + ROLESDESCRIPTION: 'Los roles son sets de permisos predefinidos y pueden ser asignados a grupos.
Ellos son heredados desde los grupos superiores si es requerido.' TABROLES: Roles - Users: Users + Users: Usuarios SecurityAdmin_MemberImportForm: BtnImport: Importar FileFieldLabel: 'Archivo CSV (Extensiones permitidas: *.csv)' @@ -452,29 +452,29 @@ es_MX: Print: Imprimir SELECT: 'Seleccione:' TimeField: - VALIDATEFORMAT: 'Please enter a valid time format ({format})' + VALIDATEFORMAT: 'Por favor ingresar un formato válido de fecha ({format})' ToggleField: LESS: menos MORE: más UploadField: - ATTACHFILE: 'Attach a file' - ATTACHFILES: 'Attach files' - AttachFile: 'Attach a file' - DELETEINFO: 'Permanently delete this file from the file store' - DOEDIT: Save - DROPFILE: 'drop a file' - DROPFILES: 'drop files' - Dimensions: Dimensions - EDITINFO: 'Edit this file' - FIELDNOTSET: 'File information not found' - FROMCOMPUTER: 'From your computer' - FROMFILES: 'From files' - MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' - MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' - REMOVE: Remove - REMOVEERROR: 'Error removing file' - REMOVEINFO: 'Remove this file from here, but do not delete it from the file store' - STARTALL: 'Start all' - Saved: Saved + ATTACHFILE: 'Adjuntar un archivo' + ATTACHFILES: 'Adjuntar archivos' + AttachFile: 'Adjuntar un archivo' + DELETEINFO: 'Eliminar permanentemente este archivo desde el almacén' + DOEDIT: Guardar + DROPFILE: 'Arrastrar un archivo' + DROPFILES: 'arrastrar archivo aquí' + Dimensions: Dimensiones + EDITINFO: 'Editar este archivo' + FIELDNOTSET: 'Información acerca del archivo no encontrada' + FROMCOMPUTER: 'Desde tu computador' + FROMFILES: 'Desde archivos' + MAXNUMBEROFFILES: 'Máximo número {count} de archivos sobrepasado' + MAXNUMBEROFFILESSHORT: 'Solo puedes subir {count} archivos' + REMOVE: Remover + REMOVEERROR: 'Error removiendo archivo' + REMOVEINFO: 'Remover este archivo de aquí, pero no borrarlo del almacén de archivos' + STARTALL: 'Comenzar todas' + Saved: Guardado Versioned: has_many_Versions: Versiones diff --git a/lang/fa_IR.yml b/lang/fa_IR.yml index 533e56684..9b2c89f22 100644 --- a/lang/fa_IR.yml +++ b/lang/fa_IR.yml @@ -8,7 +8,7 @@ fa_IR: FOLDER: Folder LASTEDIT: 'آخرین تغییرات' OWNER: دارنده - SIZE: 'حجم' + SIZE: حجم TITLE: عنوان TYPE: نوع URL: نشانی @@ -78,9 +78,9 @@ fa_IR: SHOWONCLICKTITLE: 'تغيير كلمه عبور' CreditCardField: FIRST: نخست - FOURTH: 'چهارم' - SECOND: 'دوم' - THIRD: 'سوم' + FOURTH: چهارم + SECOND: دوم + THIRD: سوم CurrencyField: CURRENCYSYMBOL: $ DataObject: @@ -93,7 +93,7 @@ fa_IR: HOURS: ساعت MIN: دقیقه MINS: دقیقه - MONTH: 'ماه' + MONTH: ماه MONTHS: 'ماه ها' SEC: ثانیه SECS: ثانیه @@ -103,7 +103,7 @@ fa_IR: YEARS: سال DateField: NOTSET: 'not set' - TODAY: 'امروز' + TODAY: امروز VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' @@ -121,13 +121,13 @@ fa_IR: ANY: Any LOADING: Loading... File: - Content: 'محتوا' + Content: محتوا Filename: 'نام پرونده' INVALIDEXTENSION: 'Extension is not allowed (valid: {extensions})' INVALIDEXTENSIONSHORT: 'Extension is not allowed' NOFILESIZE: 'Filesize is zero bytes.' NOVALIDUPLOAD: 'File is not a valid upload' - Name: 'نام' + Name: نام PLURALNAME: 'فايل ها' SINGULARNAME: فايل TOOLARGE: 'Filesize is too large, maximum {size} allowed' @@ -202,7 +202,7 @@ fa_IR: DefaultGroupTitleAdministrators: 'مدیران کل' DefaultGroupTitleContentAuthors: 'نویسندگان مطالب' Description: توضحیات - EMAIL: 'ايميل' + EMAIL: ايميل GroupReminder: 'If you choose a parent group, this group will take all it''s roles' HELLO: درود Locked: 'بسته شده است؟' @@ -212,7 +212,7 @@ fa_IR: RolesAddEditLink: 'اضافه/ویرایش وظیفه' Sort: 'تربیت چیدن' TITLE: 'Image Uploading Iframe' - has_many_Permissions: 'مجوز‌ها' + has_many_Permissions: مجوز‌ها many_many_Members: اعضاء GroupImportForm: Help1: '

Import one or more groups in CSV format (comma-separated values). Show advanced usage

' @@ -275,7 +275,7 @@ fa_IR: CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' DELETED: Deleted. DropdownBatchActionsDefault: Actions - HELP: 'کمک' + HELP: کمک PAGETYPE: 'نوع صفحه' PERMAGAIN: 'شما از سیستم مدیریت محتوا خارج شده اید.اگر میخواهید دوباره وارد شوید نام کاربری و رمز عبور خود را در قسمت زیر وارد کنید' PERMALREADY: 'من متاسفم، شما نمی توانید به آن قسمت از سیستم مدیریت محتوا دسترسی پیدا کنید. اگر میخواهید به عنوان شخص دیگری وارد شوید از قسمت زیر تلاش کنید' @@ -306,7 +306,7 @@ fa_IR: ERRORNEWPASSWORD: 'You have entered your new password differently, try again' ERRORPASSWORDNOTMATCH: 'Your current password does not match, please try again' ERRORWRONGCRED: 'That doesn''t seem to be the right e-mail address or password. Please try again.' - FIRSTNAME: 'نام' + FIRSTNAME: نام INTERFACELANG: 'زبان برنامه' INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' LOGGEDINAS: 'You''re logged in as {name}.' diff --git a/lang/fi.yml b/lang/fi.yml index 3d9df9ef2..fd93d3201 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -16,12 +16,12 @@ fi: ChooseFiles: 'Valitse tiedostot' DRAGFILESHERE: 'Raahaa tiedotot tähän' DROPAREA: Pudotusalue - EDITALL: 'Edit all' + EDITALL: 'Muokkaa kaikkia' EDITANDORGANIZE: 'Muokkaa & järjestele' - FILES: Files - TOTAL: Total - TOUPLOAD: 'Choose file(s) to upload...' - UPLOADINPROGRESS: 'Please wait… upload in progress' + FILES: Tiedostot + TOTAL: Yhteensä + TOUPLOAD: 'Valitse siirrettävä(t) tiedosto(t)...' + UPLOADINPROGRESS: 'Ole hyvä ja odota... siirto käynnissä' UPLOADOR: TAI BBCodeParser: ALIGNEMENT: Tasaus @@ -55,10 +55,10 @@ fi: Boolean: ANY: Yhtään 0: Ei - LOGOUT: 'Log out' + LOGOUT: 'Kirjaudu ulos' 1: Kyllä CMSMain: - ACCESS: 'Access to ''{title}'' section' + ACCESS: 'Pääsy ''{title}'' -osioon' ACCESSALLINTERFACES: 'Pääsy kaikkiin CMS-osioihin' ACCESSALLINTERFACESHELP: 'Ohittaa tarkemmat käyttöoikeudet.' SAVE: Tallenna @@ -69,12 +69,12 @@ fi: - Kyllä ComplexTableField: CLOSEPOPUP: 'Sulje ponnahdusikkuna' - SUCCESSADD2: 'Added {name}' + SUCCESSADD2: 'Lisättiin {name}' SUCCESSEDIT: 'Tallennettu %s %s %s' ConfirmedPasswordField: - ATLEAST: 'Passwords must be at least {min} characters long.' - BETWEEN: 'Passwords must be {min} to {max} characters long.' - MAXIMUM: 'Passwords must be at most {max} characters long.' + ATLEAST: 'Salasanan on oltava vähintään {min} merkkiä pitkä.' + BETWEEN: 'Salasanan on oltava väh. {min} ja enintään {max} merkkiä pitkä.' + MAXIMUM: 'Salasanan voi olla enintään {max} merkkiä pitkä.' SHOWONCLICKTITLE: 'Vaihda salasana' CreditCardField: FIRST: ensimmäinen @@ -97,86 +97,86 @@ fi: MONTHS: kuukaudet SEC: sek. SECS: sek. - TIMEDIFFAGO: '{difference} ago' - TIMEDIFFIN: 'in {difference}' + TIMEDIFFAGO: '{difference} sitten' + TIMEDIFFIN: '» {difference}' YEAR: vuosi YEARS: vuodet DateField: NOTSET: 'ei asetettu' TODAY: tänään - VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' - VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' - VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' + VALIDDATEFORMAT2: 'Ole hyvä ja kirjaa päivämäärä sallitussa muodossa ({format})' + VALIDDATEMAXDATE: 'Päivämäärän on oltava vanhempi tai sovittava asetettuun maksimiin ({date})' + VALIDDATEMINDATE: 'Päivämäärän on oltava uudempi tai sovittava vähintään asetettuun minimiin ({date})' Director: ADD: Lisää - INVALID_REQUEST: 'Invalid request' + INVALID_REQUEST: 'Pyyntö on virheellinen' DropdownField: CHOOSE: (Valitse) EmailField: - VALIDATION: 'Please enter an email address' + VALIDATION: 'Anna sähköpostiosoite, ole hyvä.' Email_BounceRecord: PLURALNAME: 'Palautetut sähköpostiviestit' SINGULARNAME: 'Palautettu sähköpostiviesti' Enum: ANY: Yhtään - LOADING: Loading... + LOADING: Ladataan... File: Content: Sisältö Filename: Tiedostonimi - INVALIDEXTENSION: 'Extension is not allowed (valid: {extensions})' - INVALIDEXTENSIONSHORT: 'Extension is not allowed' + INVALIDEXTENSION: 'Tiedostopääte ei ole sallittu (sallitut muodot: {extensions})' + INVALIDEXTENSIONSHORT: 'Tiedostopääte ei ole sallittu' NOFILESIZE: 'Tiedostokoko on nolla tavua.' NOVALIDUPLOAD: 'Tiedosto ei ole kelvollinen ladattavaksi' Name: Nimi PLURALNAME: Tiedostot SINGULARNAME: Tiedosto - TOOLARGE: 'Filesize is too large, maximum {size} allowed' - TOOLARGESHORT: 'Filesize exceeds {size}' + TOOLARGE: 'Tiedostokoko on liian suuri: maks. sallittu koko on {size}' + TOOLARGESHORT: 'Sallittu tiedostokoko ylitetty {size}' Title: Otsikko FileIFrameField: - ATTACH: 'Attach {type}' - ATTACHONCESAVED: '{type}s can be attached once you have saved the record for the first time.' - ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' - DELETE: 'Delete {type}' + ATTACH: 'Liitä {type}' + ATTACHONCESAVED: '{type} voidaan liittää, kun olet tallentanut tietueen ensimmäistä kertaa.' + ATTACHONCESAVED2: 'Tiedostoja voidaan liittää, kun olet tallentanut tietueen ensimmäisen kerran.' + DELETE: 'Poista {type}' DISALLOWEDFILETYPE: 'Tiedostotyyppin siirtoa ei ole sallittu' FILE: Tiedosto FROMCOMPUTER: tietokoneeltasi FROMFILESTORE: Tiedostovarastosta NOSOURCE: 'Valitse lähdetiedosto liitettäväksi' - REPLACE: 'Replace {type}' + REPLACE: 'Korvaa {type}' Filesystem: - IMPORT_TAB_HEADER: Import - SEARCHLISTINGS: Search - SYNCRESULTS: 'Sync complete: {createdcount} items created, {deletedcount} items deleted' + IMPORT_TAB_HEADER: Tuo + SEARCHLISTINGS: Etsi + SYNCRESULTS: 'Synkronointi valmis: {createdcount} kohdetta luotu, {deletedcount} kohdetta poistettu' Form: FIELDISREQUIRED: '%s on pakollinen.' TITLE: 'Kuvansiirtoikkuna (iFrame)' - VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' + VALIDATIONCREDITNUMBER: 'Tarkista, ovatko antamasi luottokortin numerot ({number}) oikein' VALIDATIONNOTUNIQUE: 'Syötetty arvo ei ole yksilöllinen' VALIDATIONPASSWORDSDONTMATCH: 'Salasanat eivät täsmää' VALIDATIONPASSWORDSNOTEMPTY: 'Salasana ei voi olla tyhjä' - VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character' + VALIDATIONSTRONGPASSWORD: 'Salasanassa on oltava vähintään yksi numero ja yksi kirjain' VALIDATOR: Tarkistin - VALIDCURRENCY: 'Please enter a valid currency' + VALIDCURRENCY: 'Ole hyvä ja valitse voimassa oleva valuutta' FormField: NONE: 'Ei yhtään' GridAction: - DELETE_DESCRIPTION: Delete + DELETE_DESCRIPTION: Poista Delete: Poista UnlinkRelation: 'Pura linkitys' GridField: - Add: 'Add {name}' + Add: 'Lisää {name}' Filter: Suodatin - FilterBy: 'Filter by ' + FilterBy: 'Suodata »' Find: Etsi - LEVELUP: 'Level up' + LEVELUP: 'Taso ylös' LinkExisting: 'Linkitä olemassaoleva' NewRecord: 'Uusi %s' NoItemsFound: 'Ei kohteita' PRINTEDAT: Tulostettu PRINTEDBY: Tulostaja - PlaceHolder: 'Find {type}' - PlaceHolderWithLabels: 'Find {type} by {name}' + PlaceHolder: 'Etsi {type}' + PlaceHolderWithLabels: 'Etsi {type} » {name}' RelationSearch: Relaatiohaku ResetFilter: Nollaa GridFieldAction_Delete: @@ -184,13 +184,13 @@ fi: NEXT: Seuraava PREVIOUS: Edellinen GridFieldDetailForm: - Create: Create - Delete: Delete - DeletePermissionsFailure: 'No delete permissions' - Deleted: 'Deleted %s %s' + Create: Luo + Delete: Poista + DeletePermissionsFailure: 'Ei oikeuksia poistamiseen' + Deleted: 'Poistettiin %s %s' HELLO: Hei - Save: Save - Saved: 'Saved %s %s' + Save: Tallenna + Saved: 'Tallennettu %s %s' TEXT1: 'Tässä on sinun' TEXT2: 'salasanan tyhjäys -linkki' TEXT3: henkilölle @@ -206,7 +206,7 @@ fi: GroupReminder: 'Valitessasi isäntäryhmän, roolit periytyvät tähän ryhmään' HELLO: Hei Locked: 'Lukittu?' - NoRoles: 'Roolia ei löytynyt' + NoRoles: 'Rooleja ei löytynyt' PASSWORD: Salasana Parent: Yliryhmä RolesAddEditLink: 'Lisää/muokkaa rooleja' @@ -217,19 +217,19 @@ fi: GroupImportForm: Help1: '

Tuo yksi tai useampi ryhmä CSV-muotoisena (arvot pilkulla erotettuina). Näytä edistyksellinen käyttö

' Help2: "
\\n

Edistynyt käyttö

\\n
    \\n
  • Sallitut palstat: %s
  • \\n
  • Olemassa olevat ryhmät kohdistetaan niiden uniikin Code-arvolla, ja päivitetään uudet arvot tuodusta tiedostosta.
  • \\n
  • Ryhmien hierarkiat voidaan luoda ParentCode-palstalla.
  • \\n
  • Oikeustasot voidaan kohdistaa PermissionCode-palstalla. Olemassa olevia oikeustasoja ei poisteta.
  • \\n
\\n
" - ResultCreated: 'Created {count} groups' + ResultCreated: 'Luotiin {count} ryhmä(ä)' ResultDeleted: 'Poistettu %d ryhmää' ResultUpdated: 'Päivitetty %d ryhmää' Hierarchy: - InfiniteLoopNotAllowed: 'Infinite loop found within the "{type}" hierarchy. Please change the parent to resolve this' + InfiniteLoopNotAllowed: '"{type}" -hierarkiasta löytyi loputon silmukka. Ole hyvä ja muuta isäntää korjataksesi ongelman.' HtmlEditorField: - ADDURL: 'Add URL' - ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' + ADDURL: 'Lisää URL-osoite' + ADJUSTDETAILSDIMENSIONS: 'Tarkat tiedot & mitat' ANCHORVALUE: Ankkuri BUTTONINSERT: Liitä BUTTONINSERTLINK: 'Lisää linkki' BUTTONREMOVELINK: 'Poista linkki' - BUTTONUpdate: Update + BUTTONUpdate: Päivitä CAPTIONTEXT: Kuvateksti CSSCLASS: Tasaus/tyyli CSSCLASSCENTER: 'Keskellä omillaan.' @@ -242,18 +242,18 @@ fi: FOLDER: Kansio FROMCMS: CMS-järjestelmästä FROMCOMPUTER: 'Omalta tietokoneeltasi' - FROMWEB: 'From the web' - FindInFolder: 'Find in Folder' - IMAGEALT: 'Alternative text (alt)' + FROMWEB: Webistä + FindInFolder: 'Etsi kansiosta' + IMAGEALT: 'Vaihtoehtoinen teksti (alt)' IMAGEALTTEXT: 'Vaihtoehtoinen teksti (alt) - näytetään jos kuvaa ei voida näyttää' - IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' + IMAGEALTTEXTDESC: 'Näytetään ruudunlukuohjelmille tai jos kuvia ei voi näyttää' IMAGEDIMENSIONS: Mitat IMAGEHEIGHTPX: Korkeus IMAGETITLE: 'Otsikko (tooltip) - kuvan lisätietoja varten' - IMAGETITLETEXT: 'Title text (tooltip)' - IMAGETITLETEXTDESC: 'For additional information about the image' + IMAGETITLETEXT: 'Otsikkoteksti (tooltip)' + IMAGETITLETEXTDESC: 'Kuvan lisätiedot' IMAGEWIDTHPX: Leveys - INSERTMEDIA: 'Insert Media' + INSERTMEDIA: 'Liitä media' LINK: 'Lisää/muokkaa linkki(ä) valittuun tekstiin' LINKANCHOR: 'Ankkuroi tähän sivuun' LINKDESCR: 'Linkin kuvaus' @@ -265,15 +265,15 @@ fi: LINKTO: Linkki PAGE: Sivu URL: URL-osoite - URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' - UpdateMEDIA: 'Update Media' + URLNOTANOEMBEDRESOURCE: 'URL-osoitetteesta ''{url}'' ei voitu liittää mediaa' + UpdateMEDIA: 'Päivitä media' ImageField: IMAGE: Kuva Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Suodata" GridFieldItemEditView.ss: Go back: "Takaisin" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Lisää uusi rivi' - CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' - DELETED: Deleted. + CANT_REORGANISE: 'Sinulla ei ole oikeuksia mennä ylemmän tason sivuille. Muutoksiasi ei tallennettu.' + DELETED: Poistettu. DropdownBatchActionsDefault: Toimenpiteet HELP: Ohje PAGETYPE: 'Sivun tyyppi:' @@ -281,16 +281,16 @@ fi: PERMALREADY: 'Paihoittelut, mutta et pääse tähän osaan CMS:ää. Jos haluat kirjautua jonain muuna, voit tehdä sen alla.' PERMDEFAULT: 'Valitse tunnistustapa ja syötä tunnistetietosi CMS:ään.' PLEASESAVE: 'Tätä sivua ei voitu päivittää, koska sitä ei ole vielä tallennettu. Tallenna sivu.' - PreviewButton: Preview - REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' - SAVEDUP: Saved. + PreviewButton: Esikatselu + REORGANISATIONSUCCESSFUL: 'Hakemistopuu järjestettiin uudelleen onnistuneesti.' + SAVEDUP: Tallennettu. VersionUnknown: tuntematon LoginAttempt: Email: Sähköpostiosoite IP: IP-osoite Status: Tila Member: - ADDGROUP: 'Add group' + ADDGROUP: 'Lisää ryhmä' BUTTONCHANGEPASSWORD: 'Vaihda salasana' BUTTONLOGIN: 'Kirjaudu sisään' BUTTONLOGINOTHER: 'Kirjaudu jonain muuna' @@ -308,8 +308,8 @@ fi: ERRORWRONGCRED: 'Tämä ei näytä oikealta sähköpostiosoitteelta tai salasanalta. Yritä uudelleen.' FIRSTNAME: Etunimi INTERFACELANG: 'Käyttöliittymän kieli' - INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' - LOGGEDINAS: 'You''re logged in as {name}.' + INVALIDNEWPASSWORD: 'Salasana ({password}) ei ole kelvollinen' + LOGGEDINAS: 'Olet kirjautuneena nimellä {name}.' NEWPASSWORD: 'Uusi salasana' PASSWORD: Salasana PLURALNAME: Jäsenet @@ -320,8 +320,8 @@ fi: SUBJECTPASSWORDRESET: 'Salasanasi palautuslinkki' SURNAME: Sukunimi VALIDATIONMEMBEREXISTS: 'Rekisteröityneellä käyttäjällä on jo käytössä tämä sähköpostiosoite.' - ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' - WELCOMEBACK: 'Welcome Back, {firstname}' + ValidationIdentifierFailed: 'Olemassa olevan käyttäjän id:n #{id} päälle ei voida kirjoittaa samalla tunnisteella ({name} = {value}))' + WELCOMEBACK: 'Tervetuloa takaisin, {firstname}' YOUROLDPASSWORD: 'Vanha salasanasi' belongs_many_many_Groups: Ryhmät db_LastVisited: 'Viimeisin vierailu:' @@ -355,44 +355,44 @@ fi: MemberImportForm: Help1: '

Tuo käyttäjät CSV-muodossa (arvot pilkulla erotettuina). Näytä edistyksellinen käyttö

' Help2: "
\\n

Edistynyt käyttö

\\n
    \\n
  • Sallitut palstat: %s
  • \\n
  • Olemassa olevat käyttäjät kohdistetaan uniikilla Code-arvolla, ja päivitetään uudet arvot tuodusta tiedostosta.
  • \\n
  • Ryhmät voidaan kohdistaa Ryhmät-palstaan. Ryhmät tunnistetaan Code-arvosta, useat ryhmät voidaan erottaa pilkulla. Olemassa olevat ryhmäjäsenyydet säilytetään.
  • \\n
\\n
" - ResultCreated: 'Created {count} members' + ResultCreated: 'Luotiin {count} käyttäjä(ä)' ResultDeleted: 'Poistettu %d jäsentä' ResultNone: 'Ei muutoksia' - ResultUpdated: 'Updated {count} members' + ResultUpdated: 'Päivitettiin {count} käyttäjä(ä)' MemberTableField: null ModelAdmin: DELETE: Poista - DELETEDRECORDS: 'Deleted {count} records.' + DELETEDRECORDS: 'Poistettiin {count} tietuetta' IMPORT: 'Tuo CSV:stä' - IMPORTEDRECORDS: 'Imported {count} records.' + IMPORTEDRECORDS: 'Tuotiin {count} tietuetta' NOCSVFILE: 'Selaa ja tuo CSV-tiedosto' NOIMPORT: 'Ei tuotavia' RESET: Nollaa - Title: 'Data Models' - UPDATEDRECORDS: 'Updated {count} records.' + Title: Datamallit + UPDATEDRECORDS: 'Päivitettiin {count} tietuetta' MoneyField: FIELDLABELAMOUNT: Määrä FIELDLABELCURRENCY: Valuutta NullableField: IsNullLabel: 'On nolla' NumericField: - VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field' + VALIDATION: '''{value}'' ei ole numero: tähän kenttään hyväksytään vain numeroita' Permission: AdminGroup: Järjestelmänvalvoja CMS_ACCESS_CATEGORY: CMS-pääsy FULLADMINRIGHTS: 'Täydet ylläpitäjän oikeudet' FULLADMINRIGHTS_HELP: 'Merkitsee ja ohittaa kaikki muut määritellyt käyttöoikeudet.' - IMPORTSPECFIELDS: 'Database columns' - IMPORTSPECRELATIONS: Relations + IMPORTSPECFIELDS: 'Tietokannan sarakkeet' + IMPORTSPECRELATIONS: Yhteydet PermissionCheckboxSetField: - AssignedTo: 'assigned to "{title}"' - FromGroup: 'inherited from group "{title}"' - FromRole: 'inherited from role "{title}"' + AssignedTo: 'valittiin "{title}"' + FromGroup: 'periytyivät ryhmästä "{title}"' + FromRole: 'periytyivät roolista "{title}"' FromRoleOnGroup: 'periytynyt roolista "%s" ryhmässä "%s"' Permissions: PERMISSIONS_CATEGORY: 'Roolit ja käyttöoikeudet' PhoneNumberField: - Back: Back + Back: Takaisin VALIDATION: 'Kirjoita pätevä puhelinnumero' Security: ALREADYLOGGEDIN: 'Sinulla ei ole oikeuksia tälle sivulle. Jos sinulla on toinen tili, jolla on oikeudet tälle sivulle, voit kirjautua niillä sisään.' @@ -404,10 +404,10 @@ fi: LOGGEDOUT: 'Kirjauduit ulos. Jos haluat kirjautua sisään, syötä tietosi alle.' LOGIN: 'Kirjaudu sisään' NOTEPAGESECURED: 'Tämä sivu on suojattu. Syötä tunnistetietosi alle ja annamme sinulle oikeat oikeudet.' - NOTERESETLINKINVALID: '

The password reset link is invalid or expired.

You can request a new one here or change your password after you logged in.

' + NOTERESETLINKINVALID: '

Salasanan nollauslinkki on virheellinen tai vanhentunut.

Voit pyytää uuden napsauttamalla tästä tai vaihtaa salasanasi kirjautumisen jälkeen.

' NOTERESETPASSWORD: 'Syötä sähköpostiosoitteesi ja lähetämme sinulle linkin, jonka avulla saat palautettua salasanasi' - PASSWORDSENTHEADER: 'Password reset link sent to ''{email}''' - PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' + PASSWORDSENTHEADER: 'Salasanan palautuslinkki lähetettiin osoitteeseen ''{email}''' + PASSWORDSENTTEXT: 'Kiitos! Salasanan palautuslinkki lähetettiin osoitteeseen ''{email}'', joka on liitettynä tähän käyttäjätiliin.' SecurityAdmin: ACCESS_HELP: 'Oikeuttaa käyttäjien katselun, lisäämisen ja muokkaamisen, kuten myös käyttöoikeuksien ja roolien määrittämisen heille.' APPLY_ROLES: 'Aseta roolit ryhmille' @@ -418,7 +418,7 @@ fi: IMPORTGROUPS: 'Tuo ryhmiä' IMPORTUSERS: 'Tuo käyttäjiä' MEMBERS: Jäsenet - MENUTITLE: Security + MENUTITLE: Tietosuoja MemberListCaution: 'Varoitus: Jäsenten poistaminen listalta poistaa ne kaikista ryhmistä ja tietokannasta' NEWGROUP: 'Uusi ryhmä' PERMISSIONS: Oikeudet @@ -430,9 +430,9 @@ fi: BtnImport: Tuonti FileFieldLabel: 'CSV-tiedosto (Sallitut päätteet: *.csv)' SilverStripeNavigator: - Edit: Edit - FILTER: Filter - IMPORT: Import + Edit: Muokkaa + FILTER: Suodin + IMPORT: Tuo VIEWFIRST: 'Näytä ensimmäinen' VIEWLAST: 'Näytä viimeinen' VIEWNEXT: 'Näytä seuraava' @@ -443,7 +443,7 @@ fi: TABMAIN: Yleiset TableField: ADDITEM: 'Lisää %s' - ISREQUIRED: 'In %s ''%s'' is required' + ISREQUIRED: 'Kohteessa %s on ''%s'' pakollinen' SORTASC: 'Järjestä nousevasti' SORTDESC: 'Järjestä laskevasti' TableListField: @@ -452,7 +452,7 @@ fi: Print: Tulosta SELECT: 'Valitse:' TimeField: - VALIDATEFORMAT: 'Please enter a valid time format ({format})' + VALIDATEFORMAT: 'Ole hyvä ja kirjaa päivämäärä sallitussa muodossa ({format})' ToggleField: LESS: vähemmän MORE: lisää @@ -464,14 +464,14 @@ fi: DOEDIT: Tallenna DROPFILE: 'Pudota tiedosto' DROPFILES: 'pudota tiedostot' - Dimensions: Dimensions + Dimensions: Mitat EDITINFO: 'Muokkaa tätä tiedostoa' FIELDNOTSET: 'Tietoja tiedostosta ei löytynyt' FROMCOMPUTER: 'Omalta tietokoneeltasi' FROMFILES: Tiedostoista - MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' - MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' - REMOVE: Remove + MAXNUMBEROFFILES: 'Suurin sallittu määrä ({count}) tiedostoja ylitetty.' + MAXNUMBEROFFILESSHORT: 'Voidaan siirtää vain {count} tiedostoa' + REMOVE: Poista REMOVEERROR: 'Virhe poistettaessa tiedostoa' REMOVEINFO: 'Poista tiedosto, mutta säilytä se tiedostovarastossa' STARTALL: 'Aloita kaikki' diff --git a/lang/fr.yml b/lang/fr.yml index 0a377b443..4ec96c9a7 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -21,7 +21,7 @@ fr: FILES: Fichiers TOTAL: Total TOUPLOAD: 'Choisissez les fichiers à télécharger' - UPLOADINPROGRESS: 'Please wait… upload in progress' + UPLOADINPROGRESS: 'Patientez s''il vous plaît… téléchargement en cours ' UPLOADOR: OU BBCodeParser: ALIGNEMENT: Alignement @@ -69,7 +69,7 @@ fr: - Oui ComplexTableField: CLOSEPOPUP: 'Ferme Popup' - SUCCESSADD2: 'Added {name}' + SUCCESSADD2: '{name} ajouté' SUCCESSEDIT: 'Sauvegardé %s %s %s' ConfirmedPasswordField: ATLEAST: 'Passwords must be at least {min} characters long.' @@ -97,16 +97,16 @@ fr: MONTHS: mois SEC: seconde SECS: secondes - TIMEDIFFAGO: '{difference} ago' - TIMEDIFFIN: 'in {difference}' + TIMEDIFFAGO: 'Il y a {difference}' + TIMEDIFFIN: 'Dans {difference}' YEAR: année YEARS: années DateField: NOTSET: 'pas d''ensemble' TODAY: 'aujourd''hui' - VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' - VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' - VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' + VALIDDATEFORMAT2: 'Saisissez la date au format valide ({format})' + VALIDDATEMAXDATE: 'La date doit être antérieure ou égale à celle qui a été autorisée ({date})' + VALIDDATEMINDATE: 'La date doit être plus récente ou égale à celle qui a été autorisée ({date})' Director: ADD: Ajouter INVALID_REQUEST: 'Requête non valide' @@ -123,7 +123,7 @@ fr: File: Content: Contenu Filename: 'Nom du fichier' - INVALIDEXTENSION: 'Extension is not allowed (valid: {extensions})' + INVALIDEXTENSION: 'Cette extension n’est pas autorisée (les valides sont : {extensions})' INVALIDEXTENSIONSHORT: 'Extension is not allowed' NOFILESIZE: 'La taille du fichier est de zéro bytes.' NOVALIDUPLOAD: 'Le fichier n’est pas valide pour le téléversement' @@ -147,7 +147,7 @@ fr: Filesystem: IMPORT_TAB_HEADER: Importer SEARCHLISTINGS: Rechercher - SYNCRESULTS: 'Sync complete: {createdcount} items created, {deletedcount} items deleted' + SYNCRESULTS: 'Synchronisation terminée : {createdcount} éléments créés, {deletedcount} éléments supprimés ' Form: FIELDISREQUIRED: '%s est requis' TITLE: 'Iframe de chargement d’images' @@ -169,14 +169,14 @@ fr: Filter: Filtrer FilterBy: 'Filtrer par' Find: Trouver - LEVELUP: 'Level up' + LEVELUP: 'Monter d’un niveau' LinkExisting: 'Lien existant' NewRecord: 'Nouveau %s' NoItemsFound: 'Aucun élément n’a été trouvé.' PRINTEDAT: 'Imprimé le' PRINTEDBY: 'Imprimé par' - PlaceHolder: 'Find {type}' - PlaceHolderWithLabels: 'Find {type} by {name}' + PlaceHolder: 'Rechercher {type}' + PlaceHolderWithLabels: 'Rechercher {type} par {name}' RelationSearch: 'Rechercher relations' ResetFilter: Réinitialiser GridFieldAction_Delete: @@ -186,8 +186,8 @@ fr: GridFieldDetailForm: Create: Créer Delete: Supprimer - DeletePermissionsFailure: 'No delete permissions' - Deleted: 'Deleted %s %s' + DeletePermissionsFailure: 'Vous n’avez pas les autorisations pour supprimer' + Deleted: '%s %s supprimés' HELLO: Salut Save: Enregistrer Saved: '%s %s sauvegardés' @@ -197,7 +197,7 @@ fr: Group: AddRole: 'Ajouter un rôle à ce groupe ' CHANGEPASSWORDTEXT1: 'Vous avez modifié votre mot de passe pour' - CHANGEPASSWORDTEXT2: 'Vous pouvez maintenant utiliser les détails suivants pour vous connecter :' + CHANGEPASSWORDTEXT2: 'Vous pouvez maintenant utiliser les identifiants suivants pour vous connecter :' Code: 'Code de groupe' DefaultGroupTitleAdministrators: Administrateur DefaultGroupTitleContentAuthors: 'Auteurs du contenu' @@ -212,11 +212,11 @@ fr: RolesAddEditLink: 'Ajouter/éditer les rôles' Sort: 'Ordre de tri' TITLE: 'Fenêtre de chargement d''images' - has_many_Permissions: Permissions + has_many_Permissions: Autorisations many_many_Members: Membres GroupImportForm: Help1: '

Importer un ou plusieurs groupe(s) au format CSV (comma-separated values). Montrer l''usage avancé

' - Help2: '

Advanced usage

  • Colonnes permises : %s
  • Les groupes existants dont le Code valeur concorde, sont mis à jour avec les nouvelles valeurs du fichier importé.
  • Une hiérarchie de groupe peut être créé avec la colonne ParentCode.
  • Les codes de permissions peuvent être assignés grâce à la colonne PermissionCode. Les codes permissions ne sont pas effacés.
' + Help2: "
\\n

Utilisations avancée

\\n
    \\n
  • Colonnes autorisées : %s
  • \\n
  • Les groupes existants dont la valeur Code concorde seront mis à jour avec les données du fichier importé.
  • \\n
  • Des hiérarchies entre groupes peuvent être créées à l’aide de la colonne ParentCode.
  • \\n
  • Des autorisations peuvent être assignées par la colonne PermissionCode. Les autorisations existantes ne seront pas effacées.
  • \\n
\\n
" ResultCreated: 'Created {count} groups' ResultDeleted: '%d groupes supprimés' ResultUpdated: '%d groupes mises à jour' @@ -224,7 +224,7 @@ fr: InfiniteLoopNotAllowed: 'Infinite loop found within the "{type}" hierarchy. Please change the parent to resolve this' HtmlEditorField: ADDURL: 'Add URL' - ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' + ADJUSTDETAILSDIMENSIONS: 'Détails & dimensions' ANCHORVALUE: Ancre BUTTONINSERT: Insérer BUTTONINSERTLINK: 'Insérer un lien' @@ -243,17 +243,17 @@ fr: FROMCMS: 'Depuis le SGC' FROMCOMPUTER: 'Depuis votre ordinateur' FROMWEB: 'From the web' - FindInFolder: 'Find in Folder' + FindInFolder: 'Trouver dans un dossier' IMAGEALT: 'Alternative text (alt)' IMAGEALTTEXT: 'Texte alternatif (alt) - s''affiche si l''image ne peut être affichée.' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' IMAGEDIMENSIONS: Dimensions IMAGEHEIGHTPX: Hauteur IMAGETITLE: 'Texte du titre (tooltip) - informations à propos de l''image' - IMAGETITLETEXT: 'Title text (tooltip)' - IMAGETITLETEXTDESC: 'For additional information about the image' + IMAGETITLETEXT: 'Texte du titre (info-bulle)' + IMAGETITLETEXTDESC: 'Autres informations à propos de l’image' IMAGEWIDTHPX: Largeur - INSERTMEDIA: 'Insert Media' + INSERTMEDIA: 'Insérer un support audiovisuel' LINK: Lien LINKANCHOR: 'Ancre sur cette page' LINKDESCR: 'Description du lien' @@ -266,21 +266,21 @@ fr: PAGE: Page URL: URL URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' - UpdateMEDIA: 'Update Media' + UpdateMEDIA: 'Mettre à jour le support audiovisuel' ImageField: IMAGE: Image Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Appliquer le filtre" GridFieldItemEditView.ss: Go back: "Revenir en arrière" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Ajouter une nouvelle ligne' - CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' + CANT_REORGANISE: 'Vous n’avez pas l’autorisation de modifier les pages de premier niveau. Vos modifications n’ont pas été enregistrées.' DELETED: Deleted. DropdownBatchActionsDefault: Actions HELP: Aide - PAGETYPE: 'Type de page :' + PAGETYPE: 'Type de page :' PERMAGAIN: 'Vous avez été déconnecté du CMS. Si vous voulez vous reconnecter, entrez un nom d''utilisateur et un mot de passe ci-dessous.' PERMALREADY: 'Désolé, mais vous ne pouvez pas accéder à cette partie du CMS. Si vous voulez changer d''identité, faites le ci-dessous' PERMDEFAULT: 'Saisissez votre adresse de courriel et votre mot de passe pour accéder au CMS.' - PLEASESAVE: 'Enregistez la page s''il vous plaît : Cette page ne pouvait pas être actualisée, car elle n''a pas encore été enregistrée.' + PLEASESAVE: 'Enregistrez la page s’il vous plaît : elle ne pouvait pas être mise à jour car elle n’avait pas encore été sauvegardée.' PreviewButton: Preview REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' SAVEDUP: Saved. @@ -308,8 +308,8 @@ fr: ERRORWRONGCRED: 'Il semble que ce ne soit pas le bon email ou mot de passe. Essayez encore s''il vous plaît.' FIRSTNAME: Prénom INTERFACELANG: 'Langue de l''interface' - INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' - LOGGEDINAS: 'You''re logged in as {name}.' + INVALIDNEWPASSWORD: 'Nous ne pouvons pas accepter le mot de passe {password}' + LOGGEDINAS: 'Vous êtes connecté comme {name}.' NEWPASSWORD: 'Nouveau mot de passe' PASSWORD: 'Mot de passe' PLURALNAME: Membres @@ -320,8 +320,8 @@ fr: SUBJECTPASSWORDRESET: 'Lien pour modifier votre mot de passe' SURNAME: 'Nom de famille' VALIDATIONMEMBEREXISTS: 'Il existe déjà un membre avec cet email' - ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' - WELCOMEBACK: 'Welcome Back, {firstname}' + ValidationIdentifierFailed: 'On ne peut pas réenregistrer le membre nº {id} avec un identifiant identique ({name} = {value}))' + WELCOMEBACK: 'Bienvenue {firstname}' YOUROLDPASSWORD: 'Votre ancien mot de passe' belongs_many_many_Groups: Groupes db_LastVisited: 'Date de la dernière visite' @@ -354,7 +354,7 @@ fr: TWODIGITYEAR: 'L’année sur deux chiffres' MemberImportForm: Help1: '

Importer les membres au formatCSV format (comma-separated values). Afficher l''usage avancé.

' - Help2: '

Advanced usage

  • Colonnes permises : %s
  • Les membres existants dont le Code valeur concorde, sont mis à jour avec les nouvelles valeurs du fichier importé.
  • Les groupes peuvent être assignés par la colonne Groups. Les groupes sont identifiés par Code , les groupes multiples sont séparés par une virgule. Les groupes existants ne sont pas effacés.
' + Help2: "
\\n

Utilisations avancée

\\n
    \\n
  • Colonnes autorisées : %s
  • \\n
  • Les membres existants dont la valeur Code concorde seront mis à jour avec les données du fichier importé.
  • \\n
  • Des groupes peuvent être assignés par la colonne Groups. Plusieurs groupes, identifiés par leur Code, peuvent être assignés en les séparant par des virgules. Les groupes existants ne seront pas effacés.
  • \\n
\\n
\\n" ResultCreated: 'Created {count} members' ResultDeleted: '%d membres supprimés' ResultNone: 'Aucun changements' @@ -376,18 +376,18 @@ fr: NullableField: IsNullLabel: 'Est Null' NumericField: - VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field' + VALIDATION: '« {value} » n’est pas un chiffre, seule donnée acceptée dans ce champ ' Permission: AdminGroup: Administrateur CMS_ACCESS_CATEGORY: 'Accès au CMS' FULLADMINRIGHTS: 'Droits d''administration complets' - FULLADMINRIGHTS_HELP: 'Implique et écrase toute les autres permissions assignées.' + FULLADMINRIGHTS_HELP: 'Implique et prévaut sur toutes les autres autorisations assignées.' IMPORTSPECFIELDS: 'Database columns' IMPORTSPECRELATIONS: Relations PermissionCheckboxSetField: - AssignedTo: 'assigned to "{title}"' - FromGroup: 'inherited from group "{title}"' - FromRole: 'inherited from role "{title}"' + AssignedTo: 'assignée au groupe « {title} »' + FromGroup: 'hérité du groupe « {title} »' + FromRole: 'héritée du rôle « {title} »' FromRoleOnGroup: 'hérité du rôle "%s" du groupe "%s"' Permissions: PERMISSIONS_CATEGORY: 'Rôles et autorisations d’accès' @@ -409,26 +409,26 @@ fr: PASSWORDSENTHEADER: 'Password reset link sent to ''{email}''' PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' SecurityAdmin: - ACCESS_HELP: 'Permettre la visualisation, l''addition et l''édition des utilisateurs, aussi bien que leur assigner des permissions et des rôles.' + ACCESS_HELP: 'Permet de consulter, d’ajouter et d’éditer les utilisateurs, aussi bien que de leur assigner des autorisations et des rôles.' APPLY_ROLES: 'Appliquer des rôles aux groupes' - APPLY_ROLES_HELP: 'Possibilité d''éditer les rôles assignés à un groupe. Nécessite "Access to ''Security'' section".' - EDITPERMISSIONS: 'Gérer les permissions des groupes' - EDITPERMISSIONS_HELP: 'Possibilité d''éditer les permissions et les l''adresses IP pour un groupe. Nécessite "Access to ''Security'' section".' + APPLY_ROLES_HELP: 'Possibilité d''éditer les rôle assignés à un groupe. Nécessite l’autorisation « Accès à la section “Utilisateurs” ».' + EDITPERMISSIONS: 'Gérer les autorisations des groupes' + EDITPERMISSIONS_HELP: 'Possibilité d''éditer les autorisations et les adresses IP pour un groupe. Nécessite l’autorisation « Accès à la section “Securité” ».' GROUPNAME: 'Nom du group' IMPORTGROUPS: 'Importer groupes' IMPORTUSERS: 'Importer utilisateurs' MEMBERS: Membres MENUTITLE: Sécurité - MemberListCaution: 'Attention : Enlever des membres de cette liste va les enlever de tous les groupes et de la base de donnée' - NEWGROUP: 'Nouveau Groupe' - PERMISSIONS: Permissions + MemberListCaution: 'Attention : en supprimant des membres de cette liste vous les enlèverez de tous les groupes ainsi que de la base de données' + NEWGROUP: 'Nouveau groupe' + PERMISSIONS: Autorisations ROLES: Rôles - ROLESDESCRIPTION: 'Cette section vous permet d''ajouter des rôles à ce groupe. Les rôles sont des regroupements logiques d''autorisations, qui peuvent être modifiés dans l''onglet Rôles' + ROLESDESCRIPTION: 'Les rôles sont des regroupements logiques d’autorisations qui peuvent être assignés à des groupes.
Ils peuvent être hérités de groupes parents, si nécessaire.' TABROLES: Rôles Users: Utilisateurs SecurityAdmin_MemberImportForm: BtnImport: Importer - FileFieldLabel: 'Fichier CSV (Extension permise: *.csv)' + FileFieldLabel: 'Fichier CSV (extension autorisée : *.csv)' SilverStripeNavigator: Edit: 'Tout modifier' FILTER: Filtrer @@ -450,9 +450,9 @@ fr: CSVEXPORT: 'Exporter vers un fichier CSV' PRINT: Imprimer Print: Imprimer - SELECT: 'Sélectionner:' + SELECT: 'Sélectionner :' TimeField: - VALIDATEFORMAT: 'Please enter a valid time format ({format})' + VALIDATEFORMAT: 'Saisissez l’heure au format valide ({format})' ToggleField: LESS: moins MORE: plus @@ -469,8 +469,8 @@ fr: FIELDNOTSET: 'Aucune information sur le fichier n''a été trouvée ' FROMCOMPUTER: 'Depuis votre ordinateur' FROMFILES: 'Depuis les fichiers' - MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' - MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' + MAXNUMBEROFFILES: 'Le nombre maximal de {count} fichiers a été dépassé.' + MAXNUMBEROFFILESSHORT: 'On ne peut pas télécharger plus de {count} fichiers' REMOVE: Supprimer REMOVEERROR: 'Le fichier n’a pas pu être supprimé' REMOVEINFO: 'Supprimer ce fichier ici sans l’effacer des archives' diff --git a/lang/he_IL.yml b/lang/he_IL.yml index 8d36f2091..d31313bfb 100644 --- a/lang/he_IL.yml +++ b/lang/he_IL.yml @@ -95,12 +95,12 @@ he_IL: MINS: דקות MONTH: חודש MONTHS: חודשים - SEC: 'שניה' - SECS: 'שניות' + SEC: שניה + SECS: שניות TIMEDIFFAGO: '{difference} ago' TIMEDIFFIN: 'in {difference}' - YEAR: 'שנה' - YEARS: 'שנים' + YEAR: שנה + YEARS: שנים DateField: NOTSET: 'not set' TODAY: today @@ -231,7 +231,7 @@ he_IL: BUTTONREMOVELINK: 'הסר קישור' BUTTONUpdate: Update CAPTIONTEXT: 'Caption text' - CSSCLASS: 'יישור/סגנון' + CSSCLASS: יישור/סגנון CSSCLASSCENTER: 'ממורכז, ללא טקסט בצדדים.' CSSCLASSLEFT: 'לשמאל, עם טקסט מסודר מסביב.' CSSCLASSLEFTALONE: 'On the left, on its own.' diff --git a/lang/hr.yml b/lang/hr.yml index a6d7ee515..235acb463 100644 --- a/lang/hr.yml +++ b/lang/hr.yml @@ -252,7 +252,7 @@ hr: IMAGETITLE: 'Title text (tooltip) - for additional information about the image' IMAGETITLETEXT: 'Title text (tooltip)' IMAGETITLETEXTDESC: 'For additional information about the image' - IMAGEWIDTHPX: 'Širina' + IMAGEWIDTHPX: Širina INSERTMEDIA: 'Insert Media' LINK: 'Ubaci/editiraj link za označeni tekst' LINKANCHOR: 'Anchor on this page' diff --git a/lang/ja_JP.yml b/lang/ja_JP.yml index 9aae53e12..01feeabea 100644 --- a/lang/ja_JP.yml +++ b/lang/ja_JP.yml @@ -40,7 +40,7 @@ ja_JP: ITALIC: テキストを斜体にする ITALICEXAMPLE: 斜体 LINK: ウェブサイトのリンク - LINKDESCRIPTION: '別のウェブサイトかURLにリンクしてください' + LINKDESCRIPTION: 別のウェブサイトかURLにリンクしてください STRUCK: テキストに取り消し線を引く STRUCKEXAMPLE: 取り消し線 UNDERLINE: テキストに下線を引く @@ -49,8 +49,8 @@ ja_JP: UNORDEREDDESCRIPTION: 不規則なリストです UNORDEREDEXAMPLE1: '不規則なアイテム 1' BasicAuth: - ENTERINFO: 'ユーザー名とパスワードを入力してください' - ERRORNOTADMIN: 'このユーザーは管理者(アドミニストレーター)ではありません' + ENTERINFO: ユーザー名とパスワードを入力してください + ERRORNOTADMIN: このユーザーは管理者(アドミニストレーター)ではありません ERRORNOTREC: 'ユーザー名 / パスワードは認識されませんでした' Boolean: ANY: Any @@ -108,7 +108,7 @@ ja_JP: VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' Director: - ADD: '追加' + ADD: 追加 INVALID_REQUEST: 'Invalid request' DropdownField: CHOOSE: (選択) @@ -121,7 +121,7 @@ ja_JP: ANY: Any LOADING: Loading... File: - Content: '内容' + Content: 内容 Filename: ファイル名 INVALIDEXTENSION: 'Extension is not allowed (valid: {extensions})' INVALIDEXTENSIONSHORT: 'Extension is not allowed' @@ -152,7 +152,7 @@ ja_JP: FIELDISREQUIRED: '%s が必要です' TITLE: 'Image Uploading Iframe' VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' - VALIDATIONNOTUNIQUE: '入力された値はユニークではありません' + VALIDATIONNOTUNIQUE: 入力された値はユニークではありません VALIDATIONPASSWORDSDONTMATCH: パスワードが一致しません VALIDATIONPASSWORDSNOTEMPTY: パスワードが空欄です VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character' @@ -199,7 +199,7 @@ ja_JP: CHANGEPASSWORDTEXT1: このサイトのパスワードが変更されました。 CHANGEPASSWORDTEXT2: '貴方は現在以下の証明書を使ってログインしています:' Code: グループコード - DefaultGroupTitleAdministrators: '管理者' + DefaultGroupTitleAdministrators: 管理者 DefaultGroupTitleContentAuthors: 'Content Authors' Description: 説明文 EMAIL: メールアドレス @@ -208,9 +208,9 @@ ja_JP: Locked: ロックしますか? NoRoles: 'No roles found' PASSWORD: パスワード - Parent: '元グループ' + Parent: 元グループ RolesAddEditLink: 'Manage roles' - Sort: '並び順' + Sort: 並び順 TITLE: イメージアップロード(Iframe) has_many_Permissions: 承認 many_many_Members: メンバー @@ -227,15 +227,15 @@ ja_JP: ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' ANCHORVALUE: アンカー BUTTONINSERT: Insert - BUTTONINSERTLINK: 'リンクを追加' + BUTTONINSERTLINK: リンクを追加 BUTTONREMOVELINK: リンクを削除 BUTTONUpdate: Update CAPTIONTEXT: タイトル CSSCLASS: '調整 / スタイル' CSSCLASSCENTER: 中央はテキストのみ - CSSCLASSLEFT: '左側にテキストと一緒に処理してください' + CSSCLASSLEFT: 左側にテキストと一緒に処理してください CSSCLASSLEFTALONE: 中央はテキストのみ - CSSCLASSRIGHT: '右側にテキストと一緒に処理してください' + CSSCLASSRIGHT: 右側にテキストと一緒に処理してください DETAILS: Details EMAIL: メールアドレス FILE: ファイル @@ -254,7 +254,7 @@ ja_JP: IMAGETITLETEXTDESC: 'For additional information about the image' IMAGEWIDTHPX: Width INSERTMEDIA: 'Insert Media' - LINK: 'ハイライトテキストへのリンクの挿入/削除' + LINK: ハイライトテキストへのリンクの挿入/削除 LINKANCHOR: このページにアンカーを置く LINKDESCR: リンクの説明 LINKEMAIL: メールアドレス @@ -271,7 +271,7 @@ ja_JP: IMAGE: 画像 Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Apply Filter" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: - ADD: '新しい行を追加' + ADD: 新しい行を追加 CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' DELETED: Deleted. DropdownBatchActionsDefault: Actions @@ -300,12 +300,12 @@ ja_JP: DefaultAdminFirstname: 'Default Admin' DefaultDateTime: default EMAIL: メールアドレス - EMPTYNEWPASSWORD: 'パスワードが空です。もう一度入力して下さい。' - ENTEREMAIL: 'パスワードをリセットするためにメールアドレスを入力してください。' - ERRORLOCKEDOUT: 'あなたのアカウントは何度もログインに失敗したため一時的に利用できなくなっています。20分後に試してください。' - ERRORNEWPASSWORD: '入力されたパスワードが一致しません。再度お試しください' - ERRORPASSWORDNOTMATCH: '登録されているパスワードと一致しません、もう一度入力し直してください' - ERRORWRONGCRED: 'メールアドレスまたはパスワードが正しくありません、もう一度入力し直してください' + EMPTYNEWPASSWORD: パスワードが空です。もう一度入力して下さい。 + ENTEREMAIL: パスワードをリセットするためにメールアドレスを入力してください。 + ERRORLOCKEDOUT: あなたのアカウントは何度もログインに失敗したため一時的に利用できなくなっています。20分後に試してください。 + ERRORNEWPASSWORD: 入力されたパスワードが一致しません。再度お試しください + ERRORPASSWORDNOTMATCH: 登録されているパスワードと一致しません、もう一度入力し直してください + ERRORWRONGCRED: メールアドレスまたはパスワードが正しくありません、もう一度入力し直してください FIRSTNAME: 名 INTERFACELANG: 画面言語 INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' @@ -319,7 +319,7 @@ ja_JP: SUBJECTPASSWORDCHANGED: パスワードが変わりました。 SUBJECTPASSWORDRESET: パスワード再発行 SURNAME: 姓 - VALIDATIONMEMBEREXISTS: '入力したメールアドレス(%s)は、他のメンバーにすでに使用されています。' + VALIDATIONMEMBEREXISTS: 入力したメールアドレス(%s)は、他のメンバーにすでに使用されています。 ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' WELCOMEBACK: 'Welcome Back, {firstname}' YOUROLDPASSWORD: 古いパスワード @@ -327,7 +327,7 @@ ja_JP: db_LastVisited: 最終訪問日 db_Locale: インターフェースの言語地域 db_LockedOutUntil: DBロックがされています。 - db_NumVisit: '訪問者数' + db_NumVisit: 訪問者数 db_Password: パスワード db_PasswordExpiry: パスワードの有効期限 MemberAuthenticator: @@ -378,9 +378,9 @@ ja_JP: NumericField: VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field' Permission: - AdminGroup: '管理者' + AdminGroup: 管理者 CMS_ACCESS_CATEGORY: 'CMS Access' - FULLADMINRIGHTS: '完全な管理権' + FULLADMINRIGHTS: 完全な管理権 FULLADMINRIGHTS_HELP: 'Implies and overrules all other assigned permissions.' IMPORTSPECFIELDS: 'Database columns' IMPORTSPECRELATIONS: Relations @@ -393,19 +393,19 @@ ja_JP: PERMISSIONS_CATEGORY: 'Roles and access permissions' PhoneNumberField: Back: Back - VALIDATION: '電話番号を入力してください' + VALIDATION: 電話番号を入力してください Security: ALREADYLOGGEDIN: 'あなたはこのページにアクセスできません。別のアカウントを持っていたら 再ログインを行ってください。' - BUTTONSEND: 'パスワードリセットのリンクを送信してください' + BUTTONSEND: パスワードリセットのリンクを送信してください CHANGEPASSWORDBELOW: 以下のパスワードを変更できます CHANGEPASSWORDHEADER: パスワードを変更しました - ENTERNEWPASSWORD: '新しいパスワードを入力してください' + ENTERNEWPASSWORD: 新しいパスワードを入力してください ERRORPASSWORDPERMISSION: パスワードを変更する為に、ログインしなければなりません! - LOGGEDOUT: 'ログアウトしました。再度ログインする場合は証明書キーを入力してください' + LOGGEDOUT: ログアウトしました。再度ログインする場合は証明書キーを入力してください LOGIN: ログイン - NOTEPAGESECURED: 'このページはセキュリティで保護されております証明書キーを下記に入力してください。こちらからすぐに送信します' + NOTEPAGESECURED: このページはセキュリティで保護されております証明書キーを下記に入力してください。こちらからすぐに送信します NOTERESETLINKINVALID: '

The password reset link is invalid or expired.

You can request a new one here or change your password after you logged in.

' - NOTERESETPASSWORD: 'メールアドレスを入力してください、パスワードをリセットするURLを送信致します' + NOTERESETPASSWORD: メールアドレスを入力してください、パスワードをリセットするURLを送信致します PASSWORDSENTHEADER: 'Password reset link sent to ''{email}''' PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' SecurityAdmin: @@ -455,7 +455,7 @@ ja_JP: VALIDATEFORMAT: 'Please enter a valid time format ({format})' ToggleField: LESS: 減少 - MORE: '増加' + MORE: 増加 UploadField: ATTACHFILE: 'Attach a file' ATTACHFILES: 'Attach files' diff --git a/lang/km.yml b/lang/km.yml index 95d01eee7..ed37fc774 100644 --- a/lang/km.yml +++ b/lang/km.yml @@ -205,10 +205,10 @@ km: EMAIL: Email GroupReminder: 'If you choose a parent group, this group will take all it''s roles' HELLO: Hi - Locked: 'មិនអាចប្រើ' + Locked: មិនអាចប្រើ NoRoles: 'No roles found' PASSWORD: Password - Parent: 'ចំណាត់ក្រុមដើម' + Parent: ចំណាត់ក្រុមដើម RolesAddEditLink: 'Manage roles' Sort: 'Sort Order' TITLE: 'Image Uploading Iframe' @@ -323,13 +323,13 @@ km: ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' WELCOMEBACK: 'Welcome Back, {firstname}' YOUROLDPASSWORD: 'Your old password' - belongs_many_many_Groups: 'ចំណាត់ក្រុម' + belongs_many_many_Groups: ចំណាត់ក្រុម db_LastVisited: 'Last Visited Date' db_Locale: 'Interface Locale' - db_LockedOutUntil: 'ដោះចេញរហូតដល់' + db_LockedOutUntil: ដោះចេញរហូតដល់ db_NumVisit: 'Number of Visits' db_Password: Password - db_PasswordExpiry: 'កាលបរិច្ឆេទផុតកំណត់ពាក្យសំងាត់' + db_PasswordExpiry: កាលបរិច្ឆេទផុតកំណត់ពាក្យសំងាត់ MemberAuthenticator: TITLE: 'E-mail & Password' MemberDatetimeOptionsetField: diff --git a/lang/lt.yml b/lang/lt.yml index 0f4636c9b..9b8dfe521 100644 --- a/lang/lt.yml +++ b/lang/lt.yml @@ -89,7 +89,7 @@ lt: Date: DAY: diena DAYS: dienas - HOUR: 'valandą' + HOUR: valandą HOURS: valandas MIN: minutę MINS: minutes diff --git a/lang/nb.yml b/lang/nb.yml index 86c342f27..c99df4a10 100644 --- a/lang/nb.yml +++ b/lang/nb.yml @@ -13,16 +13,16 @@ nb: TYPE: 'File type' URL: URL AssetUploadField: - ChooseFiles: 'Choose files' - DRAGFILESHERE: 'Drag files here' - DROPAREA: 'Drop Area' - EDITALL: 'Edit all' - EDITANDORGANIZE: 'Edit & organize' - FILES: Files + ChooseFiles: 'Velg filer' + DRAGFILESHERE: 'Dra filer hit' + DROPAREA: Droppunkt + EDITALL: 'Endre alle' + EDITANDORGANIZE: 'Rediger & organiser' + FILES: Filer TOTAL: Total TOUPLOAD: 'Choose file(s) to upload...' UPLOADINPROGRESS: 'Please wait… upload in progress' - UPLOADOR: OR + UPLOADOR: ELLER BBCodeParser: ALIGNEMENT: Stilling ALIGNEMENTEXAMPLE: 'Stilt til høyre' @@ -55,7 +55,7 @@ nb: Boolean: ANY: Any 0: 'False' - LOGOUT: 'Log out' + LOGOUT: 'Logg ut' 1: 'True' CMSMain: ACCESS: 'Access to ''{title}'' section' @@ -72,9 +72,9 @@ nb: SUCCESSADD2: 'Added {name}' SUCCESSEDIT: 'Lagret %s %s %s' ConfirmedPasswordField: - ATLEAST: 'Passwords must be at least {min} characters long.' - BETWEEN: 'Passwords must be {min} to {max} characters long.' - MAXIMUM: 'Passwords must be at most {max} characters long.' + ATLEAST: 'Passordet må inneholde minst {min} skrifttegn' + BETWEEN: 'Passord må inneholde {min} til {max} skrifttegn' + MAXIMUM: 'Passord må inneholde maks {max} skrifttegn' SHOWONCLICKTITLE: 'Endre Passord' CreditCardField: FIRST: første @@ -130,16 +130,16 @@ nb: Name: Navn PLURALNAME: Filer SINGULARNAME: Fil - TOOLARGE: 'Filesize is too large, maximum {size} allowed' - TOOLARGESHORT: 'Filesize exceeds {size}' + TOOLARGE: 'Filstørrelse for stor, maksimum {size} tillatt ' + TOOLARGESHORT: 'Filstørrelse overstiger {size}' Title: Tittel FileIFrameField: - ATTACH: 'Attach {type}' + ATTACH: 'Legg ved {type}' ATTACHONCESAVED: '{type}s can be attached once you have saved the record for the first time.' ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' - DELETE: 'Delete {type}' + DELETE: 'Slett {type}' DISALLOWEDFILETYPE: 'This filetype is not allowed to be uploaded' - FILE: File + FILE: Fil FROMCOMPUTER: 'From your Computer' FROMFILESTORE: 'From the File Store' NOSOURCE: 'Please select a source file to attach' @@ -151,13 +151,13 @@ nb: Form: FIELDISREQUIRED: 'mangler %s' TITLE: 'Image Uploading Iframe' - VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' + VALIDATIONCREDITNUMBER: 'Vennligst sjekk at du har skrevet inn {number} korrekt kortnummer' VALIDATIONNOTUNIQUE: 'Den spesifiserte verdien er ikke unik' VALIDATIONPASSWORDSDONTMATCH: 'Passordene passer ikke med hverandre' VALIDATIONPASSWORDSNOTEMPTY: 'Passord kan ikke være tomt' VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character' VALIDATOR: Validator - VALIDCURRENCY: 'Please enter a valid currency' + VALIDCURRENCY: 'Vennligst skriv inn gyldig valuta' FormField: NONE: ingen GridAction: @@ -165,7 +165,7 @@ nb: Delete: Delete UnlinkRelation: Unlink GridField: - Add: 'Add {name}' + Add: 'Legg til {name}' Filter: Filter FilterBy: 'Filter by ' Find: Find @@ -195,21 +195,21 @@ nb: TEXT2: 'passord resett link' TEXT3: for Group: - AddRole: 'Add a role for this group' + AddRole: 'Legg en rolle til denne gruppen' CHANGEPASSWORDTEXT1: 'Du har byttet passordet for' CHANGEPASSWORDTEXT2: 'Du kan nå bruke følgende informasjon for å logge deg inn:' Code: 'Gruppe Kode' - DefaultGroupTitleAdministrators: Administrators - DefaultGroupTitleContentAuthors: 'Content Authors' + DefaultGroupTitleAdministrators: Administratorer + DefaultGroupTitleContentAuthors: Innholdsforfattere Description: Beskrivelse EMAIL: Epost - GroupReminder: 'If you choose a parent group, this group will take all it''s roles' + GroupReminder: 'Hvis du velger en overordnet gruppe, vil denne gruppen arve alle rollene' HELLO: Hei Locked: 'Låst?' - NoRoles: 'No roles found' + NoRoles: 'Ingen roller funnet' PASSWORD: Passord Parent: 'Foreldre Gruppe' - RolesAddEditLink: 'Manage roles' + RolesAddEditLink: 'Administrer roller' Sort: Sorteringsrekkefølge TITLE: 'Bildeopplasnings ramme' has_many_Permissions: Tillatelser @@ -226,17 +226,17 @@ nb: ADDURL: 'Add URL' ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' ANCHORVALUE: Lenke - BUTTONINSERT: Insert + BUTTONINSERT: 'Sett inn' BUTTONINSERTLINK: 'Sett inn lenke' BUTTONREMOVELINK: 'Fjern lenke' - BUTTONUpdate: Update + BUTTONUpdate: Oppdater CAPTIONTEXT: 'Caption text' CSSCLASS: 'Stille opp / stil' CSSCLASSCENTER: 'Sentrert, alene.' CSSCLASSLEFT: 'På venstre side, med tekst rundt.' CSSCLASSLEFTALONE: 'På venstre side, alene.' CSSCLASSRIGHT: 'På høyde side, med tekst rundt.' - DETAILS: Details + DETAILS: Detaljer EMAIL: 'Epost adresse' FILE: Fil FOLDER: Mappe @@ -268,37 +268,37 @@ nb: URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' UpdateMEDIA: 'Update Media' ImageField: - IMAGE: Image + IMAGE: Bilde Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Apply Filter" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Legg til en rad' CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' DELETED: Deleted. DropdownBatchActionsDefault: Actions - HELP: Help + HELP: Hjelp PAGETYPE: 'Page type: ' - PERMAGAIN: 'You have been logged out of the CMS. If you would like to log in again, enter a username and password below.' + PERMAGAIN: 'Du har blitt logget ut av CMS. Hvis du vil logge deg på igjen, skriv inn brukernavn og passord under.' PERMALREADY: 'I''m sorry, but you can''t access that part of the CMS. If you want to log in as someone else, do so below' PERMDEFAULT: 'Please choose an authentication method and enter your credentials to access the CMS.' PLEASESAVE: 'Please Save Page: This page could not be upated because it hasn''t been saved yet.' - PreviewButton: Preview + PreviewButton: Forhåndsvisning REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' SAVEDUP: Saved. - VersionUnknown: unknown + VersionUnknown: Ukjent LoginAttempt: Email: Epostadresse IP: 'IP adresse' Status: Status Member: - ADDGROUP: 'Add group' + ADDGROUP: 'Legg til en gruppe' BUTTONCHANGEPASSWORD: 'Bytt Passord' BUTTONLOGIN: 'Logg inn' BUTTONLOGINOTHER: 'Logg inn med en annen brukerkonto' BUTTONLOSTPASSWORD: 'Jeg har mistet passordet' CONFIRMNEWPASSWORD: 'Bekreft Nytt Passord' CONFIRMPASSWORD: 'Bekreft passord' - DefaultAdminFirstname: 'Default Admin' - DefaultDateTime: default + DefaultAdminFirstname: 'Standard admin' + DefaultDateTime: Standard EMAIL: Epost EMPTYNEWPASSWORD: 'The new password can''t be empty, please try again' ENTEREMAIL: 'Vennligst skriv inne en epostadresse for å få tilsendt en lenke til å resette passord.' @@ -308,8 +308,8 @@ nb: ERRORWRONGCRED: 'Det der ser ikke ut til å være riktig epost adresse eller passord. Vennligst prøv igjen.' FIRSTNAME: Fornavn INTERFACELANG: 'Språk på grensesnitt' - INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' - LOGGEDINAS: 'You''re logged in as {name}.' + INVALIDNEWPASSWORD: 'Vi kunne ikke godkjenne passordet: {password}' + LOGGEDINAS: 'Du er logget inn som {name}' NEWPASSWORD: 'Nytt Passord' PASSWORD: Passord PLURALNAME: Medlemmer @@ -321,7 +321,7 @@ nb: SURNAME: Etternavn VALIDATIONMEMBEREXISTS: 'Det eksisterer allerede et medlem med denne epost-kontoen.' ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' - WELCOMEBACK: 'Welcome Back, {firstname}' + WELCOMEBACK: 'Velkommen tilbake, {firstname}' YOUROLDPASSWORD: 'Ditt gamle passord' belongs_many_many_Groups: Grupper db_LastVisited: 'Siste besøkte dato' @@ -343,8 +343,8 @@ nb: HOURNOLEADING: 'Hour without leading zero' MINUTENOLEADING: 'Minute without leading zero' MONTHNOLEADING: 'Month digit without leading zero' - Preview: Preview - SHORTMONTH: 'Short name of month (e.g. Jun)' + Preview: Forhåndsvisning + SHORTMONTH: 'Forkortelse av måned (f.eks. jun)' TOGGLEHELP: 'Toggle formatting help' TWODIGITDAY: 'Two-digit day of month' TWODIGITHOUR: 'Two digits of hour (00 through 23)' @@ -357,7 +357,7 @@ nb: Help2: '

Advanced usage

  • Allowed columns: %s
  • Existing users are matched by their unique Code property, and updated with any new values from the imported file.
  • Groups can be assigned by the Groups column. Groups are identified by their Code property, multiple groups can be separated by comma. Existing group memberships are not cleared.
' ResultCreated: 'Created {count} members' ResultDeleted: 'Deleted %d members' - ResultNone: 'No changes' + ResultNone: 'Ingen endringer' ResultUpdated: 'Updated {count} members' MemberTableField: null ModelAdmin: @@ -371,7 +371,7 @@ nb: Title: 'Data Models' UPDATEDRECORDS: 'Updated {count} records.' MoneyField: - FIELDLABELAMOUNT: Amount + FIELDLABELAMOUNT: Mengde FIELDLABELCURRENCY: Currency NullableField: IsNullLabel: 'Is Null' @@ -392,7 +392,7 @@ nb: Permissions: PERMISSIONS_CATEGORY: 'Roles and access permissions' PhoneNumberField: - Back: Back + Back: Tilbake VALIDATION: 'Vennligst skriv inn et gyldig tlf nummer' Security: ALREADYLOGGEDIN: 'Du har ikke adgang til denne siden. Hvis du har en annen konto som har adgang til denne siden, kan du logge inn med den under.' @@ -415,17 +415,17 @@ nb: EDITPERMISSIONS: 'Manage permissions for groups' EDITPERMISSIONS_HELP: 'Ability to edit Permissions and IP Addresses for a group. Requires the "Access to ''Security'' section" permission.' GROUPNAME: Gruppenavn - IMPORTGROUPS: 'Import groups' - IMPORTUSERS: 'Import users' + IMPORTGROUPS: 'Importer grupper' + IMPORTUSERS: 'Importer brukere' MEMBERS: Medlemmer MENUTITLE: Security - MemberListCaution: 'Caution: Removing members from this list will remove them from all groups and the database' - NEWGROUP: 'New Group' + MemberListCaution: 'Advarsel: Hvis du fjerner medlemmer fra denne listen vil det samtidig fjerne dem fra alle grupper og databasen' + NEWGROUP: 'Ny gruppe' PERMISSIONS: Tilganger - ROLES: Roles + ROLES: Roller ROLESDESCRIPTION: 'Roles are predefined sets of permissions, and can be assigned to groups.
They are inherited from parent groups if required.' - TABROLES: Roles - Users: Users + TABROLES: Roller + Users: Brukere SecurityAdmin_MemberImportForm: BtnImport: 'Import from CSV' FileFieldLabel: 'CSV File (Allowed extensions: *.csv)' @@ -450,31 +450,31 @@ nb: CSVEXPORT: 'Eksporter til CSV' PRINT: 'Skriv ut' Print: 'Skriv ut' - SELECT: 'Select:' + SELECT: 'Velg:' TimeField: VALIDATEFORMAT: 'Please enter a valid time format ({format})' ToggleField: LESS: mindre MORE: mer UploadField: - ATTACHFILE: 'Attach a file' - ATTACHFILES: 'Attach files' - AttachFile: 'Attach a file' + ATTACHFILE: 'Legg ved fil' + ATTACHFILES: 'Legg ved filer' + AttachFile: 'Legg ved fil' DELETEINFO: 'Permanently delete this file from the file store' - DOEDIT: Save - DROPFILE: 'drop a file' - DROPFILES: 'drop files' + DOEDIT: Lagre + DROPFILE: 'Slipp en fil' + DROPFILES: 'Slipp filer' Dimensions: Dimensions - EDITINFO: 'Edit this file' - FIELDNOTSET: 'File information not found' - FROMCOMPUTER: 'From your computer' - FROMFILES: 'From files' + EDITINFO: 'Rediger denne filen' + FIELDNOTSET: 'Filinformasjon ikke funnet' + FROMCOMPUTER: 'Fra din pc' + FROMFILES: 'Fra filer' MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' - REMOVE: Remove - REMOVEERROR: 'Error removing file' + REMOVE: Fjern + REMOVEERROR: 'Feil ved fjerning av fil' REMOVEINFO: 'Remove this file from here, but do not delete it from the file store' STARTALL: 'Start all' - Saved: Saved + Saved: Lagret Versioned: has_many_Versions: Versjoner diff --git a/lang/nl.yml b/lang/nl.yml index 8a10b30b7..0120a19bd 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -13,16 +13,16 @@ nl: TYPE: Type URL: URL AssetUploadField: - ChooseFiles: 'Choose files' - DRAGFILESHERE: 'Drag files here' + ChooseFiles: 'Selecteer bestanden' + DRAGFILESHERE: 'Sleep bestanden hiernaar toe' DROPAREA: 'Drop Area' EDITALL: 'Edit all' - EDITANDORGANIZE: 'Edit & organize' + EDITANDORGANIZE: 'Bewerk en beheer' FILES: Files TOTAL: Total TOUPLOAD: 'Choose file(s) to upload...' UPLOADINPROGRESS: 'Please wait… upload in progress' - UPLOADOR: OR + UPLOADOR: OF BBCodeParser: ALIGNEMENT: Uitlijning ALIGNEMENTEXAMPLE: 'rechts uitgelijnd' @@ -69,7 +69,7 @@ nl: - Ja ComplexTableField: CLOSEPOPUP: 'Sluit Popup' - SUCCESSADD2: 'Added {name}' + SUCCESSADD2: 'Toegevoegd {name}' SUCCESSEDIT: '%s %s %s Opgeslagen' ConfirmedPasswordField: ATLEAST: 'Passwords must be at least {min} characters long.' @@ -138,19 +138,19 @@ nl: ATTACHONCESAVED: '{type}s can be attached once you have saved the record for the first time.' ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' DELETE: 'Delete {type}' - DISALLOWEDFILETYPE: 'This filetype is not allowed to be uploaded' + DISALLOWEDFILETYPE: 'Dit type bestand mag niet worden opgeslagen' FILE: Bestand FROMCOMPUTER: 'Vanaf computer' FROMFILESTORE: 'Vanaf de website''s bestandsopslag' NOSOURCE: 'Selecteer een bron bestand om toe te voegen' REPLACE: 'Replace {type}' Filesystem: - IMPORT_TAB_HEADER: Import - SEARCHLISTINGS: Search - SYNCRESULTS: 'Sync complete: {createdcount} items created, {deletedcount} items deleted' + IMPORT_TAB_HEADER: Importeer + SEARCHLISTINGS: Zoeken + SYNCRESULTS: 'Synchroniseren compleet: {createdcount} bestanden aangemaakt, {deletedcount} bestanden verwijderd.' Form: FIELDISREQUIRED: '%s is verplicht' - TITLE: 'Image Uploading Iframe' + TITLE: 'Afbeelding uploaden' VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' VALIDATIONNOTUNIQUE: 'De ingevoerde waarde is niet uniek' VALIDATIONPASSWORDSDONTMATCH: 'Wachtwoorden komen niet overeen' @@ -162,40 +162,40 @@ nl: NONE: geen GridAction: DELETE_DESCRIPTION: Delete - Delete: Delete - UnlinkRelation: Unlink + Delete: Verwijder + UnlinkRelation: Ontkoppelen GridField: Add: 'Add {name}' Filter: Filter FilterBy: 'Filter by ' - Find: Find + Find: Zoek LEVELUP: 'Level up' LinkExisting: 'Link Existing' - NewRecord: 'New %s' - NoItemsFound: 'No items found' - PRINTEDAT: 'Printed at' - PRINTEDBY: 'Printed by' + NewRecord: 'Nieuw %s' + NoItemsFound: 'Geen items gevonden.' + PRINTEDAT: 'Geprint om' + PRINTEDBY: 'Geprint door' PlaceHolder: 'Find {type}' PlaceHolderWithLabels: 'Find {type} by {name}' RelationSearch: 'Relation search' ResetFilter: Reset GridFieldAction_Delete: - DeletePermissionsFailure: 'No delete permissions' + DeletePermissionsFailure: 'Onvoldoende rechten om te verwijderen' NEXT: Volgende PREVIOUS: Vorige GridFieldDetailForm: Create: Create - Delete: Delete + Delete: Verwijder DeletePermissionsFailure: 'No delete permissions' Deleted: 'Deleted %s %s' HELLO: Hallo - Save: Save - Saved: 'Saved %s %s' + Save: Opslaan + Saved: '%s %s %s Opgeslagen' TEXT1: 'Hier is uw' TEXT2: 'wachtwoord reset link' TEXT3: voor Group: - AddRole: 'Add a role for this group' + AddRole: 'Voeg een rol toe aan deze groep' CHANGEPASSWORDTEXT1: 'U heeft het wachtwoord veranderd voor' CHANGEPASSWORDTEXT2: 'U kunt nu onderstaande gegevens gebruiken om in te loggen:' Code: 'Groep code' @@ -203,10 +203,10 @@ nl: DefaultGroupTitleContentAuthors: 'Inhoud Auteurs' Description: 'Omschrijving ' EMAIL: E-mail - GroupReminder: 'If you choose a parent group, this group will take all it''s roles' + GroupReminder: 'Als je de bovenliggende groep selecteert, neemt deze groep alle rollen over' HELLO: Hallo Locked: 'Gesloten?' - NoRoles: 'No roles found' + NoRoles: 'Geen rollen gevonden' PASSWORD: Wachtwoord Parent: 'Bovenliggende groep' RolesAddEditLink: 'Toevoegen/wijzigingen rollen' @@ -223,10 +223,10 @@ nl: Hierarchy: InfiniteLoopNotAllowed: 'Infinite loop found within the "{type}" hierarchy. Please change the parent to resolve this' HtmlEditorField: - ADDURL: 'Add URL' - ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' + ADDURL: 'Voeg URL toe' + ADJUSTDETAILSDIMENSIONS: 'Details $amp; afmeting' ANCHORVALUE: Anker - BUTTONINSERT: Insert + BUTTONINSERT: Invoegen BUTTONINSERTLINK: 'Link invoegen' BUTTONREMOVELINK: 'Link verwijderen' BUTTONUpdate: Update @@ -240,20 +240,20 @@ nl: EMAIL: Emailadres FILE: Bestand FOLDER: Map - FROMCMS: 'From the CMS' - FROMCOMPUTER: 'From your computer' - FROMWEB: 'From the web' - FindInFolder: 'Find in Folder' - IMAGEALT: 'Alternative text (alt)' + FROMCMS: 'Vanaf CMS' + FROMCOMPUTER: 'Vanaf computer' + FROMWEB: 'Vanaf een website' + FindInFolder: 'Zoek in map' + IMAGEALT: 'Alternatieve tekst (alt tekst) - wordt getoond als de afbeelding niet kan worden geladen' IMAGEALTTEXT: 'Alternatieve tekst (alt tekst) - wordt getoond als de afbeelding niet kan worden geladen' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' IMAGEDIMENSIONS: Dimensies IMAGEHEIGHTPX: Hoogte IMAGETITLE: 'Titel tekst (tooltip) - Toon extra informatie over de afbeelding' - IMAGETITLETEXT: 'Title text (tooltip)' - IMAGETITLETEXTDESC: 'For additional information about the image' + IMAGETITLETEXT: 'Titel tekst (tooltip) - Toon extra informatie over de afbeelding' + IMAGETITLETEXTDESC: 'Titel tekst (tooltip) - Toon extra informatie over de afbeelding' IMAGEWIDTHPX: Breedte - INSERTMEDIA: 'Insert Media' + INSERTMEDIA: Invoegen LINK: Link LINKANCHOR: 'Anker op deze pagina' LINKDESCR: 'Link omschrijving' @@ -269,12 +269,12 @@ nl: UpdateMEDIA: 'Update Media' ImageField: IMAGE: Afbeelding - Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Apply Filter" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' + Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Filter toepassen" GridFieldItemEditView.ss: Go back: "Ga terug" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Nieuwe rij toevoegen' CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' DELETED: Deleted. - DropdownBatchActionsDefault: Actions + DropdownBatchActionsDefault: Acties HELP: Help PAGETYPE: 'Pagina type: ' PERMAGAIN: 'U bent uitgelogd uit het CMS. Als U weer wilt inloggen vul dan uw gebruikersnaam en wachtwoord hier beneden in.' @@ -284,7 +284,7 @@ nl: PreviewButton: Preview REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' SAVEDUP: Saved. - VersionUnknown: unknown + VersionUnknown: onbekend LoginAttempt: Email: 'Email adres ' IP: 'IP Adres' @@ -298,7 +298,7 @@ nl: CONFIRMNEWPASSWORD: 'Bevestig het nieuwe wachtwoord' CONFIRMPASSWORD: 'Bevestig wachtwoord' DefaultAdminFirstname: 'Standaard Beheerder' - DefaultDateTime: default + DefaultDateTime: Standaard EMAIL: Email EMPTYNEWPASSWORD: 'Het nieuwe wachtwoord mag niet leeg zijn, probeer opnieuw' ENTEREMAIL: 'Typ uw e-mailadres om een link te ontvangen waarmee u uw wachtwoord kunt resetten.' @@ -334,24 +334,24 @@ nl: TITLE: 'Email & Wachtwoord' MemberDatetimeOptionsetField: AMORPM: 'AM (Ante meridiem) or PM (Post meridiem)' - Custom: Custom - DATEFORMATBAD: 'Date format is invalid' - DAYNOLEADING: 'Day of month without leading zero' + Custom: Aangepast + DATEFORMATBAD: 'Datum is niet correct opgegeven' + DAYNOLEADING: 'Dag van de maand zonder voorloop-nul' DIGITSDECFRACTIONSECOND: 'One or more digits representing a decimal fraction of a second' FOURDIGITYEAR: 'Four-digit year' FULLNAMEMONTH: 'Full name of month (e.g. June)' HOURNOLEADING: 'Hour without leading zero' MINUTENOLEADING: 'Minute without leading zero' MONTHNOLEADING: 'Month digit without leading zero' - Preview: Preview + Preview: Voorbeeld SHORTMONTH: 'Short name of month (e.g. Jun)' TOGGLEHELP: 'Toggle formatting help' TWODIGITDAY: 'Two-digit day of month' - TWODIGITHOUR: 'Two digits of hour (00 through 23)' + TWODIGITHOUR: 'Twee cijfer van het uur (00 tot 23)' TWODIGITMINUTE: 'Two digits of minute (00 through 59)' TWODIGITMONTH: 'Two-digit month (01=January, etc.)' TWODIGITSECOND: 'Two digits of second (00 through 59)' - TWODIGITYEAR: 'Two-digit year' + TWODIGITYEAR: 'Twee-cijferig jaar' MemberImportForm: Help1: '

Importeer leden in CSV formaat (Kommagescheiden bestandsformaat). Toon geavanceerd gebruik

' Help2: '

Geavanceerd gebruik

  • Toegestane kolommen: %s
  • Bestaande leden worden geïdentificeerd door middel van hun unieke Code waarde en aangepast met de nieuwe waarden van het geïmporteerde bestand
  • Groepen kunnen toegewezen worden met de Groups kolom. Groepen worden geïdentificeerd met hun Code waarde en meerdere groepen kunnen worden gescheiden met een komma. Bestaande groep lidmaatschappen worden niet gewist.
' @@ -415,8 +415,8 @@ nl: EDITPERMISSIONS: 'Bewerk rechten en IP-adressen bij elke groep' EDITPERMISSIONS_HELP: 'Bewerkingsmogelijkheid van Rechten en IP adressen voor groepen. Heeft rechten voor "Beveiligingsectie" nodig.' GROUPNAME: 'Groep naam' - IMPORTGROUPS: 'Import groups' - IMPORTUSERS: 'Import users' + IMPORTGROUPS: Groepen + IMPORTUSERS: 'Importeer gebruikers' MEMBERS: Leden MENUTITLE: Security MemberListCaution: 'Let op: Verwijderen van leden van deze lijst heeft als gevolg dat deze uit alle groepen en de database worden verwijderd' @@ -425,14 +425,14 @@ nl: ROLES: Rollen ROLESDESCRIPTION: 'In deze sectie kan je rollen toevoegen aan deze groep. Rollen zijn logische groeperingen van rechten die in het Rollen tapblad gewijzigd kunnen worden.' TABROLES: Rollen - Users: Users + Users: Gebruikers SecurityAdmin_MemberImportForm: BtnImport: Importeer FileFieldLabel: 'CSV Bestand (Toegestane extensies: *.csv)' SilverStripeNavigator: - Edit: Edit + Edit: Bewerken FILTER: Filter - IMPORT: Import + IMPORT: Importeer VIEWFIRST: 'Bekijk eerste' VIEWLAST: 'Bekijk laatste' VIEWNEXT: 'Bekijk volgende' @@ -457,24 +457,24 @@ nl: LESS: minder MORE: meer UploadField: - ATTACHFILE: 'Attach a file' - ATTACHFILES: 'Attach files' - AttachFile: 'Attach a file' - DELETEINFO: 'Permanently delete this file from the file store' - DOEDIT: Save - DROPFILE: 'drop a file' - DROPFILES: 'drop files' + ATTACHFILE: 'Voeg een bestand toe' + ATTACHFILES: 'Voeg bestanden toe' + AttachFile: 'Voeg een bestand toe' + DELETEINFO: 'Verwijder dit bestand uit bestandsopslag van de website.' + DOEDIT: Bewaar + DROPFILE: 'Bestand hiernaar toe slepen' + DROPFILES: 'Sleep hier je bestanden' Dimensions: Dimensions - EDITINFO: 'Edit this file' - FIELDNOTSET: 'File information not found' - FROMCOMPUTER: 'From your computer' - FROMFILES: 'From files' + EDITINFO: 'Bewerk dit bestand' + FIELDNOTSET: 'Bestandsinformatie niet gevonden' + FROMCOMPUTER: 'Vanaf computer' + FROMFILES: 'Bestaande bestanden' MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' REMOVE: Remove - REMOVEERROR: 'Error removing file' - REMOVEINFO: 'Remove this file from here, but do not delete it from the file store' - STARTALL: 'Start all' - Saved: Saved + REMOVEERROR: 'Fout bij verwijderen' + REMOVEINFO: 'Verwijder (ontkoppel) dit bestand, maar behoud het in bestandsopslag van de website.' + STARTALL: 'Start alles' + Saved: 'Succesvol opgeslagen' Versioned: has_many_Versions: Versies diff --git a/lang/pa.yml b/lang/pa.yml index 154cd2442..80f9fd598 100644 --- a/lang/pa.yml +++ b/lang/pa.yml @@ -181,7 +181,7 @@ pa: ResetFilter: Reset GridFieldAction_Delete: DeletePermissionsFailure: 'No delete permissions' - NEXT: 'ਅਗਲਾ' + NEXT: ਅਗਲਾ PREVIOUS: ਪਿਛਲਾ GridFieldDetailForm: Create: Create diff --git a/lang/pl.yml b/lang/pl.yml index 31af57eec..5d475ea50 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -1,27 +1,27 @@ pl: AssetAdmin: - NEWFOLDER: NewFolder + NEWFOLDER: NowyFolder AssetTableField: - CREATED: 'First uploaded' - DIM: Dimensions - FILENAME: Filename + CREATED: 'Po raz pierwszy wgrany' + DIM: Rozmiar + FILENAME: 'Nazwa pliku' FOLDER: Folder - LASTEDIT: 'Last changed' - OWNER: Owner - SIZE: 'File size' - TITLE: Title - TYPE: 'File type' - URL: URL + LASTEDIT: 'Ostatnio zmieniony' + OWNER: Właściciel + SIZE: 'Rozmiar pliku' + TITLE: Tytuł + TYPE: 'Typ pliku' + URL: 'Adres URL' AssetUploadField: ChooseFiles: 'Wybierz pliki' DRAGFILESHERE: 'Przeciągnij tu pliki' DROPAREA: 'Obszar upuszczania' - EDITALL: 'Edit all' + EDITALL: 'Edytuj wszystkie' EDITANDORGANIZE: 'Edytuj i organizuj' - FILES: Files - TOTAL: Total - TOUPLOAD: 'Choose file(s) to upload...' - UPLOADINPROGRESS: 'Please wait… upload in progress' + FILES: Pliki + TOTAL: Razem + TOUPLOAD: 'Wybierz pliki do przesłania...' + UPLOADINPROGRESS: 'Pliki są przesyłane... proszę czekać' UPLOADOR: LUB BBCodeParser: ALIGNEMENT: Wyrównanie @@ -55,12 +55,12 @@ pl: Boolean: ANY: Jakikolwiek 0: Nie - LOGOUT: 'Log out' + LOGOUT: 'Wyloguj się' 1: Tak CMSMain: - ACCESS: 'Access to ''{title}'' section' - ACCESSALLINTERFACES: 'Access to all CMS sections' - ACCESSALLINTERFACESHELP: 'Overrules more specific access settings.' + ACCESS: 'Dostęp do sekcji ''{title}''' + ACCESSALLINTERFACES: 'Dostęp do wszystkich sekcji CMSa' + ACCESSALLINTERFACESHELP: 'Nadpisuje bardziej specyficzne ustawienia dostępu.' SAVE: Zapisz CMSProfileController: MENUTITLE: CMSProfileController @@ -69,12 +69,12 @@ pl: - Tak ComplexTableField: CLOSEPOPUP: 'Zamknij Okienko' - SUCCESSADD2: 'Added {name}' + SUCCESSADD2: 'Dodano {name}' SUCCESSEDIT: 'Zapisano %s %s %s' ConfirmedPasswordField: - ATLEAST: 'Passwords must be at least {min} characters long.' - BETWEEN: 'Passwords must be {min} to {max} characters long.' - MAXIMUM: 'Passwords must be at most {max} characters long.' + ATLEAST: 'Hasła muszą mieć przynajmniej {min} znaków.' + BETWEEN: 'Hasła muszą mieć długość pomiędzy {min} a {max} znaków.' + MAXIMUM: 'Hasła mogą mieć co najwyżej {max} znaków.' SHOWONCLICKTITLE: 'Zmiana Hasła' CreditCardField: FIRST: pierwszy @@ -84,8 +84,8 @@ pl: CurrencyField: CURRENCYSYMBOL: $ DataObject: - PLURALNAME: 'Data Objects' - SINGULARNAME: 'Data Object' + PLURALNAME: 'Obiekty danych' + SINGULARNAME: 'Obiekt danych' Date: DAY: dzień DAYS: dni @@ -93,90 +93,90 @@ pl: HOURS: godziny MIN: min MINS: minuty - MONTH: 'miesiąc' - MONTHS: 'miesiące' + MONTH: miesiąc + MONTHS: miesiące SEC: sekunda SECS: sekundy - TIMEDIFFAGO: '{difference} ago' - TIMEDIFFIN: 'in {difference}' + TIMEDIFFAGO: '{difference} temu' + TIMEDIFFIN: 'w {difference}' YEAR: rok YEARS: lata DateField: NOTSET: 'nie ustawiono' TODAY: dzisiaj - VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' - VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' - VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' + VALIDDATEFORMAT2: 'Proszę wprowadź prawidłowy format daty ({format})' + VALIDDATEMAXDATE: 'Twoja data musi być wcześniejsza lub taka sama, jak maksymalna dozwolona data ({date})' + VALIDDATEMINDATE: 'Twoja data musi być późniejsza lub taka sama, jak minimalna dozwolona data ({date})' Director: ADD: Dodaj - INVALID_REQUEST: 'Invalid request' + INVALID_REQUEST: 'Nieprawidłowe żądanie' DropdownField: CHOOSE: (wybierz) EmailField: - VALIDATION: 'Please enter an email address' + VALIDATION: 'Proszę podaj adres e-mail' Email_BounceRecord: - PLURALNAME: 'Email Bounce Records' - SINGULARNAME: 'Email Bounce Record' + PLURALNAME: 'Historia odrzuconych e-maili' + SINGULARNAME: 'Odrzucony e-mail' Enum: ANY: Jakikolwiek - LOADING: Loading... + LOADING: Wczytywanie... File: Content: Zawartość Filename: 'Nazwa pliku' - INVALIDEXTENSION: 'Extension is not allowed (valid: {extensions})' - INVALIDEXTENSIONSHORT: 'Extension is not allowed' + INVALIDEXTENSION: 'Rozszerzenie niedozwolone (dozwolone: {extensions})' + INVALIDEXTENSIONSHORT: 'Rozszerzenie niedozwolone' NOFILESIZE: 'Rozmiar pliku to zero bajtów.' - NOVALIDUPLOAD: 'File is not a valid upload' + NOVALIDUPLOAD: 'Plik nie został poprawnie przesłany' Name: Nazwa PLURALNAME: Pliki SINGULARNAME: Plik - TOOLARGE: 'Filesize is too large, maximum {size} allowed' - TOOLARGESHORT: 'Filesize exceeds {size}' + TOOLARGE: 'Plik jest za duży, maksymalnie dozwolone jest {size}' + TOOLARGESHORT: 'Rozmiar pliku przekracza {size}' Title: Tytuł FileIFrameField: - ATTACH: 'Attach {type}' - ATTACHONCESAVED: '{type}s can be attached once you have saved the record for the first time.' - ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' - DELETE: 'Delete {type}' - DISALLOWEDFILETYPE: 'This filetype is not allowed to be uploaded' + ATTACH: 'Dołącz {type}' + ATTACHONCESAVED: 'Element {type} może zostać dołączony dopiero po pierwszym zapisaniu rekordu.' + ATTACHONCESAVED2: 'Pliki mogą zostać dołączone dopiero po pierwszym zapisaniu rekordu.' + DELETE: 'Usuń {type}' + DISALLOWEDFILETYPE: 'Wgrywanie plików tego typu nie jest dozwolone' FILE: Plik - FROMCOMPUTER: 'From your Computer' - FROMFILESTORE: 'From the File Store' + FROMCOMPUTER: 'Z Twojego Komputera' + FROMFILESTORE: 'Ze Składnicy Plików' NOSOURCE: 'Wybierz źródło pliku do załaczenia' - REPLACE: 'Replace {type}' + REPLACE: 'Zastąp {type}' Filesystem: IMPORT_TAB_HEADER: Import - SEARCHLISTINGS: Search - SYNCRESULTS: 'Sync complete: {createdcount} items created, {deletedcount} items deleted' + SEARCHLISTINGS: Znajdź + SYNCRESULTS: 'Synchronizacja zakończona: stworzono {createdcount} i usunięto {deletedcount} pozycji' Form: FIELDISREQUIRED: '%s jest wymagane' - TITLE: 'Image Uploading Iframe' - VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' + TITLE: 'Iframe wgrywania zdjęć' + VALIDATIONCREDITNUMBER: 'Proszę upewnij się, że wprowadzony numer karty kredytowej {number} jest prawidłowy' VALIDATIONNOTUNIQUE: 'Wprowadzona wartość nie jest unikalna' VALIDATIONPASSWORDSDONTMATCH: 'Hasła nie są takie same' VALIDATIONPASSWORDSNOTEMPTY: 'Hasło nie może być puste' - VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character' + VALIDATIONSTRONGPASSWORD: 'Hasła muszą mieć przynajmniej jedną cyfrę oraz jeden znak alfanumeryczny.' VALIDATOR: Walidator - VALIDCURRENCY: 'Please enter a valid currency' + VALIDCURRENCY: 'Proszę podaj prawidłową walutę' FormField: NONE: brak GridAction: - DELETE_DESCRIPTION: Delete - Delete: Delete - UnlinkRelation: Unlink + DELETE_DESCRIPTION: Usuń + Delete: Usuń + UnlinkRelation: 'Usuń łącze' GridField: - Add: 'Add {name}' + Add: 'Dodaj {name}' Filter: Filtr - FilterBy: 'Filter by ' + FilterBy: 'Filtruj wg' Find: Wyszukaj - LEVELUP: 'Level up' - LinkExisting: 'Link Existing' + LEVELUP: 'W górę' + LinkExisting: 'Linkuj istniejący' NewRecord: 'Nowy %s' NoItemsFound: 'Nie znaleziono elementów' PRINTEDAT: 'Wydrukowane na' PRINTEDBY: 'Wydrukowane przez' - PlaceHolder: 'Find {type}' - PlaceHolderWithLabels: 'Find {type} by {name}' + PlaceHolder: 'Znajdź {type}' + PlaceHolderWithLabels: 'Znajdź {type} wg {name}' RelationSearch: 'Wyszukiwanie powiązań' ResetFilter: Resetuj GridFieldAction_Delete: @@ -184,13 +184,13 @@ pl: NEXT: Następny PREVIOUS: Poprzedni GridFieldDetailForm: - Create: Create - Delete: Delete - DeletePermissionsFailure: 'No delete permissions' - Deleted: 'Deleted %s %s' + Create: Stwórz + Delete: Usuń + DeletePermissionsFailure: 'Brak uprawnień do usuwania' + Deleted: 'Usunięto %s %s' HELLO: Cześć - Save: Save - Saved: 'Saved %s %s' + Save: Zapisz + Saved: 'Zapisano %s %s' TEXT1: 'Oto twój' TEXT2: 'link zmiany hasła' TEXT3: dla @@ -215,21 +215,21 @@ pl: has_many_Permissions: Zezwolenia many_many_Members: Członkowie GroupImportForm: - Help1: '

Import one or more groups in CSV format (comma-separated values). Show advanced usage

' - Help2: '

Advanced usage

  • Allowed columns: %s
  • Existing groups are matched by their unique Code value, and updated with any new values from the imported file
  • Group hierarchies can be created by using a ParentCode column.
  • Permission codes can be assigned by the PermissionCode column. Existing permission codes are not cleared.
' - ResultCreated: 'Created {count} groups' - ResultDeleted: 'Deleted %d groups' - ResultUpdated: 'Updated %d groups' + Help1: '

Zaimportuj użytkowników w formacie CSV (tekst rozdzielany przecinkami). Zaawansowane

' + Help2: "
\\n\\n

Zaawansowane użycie

\\n\\n
    \\n\\n
  • Dozwolone kolumny: %s
  • \\n\\n
  • Istniejące grupy są dopasowywane poprzez ich unikalną wartość Kod i aktualizowane nowymi wartościami z zaimportowanego pliku.
  • \\n\\n
  • Można tworzyć hierarchie Grup za pomocą kolumny KodNadrzędny.
  • \\n\\n
  • Kody uprawnień mogą być przypisywane za pomocą kolumny KodUprawnienia. Istniejące kody uprawnień nie są usuwane.
  • \\n\\n
\\n\\n
" + ResultCreated: 'Stworzono grup: {count}' + ResultDeleted: 'Usunięto grup: %d' + ResultUpdated: 'Zaktualizowano grup: %d' Hierarchy: - InfiniteLoopNotAllowed: 'Infinite loop found within the "{type}" hierarchy. Please change the parent to resolve this' + InfiniteLoopNotAllowed: 'Znaleziono nieskończoną pętlę wewnątrz hierarchii "{type}". Proszę zmień rodzica by to rozwiązać.' HtmlEditorField: - ADDURL: 'Add URL' - ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' + ADDURL: 'Dodaj adres URL' + ADJUSTDETAILSDIMENSIONS: 'Szczegóły i rozmiar' ANCHORVALUE: Odnośnik BUTTONINSERT: Wstaw BUTTONINSERTLINK: 'Wstaw link' BUTTONREMOVELINK: 'Zmień link' - BUTTONUpdate: Update + BUTTONUpdate: Aktualizuj CAPTIONTEXT: Tekst CSSCLASS: Wyrównanie/styl CSSCLASSCENTER: Wyśrodkowane @@ -242,18 +242,18 @@ pl: FOLDER: Folder FROMCMS: 'Z systemu CMS' FROMCOMPUTER: 'Z komputera' - FROMWEB: 'From the web' - FindInFolder: 'Find in Folder' - IMAGEALT: 'Alternative text (alt)' + FROMWEB: 'Z WWW' + FindInFolder: 'Znajdź w Folderze' + IMAGEALT: 'Tekst alternatywny (alt)' IMAGEALTTEXT: 'Tekst alternatywny (alt) - pokazywany gdy obrazek nie może być wyświetlony' - IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' + IMAGEALTTEXTDESC: 'Używane przez czytniki dla niewidomych oraz gdy nie można pobrać obrazu' IMAGEDIMENSIONS: Rozmiar IMAGEHEIGHTPX: 'Wysokość (px)' IMAGETITLE: 'Tytuł (tooltip) - dodatkowe informacje o obrazku' - IMAGETITLETEXT: 'Title text (tooltip)' - IMAGETITLETEXTDESC: 'For additional information about the image' + IMAGETITLETEXT: 'Tytuł (wyskakujący dymek)' + IMAGETITLETEXTDESC: 'Po dodatkowe informacje o obrazku' IMAGEWIDTHPX: 'Szerokość (px)' - INSERTMEDIA: 'Insert Media' + INSERTMEDIA: 'Wstaw Media' LINK: 'Wstaw/edytuj link z podświetlonego tekstu ' LINKANCHOR: 'Odnośnik na tej stronie' LINKDESCR: 'Opis linku' @@ -265,32 +265,32 @@ pl: LINKTO: 'Linkuj do' PAGE: Strona URL: URL - URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' - UpdateMEDIA: 'Update Media' + URLNOTANOEMBEDRESOURCE: 'Adres URL ''{url}'' nie mógł zostać przekształcony w zasób medialny' + UpdateMEDIA: 'Zaktualizuj Media' ImageField: IMAGE: Obraz Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Zastosuj filtr" GridFieldItemEditView.ss: Go back: "Wstecz" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Dodaj nowy rząd' - CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' - DELETED: Deleted. - DropdownBatchActionsDefault: Actions - HELP: Help - PAGETYPE: 'Page type: ' - PERMAGAIN: 'You have been logged out of the CMS. If you would like to log in again, enter a username and password below.' - PERMALREADY: 'I''m sorry, but you can''t access that part of the CMS. If you want to log in as someone else, do so below' - PERMDEFAULT: 'Please choose an authentication method and enter your credentials to access the CMS.' - PLEASESAVE: 'Please Save Page: This page could not be upated because it hasn''t been saved yet.' - PreviewButton: Preview - REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' - SAVEDUP: Saved. - VersionUnknown: unknown + CANT_REORGANISE: 'Nie masz uprawnień by zmieniać strony na najwyższym poziomie. Twoje zmiany nie zostały zapisane.' + DELETED: Usunięto. + DropdownBatchActionsDefault: Akcje + HELP: Pomoc + PAGETYPE: 'Rodzaj strony:' + PERMAGAIN: 'Zostałeś wylogowany z CMSa. Jeśli chcesz zalogować się ponownie, wpisz login i hasło poniżej.' + PERMALREADY: 'Niestety nie masz dostępu do tej części CMS. Jeśli chcesz zalogować się jako ktoś inny, zrób to poniżej' + PERMDEFAULT: 'Proszę wybrać metodę identyfikacji i wpisać swoje dane, aby uruchomić CMSa.' + PLEASESAVE: 'Proszę Zapisz Stronę: Ta strona nie mogła zostać uaktualniona ponieważ nie została jeszcze zapisana.' + PreviewButton: Podgląd + REORGANISATIONSUCCESSFUL: 'Pomyślnie zreorganizowano drzewo serwisu.' + SAVEDUP: Zapisano. + VersionUnknown: nieznany LoginAttempt: Email: 'Adres E-mail' IP: 'Adres IP' Status: Status Member: - ADDGROUP: 'Add group' + ADDGROUP: 'Dodaj grupę' BUTTONCHANGEPASSWORD: 'Zmień hasło' BUTTONLOGIN: Zaloguj BUTTONLOGINOTHER: 'Zaloguj jako ktoś inny' @@ -308,8 +308,8 @@ pl: ERRORWRONGCRED: 'E-mail lub hasło są nieprawidłowe, Spróbuj ponownie' FIRSTNAME: Imię INTERFACELANG: 'Język interfejsu' - INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' - LOGGEDINAS: 'You''re logged in as {name}.' + INVALIDNEWPASSWORD: 'Nie możesz użyć takiego hasła: {password}' + LOGGEDINAS: 'Zostałeś zalogowany jako {name}.' NEWPASSWORD: 'Nowe hasło' PASSWORD: Hasło PLURALNAME: Członkowie @@ -320,8 +320,8 @@ pl: SUBJECTPASSWORDRESET: 'Twój link do zmiany hasła' SURNAME: Nazwisko VALIDATIONMEMBEREXISTS: 'Użytkownik z tym adresem już istnieje' - ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' - WELCOMEBACK: 'Welcome Back, {firstname}' + ValidationIdentifierFailed: 'Nie można nadpisać istniejącego członka #{id} identycznym identyfikatorem ({name} = {value})' + WELCOMEBACK: 'Witaj ponownie, {firstname}' YOUROLDPASSWORD: 'Twoje stare hasło' belongs_many_many_Groups: Grupy db_LastVisited: 'Data Ostatniej Wizyty' @@ -333,66 +333,66 @@ pl: MemberAuthenticator: TITLE: 'E-mail i Hasło' MemberDatetimeOptionsetField: - AMORPM: 'AM (Ante meridiem) or PM (Post meridiem)' - Custom: Custom - DATEFORMATBAD: 'Date format is invalid' - DAYNOLEADING: 'Day of month without leading zero' - DIGITSDECFRACTIONSECOND: 'One or more digits representing a decimal fraction of a second' - FOURDIGITYEAR: 'Four-digit year' - FULLNAMEMONTH: 'Full name of month (e.g. June)' - HOURNOLEADING: 'Hour without leading zero' - MINUTENOLEADING: 'Minute without leading zero' - MONTHNOLEADING: 'Month digit without leading zero' - Preview: Preview - SHORTMONTH: 'Short name of month (e.g. Jun)' - TOGGLEHELP: 'Toggle formatting help' - TWODIGITDAY: 'Two-digit day of month' - TWODIGITHOUR: 'Two digits of hour (00 through 23)' - TWODIGITMINUTE: 'Two digits of minute (00 through 59)' - TWODIGITMONTH: 'Two-digit month (01=January, etc.)' - TWODIGITSECOND: 'Two digits of second (00 through 59)' - TWODIGITYEAR: 'Two-digit year' + AMORPM: 'AM (przed południem) lub PM (po południu)' + Custom: Własny + DATEFORMATBAD: 'Nieprawidłowy format daty' + DAYNOLEADING: 'Dzień miesiąca bez wiodącego zera' + DIGITSDECFRACTIONSECOND: 'Jedna lub więcej cyfr reprezentujących ułamek sekundy' + FOURDIGITYEAR: 'Czterocyfrowy rok' + FULLNAMEMONTH: 'Pełna nazwa miesiąca (np. Czerwiec)' + HOURNOLEADING: 'Godzina bez wiodącego zera' + MINUTENOLEADING: 'Minuta bez wiodącego zera' + MONTHNOLEADING: 'Miesiąc bez wiodącego zera' + Preview: Podgląd + SHORTMONTH: 'Skrócona nazwa miesiąca (np. Cze)' + TOGGLEHELP: 'Przełącz pomoc formatowania' + TWODIGITDAY: 'Dwucyfrowy dzień miesiąca' + TWODIGITHOUR: 'Dwucyfrowa godzina (od 00 do 23)' + TWODIGITMINUTE: 'Dwucyfrowa minuta (od 00 do 59)' + TWODIGITMONTH: 'Dwucyfrowy miesiąc (01=Styczeń, itd.)' + TWODIGITSECOND: 'Dwucyfrowa sekunda (od 00 do 59)' + TWODIGITYEAR: 'Dwucyfrowy rok' MemberImportForm: - Help1: '

Import users in CSV format (comma-separated values). Show advanced usage

' - Help2: '

Advanced usage

  • Allowed columns: %s
  • Existing users are matched by their unique Code property, and updated with any new values from the imported file.
  • Groups can be assigned by the Groups column. Groups are identified by their Code property, multiple groups can be separated by comma. Existing group memberships are not cleared.
' - ResultCreated: 'Created {count} members' - ResultDeleted: 'Deleted %d members' - ResultNone: 'No changes' - ResultUpdated: 'Updated {count} members' + Help1: '

Zaimportuj użytkowników w formacie CSV (tekst rozdzielany przecinkami). Zaawansowane

' + Help2: "
\\n

Zaawansowane użycie

\\n
    \\n
  • Dozwolone kolumny: %s
  • \\n
  • Istniejący użytkownicy są dopasowani poprzez unikalną właściwość Kod i uaktualniani nowymi wartościami z zaimportowanego pliku.
  • \\n
  • Grupy mogą być przypisane poprzez kolumnę Grupy. Grupy identyfikowane są poprzez unikalną właściwość Kod, grupy mogą być oddzielone od siebie przecinkiem. Przypisania użytkowników do grup nie są usuwane.
  • \\n
\\n
" + ResultCreated: 'Stworzono członków: {count}' + ResultDeleted: 'Usunięto %d użytkowników' + ResultNone: 'Bez zmian' + ResultUpdated: 'Zaktualizowano członków: {count}' MemberTableField: null ModelAdmin: - DELETE: Delete - DELETEDRECORDS: 'Deleted {count} records.' - IMPORT: 'Import from CSV' - IMPORTEDRECORDS: 'Imported {count} records.' - NOCSVFILE: 'Please browse for a CSV file to import' - NOIMPORT: 'Nothing to import' - RESET: Reset - Title: 'Data Models' - UPDATEDRECORDS: 'Updated {count} records.' + DELETE: Usuń + DELETEDRECORDS: 'Usunięto rekordów: {count}' + IMPORT: 'Import z CSV' + IMPORTEDRECORDS: 'Zaimportowano rekordów: {count}' + NOCSVFILE: 'Wybierz plik CSV do zaimportowania' + NOIMPORT: 'Nie ma niczego do zaimportowania' + RESET: Zresetuj + Title: 'Modele danych' + UPDATEDRECORDS: 'Zaktualizowano {count} rekordów.' MoneyField: FIELDLABELAMOUNT: Ilość FIELDLABELCURRENCY: waluta NullableField: IsNullLabel: 'Jest Pusty' NumericField: - VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field' + VALIDATION: '''{value}'' nie jest liczbą, to pole przyjmuje tylko liczby' Permission: AdminGroup: Administrator - CMS_ACCESS_CATEGORY: 'CMS Access' + CMS_ACCESS_CATEGORY: 'Dostęp do CMSa' FULLADMINRIGHTS: 'Pełne prawa administracyjne' FULLADMINRIGHTS_HELP: 'Zatwierdza i nadpisuje wszystkie istniejące uprawnienia' - IMPORTSPECFIELDS: 'Database columns' - IMPORTSPECRELATIONS: Relations + IMPORTSPECFIELDS: 'Kolumny bazy danych' + IMPORTSPECRELATIONS: Relacje PermissionCheckboxSetField: - AssignedTo: 'assigned to "{title}"' - FromGroup: 'inherited from group "{title}"' - FromRole: 'inherited from role "{title}"' + AssignedTo: 'przypisany do "{title}"' + FromGroup: 'odziedziczone z grupy "{title}"' + FromRole: 'odziedziczone z roli "{title}"' FromRoleOnGroup: 'odziedziczone z roli "%s" w grupie "%s"' Permissions: PERMISSIONS_CATEGORY: 'Uprawnienia ról i dostępu' PhoneNumberField: - Back: Back + Back: Wstecz VALIDATION: 'Wprowadź poprawny numer telefonu' Security: ALREADYLOGGEDIN: 'Nie masz dostępu do tej strony. Jeśli posiadasz inne konto, które umożliwi Ci dostęp do tej strony, możesz się zalogować poniżej' @@ -404,10 +404,10 @@ pl: LOGGEDOUT: 'Zostałeś wylogowany. Jeśli chcesz się zalogować ponownie wpisz dane poniżej' LOGIN: Logowanie NOTEPAGESECURED: 'Ta strona jest zabezpieczona. Wpisz swoje dane a my wyślemy Ci potwierdzenie niebawem' - NOTERESETLINKINVALID: '

The password reset link is invalid or expired.

You can request a new one here or change your password after you logged in.

' + NOTERESETLINKINVALID: '

Link resetujący hasło wygasł lub jest nieprawidłowy.

Możesz poprosić o nowy tutaj lub zmień swoje hasło po zalogowaniu się.

' NOTERESETPASSWORD: 'Wpisz adres e-mail, na który mamy wysłać link gdzie możesz zresetować swoje hasło' - PASSWORDSENTHEADER: 'Password reset link sent to ''{email}''' - PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' + PASSWORDSENTHEADER: 'Link resetujący hasła został wysłany do ''{email}''' + PASSWORDSENTTEXT: 'Dziękujemy! Link resetujący hasło został wysłany do ''{email}'', o ile konto użytkownika dla takiego e-maila istnieje.' SecurityAdmin: ACCESS_HELP: 'Pozwala na przeglądanie, dodawanie i edycję użytkowników, jak również przypisywanie im uprawnień i ról.' APPLY_ROLES: 'Zatwierdź role dla grup' @@ -418,7 +418,7 @@ pl: IMPORTGROUPS: 'Importuj grupy' IMPORTUSERS: 'Importuj użytkowników' MEMBERS: Użytkownicy - MENUTITLE: Security + MENUTITLE: Bezpieczeństwo MemberListCaution: 'Uwaga: Usunięcie użytkowników z tej listy spowoduje również usunięcie ich ze wszystkich grup oraz z bazy danych' NEWGROUP: 'Nowa grupa' PERMISSIONS: Zezwolenia @@ -427,11 +427,11 @@ pl: TABROLES: Role Users: Użytkownicy SecurityAdmin_MemberImportForm: - BtnImport: 'Import from CSV' - FileFieldLabel: 'CSV File (Allowed extensions: *.csv)' + BtnImport: 'Import z CSV' + FileFieldLabel: 'Plik CSV (Dozwolone rozszerzenia: *.csv)' SilverStripeNavigator: - Edit: Edit - FILTER: Filter + Edit: Edycja + FILTER: Filtr IMPORT: Import VIEWFIRST: 'Zobacz pierwsze' VIEWLAST: 'Zobacz ostatnie' @@ -443,7 +443,7 @@ pl: TABMAIN: Główny TableField: ADDITEM: 'Dodaj %s' - ISREQUIRED: 'In %s ''%s'' is required' + ISREQUIRED: 'W %s ''%s'' jest wymagany' SORTASC: 'Sortuj w porządku rosnącym' SORTDESC: 'Sortuj w porządku malejącym' TableListField: @@ -452,7 +452,7 @@ pl: Print: Drukuj SELECT: 'Wybierz:' TimeField: - VALIDATEFORMAT: 'Please enter a valid time format ({format})' + VALIDATEFORMAT: 'Proszę wprowadź prawidłowy format czasu ({format})' ToggleField: LESS: mniej MORE: więcej @@ -464,14 +464,14 @@ pl: DOEDIT: Zapisz DROPFILE: 'upuść plik' DROPFILES: 'upuść pliki' - Dimensions: Dimensions + Dimensions: Rozmiar EDITINFO: 'Edytuj plik' FIELDNOTSET: 'Nie znaleziono informacji o pliku' FROMCOMPUTER: 'Z komputera' FROMFILES: 'Z plików' - MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' - MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' - REMOVE: Remove + MAXNUMBEROFFILES: 'Osiągnięto maksymalną liczbę {count} plików.' + MAXNUMBEROFFILESSHORT: 'Można wgrać tylko {count} plik(ów/i)' + REMOVE: Usuń REMOVEERROR: 'Błąd podczas usuwania pliku' REMOVEINFO: 'Usuń pliki z tego miejsca, ale nie usuwaj ich z magazynu' STARTALL: 'Rozpocznij wszystko' diff --git a/lang/ro.yml b/lang/ro.yml index 78ea6c0a2..7b3481e39 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -13,7 +13,7 @@ ro: TYPE: 'File type' URL: URL AssetUploadField: - ChooseFiles: 'Choose files' + ChooseFiles: 'Alegeti fisierele' DRAGFILESHERE: 'Drag files here' DROPAREA: 'Drop Area' EDITALL: 'Edit all' @@ -31,8 +31,8 @@ ro: CODE: 'Code Block' CODEDESCRIPTION: 'Unformatted code block' CODEEXAMPLE: 'Code block' - COLORED: 'Colored text' - COLOREDEXAMPLE: 'blue text' + COLORED: 'Text colorat' + COLOREDEXAMPLE: 'Text albastru' EMAILLINK: 'Email link' EMAILLINKDESCRIPTION: 'Create link to an email address' IMAGE: Image @@ -44,13 +44,13 @@ ro: STRUCK: 'Struck-out Text' STRUCKEXAMPLE: Struck-out UNDERLINE: 'Underlined Text' - UNDERLINEEXAMPLE: Underlined + UNDERLINEEXAMPLE: Subliniat UNORDERED: 'Unordered list' UNORDEREDDESCRIPTION: 'Unordered list' UNORDEREDEXAMPLE1: 'unordered item 1' BasicAuth: ENTERINFO: 'Va rugam introduceţi un user si o parolă.' - ERRORNOTADMIN: 'That user is not an administrator.' + ERRORNOTADMIN: 'Acest utilizator nu este un administrator.' ERRORNOTREC: 'That username / password isn''t recognised' Boolean: ANY: Any @@ -77,10 +77,10 @@ ro: MAXIMUM: 'Passwords must be at most {max} characters long.' SHOWONCLICKTITLE: 'Schimba Parola' CreditCardField: - FIRST: first - FOURTH: fourth - SECOND: second - THIRD: third + FIRST: primul + FOURTH: 'al patrulea' + SECOND: 'al doilea' + THIRD: 'al treilea' CurrencyField: CURRENCYSYMBOL: $ DataObject: @@ -103,12 +103,12 @@ ro: YEARS: ani DateField: NOTSET: 'not set' - TODAY: today + TODAY: astazi VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' Director: - ADD: Add + ADD: Adauga INVALID_REQUEST: 'Invalid request' DropdownField: CHOOSE: (Alege) @@ -118,7 +118,7 @@ ro: PLURALNAME: 'Email Bounce Records' SINGULARNAME: 'Email Bounce Record' Enum: - ANY: Any + ANY: Oricare LOADING: Loading... File: Content: Content @@ -166,23 +166,23 @@ ro: UnlinkRelation: Unlink GridField: Add: 'Add {name}' - Filter: Filter + Filter: Filtru FilterBy: 'Filter by ' - Find: Find + Find: Gaseste LEVELUP: 'Level up' LinkExisting: 'Link Existing' NewRecord: 'New %s' NoItemsFound: 'No items found' - PRINTEDAT: 'Printed at' - PRINTEDBY: 'Printed by' + PRINTEDAT: 'Imprimat la' + PRINTEDBY: 'Imprimat de' PlaceHolder: 'Find {type}' PlaceHolderWithLabels: 'Find {type} by {name}' RelationSearch: 'Relation search' - ResetFilter: Reset + ResetFilter: Reseteaza GridFieldAction_Delete: DeletePermissionsFailure: 'No delete permissions' - NEXT: Next - PREVIOUS: Previous + NEXT: Urmatorul + PREVIOUS: Anteriorul GridFieldDetailForm: Create: Create Delete: Delete @@ -192,25 +192,25 @@ ro: Save: Save Saved: 'Saved %s %s' TEXT1: 'Here is your' - TEXT2: 'password reset link' - TEXT3: for + TEXT2: 'link de resetare a parolei' + TEXT3: pentru Group: AddRole: 'Add a role for this group' CHANGEPASSWORDTEXT1: 'Ti-ai schimbat parola in' CHANGEPASSWORDTEXT2: 'You can now use the following credentials to log in:' Code: 'Cod Grup' - DefaultGroupTitleAdministrators: Administrators + DefaultGroupTitleAdministrators: Administratori DefaultGroupTitleContentAuthors: 'Content Authors' - Description: Description + Description: Descriere EMAIL: Email GroupReminder: 'If you choose a parent group, this group will take all it''s roles' HELLO: Salut Locked: 'Blocat?' NoRoles: 'No roles found' - PASSWORD: Password + PASSWORD: Parola Parent: 'Grup de Baza' RolesAddEditLink: 'Manage roles' - Sort: 'Sort Order' + Sort: 'Ordine de sortare' TITLE: 'Image Uploading Iframe' has_many_Permissions: Permisiuni many_many_Members: Membri @@ -268,8 +268,8 @@ ro: URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' UpdateMEDIA: 'Update Media' ImageField: - IMAGE: Image - Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Apply Filter" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' + IMAGE: Imagine + Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Aplica filtru" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Add a new row' CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' @@ -287,7 +287,7 @@ ro: VersionUnknown: unknown LoginAttempt: Email: 'Email Address' - IP: 'IP Address' + IP: 'Adresa IP' Status: Status Member: ADDGROUP: 'Add group' @@ -295,40 +295,40 @@ ro: BUTTONLOGIN: Autentificare BUTTONLOGINOTHER: 'Log in as someone else' BUTTONLOSTPASSWORD: 'Am uitat parola' - CONFIRMNEWPASSWORD: 'Confirm New Password' - CONFIRMPASSWORD: 'Confirm Password' - DefaultAdminFirstname: 'Default Admin' - DefaultDateTime: default + CONFIRMNEWPASSWORD: 'Confirmati noua parola' + CONFIRMPASSWORD: 'Confirmati parola' + DefaultAdminFirstname: 'Administrator implicit' + DefaultDateTime: implicit EMAIL: Email EMPTYNEWPASSWORD: 'The new password can''t be empty, please try again' - ENTEREMAIL: 'Please enter an email address to get a password reset link.' + ENTEREMAIL: 'Va rog introduceti o adresa de email pentru a obtine un link de resetare a parolei' ERRORLOCKEDOUT: 'Your account has been temporarily disabled because of too many failed attempts at logging in. Please try again in 20 minutes.' ERRORNEWPASSWORD: 'You have entered your new password differently, try again' ERRORPASSWORDNOTMATCH: 'Your current password does not match, please try again' ERRORWRONGCRED: 'That doesn''t seem to be the right e-mail address or password. Please try again.' - FIRSTNAME: 'First Name' + FIRSTNAME: Prenume INTERFACELANG: 'Limba interfetei' INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' LOGGEDINAS: 'You''re logged in as {name}.' - NEWPASSWORD: 'New Password' - PASSWORD: Password + NEWPASSWORD: 'Noua parola' + PASSWORD: Parola PLURALNAME: Membri PROFILESAVESUCCESS: 'Successfully saved.' - REMEMBERME: 'Remember me next time?' + REMEMBERME: 'Tine-ma minte?' SINGULARNAME: Membru SUBJECTPASSWORDCHANGED: 'Parola dumneavoastra a fost schimbata' SUBJECTPASSWORDRESET: 'Link-ul de resetare a parolei' - SURNAME: Surname + SURNAME: Nume VALIDATIONMEMBEREXISTS: 'A member already exists with the same %s' ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' WELCOMEBACK: 'Welcome Back, {firstname}' - YOUROLDPASSWORD: 'Your old password' + YOUROLDPASSWORD: 'Vechea parola' belongs_many_many_Groups: Grupuri - db_LastVisited: 'Last Visited Date' + db_LastVisited: 'Data ultimei vizite' db_Locale: 'Interface Locale' - db_LockedOutUntil: 'Blocat pana cand' - db_NumVisit: 'Number of Visits' - db_Password: Password + db_LockedOutUntil: 'Blocat pana la' + db_NumVisit: 'Numarul de vizite' + db_Password: Parola db_PasswordExpiry: 'Data de Expirare a Parolei' MemberAuthenticator: TITLE: 'E-mail si Parolă' @@ -414,18 +414,18 @@ ro: APPLY_ROLES_HELP: 'Ability to edit the roles assigned to a group. Requires the "Access to ''Users'' section" permission.' EDITPERMISSIONS: 'Manage permissions for groups' EDITPERMISSIONS_HELP: 'Ability to edit Permissions and IP Addresses for a group. Requires the "Access to ''Security'' section" permission.' - GROUPNAME: 'Group name' - IMPORTGROUPS: 'Import groups' - IMPORTUSERS: 'Import users' - MEMBERS: Members + GROUPNAME: 'Numele grupului' + IMPORTGROUPS: 'Importati grupuri' + IMPORTUSERS: 'Importa utilizatori' + MEMBERS: Membri MENUTITLE: Security MemberListCaution: 'Caution: Removing members from this list will remove them from all groups and the database' - NEWGROUP: 'New Group' + NEWGROUP: 'Grup nou' PERMISSIONS: Permissions ROLES: Roles ROLESDESCRIPTION: 'Roles are predefined sets of permissions, and can be assigned to groups.
They are inherited from parent groups if required.' TABROLES: Roles - Users: Users + Users: Utilizatori SecurityAdmin_MemberImportForm: BtnImport: 'Import from CSV' FileFieldLabel: 'CSV File (Allowed extensions: *.csv)' @@ -433,12 +433,12 @@ ro: Edit: Edit FILTER: Filter IMPORT: Import - VIEWFIRST: 'View first' - VIEWLAST: 'View last' - VIEWNEXT: 'View next' - VIEWPREVIOUS: 'View previous' + VIEWFIRST: 'Vezi primul' + VIEWLAST: 'Vezi ultimul' + VIEWNEXT: 'Vezi urmator' + VIEWPREVIOUS: 'Vezi anterior' SimpleImageField: - NOUPLOAD: 'No Image Uploaded' + NOUPLOAD: 'Nici o imagine incarcata' SiteTree: TABMAIN: Pincipal TableField: @@ -447,27 +447,27 @@ ro: SORTASC: 'Sort in ascending order' SORTDESC: 'Sort in descending order' TableListField: - CSVEXPORT: 'Export to CSV' - PRINT: Print - Print: Print - SELECT: 'Select:' + CSVEXPORT: 'Exportati ca CSV' + PRINT: Imprima + Print: Imprima + SELECT: Selecteaza TimeField: VALIDATEFORMAT: 'Please enter a valid time format ({format})' ToggleField: LESS: 'mai puţin ' MORE: 'mai mult' UploadField: - ATTACHFILE: 'Attach a file' + ATTACHFILE: 'Atasati un fisier' ATTACHFILES: 'Attach files' - AttachFile: 'Attach a file' + AttachFile: 'Atasati un fisier' DELETEINFO: 'Permanently delete this file from the file store' - DOEDIT: Save + DOEDIT: Salveaza DROPFILE: 'drop a file' DROPFILES: 'drop files' Dimensions: Dimensions - EDITINFO: 'Edit this file' + EDITINFO: 'Editeaza acest fisier' FIELDNOTSET: 'File information not found' - FROMCOMPUTER: 'From your computer' + FROMCOMPUTER: 'Din calculatorul dumneavoastra' FROMFILES: 'From files' MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' @@ -475,6 +475,6 @@ ro: REMOVEERROR: 'Error removing file' REMOVEINFO: 'Remove this file from here, but do not delete it from the file store' STARTALL: 'Start all' - Saved: Saved + Saved: Salvat Versioned: has_many_Versions: Versiune diff --git a/lang/ru.yml b/lang/ru.yml index c1b0ee356..0689c320a 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -3,12 +3,12 @@ ru: NEWFOLDER: 'Новая папка' AssetTableField: CREATED: 'Первая загрузка' - DIM: 'Размеры' + DIM: Размеры FILENAME: 'Имя файла' FOLDER: Folder LASTEDIT: 'Последнее изменение' OWNER: Владелец - SIZE: 'Размер' + SIZE: Размер TITLE: Название TYPE: Тип URL: URL @@ -61,7 +61,7 @@ ru: ACCESS: 'Access to ''{title}'' section' ACCESSALLINTERFACES: 'Доступ ко всему интерфейсу CMS' ACCESSALLINTERFACESHELP: 'Overrules more specific access settings.' - SAVE: 'Сохранить' + SAVE: Сохранить CMSProfileController: MENUTITLE: CMSProfileController CheckboxField: @@ -247,7 +247,7 @@ ru: IMAGEALT: 'Alternative text (alt)' IMAGEALTTEXT: 'Alternative text (alt) - shown if image cannot be displayed' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' - IMAGEDIMENSIONS: 'Размеры' + IMAGEDIMENSIONS: Размеры IMAGEHEIGHTPX: Высота IMAGETITLE: 'Title text (tooltip) - for additional information about the image' IMAGETITLETEXT: 'Title text (tooltip)' @@ -402,7 +402,7 @@ ru: ENTERNEWPASSWORD: 'Пожалуйста, введите новый пароль.' ERRORPASSWORDPERMISSION: 'Вы должны войти в систему, чтобы изменить Ваш пароль!' LOGGEDOUT: 'Вы вышли. Если Вы хотите войти снова, введите ваши учетные данные ниже.' - LOGIN: 'Вход' + LOGIN: Вход NOTEPAGESECURED: 'Эта страница защищена. Пожалуйста, введите свои учетные данные для входа.' NOTERESETLINKINVALID: '

The password reset link is invalid or expired.

You can request a new one here or change your password after you logged in.

' NOTERESETPASSWORD: 'Введите Ваш адрес email, и Вам будет отправлена ссылка, по которой Вы сможете переустановить свой пароль' diff --git a/lang/si.yml b/lang/si.yml index 5efe9bd83..9efd142be 100644 --- a/lang/si.yml +++ b/lang/si.yml @@ -77,7 +77,7 @@ si: MAXIMUM: 'Passwords must be at most {max} characters long.' SHOWONCLICKTITLE: 'මුර පදය වෙනස් කිරීම' CreditCardField: - FIRST: 'පළමු' + FIRST: පළමු FOURTH: fourth SECOND: දෙවන THIRD: third @@ -99,8 +99,8 @@ si: SECS: 'තත්පර ' TIMEDIFFAGO: '{difference} ago' TIMEDIFFIN: 'in {difference}' - YEAR: 'අවුරුද්ද' - YEARS: 'අවුරුදු' + YEAR: අවුරුද්ද + YEARS: අවුරුදු DateField: NOTSET: 'not set' TODAY: today @@ -212,7 +212,7 @@ si: RolesAddEditLink: 'Manage roles' Sort: 'Sort Order' TITLE: 'පිංතූර අප්ලෝඩ් කරන Iframe ඵක' - has_many_Permissions: 'අවසර' + has_many_Permissions: අවසර many_many_Members: සාමාජිකයින් GroupImportForm: Help1: '

Import one or more groups in CSV format (comma-separated values). Show advanced usage

' @@ -454,7 +454,7 @@ si: TimeField: VALIDATEFORMAT: 'Please enter a valid time format ({format})' ToggleField: - LESS: 'අඩු' + LESS: අඩු MORE: වැඩි UploadField: ATTACHFILE: 'Attach a file' diff --git a/lang/sk.yml b/lang/sk.yml index d6a3a4160..1b060e41c 100644 --- a/lang/sk.yml +++ b/lang/sk.yml @@ -252,7 +252,7 @@ sk: IMAGETITLE: 'Text titulky (tooltip) - pre doplňujúce informácie o obrázku' IMAGETITLETEXT: 'Title text (tooltip)' IMAGETITLETEXTDESC: 'For additional information about the image' - IMAGEWIDTHPX: 'Šírka' + IMAGEWIDTHPX: Šírka INSERTMEDIA: 'Insert Media' LINK: 'Vložiť/upraviť odkaz na zvýraznený text' LINKANCHOR: 'Odkaz na tejto stranke' diff --git a/lang/sl.yml b/lang/sl.yml index bb1d198b7..4f052559c 100644 --- a/lang/sl.yml +++ b/lang/sl.yml @@ -252,7 +252,7 @@ sl: IMAGETITLE: 'Naslov (tooltip) bo izpisan kot dopolnitev k vsebini slike' IMAGETITLETEXT: 'Title text (tooltip)' IMAGETITLETEXTDESC: 'For additional information about the image' - IMAGEWIDTHPX: 'Širina' + IMAGEWIDTHPX: Širina INSERTMEDIA: 'Insert Media' LINK: Povezava LINKANCHOR: 'Sidro na tej strani' diff --git a/lang/sr.yml b/lang/sr.yml index 10a091cf5..c6252b4a5 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -182,7 +182,7 @@ sr: GridFieldAction_Delete: DeletePermissionsFailure: 'No delete permissions' NEXT: Следеће - PREVIOUS: 'Претходно' + PREVIOUS: Претходно GridFieldDetailForm: Create: Create Delete: Delete diff --git a/lang/sv.yml b/lang/sv.yml index 8d0fdfa78..007617f51 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -16,12 +16,12 @@ sv: ChooseFiles: 'Välj filer' DRAGFILESHERE: 'Dra filer hit' DROPAREA: 'Släpp här' - EDITALL: 'Edit all' + EDITALL: 'Redigera alla' EDITANDORGANIZE: 'Redigera och organisera' - FILES: Files - TOTAL: Total - TOUPLOAD: 'Choose file(s) to upload...' - UPLOADINPROGRESS: 'Please wait… upload in progress' + FILES: Filer + TOTAL: Totalt + TOUPLOAD: 'Välj fil(er) att ladda upp...' + UPLOADINPROGRESS: 'Var god dröj... uppladdning pågår' UPLOADOR: ELLER BBCodeParser: ALIGNEMENT: Justering @@ -55,7 +55,7 @@ sv: Boolean: ANY: 'Vilken som helst' 0: Falskt - LOGOUT: 'Log out' + LOGOUT: 'Logga ut' 1: Sant CMSMain: ACCESS: 'Access to ''{title}'' section' @@ -69,7 +69,7 @@ sv: - Sant ComplexTableField: CLOSEPOPUP: 'Stäng popup' - SUCCESSADD2: 'Added {name}' + SUCCESSADD2: 'Lade till {name}' SUCCESSEDIT: 'Sparade %s %s %s' ConfirmedPasswordField: ATLEAST: 'Passwords must be at least {min} characters long.' @@ -97,29 +97,29 @@ sv: MONTHS: 'månader ' SEC: sek SECS: sekunder - TIMEDIFFAGO: '{difference} ago' - TIMEDIFFIN: 'in {difference}' + TIMEDIFFAGO: '{difference} sen' + TIMEDIFFIN: 'om {difference}' YEAR: år YEARS: år DateField: NOTSET: 'inte angivet' TODAY: 'i dag' - VALIDDATEFORMAT2: 'Please enter a valid date format ({format})' - VALIDDATEMAXDATE: 'Your date has to be older or matching the maximum allowed date ({date})' - VALIDDATEMINDATE: 'Your date has to be newer or matching the minimum allowed date ({date})' + VALIDDATEFORMAT2: 'Var god att ange datumet i ett giltigt format ({format})' + VALIDDATEMAXDATE: 'Angivet datum måste vara tidigare eller samma som det senaste godkända datumet ({date})' + VALIDDATEMINDATE: 'Angivet datum måste vara senare eller samma som det tidigaste godkända datumet ({date})' Director: ADD: 'Lägg till' - INVALID_REQUEST: 'Invalid request' + INVALID_REQUEST: 'Ogiltig förfrågan' DropdownField: CHOOSE: (Välj) EmailField: - VALIDATION: 'Please enter an email address' + VALIDATION: 'Var snäll och ange en epostadress' Email_BounceRecord: PLURALNAME: 'Studsade e-brev' SINGULARNAME: 'Studsade e-brev' Enum: ANY: 'Vilken som helst' - LOADING: Loading... + LOADING: Laddar... File: Content: Innehåll Filename: Filnamn @@ -131,22 +131,22 @@ sv: PLURALNAME: Filer SINGULARNAME: Fil TOOLARGE: 'Filesize is too large, maximum {size} allowed' - TOOLARGESHORT: 'Filesize exceeds {size}' + TOOLARGESHORT: 'Filstorlek överskriden {size}' Title: Titel FileIFrameField: - ATTACH: 'Attach {type}' + ATTACH: 'Bifoga {type}' ATTACHONCESAVED: '{type}s can be attached once you have saved the record for the first time.' ATTACHONCESAVED2: 'Files can be attached once you have saved the record for the first time.' - DELETE: 'Delete {type}' + DELETE: 'Radera {type}' DISALLOWEDFILETYPE: 'Filtypen är inte tillåten för uppladdning' FILE: Fil FROMCOMPUTER: 'Från din dator' FROMFILESTORE: 'Från filarkivet' NOSOURCE: 'Välj filen du vill bifoga' - REPLACE: 'Replace {type}' + REPLACE: 'Ersätt {type}' Filesystem: - IMPORT_TAB_HEADER: Import - SEARCHLISTINGS: Search + IMPORT_TAB_HEADER: Importera + SEARCHLISTINGS: Sök SYNCRESULTS: 'Sync complete: {createdcount} items created, {deletedcount} items deleted' Form: FIELDISREQUIRED: '%s är obligatorisk' @@ -165,18 +165,18 @@ sv: Delete: Radera UnlinkRelation: Avlänka GridField: - Add: 'Add {name}' + Add: 'Lägg till {name}' Filter: Filtrera - FilterBy: 'Filter by ' + FilterBy: 'Filtrera på' Find: Hitta - LEVELUP: 'Level up' + LEVELUP: 'Upp en nivå' LinkExisting: 'Länk finns' NewRecord: 'Ny %s' NoItemsFound: 'Inget hittades' PRINTEDAT: Utskrivet PRINTEDBY: 'Utskrivet av' - PlaceHolder: 'Find {type}' - PlaceHolderWithLabels: 'Find {type} by {name}' + PlaceHolder: 'Hitta {type}' + PlaceHolderWithLabels: 'Hitta {type} efter {name}' RelationSearch: Relationssökning ResetFilter: Rensa GridFieldAction_Delete: @@ -184,13 +184,13 @@ sv: NEXT: Nästa PREVIOUS: Föregående GridFieldDetailForm: - Create: Create - Delete: Delete - DeletePermissionsFailure: 'No delete permissions' - Deleted: 'Deleted %s %s' + Create: Skapa + Delete: Radera + DeletePermissionsFailure: 'Rättighet för att radera saknas' + Deleted: 'Raderade %s %s' HELLO: Hej - Save: Save - Saved: 'Saved %s %s' + Save: Spara + Saved: 'Sparade %s %s' TEXT1: 'Här är din' TEXT2: 'Återställningslänk för lösenord' TEXT3: för @@ -223,13 +223,13 @@ sv: Hierarchy: InfiniteLoopNotAllowed: 'Infinite loop found within the "{type}" hierarchy. Please change the parent to resolve this' HtmlEditorField: - ADDURL: 'Add URL' + ADDURL: 'Lägg till URL' ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' ANCHORVALUE: Ankare BUTTONINSERT: Infoga BUTTONINSERTLINK: 'Infoga länk' BUTTONREMOVELINK: 'Ta bort länk' - BUTTONUpdate: Update + BUTTONUpdate: Uppdatera CAPTIONTEXT: Rubriktext CSSCLASS: 'Placering / stil' CSSCLASSCENTER: 'Centrerad, för sig själv' @@ -242,9 +242,9 @@ sv: FOLDER: Mapp FROMCMS: 'Från CMSet' FROMCOMPUTER: 'Från din dator' - FROMWEB: 'From the web' - FindInFolder: 'Find in Folder' - IMAGEALT: 'Alternative text (alt)' + FROMWEB: 'Från webben' + FindInFolder: 'Hitta i mapp' + IMAGEALT: 'Alternativ text (alt)' IMAGEALTTEXT: 'Alternativ text (alt) - visas om bilden inte kan visas' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' IMAGEDIMENSIONS: Dimensioner @@ -266,31 +266,31 @@ sv: PAGE: Sida URL: URL URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' - UpdateMEDIA: 'Update Media' + UpdateMEDIA: 'Uppdatera media' ImageField: IMAGE: Bild Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Använd filter" GridFieldItemEditView.ss: Go back: "Gå tillbaka" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: 'Lägg till ny rad' CANT_REORGANISE: 'You do not have permission to alter Top level pages. Your change was not saved.' - DELETED: Deleted. - DropdownBatchActionsDefault: 'Åtgärder' + DELETED: Raderad + DropdownBatchActionsDefault: Åtgärder HELP: Hjälp PAGETYPE: Sidtyp PERMAGAIN: 'Du har blivit utloggad. Om du vill logga in igen anger du dina uppgifter nedan.' PERMALREADY: 'Tyvärr så har du inte tillträde till den delen av CMSet. Om du vill logga in med en annan användare kan du göra det nedan' PERMDEFAULT: 'Var god välj en inloggningsmetod och fyll i dina uppgifter för att logga in i CMSet.' PLEASESAVE: 'Var god spara sidan. Den kan inte uppdateras för att den har inte sparats ännu.' - PreviewButton: Preview + PreviewButton: Förhandsgranska REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' - SAVEDUP: Saved. + SAVEDUP: Sparad. VersionUnknown: okänd LoginAttempt: Email: E-postadress IP: IP-adress Status: Status Member: - ADDGROUP: 'Add group' + ADDGROUP: 'Lägg till grupp' BUTTONCHANGEPASSWORD: 'Ändra lösenord' BUTTONLOGIN: 'Logga in' BUTTONLOGINOTHER: 'Logga in som annan användare' @@ -308,8 +308,8 @@ sv: ERRORWRONGCRED: 'Antingen e-postadressen eller lösenordet är fel. Försök igen.' FIRSTNAME: Förnamn INTERFACELANG: Gränssnittsspråk - INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' - LOGGEDINAS: 'You''re logged in as {name}.' + INVALIDNEWPASSWORD: 'Vi kunde inte godkänna det lösenordet: {password}' + LOGGEDINAS: 'Du är inloggad som {name}.' NEWPASSWORD: 'Nytt lösenord' PASSWORD: Lösenord PLURALNAME: Medlemmar @@ -320,8 +320,8 @@ sv: SUBJECTPASSWORDRESET: 'Din återställningslänk' SURNAME: Efternamn VALIDATIONMEMBEREXISTS: 'Det finns redan en medlem med samma %s' - ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' - WELCOMEBACK: 'Welcome Back, {firstname}' + ValidationIdentifierFailed: 'Kan inte skriva över medlem #{id} med samma identifierare ({name} = {value}))' + WELCOMEBACK: 'Välkommen tillbaka, {firstname}' YOUROLDPASSWORD: 'Ditt gamla lösenord' belongs_many_many_Groups: Grupper db_LastVisited: 'Datum för senaste besöket' @@ -376,23 +376,23 @@ sv: NullableField: IsNullLabel: 'Är NULL' NumericField: - VALIDATION: '''{value}'' is not a number, only numbers can be accepted for this field' + VALIDATION: '''{value}'' är inget nummer, bara nummer kan accepteras för det här fältet' Permission: AdminGroup: Administratör CMS_ACCESS_CATEGORY: CMS-tillgång FULLADMINRIGHTS: 'Fulla administrativa rättigheter' FULLADMINRIGHTS_HELP: 'Implicerar och gäller över alla andra tillskrivna rättigheter.' IMPORTSPECFIELDS: 'Database columns' - IMPORTSPECRELATIONS: Relations + IMPORTSPECRELATIONS: Relationer PermissionCheckboxSetField: - AssignedTo: 'assigned to "{title}"' - FromGroup: 'inherited from group "{title}"' - FromRole: 'inherited from role "{title}"' + AssignedTo: 'tilldelad till "{title}"' + FromGroup: 'ärvde från grupp "{title}"' + FromRole: 'ärvde från roll "{title}"' FromRoleOnGroup: 'ärvt från roll "%s" i grupp "%s"' Permissions: PERMISSIONS_CATEGORY: 'Roller och tillgångsinställningar' PhoneNumberField: - Back: Back + Back: Tillbaka VALIDATION: 'Var god ange ett giltigt telefonnummer' Security: ALREADYLOGGEDIN: 'Du har inte tillträde till den här sidan. Om du har ett annat konto som har rätt behörighet kan du logga in igen nedan.' @@ -418,7 +418,7 @@ sv: IMPORTGROUPS: 'Importera grupper' IMPORTUSERS: 'Importera användare' MEMBERS: Medlemmar - MENUTITLE: Security + MENUTITLE: Säkerhet MemberListCaution: 'Varning: Att radera medlemmar från den här listan kommer också att radera dem från alla grupper och från databasen helt och hållet' NEWGROUP: 'Ny grupp' PERMISSIONS: Tillstånd @@ -430,9 +430,9 @@ sv: BtnImport: 'Importera från CSV' FileFieldLabel: 'CSV-fil (Tillåtna filtyper: *.csv)' SilverStripeNavigator: - Edit: Edit - FILTER: Filter - IMPORT: Import + Edit: Ändra + FILTER: 'Filtrera på' + IMPORT: Importera VIEWFIRST: 'Visa första' VIEWLAST: 'Visa sista' VIEWNEXT: 'Visa nästa' @@ -452,7 +452,7 @@ sv: Print: 'Skriv ut' SELECT: 'Välj:' TimeField: - VALIDATEFORMAT: 'Please enter a valid time format ({format})' + VALIDATEFORMAT: 'Var god att ange tid i ett giltigt format ({format})' ToggleField: LESS: mindre MORE: mer @@ -464,14 +464,14 @@ sv: DOEDIT: Spara DROPFILE: 'Släpp en fil' DROPFILES: 'släpp filer' - Dimensions: Dimensions + Dimensions: Dimensioner EDITINFO: 'Redigera filen' FIELDNOTSET: 'Hittade ingen filinformation' FROMCOMPUTER: 'Från din dator' FROMFILES: 'Från filer' - MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' - MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' - REMOVE: Remove + MAXNUMBEROFFILES: 'Max antal ({count}) filer överstiget.' + MAXNUMBEROFFILESSHORT: 'Kan bara ladda upp {count} files' + REMOVE: 'Ta bort' REMOVEERROR: 'Fel när filen skulle tas bort' REMOVEINFO: 'Ta bort filen härifrån, men radera den inte från filarkivet' STARTALL: 'Starta alla' diff --git a/lang/th.yml b/lang/th.yml index c9dec23e2..aeaf18749 100644 --- a/lang/th.yml +++ b/lang/th.yml @@ -35,8 +35,8 @@ th: COLOREDEXAMPLE: 'blue text' EMAILLINK: 'Email link' EMAILLINKDESCRIPTION: สร้างลิงค์ให้กับที่อยู่อีเมล์ - IMAGE: 'รูปภาพ' - IMAGEDESCRIPTION: 'แสดงรูปภาพในหน้าบทความของคุณ' + IMAGE: รูปภาพ + IMAGEDESCRIPTION: แสดงรูปภาพในหน้าบทความของคุณ ITALIC: 'Italic Text' ITALICEXAMPLE: Italics LINK: 'Website link' @@ -230,7 +230,7 @@ th: BUTTONINSERTLINK: แทรกลิงค์ BUTTONREMOVELINK: ลบลิงค์ BUTTONUpdate: Update - CAPTIONTEXT: 'ข้อความคำอธิบายใต้ภาพ' + CAPTIONTEXT: ข้อความคำอธิบายใต้ภาพ CSSCLASS: 'การจัดวาง / รูปแบบ' CSSCLASSCENTER: 'Centered, on its own.' CSSCLASSLEFT: 'On the left, with text wrapping around.' @@ -268,7 +268,7 @@ th: URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' UpdateMEDIA: 'Update Media' ImageField: - IMAGE: 'รูปภาพ' + IMAGE: รูปภาพ Image_iframe.ss: 'ChangePasswordEmail.ss: BackLink_Button.ss: CMSLoadingScreen.ss: RelationComplexTableField.ss: ForgotPasswordEmail.ss: APPLY FILTER: "Apply Filter" GridFieldItemEditView.ss: Go back: "Go back" ModelSidebar.ss: TableListField_PageControls.ss: ModelAdmin_Tools.ss: ComplexTableField_popup.ss: TableField.ss: FileIFrameField_iframe.ss: ComplexTableField.ss: TableListField.ss: ModelAdmin_ImportSpec.ss: LeftAndMain_Menu.ss:' LeftAndMain: ADD: เพิ่มแถวใหม่ @@ -307,7 +307,7 @@ th: ERRORPASSWORDNOTMATCH: 'Your current password does not match, please try again' ERRORWRONGCRED: 'That doesn''t seem to be the right e-mail address or password. Please try again.' FIRSTNAME: ชื่อจริง - INTERFACELANG: 'ภาษาสำหรับหน้าจอติดต่อผู้ใช้' + INTERFACELANG: ภาษาสำหรับหน้าจอติดต่อผู้ใช้ INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' LOGGEDINAS: 'You''re logged in as {name}.' NEWPASSWORD: รหัสผ่านใหม่ @@ -325,7 +325,7 @@ th: YOUROLDPASSWORD: รหัสผ่านเก่าของคุณ belongs_many_many_Groups: กลุ่ม db_LastVisited: วันที่เยี่ยมชมล่าสุด - db_Locale: 'ภาษาสำหรับส่วนอินเทอร์เฟซ' + db_Locale: ภาษาสำหรับส่วนอินเทอร์เฟซ db_LockedOutUntil: 'Locked out until' db_NumVisit: จำนวนการเข้าชม db_Password: รหัสผ่าน @@ -438,7 +438,7 @@ th: VIEWNEXT: เปิดดูหน้าเว็บถัดไป VIEWPREVIOUS: เปิดดูหน้าเว็บก่อนหน้า SimpleImageField: - NOUPLOAD: 'ยังไม่มีรูปภาพที่ถูกอัพโหลด' + NOUPLOAD: ยังไม่มีรูปภาพที่ถูกอัพโหลด SiteTree: TABMAIN: หลัก TableField: diff --git a/lang/uk.yml b/lang/uk.yml index 5d188394a..8f122a4a1 100644 --- a/lang/uk.yml +++ b/lang/uk.yml @@ -8,7 +8,7 @@ uk: FOLDER: Folder LASTEDIT: 'Востаннє змінено' OWNER: Власник - SIZE: 'Розмір' + SIZE: Розмір TITLE: Назва TYPE: Тип URL: URL @@ -91,8 +91,8 @@ uk: DAYS: дні HOUR: година HOURS: годин - MIN: 'хв' - MINS: 'хв' + MIN: хв + MINS: хв MONTH: місяць MONTHS: місяці SEC: сек @@ -199,18 +199,18 @@ uk: CHANGEPASSWORDTEXT1: 'Ви змінили свій пароль для' CHANGEPASSWORDTEXT2: 'Тепер Ви можете використовувати наступні дані для входу:' Code: 'Код групи' - DefaultGroupTitleAdministrators: Administrators + DefaultGroupTitleAdministrators: Адміністратори DefaultGroupTitleContentAuthors: 'Content Authors' - Description: Description + Description: Опис EMAIL: Email GroupReminder: 'If you choose a parent group, this group will take all it''s roles' HELLO: Привіт Locked: 'Заблокувати?' - NoRoles: 'No roles found' + NoRoles: 'Ролі не знайдені' PASSWORD: Password Parent: 'Батьківська група' RolesAddEditLink: 'Manage roles' - Sort: 'Sort Order' + Sort: 'Порядок сортування' TITLE: 'АйФрейм завантаження зображення' has_many_Permissions: Права many_many_Members: Члени @@ -247,7 +247,7 @@ uk: IMAGEALT: 'Alternative text (alt)' IMAGEALTTEXT: 'Альтернативний текст (alt) - відображається якщо зображення не відображається' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' - IMAGEDIMENSIONS: 'Розміри' + IMAGEDIMENSIONS: Розміри IMAGEHEIGHTPX: Висота IMAGETITLE: 'Текст заголовку (tooltip) - для додаткової інформації про зображення' IMAGETITLETEXT: 'Title text (tooltip)' @@ -298,10 +298,10 @@ uk: CONFIRMNEWPASSWORD: 'Підтвердіть новий пароль' CONFIRMPASSWORD: 'Підтвердіть пароль' DefaultAdminFirstname: 'Default Admin' - DefaultDateTime: default + DefaultDateTime: типовий EMAIL: Е-пошта - EMPTYNEWPASSWORD: 'The new password can''t be empty, please try again' - ENTEREMAIL: 'Please enter an email address to get a password reset link.' + EMPTYNEWPASSWORD: 'Новий пароль не може бути порожнім, будь-ласка, спробуйте ще раз' + ENTEREMAIL: 'Введіть, будь-ласка, електронну адресу щоб отримати посилання для відновлення паролю.' ERRORLOCKEDOUT: 'Ваш екаунт тимчасово заблоковано, тому що було багато невдалих спроб входу. Будь ласка спробуйте знову через 20 хвилин.' ERRORNEWPASSWORD: 'Ви ввели новий пароль із відмінностями, спробуйте знову' ERRORPASSWORDNOTMATCH: 'Ваш теперішній пароль не збігається, будь ласка, повторіть' @@ -313,7 +313,7 @@ uk: NEWPASSWORD: 'Новий пароль' PASSWORD: Пароль PLURALNAME: Члени - PROFILESAVESUCCESS: 'Successfully saved.' + PROFILESAVESUCCESS: 'Збереження пройшло успішно.' REMEMBERME: 'Пам''ятати мене наступного разу?' SINGULARNAME: Член SUBJECTPASSWORDCHANGED: 'Ваш пароль змінено' @@ -324,10 +324,10 @@ uk: WELCOMEBACK: 'Welcome Back, {firstname}' YOUROLDPASSWORD: 'Ваш старий пароль' belongs_many_many_Groups: Групи - db_LastVisited: 'Last Visited Date' + db_LastVisited: 'Дата останнього відвідування' db_Locale: 'Interface Locale' db_LockedOutUntil: 'Заблоковано поки' - db_NumVisit: 'Number of Visits' + db_NumVisit: 'Кількість відвідувань' db_Password: Пароль db_PasswordExpiry: 'Дата закінчення терміну дії пароля' MemberAuthenticator: @@ -410,22 +410,22 @@ uk: PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' SecurityAdmin: ACCESS_HELP: 'Allow viewing, adding and editing users, as well as assigning permissions and roles to them.' - APPLY_ROLES: 'Apply roles to groups' + APPLY_ROLES: 'Застосувати ролі до груп' APPLY_ROLES_HELP: 'Ability to edit the roles assigned to a group. Requires the "Access to ''Users'' section" permission.' EDITPERMISSIONS: 'Керувати дозволами для груп' EDITPERMISSIONS_HELP: 'Ability to edit Permissions and IP Addresses for a group. Requires the "Access to ''Security'' section" permission.' - GROUPNAME: 'Group name' - IMPORTGROUPS: 'Import groups' + GROUPNAME: 'Назва групи' + IMPORTGROUPS: 'Імпортувати групи' IMPORTUSERS: 'Import users' - MEMBERS: Members + MEMBERS: Члени MENUTITLE: Security MemberListCaution: 'Caution: Removing members from this list will remove them from all groups and the database' NEWGROUP: 'Нова Група' - PERMISSIONS: Permissions - ROLES: Roles + PERMISSIONS: Дозволи + ROLES: Ролі ROLESDESCRIPTION: 'Roles are predefined sets of permissions, and can be assigned to groups.
They are inherited from parent groups if required.' - TABROLES: Roles - Users: Users + TABROLES: Ролі + Users: Користувачі SecurityAdmin_MemberImportForm: BtnImport: 'Import from CSV' FileFieldLabel: 'CSV File (Allowed extensions: *.csv)' @@ -450,29 +450,29 @@ uk: CSVEXPORT: 'Експортувати в CSV' PRINT: Друкувати Print: Друкувати - SELECT: 'Select:' + SELECT: 'Вибрати:' TimeField: VALIDATEFORMAT: 'Please enter a valid time format ({format})' ToggleField: LESS: менше MORE: більше UploadField: - ATTACHFILE: 'Attach a file' - ATTACHFILES: 'Attach files' - AttachFile: 'Attach a file' + ATTACHFILE: 'Прикріпити файл' + ATTACHFILES: 'Прикріпити файли' + AttachFile: 'Прикріпити файл' DELETEINFO: 'Permanently delete this file from the file store' - DOEDIT: Save + DOEDIT: Зберегти DROPFILE: 'drop a file' DROPFILES: 'drop files' Dimensions: Dimensions - EDITINFO: 'Edit this file' + EDITINFO: 'Редагувати цей файл' FIELDNOTSET: 'File information not found' FROMCOMPUTER: 'From your computer' - FROMFILES: 'From files' + FROMFILES: 'З файлів' MAXNUMBEROFFILES: 'Max number of {count} file(s) exceeded.' MAXNUMBEROFFILESSHORT: 'Can only upload {count} files' REMOVE: Remove - REMOVEERROR: 'Error removing file' + REMOVEERROR: 'Помилка видалення файла' REMOVEINFO: 'Remove this file from here, but do not delete it from the file store' STARTALL: 'Start all' Saved: Saved diff --git a/lang/vi_VN.yml b/lang/vi_VN.yml index affcddd0c..458d91178 100644 --- a/lang/vi_VN.yml +++ b/lang/vi_VN.yml @@ -87,8 +87,8 @@ vi_VN: PLURALNAME: 'Data Objects' SINGULARNAME: 'Data Object' Date: - DAY: 'ngày' - DAYS: 'ngày' + DAY: ngày + DAYS: ngày HOUR: giờ HOURS: giờ MIN: phút diff --git a/lang/zh_CN.yml b/lang/zh_CN.yml index 97529248a..285c86191 100644 --- a/lang/zh_CN.yml +++ b/lang/zh_CN.yml @@ -2,12 +2,12 @@ zh_CN: AssetAdmin: NEWFOLDER: 新建文件夹 AssetTableField: - CREATED: '第一次被上传' + CREATED: 第一次被上传 DIM: 尺寸 FILENAME: 文件名 FOLDER: Folder LASTEDIT: 上一次被更改 - OWNER: '拥有者' + OWNER: 拥有者 SIZE: 大小 TITLE: 文件名称 TYPE: 类型 @@ -49,9 +49,9 @@ zh_CN: UNORDEREDDESCRIPTION: 'Unordered list' UNORDEREDEXAMPLE1: 'unordered item 1' BasicAuth: - ENTERINFO: '请输入用户名和密码' + ENTERINFO: 请输入用户名和密码 ERRORNOTADMIN: 此用户没有管理员权限。 - ERRORNOTREC: '没有找到此用户名/密码' + ERRORNOTREC: 没有找到此用户名/密码 Boolean: ANY: Any 0: 'False' @@ -75,7 +75,7 @@ zh_CN: ATLEAST: 'Passwords must be at least {min} characters long.' BETWEEN: 'Passwords must be {min} to {max} characters long.' MAXIMUM: 'Passwords must be at most {max} characters long.' - SHOWONCLICKTITLE: '更改密码' + SHOWONCLICKTITLE: 更改密码 CreditCardField: FIRST: first FOURTH: fourth @@ -152,9 +152,9 @@ zh_CN: FIELDISREQUIRED: '%s是必需填写的' TITLE: 'Image Uploading Iframe' VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' - VALIDATIONNOTUNIQUE: '输入值已被他人占用' - VALIDATIONPASSWORDSDONTMATCH: '(密码相互不匹配)' - VALIDATIONPASSWORDSNOTEMPTY: '密码不能空白' + VALIDATIONNOTUNIQUE: 输入值已被他人占用 + VALIDATIONPASSWORDSDONTMATCH: (密码相互不匹配) + VALIDATIONPASSWORDSNOTEMPTY: 密码不能空白 VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character' VALIDATOR: Validator VALIDCURRENCY: 'Please enter a valid currency' @@ -196,9 +196,9 @@ zh_CN: TEXT3: for Group: AddRole: 'Add a role for this group' - CHANGEPASSWORDTEXT1: '您已更改了登陆%s的密码' + CHANGEPASSWORDTEXT1: 您已更改了登陆%s的密码 CHANGEPASSWORDTEXT2: 您现在可以用下列权限信息进行登路: - Code: '团队代码' + Code: 团队代码 DefaultGroupTitleAdministrators: Administrators DefaultGroupTitleContentAuthors: 'Content Authors' Description: Description @@ -211,7 +211,7 @@ zh_CN: Parent: 主团队 RolesAddEditLink: 'Manage roles' Sort: 'Sort Order' - TITLE: '图象上传内嵌框架(Iframe)' + TITLE: 图象上传内嵌框架(Iframe) has_many_Permissions: 权限 many_many_Members: 成员 GroupImportForm: @@ -227,12 +227,12 @@ zh_CN: ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' ANCHORVALUE: Anchor BUTTONINSERT: Insert - BUTTONINSERTLINK: '插入链接' - BUTTONREMOVELINK: '删除链接' + BUTTONINSERTLINK: 插入链接 + BUTTONREMOVELINK: 删除链接 BUTTONUpdate: Update CAPTIONTEXT: 'Caption text' - CSSCLASS: '对齐/样式' - CSSCLASSCENTER: '自居中' + CSSCLASS: 对齐/样式 + CSSCLASSCENTER: 自居中 CSSCLASSLEFT: 左端自动换行 CSSCLASSLEFTALONE: 'On the left, on its own.' CSSCLASSRIGHT: 右端自动换行 @@ -248,17 +248,17 @@ zh_CN: IMAGEALTTEXT: 'Alternative text (alt) - shown if image cannot be displayed' IMAGEALTTEXTDESC: 'Shown to screen readers or if image can not be displayed' IMAGEDIMENSIONS: 尺寸 - IMAGEHEIGHTPX: '高(像素)' + IMAGEHEIGHTPX: 高(像素) IMAGETITLE: 'Title text (tooltip) - for additional information about the image' IMAGETITLETEXT: 'Title text (tooltip)' IMAGETITLETEXTDESC: 'For additional information about the image' - IMAGEWIDTHPX: '宽(像素)' + IMAGEWIDTHPX: 宽(像素) INSERTMEDIA: 'Insert Media' - LINK: '对所选文字插入/编辑链接' + LINK: 对所选文字插入/编辑链接 LINKANCHOR: 'Anchor on this page' LINKDESCR: 链接描述 LINKEMAIL: 电子邮件地址 - LINKEXTERNAL: '其它网站' + LINKEXTERNAL: 其它网站 LINKFILE: 下载文件 LINKINTERNAL: 本站网页 LINKOPENNEWWIN: 在新窗口打开链接? @@ -277,10 +277,10 @@ zh_CN: DropdownBatchActionsDefault: Actions HELP: 帮助 PAGETYPE: 网页类型 - PERMAGAIN: '您于CMS的登录已被注销,请在下面输入用户名和密码重新登录。' - PERMALREADY: '对不起,您无权登录CMS的这一部分。如果您要用另外的帐号,请在下面登录。' - PERMDEFAULT: '请先选择一种验证方法并输入您的权限信息,以登录CMS。' - PLEASESAVE: '请先保存:因为该网页还未保存,所以该页无法更新。' + PERMAGAIN: 您于CMS的登录已被注销,请在下面输入用户名和密码重新登录。 + PERMALREADY: 对不起,您无权登录CMS的这一部分。如果您要用另外的帐号,请在下面登录。 + PERMDEFAULT: 请先选择一种验证方法并输入您的权限信息,以登录CMS。 + PLEASESAVE: 请先保存:因为该网页还未保存,所以该页无法更新。 PreviewButton: Preview REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' SAVEDUP: Saved. @@ -291,47 +291,47 @@ zh_CN: Status: Status Member: ADDGROUP: 'Add group' - BUTTONCHANGEPASSWORD: '更改密码' + BUTTONCHANGEPASSWORD: 更改密码 BUTTONLOGIN: 登录 - BUTTONLOGINOTHER: '使用其他帐户登录' - BUTTONLOSTPASSWORD: '忘记密码' - CONFIRMNEWPASSWORD: '确认新密码' - CONFIRMPASSWORD: '确认密码' + BUTTONLOGINOTHER: 使用其他帐户登录 + BUTTONLOSTPASSWORD: 忘记密码 + CONFIRMNEWPASSWORD: 确认新密码 + CONFIRMPASSWORD: 确认密码 DefaultAdminFirstname: 'Default Admin' DefaultDateTime: default EMAIL: 电子邮件 EMPTYNEWPASSWORD: 'The new password can''t be empty, please try again' ENTEREMAIL: 'Please enter an email address to get a password reset link.' ERRORLOCKEDOUT: 'Your account has been temporarily disabled because of too many failed attempts at logging in. Please try again in 20 minutes.' - ERRORNEWPASSWORD: '您输入了一个不同的新密码,请重新输入' - ERRORPASSWORDNOTMATCH: '您当前的密码不正确,请再次输入' - ERRORWRONGCRED: '电邮地址或密码似乎不对。请重新输入。' + ERRORNEWPASSWORD: 您输入了一个不同的新密码,请重新输入 + ERRORPASSWORDNOTMATCH: 您当前的密码不正确,请再次输入 + ERRORWRONGCRED: 电邮地址或密码似乎不对。请重新输入。 FIRSTNAME: 名 INTERFACELANG: 界面语言 INVALIDNEWPASSWORD: 'We couldn''t accept that password: {password}' LOGGEDINAS: 'You''re logged in as {name}.' - NEWPASSWORD: '新密码' - PASSWORD: '密码' + NEWPASSWORD: 新密码 + PASSWORD: 密码 PLURALNAME: 成员 PROFILESAVESUCCESS: 'Successfully saved.' REMEMBERME: 记住我的信息? SINGULARNAME: 成员 - SUBJECTPASSWORDCHANGED: '您的密码已更改' - SUBJECTPASSWORDRESET: '重设您的密码链接' + SUBJECTPASSWORDCHANGED: 您的密码已更改 + SUBJECTPASSWORDRESET: 重设您的密码链接 SURNAME: 姓 VALIDATIONMEMBEREXISTS: 已经存在用这个电子邮件的会员 ValidationIdentifierFailed: 'Can''t overwrite existing member #{id} with identical identifier ({name} = {value}))' WELCOMEBACK: 'Welcome Back, {firstname}' - YOUROLDPASSWORD: '您的旧密码' + YOUROLDPASSWORD: 您的旧密码 belongs_many_many_Groups: 团队 db_LastVisited: 'Last Visited Date' db_Locale: 'Interface Locale' db_LockedOutUntil: 禁止直至 db_NumVisit: 'Number of Visits' db_Password: Password - db_PasswordExpiry: '密码过期日期' + db_PasswordExpiry: 密码过期日期 MemberAuthenticator: - TITLE: '电邮地址和密码' + TITLE: 电邮地址和密码 MemberDatetimeOptionsetField: AMORPM: 'AM (Ante meridiem) or PM (Post meridiem)' Custom: Custom @@ -361,7 +361,7 @@ zh_CN: ResultUpdated: 'Updated {count} members' MemberTableField: null ModelAdmin: - DELETE: '删除' + DELETE: 删除 DELETEDRECORDS: 'Deleted {count} records.' IMPORT: 'Import from CSV' IMPORTEDRECORDS: 'Imported {count} records.' @@ -393,19 +393,19 @@ zh_CN: PERMISSIONS_CATEGORY: 'Roles and access permissions' PhoneNumberField: Back: Back - VALIDATION: '请输入有效电话号码' + VALIDATION: 请输入有效电话号码 Security: - ALREADYLOGGEDIN: '您无访问此页的权限。如果您拥有另一个可访问次页的帐户,请在下面登录。' - BUTTONSEND: '给我发送密码重设链接' - CHANGEPASSWORDBELOW: '您可在下面更改您的密码' - CHANGEPASSWORDHEADER: '更改您的密码' - ENTERNEWPASSWORD: '请输入新密码' - ERRORPASSWORDPERMISSION: '您必需登录以更改您的密码' - LOGGEDOUT: '您已被撤消登录。如果您想再次登录,在下面输入您的登录信息。' + ALREADYLOGGEDIN: 您无访问此页的权限。如果您拥有另一个可访问次页的帐户,请在下面登录。 + BUTTONSEND: 给我发送密码重设链接 + CHANGEPASSWORDBELOW: 您可在下面更改您的密码 + CHANGEPASSWORDHEADER: 更改您的密码 + ENTERNEWPASSWORD: 请输入新密码 + ERRORPASSWORDPERMISSION: 您必需登录以更改您的密码 + LOGGEDOUT: 您已被撤消登录。如果您想再次登录,在下面输入您的登录信息。 LOGIN: 'Log in' - NOTEPAGESECURED: '此页是受安全保护的。输入您的登录信息,我们会将您送达。' + NOTEPAGESECURED: 此页是受安全保护的。输入您的登录信息,我们会将您送达。 NOTERESETLINKINVALID: '

The password reset link is invalid or expired.

You can request a new one here or change your password after you logged in.

' - NOTERESETPASSWORD: '输入您的电邮地址,我们会给您发送一个您可重设密码的链接' + NOTERESETPASSWORD: 输入您的电邮地址,我们会给您发送一个您可重设密码的链接 PASSWORDSENTHEADER: 'Password reset link sent to ''{email}''' PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' SecurityAdmin: @@ -438,11 +438,11 @@ zh_CN: VIEWNEXT: 'View next' VIEWPREVIOUS: 'View previous' SimpleImageField: - NOUPLOAD: '没有上传的图像' + NOUPLOAD: 没有上传的图像 SiteTree: TABMAIN: 主要部分 TableField: - ADDITEM: '新加' + ADDITEM: 新加 ISREQUIRED: 'In %s ''%s'' is required' SORTASC: 'Sort in ascending order' SORTDESC: 'Sort in descending order' diff --git a/lang/zh_TW.yml b/lang/zh_TW.yml index d3fea67f7..8dcf607d2 100644 --- a/lang/zh_TW.yml +++ b/lang/zh_TW.yml @@ -7,7 +7,7 @@ zh_TW: FILENAME: 檔案名稱 FOLDER: Folder LASTEDIT: 最後一次更新 - OWNER: '擁有者' + OWNER: 擁有者 SIZE: 大小 TITLE: 標題 TYPE: 類型 @@ -49,8 +49,8 @@ zh_TW: UNORDEREDDESCRIPTION: 'Unordered list' UNORDEREDEXAMPLE1: 'unordered item 1' BasicAuth: - ENTERINFO: '請輸入帳號密碼。' - ERRORNOTADMIN: '那個使用者不是管理員。' + ENTERINFO: 請輸入帳號密碼。 + ERRORNOTADMIN: 那個使用者不是管理員。 ERRORNOTREC: 那組帳號密碼不對。 Boolean: ANY: Any @@ -152,8 +152,8 @@ zh_TW: FIELDISREQUIRED: '必須要填 %s' TITLE: 'Image Uploading Iframe' VALIDATIONCREDITNUMBER: 'Please ensure you have entered the {number} credit card number correctly' - VALIDATIONNOTUNIQUE: '您輸入的數值並不是獨特的。' - VALIDATIONPASSWORDSDONTMATCH: '密碼不相配' + VALIDATIONNOTUNIQUE: 您輸入的數值並不是獨特的。 + VALIDATIONPASSWORDSDONTMATCH: 密碼不相配 VALIDATIONPASSWORDSNOTEMPTY: 密碼不能是空的 VALIDATIONSTRONGPASSWORD: 'Passwords must have at least one digit and one alphanumeric character' VALIDATOR: Validator @@ -197,7 +197,7 @@ zh_TW: Group: AddRole: 'Add a role for this group' CHANGEPASSWORDTEXT1: 您為這個帳戶改密碼: - CHANGEPASSWORDTEXT2: '您可以用下列的帳號密碼登入:' + CHANGEPASSWORDTEXT2: 您可以用下列的帳號密碼登入: Code: 'Group Code' DefaultGroupTitleAdministrators: Administrators DefaultGroupTitleContentAuthors: 'Content Authors' @@ -227,15 +227,15 @@ zh_TW: ADJUSTDETAILSDIMENSIONS: 'Details & dimensions' ANCHORVALUE: Anchor BUTTONINSERT: Insert - BUTTONINSERTLINK: '插入連結' + BUTTONINSERTLINK: 插入連結 BUTTONREMOVELINK: 移除連結 BUTTONUpdate: Update CAPTIONTEXT: 'Caption text' CSSCLASS: 對齊/樣式 CSSCLASSCENTER: 獨立置中 - CSSCLASSLEFT: '靠左被字包圍。' + CSSCLASSLEFT: 靠左被字包圍。 CSSCLASSLEFTALONE: 'On the left, on its own.' - CSSCLASSRIGHT: '靠右被字包圍。' + CSSCLASSRIGHT: 靠右被字包圍。 DETAILS: Details EMAIL: 電子郵件地址 FILE: 檔案 @@ -254,7 +254,7 @@ zh_TW: IMAGETITLETEXTDESC: 'For additional information about the image' IMAGEWIDTHPX: 寬 INSERTMEDIA: 'Insert Media' - LINK: '插入或編輯選取的連結' + LINK: 插入或編輯選取的連結 LINKANCHOR: 'Anchor on this page' LINKDESCR: 連結敘述 LINKEMAIL: 電子郵件地址 @@ -263,7 +263,7 @@ zh_TW: LINKINTERNAL: 此網站 LINKOPENNEWWIN: 在新視窗打開連結 LINKTO: 連結至 - PAGE: '網頁' + PAGE: 網頁 URL: 網址 URLNOTANOEMBEDRESOURCE: 'The URL ''{url}'' could not be turned into a media resource.' UpdateMEDIA: 'Update Media' @@ -276,11 +276,11 @@ zh_TW: DELETED: Deleted. DropdownBatchActionsDefault: Actions HELP: 說明 - PAGETYPE: '網頁類型:' - PERMAGAIN: '您已被登出,請在下面重新登入。' - PERMALREADY: '抱歉,您沒有權力使用這個部分。您可以用別的帳號登入。' - PERMDEFAULT: '請選擇一個認證方法並登入。' - PLEASESAVE: '請儲存:這個網頁沒有被更新因為尚未被儲存。' + PAGETYPE: 網頁類型: + PERMAGAIN: 您已被登出,請在下面重新登入。 + PERMALREADY: 抱歉,您沒有權力使用這個部分。您可以用別的帳號登入。 + PERMDEFAULT: 請選擇一個認證方法並登入。 + PLEASESAVE: 請儲存:這個網頁沒有被更新因為尚未被儲存。 PreviewButton: Preview REORGANISATIONSUCCESSFUL: 'Reorganised the site tree successfully.' SAVEDUP: Saved. @@ -292,8 +292,8 @@ zh_TW: Member: ADDGROUP: 'Add group' BUTTONCHANGEPASSWORD: 更改密碼 - BUTTONLOGIN: '登入' - BUTTONLOGINOTHER: '用別的帳戶登入' + BUTTONLOGIN: 登入 + BUTTONLOGINOTHER: 用別的帳戶登入 BUTTONLOSTPASSWORD: 忘記密碼 CONFIRMNEWPASSWORD: 確認新密碼 CONFIRMPASSWORD: 確認密碼 @@ -303,7 +303,7 @@ zh_TW: EMPTYNEWPASSWORD: 'The new password can''t be empty, please try again' ENTEREMAIL: 'Please enter an email address to get a password reset link.' ERRORLOCKEDOUT: 'Your account has been temporarily disabled because of too many failed attempts at logging in. Please try again in 20 minutes.' - ERRORNEWPASSWORD: '新密碼不相配,請再試一次。' + ERRORNEWPASSWORD: 新密碼不相配,請再試一次。 ERRORPASSWORDNOTMATCH: 舊密碼不對,請再試一次。 ERRORWRONGCRED: 密碼或電子郵件地址錯誤。請再是一次。 FIRSTNAME: 名 @@ -393,19 +393,19 @@ zh_TW: PERMISSIONS_CATEGORY: 'Roles and access permissions' PhoneNumberField: Back: Back - VALIDATION: '請輸入有效的電話號碼' + VALIDATION: 請輸入有效的電話號碼 Security: - ALREADYLOGGEDIN: '你不能瀏覽此頁。請用別的帳戶登入。' + ALREADYLOGGEDIN: 你不能瀏覽此頁。請用別的帳戶登入。 BUTTONSEND: 寄給我密碼重設網址。 CHANGEPASSWORDBELOW: 請在下面更改密碼。 CHANGEPASSWORDHEADER: 更改密碼 - ENTERNEWPASSWORD: '請輸入新的密碼。' - ERRORPASSWORDPERMISSION: '你必須先登入才能改密碼!' - LOGGEDOUT: '你已登出。您在下面再登入一次。' + ENTERNEWPASSWORD: 請輸入新的密碼。 + ERRORPASSWORDPERMISSION: 你必須先登入才能改密碼! + LOGGEDOUT: 你已登出。您在下面再登入一次。 LOGIN: 'Log in' - NOTEPAGESECURED: '那的網頁是被保護的。請先登入。' + NOTEPAGESECURED: 那的網頁是被保護的。請先登入。 NOTERESETLINKINVALID: '

The password reset link is invalid or expired.

You can request a new one here or change your password after you logged in.

' - NOTERESETPASSWORD: '請輸入您的電子郵件。我們將寄給你重設密媽的網址。' + NOTERESETPASSWORD: 請輸入您的電子郵件。我們將寄給你重設密媽的網址。 PASSWORDSENTHEADER: 'Password reset link sent to ''{email}''' PASSWORDSENTTEXT: 'Thank you! A reset link has been sent to ''{email}'', provided an account exists for this email address.' SecurityAdmin: From d45b33e9c797208f41805127cf5661feac375904 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 13 Jul 2012 14:25:44 +0200 Subject: [PATCH 21/43] Docs about merging back translations --- docs/en/misc/translation-process.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/en/misc/translation-process.md b/docs/en/misc/translation-process.md index 0ef5e16e2..bd1096d35 100644 --- a/docs/en/misc/translation-process.md +++ b/docs/en/misc/translation-process.md @@ -88,6 +88,23 @@ and merge it back manually to your 'master' as required. cp build.properties # Add your own getlocalization config to 'build.properties' phing -Dmodule= -propertyfile build.properties translations-sync +### Merge back existing translations + +Since the latest translations are downloaded into a "translations-staging" +branch, you need to get them back into your main project repository. +This depends on your release strategy: For simpler modules, +just merge back to master: + + git checkout master + git merge translations-staging + +In case you are maintaining release branches, its a bit more complicated: +The "translations-staging" branch is (correctly) based off master, +but you don't want to merge all other master changes into your release branch. +Use the following task to copy & commit the specific files instead: + + phing -Dmodule= translations-mergeback + ### Converting your language files from 2.4 PHP format The conversion from PHP format to YML is taken care of by a module @@ -107,9 +124,9 @@ Special characters (such as german umlauts) need to be entered in their native f Currently translated entities are not directly factored into code (for security reasons and release/review-control), so you can't see them straight away. - It is strongly encouraged that you check your translation this way, as its a good way to doublecheck your translation works in the right context. -Please use our [daily-builds](http://www.silverstripe.org/daily-builds/) for your local installation, to ensure you're looking at the most up to date interface. +Please use our [daily-builds](http://www.silverstripe.org/daily-builds/) for your local installation, to ensure you're looking at the most up to date interface. See "Download Translations" above +to find out how to retrieve the latest translation files. ### Can I change a translation just for one SilverStripe version? From 155758f546b435a2cc91b4feb96cb1d34c2a25c0 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 13 Jul 2012 16:46:23 +0200 Subject: [PATCH 22/43] NEW Save and restore tab state upon CMS navigation (fixes #7647) Implemented independently of URL state to ensure that state is retained on every user interaction, rather than having to add it to each URL specifically. Same reasons for not saving it as HTML5 history metadata, as that's only inspected on history events, not normal CMS navigation. --- admin/javascript/LeftAndMain.js | 74 ++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 19 deletions(-) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index 07f26b076..4b3a05e09 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -161,6 +161,9 @@ jQuery.noConflict(); if(abort) return; } + + // Save tab selections so we can restore them later + this.saveTabState(); if(window.History.enabled) { // Active menu item is set based on X-Controller ajax header, @@ -208,12 +211,6 @@ jQuery.noConflict(); return false; } - // save tab selections in order to reconstruct them later - var selectedTabs = []; - form.find('.cms-tabset').each(function(i, el) { - if($(el).attr('id')) selectedTabs.push({id:$(el).attr('id'), selected:$(el).tabs('option', 'selected')}); - }); - // get all data from the form var formData = form.serializeArray(); // add button action @@ -223,6 +220,9 @@ jQuery.noConflict(); // as automatic browser ajax response redirects seem to discard the hash/fragment. formData.push({name: 'BackURL', value:History.getPageUrl()}); + // Save tab selections so we can restore them later + this.saveTabState(); + // Standard Pjax behaviour is to replace the submitted form with new content. // The returned view isn't always decided upon when the request // is fired, so the server might decide to change it based on its own logic, @@ -242,23 +242,13 @@ jQuery.noConflict(); var newContentEls = self.handleAjaxResponse(data, status, xhr); if(!newContentEls) return; - var newForm = newContentEls.filter('form'); - - // Re-init tabs (in case the form tag itself is a tabset) - if(newForm.hasClass('cms-tabset')) newForm.removeClass('cms-tabset').addClass('cms-tabset'); - - // re-select previously saved tabs - $.each(selectedTabs, function(i, selectedTab) { - newForm.find('#' + selectedTab.id).tabs('select', selectedTab.selected); - }); - - newForm.trigger('aftersubmitform', {status: status, xhr: xhr, formData: formData}); + newContentEls.filter('form').trigger('aftersubmitform', {status: status, xhr: xhr, formData: formData}); } }, ajaxOptions)); return false; }, - + /** * Handles ajax loading of new panels through the window.History object. * To trigger loading, pass a new URL to window.History.pushState(). @@ -337,7 +327,7 @@ jQuery.noConflict(); * Can be hooked into an ajax 'success' callback. */ handleAjaxResponse: function(data, status, xhr) { - var self = this; + var self = this, url, selectedTabs; // Pseudo-redirects via X-ControllerURL might return empty data, in which // case we'll ignore the response @@ -401,8 +391,14 @@ jQuery.noConflict(); if(origVisible) newContentEl.css('visibility', 'visible'); }); + // Re-init tabs (in case the form tag itself is a tabset) + var newForm = newContentEls.filter('form'); + if(newForm.hasClass('cms-tabset')) newForm.removeClass('cms-tabset').addClass('cms-tabset'); + this.redraw(); + this.restoreTabState(); + return newContentEls; }, @@ -435,6 +431,46 @@ jQuery.noConflict(); $(window).trigger('statechange'); $(this).redraw(); + }, + + /** + * Save tab selections in order to reconstruct them later. + * Requires HTML5 sessionStorage support. + */ + saveTabState: function() { + if(typeof(window.sessionStorage)=="undefined") return; + + var selectedTabs = [], url = this._tabStateUrl(); + this.find('.cms-tabset,.ss-tabset').each(function(i, el) { + var id = $(el).attr('id'); + if(!id) return; // we need a unique reference + selectedTabs.push({id:id, selected:$(el).tabs('option', 'selected')}); + }); + if(selectedTabs) window.sessionStorage.setItem('tabs-' + url, JSON.stringify(selectedTabs)); + }, + + /** + * Re-select previously saved tabs. + * Requires HTML5 sessionStorage support. + */ + restoreTabState: function() { + if(typeof(window.sessionStorage)=="undefined") return; + + var self = this, url = this._tabStateUrl(), + data = window.sessionStorage.getItem('tabs-' + url), + selectedTabs = data ? JSON.parse(data) : false; + if(selectedTabs) { + $.each(selectedTabs, function(i, selectedTab) { + self.find('#' + selectedTab.id).tabs('select', selectedTab.selected); + }); + } + }, + + _tabStateUrl: function() { + return History.getState().url + .replace(/\?.*/, '') + .replace(/#.*/, '') + .replace($('base').attr('href'), ''); } }); From 78038eb75e1e41feb50dc2649a37d63c3531af4d Mon Sep 17 00:00:00 2001 From: jakr Date: Thu, 5 Jul 2012 22:53:40 +0300 Subject: [PATCH 23/43] FIX 7617: Back button in CMS after Add/Edit/View action in GridField does not work --- forms/gridfield/GridFieldDetailForm.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/forms/gridfield/GridFieldDetailForm.php b/forms/gridfield/GridFieldDetailForm.php index 6fd8233eb..7ee41101d 100644 --- a/forms/gridfield/GridFieldDetailForm.php +++ b/forms/gridfield/GridFieldDetailForm.php @@ -328,11 +328,15 @@ class GridFieldDetailForm_ItemRequest extends RequestHandler { $form->addExtraClass('cms-content cms-edit-form center ss-tabset'); $form->setAttribute('data-pjax-fragment', 'CurrentForm Content'); if($form->Fields()->hasTabset()) $form->Fields()->findOrMakeTab('Root')->setTemplate('CMSTabSet'); - // TODO Link back to controller action (and edited root record) rather than index, - // which requires more URL knowledge than the current link to this field gives us. - // The current root record is held in session only, - // e.g. page/edit/show/6/ vs. page/edit/EditForm/field/MyGridField/.... - $form->Backlink = $toplevelController->hasMethod('Backlink') ? $toplevelController->Backlink() : $toplevelController->Link(); + + if($toplevelController->hasMethod('Backlink')) { + $form->Backlink = $toplevelController->Backlink(); + } elseif($this->popupController->hasMethod('Breadcrumbs')) { + $parents = $this->popupController->Breadcrumbs(false)->items; + $form->Backlink = array_pop($parents)->Link; + } else { + $form->Backlink = $toplevelController->Link(); + } } $cb = $this->component->getItemEditFormCallback(); From c493dc730afa2f3b5f89d044962aa7c03634d622 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 13 Jul 2012 17:33:48 +0200 Subject: [PATCH 24/43] Avoid lonely question mark for GridField URLs in CMS --- admin/javascript/LeftAndMain.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index 4b3a05e09..224476786 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -714,7 +714,8 @@ jQuery.noConflict(); showDetailView: function(url) { // Include any GET parameters from the current URL, as the view state might depend on it. // For example, a list prefiltered through external search criteria might be passed to GridField. - url = $.path.addSearchParams(url, window.location.search.replace(/^\?/, '')); + var params = window.location.search.replace(/^\?/, ''); + if(params) url = $.path.addSearchParams(url, params); $('.cms-container').loadPanel(url); } }); From bf91594e4fe367e714bdc3b2ad0726427d0cfe84 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Fri, 13 Jul 2012 17:34:55 +0200 Subject: [PATCH 25/43] Disable tab state logic on uninit'ed tabs, allow opt-out Fixes a problem when switching between ajax tabs, e.g. "Content" and "Settings" in admin/pages/edit/show/. --- admin/javascript/LeftAndMain.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index 224476786..8daabbd86 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -444,6 +444,8 @@ jQuery.noConflict(); this.find('.cms-tabset,.ss-tabset').each(function(i, el) { var id = $(el).attr('id'); if(!id) return; // we need a unique reference + if(!$(el).data('tabs')) return; // don't act on uninit'ed controls + if($(el).data('ignoreTabState')) return; // allow opt-out selectedTabs.push({id:id, selected:$(el).tabs('option', 'selected')}); }); if(selectedTabs) window.sessionStorage.setItem('tabs-' + url, JSON.stringify(selectedTabs)); @@ -461,7 +463,9 @@ jQuery.noConflict(); selectedTabs = data ? JSON.parse(data) : false; if(selectedTabs) { $.each(selectedTabs, function(i, selectedTab) { - self.find('#' + selectedTab.id).tabs('select', selectedTab.selected); + var el = self.find('#' + selectedTab.id); + if(!el.data('tabs')) return; // don't act on uninit'ed controls + el.tabs('select', selectedTab.selected); }); } }, From c555256890b2cd0993402f775f5165aa04e72ae9 Mon Sep 17 00:00:00 2001 From: Saophalkun Ponlu Date: Sun, 15 Jul 2012 01:02:49 +1200 Subject: [PATCH 26/43] BUGFIX: PaginatedList::getIterator() trims the original list to the page lenght when the source list is DataList --- core/PaginatedList.php | 3 ++- tests/model/PaginatedListTest.php | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/PaginatedList.php b/core/PaginatedList.php index 5886182eb..0401063ef 100644 --- a/core/PaginatedList.php +++ b/core/PaginatedList.php @@ -172,8 +172,9 @@ class PaginatedList extends SS_ListDecorator { */ public function getIterator() { if($this->limitItems) { + $tmptList = clone $this->list; return new IteratorIterator( - $this->list->limit($this->pageLength, $this->getPageStart()) + $tmptList->limit($this->pageLength, $this->getPageStart()) ); } else { return new IteratorIterator($this->list); diff --git a/tests/model/PaginatedListTest.php b/tests/model/PaginatedListTest.php index 0bed6b70c..2ed971a20 100644 --- a/tests/model/PaginatedListTest.php +++ b/tests/model/PaginatedListTest.php @@ -7,6 +7,14 @@ */ class PaginatedListTest extends SapphireTest { + static $fixture_file = 'DataObjectTest.yml'; + + protected $extraDataObjects = array( + 'DataObjectTest_Team', + 'DataObjectTest_SubTeam', + 'DataObjectTest_Player' + ); + public function testPageStart() { $list = new PaginatedList(new ArrayList()); $this->assertEquals(0, $list->getPageStart(), 'The start defaults to 0.'); @@ -84,6 +92,12 @@ class PaginatedListTest extends SapphireTest { $list->setCurrentPage(999); $this->assertDOSEquals(array(), $list->getIterator()); + + $players = DataObjectTest_Player::get(); + $list = new PaginatedList($players); + $list->setPageLength(1); + $list->getIterator(); + $this->assertEquals(4, $list->getTotalItems(), 'Getting an iterator should not trim the list to the page length.'); } public function testPages() { From aa76aca10dcaf626a04d4c62e826ef0a1d5f3a81 Mon Sep 17 00:00:00 2001 From: Will Rossiter Date: Sun, 15 Jul 2012 17:23:10 +1200 Subject: [PATCH 27/43] Update extend cms docs to include 3.0 API change. --- docs/en/howto/extend-cms-interface.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/howto/extend-cms-interface.md b/docs/en/howto/extend-cms-interface.md index 173035868..b074d1ead 100644 --- a/docs/en/howto/extend-cms-interface.md +++ b/docs/en/howto/extend-cms-interface.md @@ -85,9 +85,9 @@ Create a new file called `zzz_admin/code/BookmarkedPageExtension.php` and insert :::php 'Boolean'); + public static $db = array('IsBookmarked' => 'Boolean'); - public function updateCMSFields(&$fields) { + public function updateCMSFields(FieldList $fields) { $fields->addFieldToTab('Root.Main', new CheckboxField('IsBookmarked', "Show in CMS bookmarks?") ); From b4ecc308a12bd3cc095bcce39b8a234e87322ff2 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 15 Jul 2012 20:53:33 +0200 Subject: [PATCH 28/43] BUG Enforce startClosed prop on ToggleCompositeField --- javascript/ToggleCompositeField.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javascript/ToggleCompositeField.js b/javascript/ToggleCompositeField.js index a7ddbbaa1..d853bfbee 100644 --- a/javascript/ToggleCompositeField.js +++ b/javascript/ToggleCompositeField.js @@ -2,10 +2,10 @@ $.entwine('ss', function($){ $('.ss-toggle').entwine({ onadd: function() { - opts = {collapsible: true}; - if (this.hasClass("ss-toggle-start-closed")) opts.active = false; - - this.accordion({ collapsible: true }); + this.accordion({ + collapsible: true, + active: !this.hasClass("ss-toggle-start-closed") + }); this._super(); }, From b42a76bebc3eabcdf40920c7eaae7a6e8caad5b7 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Sun, 15 Jul 2012 21:28:09 +0200 Subject: [PATCH 29/43] Fluent interface for ToggleCompositeField --- forms/ToggleCompositeField.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forms/ToggleCompositeField.php b/forms/ToggleCompositeField.php index 042cba8b3..7c8aaa2cb 100644 --- a/forms/ToggleCompositeField.php +++ b/forms/ToggleCompositeField.php @@ -66,6 +66,7 @@ class ToggleCompositeField extends CompositeField { */ public function setStartClosed($bool) { $this->startClosed = (bool) $bool; + return $this; } /** @@ -80,6 +81,7 @@ class ToggleCompositeField extends CompositeField { */ public function setHeadingLevel($level) { $this->headingLevel = $level; + return $this; } /** From d571cdcc85daa76f1d529f651a3725b8cae1790f Mon Sep 17 00:00:00 2001 From: unclecheese Date: Sun, 15 Jul 2012 22:54:53 -0300 Subject: [PATCH 30/43] ENHANCEMENT: Hide the search bar in Chosen dropdown fields when list is reasonably short. --- admin/javascript/LeftAndMain.js | 1 + 1 file changed, 1 insertion(+) diff --git a/admin/javascript/LeftAndMain.js b/admin/javascript/LeftAndMain.js index 8daabbd86..0b69a1139 100644 --- a/admin/javascript/LeftAndMain.js +++ b/admin/javascript/LeftAndMain.js @@ -23,6 +23,7 @@ jQuery.noConflict(); var applyChosen = function(el){ if(el.outerWidth()){ el.chosen({ + 'disable_search_threshold' : 20, 'allow_single_deselect': true }).addClass("has-chzn"); // Copy over title attribute if required From b9ed6f7f6d388fc451efbada2d1501d667322cb0 Mon Sep 17 00:00:00 2001 From: unclecheese Date: Sun, 15 Jul 2012 22:58:30 -0300 Subject: [PATCH 31/43] BUGFIX: When Chosen dropdowns are instantiated on hidden tabs, the width is rendered very small and they are unreadable. This is a known bug in Chosen. A change has been proposed at the Chosen page here: https://github.com/harvesthq/chosen/issues/92 but no pull request has been executed. --- admin/thirdparty/chosen/chosen/chosen.jquery.js | 1 + 1 file changed, 1 insertion(+) diff --git a/admin/thirdparty/chosen/chosen/chosen.jquery.js b/admin/thirdparty/chosen/chosen/chosen.jquery.js index 225754bc3..74b8b0b14 100644 --- a/admin/thirdparty/chosen/chosen/chosen.jquery.js +++ b/admin/thirdparty/chosen/chosen/chosen.jquery.js @@ -325,6 +325,7 @@ Copyright (c) 2011 by Harvest this.container_id = this.form_field.id.length ? this.form_field.id.replace(/(:|\.)/g, '_') : this.generate_field_id(); this.container_id += "_chzn"; this.f_width = this.form_field_jq.outerWidth(); + if (this.f_width==0) this.f_width = this.form_field_jq.css("width"); this.default_text = this.form_field_jq.data('placeholder') ? this.form_field_jq.data('placeholder') : this.default_text_default; container_div = $("
", { id: this.container_id, From 2bd9852ae9a3ac63af87bbdf82ff6bd1da42208a Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 16 Jul 2012 11:21:05 +0200 Subject: [PATCH 32/43] Fixed spelling of "Maori" in lang selection --- i18n/i18n.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/i18n.php b/i18n/i18n.php index 4113edc03..7a518d3bb 100644 --- a/i18n/i18n.php +++ b/i18n/i18n.php @@ -444,7 +444,7 @@ class i18n extends Object implements TemplateGlobalProvider { 'mfe_MU' => 'Morisyen (Mauritius)', 'mg_MG' => 'Malagasy (Madagascar)', 'mh_MH' => 'Marshallese (Marshall Islands)', - 'mi_NZ' => 'Maori (New Zealand)', + 'mi_NZ' => 'Māori (New Zealand)', 'min_ID' => 'Minangkabau (Indonesia)', 'mk_MK' => 'Macedonian (Macedonia)', 'ml_IN' => 'Malayalam (India)', @@ -685,7 +685,7 @@ class i18n extends Object implements TemplateGlobalProvider { 'lt' => array('Lithuanian', 'lietuviškai'), 'lmo' => array('Lombard', 'Lombardo'), 'mk' => array('Macedonian', 'македонски'), - 'mi' => array('Maori', 'Maori'), + 'mi' => array('Maori', 'Māori'), 'ms' => array('Malay', 'Bahasa melayu'), 'mt' => array('Maltese', 'Malti'), 'mr' => array('Marathi', 'मराठी'), @@ -777,7 +777,7 @@ class i18n extends Object implements TemplateGlobalProvider { 'lv_LV' => array('Latvian', 'latviešu'), 'lt_LT' => array('Lithuanian', 'lietuviškai'), 'mk_MK' => array('Macedonian', 'македонски'), - 'mi_NZ' => array('Maori', 'Maori'), + 'mi_NZ' => array('Maori', 'Māori'), 'ms_MY' => array('Malay', 'Bahasa melayu'), 'mt_MT' => array('Maltese', 'Malti'), 'mr_IN' => array('Marathi', 'मराठी'), From bbfa54c81690adb3c831019f042d39c96c755ce9 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 16 Jul 2012 12:05:48 +0200 Subject: [PATCH 33/43] Allow custom preview URLs through hidden fields Useful e.g. to force non-SSL previews via absolute links, even if the CMS is loaded on an SSL host. --- admin/javascript/LeftAndMain.Preview.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/admin/javascript/LeftAndMain.Preview.js b/admin/javascript/LeftAndMain.Preview.js index ff371eafc..2fc7f65c1 100644 --- a/admin/javascript/LeftAndMain.Preview.js +++ b/admin/javascript/LeftAndMain.Preview.js @@ -67,7 +67,7 @@ if(this.is('.is-collapsed')) return; // var url = ui.xmlhttp.getResponseHeader('x-frontend-url'); - var url = $('.cms-edit-form').find(':input[name=StageURLSegment]').val(); + var url = $('.cms-edit-form').find(':input[name=PreviewURL],:input[name=StageURLSegment]').val(); if(url) { this.loadUrl(url); this.unblock(); @@ -286,7 +286,7 @@ onclick: function(e) { e.preventDefault(); - var preview = $('.cms-preview'), url = $('.cms-edit-form').find(':input[name=StageURLSegment]').val(); + var preview = $('.cms-preview'), url = $('.cms-edit-form').find(':input[name=PreviewURL],:input[name=StageURLSegment]').val(); if(url) { preview.loadUrl(url); preview.unblock(); @@ -295,4 +295,4 @@ } }); }); -}(jQuery)); +}(jQuery)); \ No newline at end of file From d4b8db27afddc49f5ff37b25ed13490f6ec5c608 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 16 Jul 2012 23:30:59 +0200 Subject: [PATCH 34/43] Marking fake LeftAndMain->redirect() responses as finished Introduce new LeftAndMain_HTTPResponse class for this purpose, to mark a response as finished regardless of HTTP status. This is required for ajax responses which do redirects on app layer rather than HTTP (to avoid double processing). Specifically required to decorate LeftAndMain->init() in the 'translatable' module (TranslatableCMSMainExtension), which marks the response as finished through its redirect, avoiding further processing after init(). --- admin/code/LeftAndMain.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index 0e488c48f..16914770e 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -358,6 +358,17 @@ class LeftAndMain extends Controller implements PermissionProvider { if($this->request->getHeader('X-Pjax') && !$this->response->getHeader('X-Pjax')) { $this->response->addHeader('X-Pjax', $this->request->getHeader('X-Pjax')); } + $oldResponse = $this->response; + $newResponse = new LeftAndMain_HTTPResponse( + $oldResponse->getBody(), + $oldResponse->getStatusCode(), + $oldResponse->getStatusDescription() + ); + foreach($oldResponse->getHeaders() as $k => $v) { + $newResponse->addHeader($k, $v); + } + $newResponse->setIsFinished(true); + $this->response = $newResponse; return ''; // Actual response will be re-requested by client } else { parent::redirect($url, $code); @@ -1471,3 +1482,19 @@ class LeftAndMainMarkingFilter { } } +/** + * Allow overriding finished state for faux redirects. + */ +class LeftAndMain_HTTPResponse extends SS_HTTPResponse { + + protected $isFinished = false; + + function isFinished() { + return (parent::isFinished() || $this->isFinished); + } + + function setIsFinished($bool) { + $this->isFinished = $bool; + } + +} \ No newline at end of file From a033ddf7735a61e77b1b6abe627c47d6197050ba Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Mon, 16 Jul 2012 23:33:22 +0200 Subject: [PATCH 35/43] More init checks in HtmlEditorField.js --- javascript/HtmlEditorField.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/HtmlEditorField.js b/javascript/HtmlEditorField.js index 7f21670d6..5c19463fd 100644 --- a/javascript/HtmlEditorField.js +++ b/javascript/HtmlEditorField.js @@ -283,7 +283,7 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE; onbeforestatechange: function(){ this.css('visibility', 'hidden'); - var ed = this.getEditor(), container = ed.getInstance() ? ed.getContainer() : null; + var ed = this.getEditor(), container = (ed && ed.getInstance()) ? ed.getContainer() : null; if(container && container.length) container.remove(); } }, From 70dcb55fe0537e010d32632b236fd49cb7fcfe7b Mon Sep 17 00:00:00 2001 From: Mateusz Uzdowski Date: Tue, 17 Jul 2012 13:28:20 +1200 Subject: [PATCH 36/43] BUG Use prepStringForDB consistently across the framework. Also remove a line from DBFieldTest, it's redundant with the previous line. Ref: os7229 --- model/DataQuery.php | 2 +- tests/model/DBFieldTest.php | 1 - tests/model/DataListTest.php | 9 ++++++--- tests/model/DataObjectLazyLoadingTest.php | 20 ++++++++++++-------- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/model/DataQuery.php b/model/DataQuery.php index 98c672fe6..fa3d8b1dc 100644 --- a/model/DataQuery.php +++ b/model/DataQuery.php @@ -223,7 +223,7 @@ class DataQuery { } $query->selectField("\"$baseClass\".\"ID\"", "ID"); - $query->selectField("CASE WHEN \"$baseClass\".\"ClassName\" IS NOT NULL THEN \"$baseClass\".\"ClassName\" ELSE '$baseClass' END", "RecordClassName"); + $query->selectField("CASE WHEN \"$baseClass\".\"ClassName\" IS NOT NULL THEN \"$baseClass\".\"ClassName\" ELSE ".DB::getConn()->prepStringForDB($baseClass)." END", "RecordClassName"); // TODO: Versioned, Translatable, SiteTreeSubsites, etc, could probably be better implemented as subclasses of DataQuery diff --git a/tests/model/DBFieldTest.php b/tests/model/DBFieldTest.php index 952ceba9c..3c026e4c6 100644 --- a/tests/model/DBFieldTest.php +++ b/tests/model/DBFieldTest.php @@ -76,7 +76,6 @@ class DBFieldTest extends SapphireTest { /* Varchar behaviour */ $this->assertEquals($db->prepStringForDB("0"), singleton('Varchar')->prepValueForDB(0)); - $this->assertEquals("'0'", singleton('Varchar')->prepValueForDB(0)); $this->assertEquals("null", singleton('Varchar')->prepValueForDB(null)); $this->assertEquals("null", singleton('Varchar')->prepValueForDB(false)); $this->assertEquals("null", singleton('Varchar')->prepValueForDB('')); diff --git a/tests/model/DataListTest.php b/tests/model/DataListTest.php index 796cd427e..be2dea797 100644 --- a/tests/model/DataListTest.php +++ b/tests/model/DataListTest.php @@ -65,22 +65,25 @@ class DataListTest extends SapphireTest { } function testSql() { + $db = DB::getConn(); $list = DataObjectTest_TeamComment::get(); - $expected = 'SELECT DISTINCT "DataObjectTest_TeamComment"."ClassName", "DataObjectTest_TeamComment"."Created", "DataObjectTest_TeamComment"."LastEdited", "DataObjectTest_TeamComment"."Name", "DataObjectTest_TeamComment"."Comment", "DataObjectTest_TeamComment"."TeamID", "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL THEN "DataObjectTest_TeamComment"."ClassName" ELSE \'DataObjectTest_TeamComment\' END AS "RecordClassName" FROM "DataObjectTest_TeamComment"'; + $expected = 'SELECT DISTINCT "DataObjectTest_TeamComment"."ClassName", "DataObjectTest_TeamComment"."Created", "DataObjectTest_TeamComment"."LastEdited", "DataObjectTest_TeamComment"."Name", "DataObjectTest_TeamComment"."Comment", "DataObjectTest_TeamComment"."TeamID", "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL THEN "DataObjectTest_TeamComment"."ClassName" ELSE '.$db->prepStringForDB('DataObjectTest_TeamComment').' END AS "RecordClassName" FROM "DataObjectTest_TeamComment"'; $this->assertEquals($expected, $list->sql()); } function testInnerJoin() { + $db = DB::getConn(); $list = DataObjectTest_TeamComment::get(); $list->innerJoin('DataObjectTest_Team', '"DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"', 'Team'); - $expected = 'SELECT DISTINCT "DataObjectTest_TeamComment"."ClassName", "DataObjectTest_TeamComment"."Created", "DataObjectTest_TeamComment"."LastEdited", "DataObjectTest_TeamComment"."Name", "DataObjectTest_TeamComment"."Comment", "DataObjectTest_TeamComment"."TeamID", "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL THEN "DataObjectTest_TeamComment"."ClassName" ELSE \'DataObjectTest_TeamComment\' END AS "RecordClassName" FROM "DataObjectTest_TeamComment" INNER JOIN "DataObjectTest_Team" AS "Team" ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"'; + $expected = 'SELECT DISTINCT "DataObjectTest_TeamComment"."ClassName", "DataObjectTest_TeamComment"."Created", "DataObjectTest_TeamComment"."LastEdited", "DataObjectTest_TeamComment"."Name", "DataObjectTest_TeamComment"."Comment", "DataObjectTest_TeamComment"."TeamID", "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL THEN "DataObjectTest_TeamComment"."ClassName" ELSE '.$db->prepStringForDB('DataObjectTest_TeamComment').' END AS "RecordClassName" FROM "DataObjectTest_TeamComment" INNER JOIN "DataObjectTest_Team" AS "Team" ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"'; $this->assertEquals($expected, $list->sql()); } function testLeftJoin() { + $db = DB::getConn(); $list = DataObjectTest_TeamComment::get(); $list->leftJoin('DataObjectTest_Team', '"DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"', 'Team'); - $expected = 'SELECT DISTINCT "DataObjectTest_TeamComment"."ClassName", "DataObjectTest_TeamComment"."Created", "DataObjectTest_TeamComment"."LastEdited", "DataObjectTest_TeamComment"."Name", "DataObjectTest_TeamComment"."Comment", "DataObjectTest_TeamComment"."TeamID", "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL THEN "DataObjectTest_TeamComment"."ClassName" ELSE \'DataObjectTest_TeamComment\' END AS "RecordClassName" FROM "DataObjectTest_TeamComment" LEFT JOIN "DataObjectTest_Team" AS "Team" ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"'; + $expected = 'SELECT DISTINCT "DataObjectTest_TeamComment"."ClassName", "DataObjectTest_TeamComment"."Created", "DataObjectTest_TeamComment"."LastEdited", "DataObjectTest_TeamComment"."Name", "DataObjectTest_TeamComment"."Comment", "DataObjectTest_TeamComment"."TeamID", "DataObjectTest_TeamComment"."ID", CASE WHEN "DataObjectTest_TeamComment"."ClassName" IS NOT NULL THEN "DataObjectTest_TeamComment"."ClassName" ELSE '.$db->prepStringForDB('DataObjectTest_TeamComment').' END AS "RecordClassName" FROM "DataObjectTest_TeamComment" LEFT JOIN "DataObjectTest_Team" AS "Team" ON "DataObjectTest_Team"."ID" = "DataObjectTest_TeamComment"."TeamID"'; $this->assertEquals($expected, $list->sql()); } diff --git a/tests/model/DataObjectLazyLoadingTest.php b/tests/model/DataObjectLazyLoadingTest.php index d42998616..8ade64c9c 100644 --- a/tests/model/DataObjectLazyLoadingTest.php +++ b/tests/model/DataObjectLazyLoadingTest.php @@ -22,49 +22,53 @@ class DataObjectLazyLoadingTest extends SapphireTest { ); function testQueriedColumnsID() { + $db = DB::getConn(); $playerList = new DataList('DataObjectTest_SubTeam'); $playerList = $playerList->setQueriedColumns(array('ID')); $expected = 'SELECT DISTINCT "DataObjectTest_Team"."ClassName", "DataObjectTest_Team"."Created", ' . '"DataObjectTest_Team"."LastEdited", "DataObjectTest_Team"."ID", CASE WHEN '. '"DataObjectTest_Team"."ClassName" IS NOT NULL THEN "DataObjectTest_Team"."ClassName" ELSE ' . - '\'DataObjectTest_Team\' END AS "RecordClassName" FROM "DataObjectTest_Team" WHERE ' . - '("DataObjectTest_Team"."ClassName" IN (\'DataObjectTest_SubTeam\'))'; + $db->prepStringForDB('DataObjectTest_Team').' END AS "RecordClassName" FROM "DataObjectTest_Team" WHERE ' . + '("DataObjectTest_Team"."ClassName" IN ('.$db->prepStringForDB('DataObjectTest_SubTeam').'))'; $this->assertEquals($expected, $playerList->sql()); } function testQueriedColumnsFromBaseTableAndSubTable() { + $db = DB::getConn(); $playerList = new DataList('DataObjectTest_SubTeam'); $playerList = $playerList->setQueriedColumns(array('Title', 'SubclassDatabaseField')); $expected = 'SELECT DISTINCT "DataObjectTest_Team"."ClassName", "DataObjectTest_Team"."Created", ' . '"DataObjectTest_Team"."LastEdited", "DataObjectTest_Team"."Title", ' . '"DataObjectTest_SubTeam"."SubclassDatabaseField", "DataObjectTest_Team"."ID", CASE WHEN ' . '"DataObjectTest_Team"."ClassName" IS NOT NULL THEN "DataObjectTest_Team"."ClassName" ELSE ' . - '\'DataObjectTest_Team\' END AS "RecordClassName" FROM "DataObjectTest_Team" LEFT JOIN ' . + $db->prepStringForDB('DataObjectTest_Team').' END AS "RecordClassName" FROM "DataObjectTest_Team" LEFT JOIN ' . '"DataObjectTest_SubTeam" ON "DataObjectTest_SubTeam"."ID" = "DataObjectTest_Team"."ID" WHERE ' . - '("DataObjectTest_Team"."ClassName" IN (\'DataObjectTest_SubTeam\'))'; + '("DataObjectTest_Team"."ClassName" IN ('.$db->prepStringForDB('DataObjectTest_SubTeam').'))'; $this->assertEquals($expected, $playerList->sql()); } function testQueriedColumnsFromBaseTable() { + $db = DB::getConn(); $playerList = new DataList('DataObjectTest_SubTeam'); $playerList = $playerList->setQueriedColumns(array('Title')); $expected = 'SELECT DISTINCT "DataObjectTest_Team"."ClassName", "DataObjectTest_Team"."Created", ' . '"DataObjectTest_Team"."LastEdited", "DataObjectTest_Team"."Title", "DataObjectTest_Team"."ID", ' . 'CASE WHEN "DataObjectTest_Team"."ClassName" IS NOT NULL THEN "DataObjectTest_Team"."ClassName" ELSE ' . - '\'DataObjectTest_Team\' END AS "RecordClassName" FROM "DataObjectTest_Team" WHERE ' . - '("DataObjectTest_Team"."ClassName" IN (\'DataObjectTest_SubTeam\'))'; + $db->prepStringForDB('DataObjectTest_Team').' END AS "RecordClassName" FROM "DataObjectTest_Team" WHERE ' . + '("DataObjectTest_Team"."ClassName" IN ('.$db->prepStringForDB('DataObjectTest_SubTeam').'))'; $this->assertEquals($expected, $playerList->sql()); } function testQueriedColumnsFromSubTable() { + $db = DB::getConn(); $playerList = new DataList('DataObjectTest_SubTeam'); $playerList = $playerList->setQueriedColumns(array('SubclassDatabaseField')); $expected = 'SELECT DISTINCT "DataObjectTest_Team"."ClassName", "DataObjectTest_Team"."Created", ' . '"DataObjectTest_Team"."LastEdited", "DataObjectTest_SubTeam"."SubclassDatabaseField", ' . '"DataObjectTest_Team"."ID", CASE WHEN "DataObjectTest_Team"."ClassName" IS NOT NULL THEN ' . - '"DataObjectTest_Team"."ClassName" ELSE \'DataObjectTest_Team\' END AS "RecordClassName" FROM ' . + '"DataObjectTest_Team"."ClassName" ELSE '.$db->prepStringForDB('DataObjectTest_Team').' END AS "RecordClassName" FROM ' . '"DataObjectTest_Team" LEFT JOIN "DataObjectTest_SubTeam" ON "DataObjectTest_SubTeam"."ID" = ' . - '"DataObjectTest_Team"."ID" WHERE ("DataObjectTest_Team"."ClassName" IN (\'DataObjectTest_SubTeam\'))'; + '"DataObjectTest_Team"."ID" WHERE ("DataObjectTest_Team"."ClassName" IN ('.$db->prepStringForDB('DataObjectTest_SubTeam').'))'; $this->assertEquals($expected, $playerList->sql()); } From 8c0a8539c75e4328504f5fad3d8513a1b7d96772 Mon Sep 17 00:00:00 2001 From: Andrew Short Date: Tue, 17 Jul 2012 19:56:18 +1000 Subject: [PATCH 37/43] Limit the results shown in the autocompleter. --- .../GridFieldAddExistingAutocompleter.php | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) mode change 100755 => 100644 forms/gridfield/GridFieldAddExistingAutocompleter.php diff --git a/forms/gridfield/GridFieldAddExistingAutocompleter.php b/forms/gridfield/GridFieldAddExistingAutocompleter.php old mode 100755 new mode 100644 index 157eaa800..108fa4fc0 --- a/forms/gridfield/GridFieldAddExistingAutocompleter.php +++ b/forms/gridfield/GridFieldAddExistingAutocompleter.php @@ -40,7 +40,12 @@ class GridFieldAddExistingAutocompleter implements GridField_HTMLProvider, GridF * @var String Text shown on the search field, instructing what to search for. */ protected $placeholderText; - + + /** + * @var int + */ + protected $resultsLimit = 20; + /** * * @param array $searchFields Which fields on the object in the list should be searched @@ -180,6 +185,7 @@ class GridFieldAddExistingAutocompleter implements GridField_HTMLProvider, GridF } $results = $allList->where(implode(' OR ', $stmts))->subtract($gridField->getList()); $results = $results->sort($searchFields[0], 'ASC'); + $results = $results->limit($this->getResultsLimit()); $json = array(); foreach($results as $result) { @@ -271,7 +277,23 @@ class GridFieldAddExistingAutocompleter implements GridField_HTMLProvider, GridF public function setPlaceholderText($text) { $this->placeholderText = $text; } - + + /** + * Gets the maximum number of autocomplete results to display. + * + * @return int + */ + public function getResultsLimit() { + return $this->resultsLimit; + } + + /** + * @param int $limit + */ + public function setResultsLimit($limit) { + $this->resultsLimit = $limit; + } + /** * This will provide a StartsWith search that only returns a value if we are * matching ONE object only. We wouldn't want to attach used any object to From 8d385512971c483225e143ccc6baf502919dec60 Mon Sep 17 00:00:00 2001 From: Andrew Short Date: Tue, 17 Jul 2012 16:39:41 +1000 Subject: [PATCH 38/43] Don't change track autocompleter fields. --- forms/gridfield/GridFieldAddExistingAutocompleter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forms/gridfield/GridFieldAddExistingAutocompleter.php b/forms/gridfield/GridFieldAddExistingAutocompleter.php index 108fa4fc0..7f1782c7c 100644 --- a/forms/gridfield/GridFieldAddExistingAutocompleter.php +++ b/forms/gridfield/GridFieldAddExistingAutocompleter.php @@ -74,7 +74,7 @@ class GridFieldAddExistingAutocompleter implements GridField_HTMLProvider, GridF // Apparently the data-* needs to be double qouted for the jQuery.meta data plugin $searchField->setAttribute('data-search-url', '\''.Controller::join_links($gridField->Link('search').'\'')); $searchField->setAttribute('placeholder', $this->getPlaceholderText($dataClass)); - $searchField->addExtraClass('relation-search'); + $searchField->addExtraClass('relation-search no-change-track'); $findAction = new GridField_FormAction($gridField, 'gridfield_relationfind', _t('GridField.Find', "Find"), 'find', 'find'); $findAction->setAttribute('data-icon', 'relationfind'); From 1a91431d39dce6eaa2dd60fa17977693a30fec8f Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Tue, 17 Jul 2012 13:26:33 +0200 Subject: [PATCH 39/43] Query param searches for GridFieldAddExistingAutocompleter Fixes issues with query construction in JS when the search URL already contains GET paramters (e.g. when using the 'translatable' module). --- forms/gridfield/GridFieldAddExistingAutocompleter.php | 4 ++-- javascript/GridField.js | 2 +- .../forms/gridfield/GridFieldAddExistingAutocompleterTest.php | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/forms/gridfield/GridFieldAddExistingAutocompleter.php b/forms/gridfield/GridFieldAddExistingAutocompleter.php index 7f1782c7c..06b2bca68 100644 --- a/forms/gridfield/GridFieldAddExistingAutocompleter.php +++ b/forms/gridfield/GridFieldAddExistingAutocompleter.php @@ -156,7 +156,7 @@ class GridFieldAddExistingAutocompleter implements GridField_HTMLProvider, GridF */ public function getURLHandlers($gridField) { return array( - 'search/$ID' => 'doSearch', + 'search' => 'doSearch', ); } @@ -181,7 +181,7 @@ class GridFieldAddExistingAutocompleter implements GridField_HTMLProvider, GridF // TODO Replace with DataList->filterAny() once it correctly supports OR connectives foreach($searchFields as $searchField) { - $stmts[] .= sprintf('"%s" LIKE \'%s%%\'', $searchField, $request->param('ID')); + $stmts[] .= sprintf('"%s" LIKE \'%s%%\'', $searchField, Convert::raw2sql($request->getVar('gridfield_relationsearch'))); } $results = $allList->where(implode(' OR ', $stmts))->subtract($gridField->getList()); $results = $results->sort($searchFields[0], 'ASC'); diff --git a/javascript/GridField.js b/javascript/GridField.js index a5d37752a..51f706620 100644 --- a/javascript/GridField.js +++ b/javascript/GridField.js @@ -301,7 +301,7 @@ "X-Pjax" : 'Partial' }, type: "GET", - url: suggestionUrl+'/'+request.term, + url: suggestionUrl, data: form.serialize()+'&'+escape(searchField.attr('name'))+'='+escape(searchField.val()), success: function(data) { response( $.map(JSON.parse(data), function( name, id ) { diff --git a/tests/forms/gridfield/GridFieldAddExistingAutocompleterTest.php b/tests/forms/gridfield/GridFieldAddExistingAutocompleterTest.php index caec12193..d5c870822 100644 --- a/tests/forms/gridfield/GridFieldAddExistingAutocompleterTest.php +++ b/tests/forms/gridfield/GridFieldAddExistingAutocompleterTest.php @@ -15,7 +15,7 @@ class GridFieldAddExistingAutocompleterTest extends FunctionalTest { $btns = $parser->getBySelector('.ss-gridfield #action_gridfield_relationfind'); $response = $this->post( - 'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield/search/Team 2', + 'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield/search/?gridfield_relationsearch=Team 2', array( (string)$btns[0]['name'] => 1 ) @@ -26,7 +26,7 @@ class GridFieldAddExistingAutocompleterTest extends FunctionalTest { $this->assertEquals(array($team2->ID => 'Team 2'), $result); $response = $this->post( - 'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield/search/Unknown', + 'GridFieldAddExistingAutocompleterTest_Controller/Form/field/testfield/search/?gridfield_relationsearch=Unknown', array( (string)$btns[0]['name'] => 1 ) From a38bfc577c5d3035577f2d4b585ba5bf7f2daf1e Mon Sep 17 00:00:00 2001 From: Will Rossiter Date: Wed, 18 Jul 2012 11:54:42 +1200 Subject: [PATCH 40/43] API: Deprecate EnumField::Lower() and EnumField::Upper() to LowerCase() and UpperCase() for consistency with StringField --- model/fieldtypes/Enum.php | 82 ++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/model/fieldtypes/Enum.php b/model/fieldtypes/Enum.php index d9af908c4..623c5cd6d 100644 --- a/model/fieldtypes/Enum.php +++ b/model/fieldtypes/Enum.php @@ -1,12 +1,13 @@ * "MyField" => "Enum('Val1, Val2, Val3', 'Val1')" * * - * Example usage in in {@link DataObject::$db} with array notation ('Val1' is default) + * Example usage in in {@link DataObject::$db} with array notation + * ('Val1' is default) + * * * "MyField" => "Enum(array('Val1', 'Val2', 'Val3'), 'Val1')" * * - * @param enum: A string containing a comma separated list of options or an array of Vals. - * @param default The default option, which is either NULL or one of the items in the enumeration. + * @param enum: A string containing a comma separated list of options or an + * array of Vals. + * @param string The default option, which is either NULL or one of the + * items in the enumeration. */ - function __construct($name = null, $enum = NULL, $default = NULL) { + public function __construct($name = null, $enum = NULL, $default = NULL) { if($enum) { - if(!is_array($enum)){ + if(!is_array($enum)) { $enum = preg_split("/ *, */", trim($enum)); } @@ -49,19 +56,38 @@ class Enum extends DBField { $this->default = reset($enum); } } + parent::__construct($name); } - function requireField(){ - $parts=Array('datatype'=>'enum', 'enums'=>Convert::raw2sql($this->enum), 'character set'=>'utf8', 'collate'=> 'utf8_general_ci', 'default'=>Convert::raw2sql($this->default), 'table'=>$this->tableName, 'arrayValue'=>$this->arrayValue); - $values=Array('type'=>'enum', 'parts'=>$parts); + /** + * @return void + */ + public function requireField() { + $parts = array( + 'datatype' => 'enum', + 'enums' => Convert::raw2sql($this->enum), + 'character set' => 'utf8', + 'collate' => 'utf8_general_ci', + 'default' => Convert::raw2sql($this->default), + 'table' => $this->tableName, + 'arrayValue' => $this->arrayValue + ); + + $values = array( + 'type' => 'enum', + 'parts' => $parts + ); + DB::requireField($this->tableName, $this->name, $values); -} + } /** - * Return a dropdown field suitable for editing this field + * Return a dropdown field suitable for editing this field. + * + * @return DropdownField */ - function formField($title = null, $name = null, $hasEmpty = false, $value = "", $form = null, $emptyString = null) { + public function formField($title = null, $name = null, $hasEmpty = false, $value = "", $form = null, $emptyString = null) { if(!$title) $title = $this->name; if(!$name) $name = $this->name; @@ -71,28 +97,32 @@ class Enum extends DBField { return $field; } + /** + * @return DropdownField + */ public function scaffoldFormField($title = null, $params = null) { return $this->formField($title); } - function scaffoldSearchField($title = null) { + /** + * @param string + * + * @return DropdownField + */ + public function scaffoldSearchField($title = null) { $anyText = _t('Enum.ANY', 'Any'); return $this->formField($title, null, false, '', null, "($anyText)"); } /** - * Return the values of this enum, suitable for insertion into a dropdown field. + * Returns the values of this enum as an array, suitable for insertion into + * a {@link DropdownField} + * + * @param boolean + * + * @return array */ - function enumValues($hasEmpty = false) { + public function enumValues($hasEmpty = false) { return ($hasEmpty) ? array_merge(array('' => ''), ArrayLib::valuekey($this->enum)) : ArrayLib::valuekey($this->enum); } - - function Lower() { - return StringField::LowerCase(); - } - function Upper() { - return StringField::UpperCase(); - } -} - - +} \ No newline at end of file From 9e1f7421f543e098bf893438a2b6d1f9d6e9d849 Mon Sep 17 00:00:00 2001 From: Kirk Mayo Date: Wed, 18 Jul 2012 17:02:31 +1200 Subject: [PATCH 41/43] BUG: open ticket 7678 fixing usable_tags to send an array to ArrayList --- parsers/BBCodeParser.php | 120 ++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/parsers/BBCodeParser.php b/parsers/BBCodeParser.php index e2fec6e9d..c9618218e 100644 --- a/parsers/BBCodeParser.php +++ b/parsers/BBCodeParser.php @@ -64,65 +64,67 @@ class BBCodeParser extends TextParser { static function usable_tags() { return new ArrayList( - new ArrayData(array( - "Title" => _t('BBCodeParser.BOLD', 'Bold Text'), - "Example" => '[b]'._t('BBCodeParser.BOLDEXAMPLE', 'Bold').'[/b]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.ITALIC', 'Italic Text'), - "Example" => '[i]'._t('BBCodeParser.ITALICEXAMPLE', 'Italics').'[/i]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.UNDERLINE', 'Underlined Text'), - "Example" => '[u]'._t('BBCodeParser.UNDERLINEEXAMPLE', 'Underlined').'[/u]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.STRUCK', 'Struck-out Text'), - "Example" => '[s]'._t('BBCodeParser.STRUCKEXAMPLE', 'Struck-out').'[/s]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.COLORED', 'Colored text'), - "Example" => '[color=blue]'._t('BBCodeParser.COLOREDEXAMPLE', 'blue text').'[/color]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.ALIGNEMENT', 'Alignment'), - "Example" => '[align=right]'._t('BBCodeParser.ALIGNEMENTEXAMPLE', 'right aligned').'[/align]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.CODE', 'Code Block'), - "Description" => _t('BBCodeParser.CODEDESCRIPTION', 'Unformatted code block'), - "Example" => '[code]'._t('BBCodeParser.CODEEXAMPLE', 'Code block').'[/code]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.EMAILLINK', 'Email link'), - "Description" => _t('BBCodeParser.EMAILLINKDESCRIPTION', 'Create link to an email address'), - "Example" => "[email]you@yoursite.com[/email]" - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.EMAILLINK', 'Email link'), - "Description" => _t('BBCodeParser.EMAILLINKDESCRIPTION', 'Create link to an email address'), - "Example" => "[email=you@yoursite.com]Email[/email]" - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.UNORDERED', 'Unordered list'), - "Description" => _t('BBCodeParser.UNORDEREDDESCRIPTION', 'Unordered list'), - "Example" => '[ulist][*]'._t('BBCodeParser.UNORDEREDEXAMPLE1', 'unordered item 1').'[/ulist]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.IMAGE', 'Image'), - "Description" => _t('BBCodeParser.IMAGEDESCRIPTION', 'Show an image in your post'), - "Example" => "[img]http://www.website.com/image.jpg[/img]" - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.LINK', 'Website link'), - "Description" => _t('BBCodeParser.LINKDESCRIPTION', 'Link to another website or URL'), - "Example" => '[url]http://www.website.com/[/url]' - )), - new ArrayData(array( - "Title" => _t('BBCodeParser.LINK', 'Website link'), - "Description" => _t('BBCodeParser.LINKDESCRIPTION', 'Link to another website or URL'), - "Example" => "[url=http://www.website.com/]Website[/url]" - )) + array( + new ArrayData(array( + "Title" => _t('BBCodeParser.BOLD', 'Bold Text'), + "Example" => '[b]'._t('BBCodeParser.BOLDEXAMPLE', 'Bold').'[/b]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.ITALIC', 'Italic Text'), + "Example" => '[i]'._t('BBCodeParser.ITALICEXAMPLE', 'Italics').'[/i]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.UNDERLINE', 'Underlined Text'), + "Example" => '[u]'._t('BBCodeParser.UNDERLINEEXAMPLE', 'Underlined').'[/u]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.STRUCK', 'Struck-out Text'), + "Example" => '[s]'._t('BBCodeParser.STRUCKEXAMPLE', 'Struck-out').'[/s]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.COLORED', 'Colored text'), + "Example" => '[color=blue]'._t('BBCodeParser.COLOREDEXAMPLE', 'blue text').'[/color]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.ALIGNEMENT', 'Alignment'), + "Example" => '[align=right]'._t('BBCodeParser.ALIGNEMENTEXAMPLE', 'right aligned').'[/align]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.CODE', 'Code Block'), + "Description" => _t('BBCodeParser.CODEDESCRIPTION', 'Unformatted code block'), + "Example" => '[code]'._t('BBCodeParser.CODEEXAMPLE', 'Code block').'[/code]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.EMAILLINK', 'Email link'), + "Description" => _t('BBCodeParser.EMAILLINKDESCRIPTION', 'Create link to an email address'), + "Example" => "[email]you@yoursite.com[/email]" + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.EMAILLINK', 'Email link'), + "Description" => _t('BBCodeParser.EMAILLINKDESCRIPTION', 'Create link to an email address'), + "Example" => "[email=you@yoursite.com]Email[/email]" + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.UNORDERED', 'Unordered list'), + "Description" => _t('BBCodeParser.UNORDEREDDESCRIPTION', 'Unordered list'), + "Example" => '[ulist][*]'._t('BBCodeParser.UNORDEREDEXAMPLE1', 'unordered item 1').'[/ulist]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.IMAGE', 'Image'), + "Description" => _t('BBCodeParser.IMAGEDESCRIPTION', 'Show an image in your post'), + "Example" => "[img]http://www.website.com/image.jpg[/img]" + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.LINK', 'Website link'), + "Description" => _t('BBCodeParser.LINKDESCRIPTION', 'Link to another website or URL'), + "Example" => '[url]http://www.website.com/[/url]' + )), + new ArrayData(array( + "Title" => _t('BBCodeParser.LINK', 'Website link'), + "Description" => _t('BBCodeParser.LINKDESCRIPTION', 'Link to another website or URL'), + "Example" => "[url=http://www.website.com/]Website[/url]" + )) + ) ); } From faff2c122d69bcfbdd65aee39946516ae81ac03b Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Wed, 18 Jul 2012 13:51:12 +0200 Subject: [PATCH 42/43] Localized CMS breadcrumbs title --- admin/code/LeftAndMain.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/admin/code/LeftAndMain.php b/admin/code/LeftAndMain.php index 16914770e..92f2eea6c 100644 --- a/admin/code/LeftAndMain.php +++ b/admin/code/LeftAndMain.php @@ -590,7 +590,8 @@ class LeftAndMain extends Controller implements PermissionProvider { * @return ArrayList */ public function Breadcrumbs($unlinked = false) { - $title = self::menu_title_for_class($this->class); + $defaultTitle = LeftAndMain::menu_title_for_class($this->class); + $title = _t("{$this->class}.MENUTITLE", $defaultTitle); $items = new ArrayList(array( new ArrayData(array( 'Title' => $title, @@ -1497,4 +1498,4 @@ class LeftAndMain_HTTPResponse extends SS_HTTPResponse { $this->isFinished = $bool; } -} \ No newline at end of file +} From 498a3fdf49c08ad5eb485bedc7e3bca046188d71 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Wed, 18 Jul 2012 14:58:53 +0200 Subject: [PATCH 43/43] BUG Fixed i18n text collection in templates - Non-greedy regex matching to collect more than one entity per template... - Regex failed to collect sprintf() properly --- i18n/i18nTextCollector.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n/i18nTextCollector.php b/i18n/i18nTextCollector.php index b80315166..5c0b493b0 100644 --- a/i18n/i18nTextCollector.php +++ b/i18n/i18nTextCollector.php @@ -310,9 +310,9 @@ class i18nTextCollector extends Object { // use the old method of getting _t() style translatable entities // Collect in actual template - if(preg_match_all('/<%\s*(_t\(.*)%>/ms', $content, $matches)) { - foreach($matches as $match) { - $entities = array_merge($entities, $this->collectFromCode($match[0], $module)); + if(preg_match_all('/(_t\([^\)]*?\))/ms', $content, $matches)) { + foreach($matches[1] as $match) { + $entities = array_merge($entities, $this->collectFromCode($match, $module)); } }