mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge remote-tracking branch 'origin/3.0' into 3.1
Conflicts: javascript/DateField.js model/DataQuery.php model/Versioned.php tests/forms/RequirementsTest.php tests/model/DataObjectLazyLoadingTest.php view/Requirements.php
This commit is contained in:
commit
9856fcef21
@ -94,7 +94,6 @@ $locales = array(
|
|||||||
'it_IT' => 'Italian (Italy)',
|
'it_IT' => 'Italian (Italy)',
|
||||||
'ja_JP' => 'Japanese (Japan)',
|
'ja_JP' => 'Japanese (Japan)',
|
||||||
'km_KH' => 'Khmer (Cambodia)',
|
'km_KH' => 'Khmer (Cambodia)',
|
||||||
'lc_XX' => 'LOLCAT',
|
|
||||||
'lv_LV' => 'Latvian (Latvia)',
|
'lv_LV' => 'Latvian (Latvia)',
|
||||||
'lt_LT' => 'Lithuanian (Lithuania)',
|
'lt_LT' => 'Lithuanian (Lithuania)',
|
||||||
'ms_MY' => 'Malay (Malaysia)',
|
'ms_MY' => 'Malay (Malaysia)',
|
||||||
@ -1316,7 +1315,14 @@ TEXT;
|
|||||||
<requestFiltering>
|
<requestFiltering>
|
||||||
<hiddenSegments applyToWebDAV="false">
|
<hiddenSegments applyToWebDAV="false">
|
||||||
<add segment="silverstripe-cache" />
|
<add segment="silverstripe-cache" />
|
||||||
|
<add segment="vendor" />
|
||||||
|
<add segment="composer.json" />
|
||||||
|
<add segment="composer.lock" />
|
||||||
</hiddenSegments>
|
</hiddenSegments>
|
||||||
|
<fileExtensions allowUnlisted="true" >
|
||||||
|
<add fileExtension=".ss" allowed="false"/>
|
||||||
|
<add fileExtension=".yml" allowed="false"/>
|
||||||
|
</fileExtensions>
|
||||||
</requestFiltering>
|
</requestFiltering>
|
||||||
</security>
|
</security>
|
||||||
<rewrite>
|
<rewrite>
|
||||||
|
@ -14,6 +14,11 @@ We provide a GUI for translations through [getlocalization.com](http://getlocali
|
|||||||
|
|
||||||
For all modules listed there, we automatically import new master strings as they get committed to the various codebases, so you're always translating on the latest and greatest version.
|
For all modules listed there, we automatically import new master strings as they get committed to the various codebases, so you're always translating on the latest and greatest version.
|
||||||
|
|
||||||
|
Since getlocalization doesn't allow you to download your own work,
|
||||||
|
we've created a simple downloader for this purpose at [http://translate.silverstripe.org/download.php](http://translate.silverstripe.org/download.php)
|
||||||
|
([sample download of de.yml](http://translate.silverstripe.org/download.php?project=silverstripe_cms&locale=de)).
|
||||||
|
Requests count against our own API user on getlocalization.com, so please use the script responsibly.
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
### How do I translate a module not listed on getlocalization?
|
### How do I translate a module not listed on getlocalization?
|
||||||
|
@ -25,7 +25,7 @@ when the form is submitted.
|
|||||||
new RequiredFields(array('MyRequiredField'))
|
new RequiredFields(array('MyRequiredField'))
|
||||||
);
|
);
|
||||||
// Optional: Add a CSS class for custom styling
|
// Optional: Add a CSS class for custom styling
|
||||||
$form->dataFieldByName('MyRequiredField)->addExtraClass('required');
|
$form->dataFieldByName('MyRequiredField')->addExtraClass('required');
|
||||||
return $form;
|
return $form;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,13 +92,13 @@ class GridFieldFilterHeader implements GridField_HTMLProvider, GridField_DataMan
|
|||||||
}
|
}
|
||||||
|
|
||||||
$filterArguments = $state->Columns->toArray();
|
$filterArguments = $state->Columns->toArray();
|
||||||
$dataListClone = null;
|
$dataListClone = clone($dataList);
|
||||||
foreach($filterArguments as $columnName => $value ) {
|
foreach($filterArguments as $columnName => $value ) {
|
||||||
if($dataList->canFilterBy($columnName) && $value) {
|
if($dataList->canFilterBy($columnName) && $value) {
|
||||||
$dataListClone = $dataList->filter($columnName.':PartialMatch', $value);
|
$dataListClone = $dataListClone->filter($columnName.':PartialMatch', $value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ($dataListClone) ? $dataListClone : $dataList;
|
return $dataListClone;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getHTMLFragments($gridField) {
|
public function getHTMLFragments($gridField) {
|
||||||
|
@ -170,7 +170,7 @@ class i18nTextCollector extends Object {
|
|||||||
$fileList = $this->getFilesRecursive("$this->basePath/$module/code");
|
$fileList = $this->getFilesRecursive("$this->basePath/$module/code");
|
||||||
} else if($module == FRAMEWORK_DIR || substr($module, 0, 7) == 'themes/') {
|
} else if($module == FRAMEWORK_DIR || substr($module, 0, 7) == 'themes/') {
|
||||||
// framework doesn't have the usual module structure, so we'll scan all subfolders
|
// framework doesn't have the usual module structure, so we'll scan all subfolders
|
||||||
$fileList = $this->getFilesRecursive("$this->basePath/$module");
|
$fileList = $this->getFilesRecursive("$this->basePath/$module", null, null, '/\/(tests|dev)$/');
|
||||||
}
|
}
|
||||||
foreach($fileList as $filePath) {
|
foreach($fileList as $filePath) {
|
||||||
// exclude ss-templates, they're scanned separately
|
// exclude ss-templates, they're scanned separately
|
||||||
@ -183,8 +183,7 @@ class i18nTextCollector extends Object {
|
|||||||
|
|
||||||
// Search for calls in template files if these exists
|
// Search for calls in template files if these exists
|
||||||
if(is_dir("$this->basePath/$module/")) {
|
if(is_dir("$this->basePath/$module/")) {
|
||||||
$dummy = array();
|
$fileList = $this->getFilesRecursive("$this->basePath/$module/", null, 'ss');
|
||||||
$fileList = $this->getFilesRecursive("$this->basePath/$module/", $dummy, 'ss');
|
|
||||||
foreach($fileList as $index => $filePath) {
|
foreach($fileList as $index => $filePath) {
|
||||||
$content = file_get_contents($filePath);
|
$content = file_get_contents($filePath);
|
||||||
// templates use their filename as a namespace
|
// templates use their filename as a namespace
|
||||||
@ -401,25 +400,30 @@ class i18nTextCollector extends Object {
|
|||||||
* @param string $folder base directory to scan (will scan recursively)
|
* @param string $folder base directory to scan (will scan recursively)
|
||||||
* @param array $fileList Array to which potential files will be appended
|
* @param array $fileList Array to which potential files will be appended
|
||||||
* @param string $type Optional, "php" or "ss"
|
* @param string $type Optional, "php" or "ss"
|
||||||
|
* @param string $folderExclude Regular expression matching folder names to exclude
|
||||||
* @return array $fileList An array of files
|
* @return array $fileList An array of files
|
||||||
*/
|
*/
|
||||||
protected function getFilesRecursive($folder, &$fileList = null, $type = null) {
|
protected function getFilesRecursive($folder, $fileList = null, $type = null, $folderExclude = null) {
|
||||||
|
if(!$folderExclude) $folderExclude = '/\/(tests)$/';
|
||||||
if(!$fileList) $fileList = array();
|
if(!$fileList) $fileList = array();
|
||||||
$items = scandir($folder);
|
$items = scandir($folder);
|
||||||
$isValidFolder = (
|
$isValidFolder = (
|
||||||
!in_array('_manifest_exclude', $items)
|
!in_array('_manifest_exclude', $items)
|
||||||
&& !preg_match('/\/tests$/', $folder)
|
&& !preg_match($folderExclude, $folder)
|
||||||
);
|
);
|
||||||
|
|
||||||
if($items && $isValidFolder) foreach($items as $item) {
|
if($items && $isValidFolder) foreach($items as $item) {
|
||||||
if(substr($item,0,1) == '.') continue;
|
if(substr($item,0,1) == '.') continue;
|
||||||
if(substr($item,-4) == '.php' && (!$type || $type == 'php')) {
|
if(substr($item,-4) == '.php' && (!$type || $type == 'php')) {
|
||||||
$fileList[substr($item,0,-4)] = "$folder/$item";
|
$fileList[substr($item,0,-4)] = "$folder/$item";
|
||||||
}
|
} else if(substr($item,-3) == '.ss' && (!$type || $type == 'ss')) {
|
||||||
else if(substr($item,-3) == '.ss' && (!$type || $type == 'ss')) {
|
|
||||||
$fileList[$item] = "$folder/$item";
|
$fileList[$item] = "$folder/$item";
|
||||||
|
} else if(is_dir("$folder/$item")) {
|
||||||
|
$fileList = array_merge(
|
||||||
|
$fileList,
|
||||||
|
$this->getFilesRecursive("$folder/$item", $fileList, $type, $folderExclude)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else if(is_dir("$folder/$item")) $this->getFilesRecursive("$folder/$item", $fileList, $type);
|
|
||||||
}
|
}
|
||||||
return $fileList;
|
return $fileList;
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.field.date input.text,.fieldholder-small input.text.date').live('click', function() {
|
$(document).on("click", "field.date input.text,.fieldholder-small input.text.date", function() {
|
||||||
$(this).ssDatepicker();
|
$(this).ssDatepicker();
|
||||||
|
|
||||||
if($(this).data('datepicker')) {
|
if($(this).data('datepicker')) {
|
||||||
|
@ -488,7 +488,8 @@ ss.editorWrappers['default'] = ss.editorWrappers.tinyMCE;
|
|||||||
/* NOP */
|
/* NOP */
|
||||||
},
|
},
|
||||||
resetFields: function() {
|
resetFields: function() {
|
||||||
/* NOP */
|
// Flush the tree drop down fields, as their content might get changed in other parts of the CMS, ie in Files and images
|
||||||
|
this.find('.tree-holder').empty();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
134
lang/lc_XX.yml
134
lang/lc_XX.yml
@ -1,134 +0,0 @@
|
|||||||
lc_XX:
|
|
||||||
BasicAuth:
|
|
||||||
ENTERINFO: "PLZ ENTR UR USERNAYM N A PASWORD."
|
|
||||||
ERRORNOTADMIN: "DAT USR IZ NOT AN ADMINISTRATOR."
|
|
||||||
ERRORNOTREC: "DAT USERNAYM / PASWORD ISNT RECOGNISD SUZ 2 HEAR"
|
|
||||||
ChangePasswordEmail.ss:
|
|
||||||
CHANGEPASSWORDTEXT1: "U CHANGD UR PASWORD 4"
|
|
||||||
CHANGEPASSWORDTEXT2: "U CAN NAO USE TEH FOLLOWIN CREDENSHALS 2 LOG IN:"
|
|
||||||
HELLO: "OHI! HOWRU2DAI?"
|
|
||||||
ComplexTableField.ss:
|
|
||||||
ADDITEM: "ADD"
|
|
||||||
SORTASC: "SORT ASCENDIN"
|
|
||||||
SORTDESC: "SORT DESCENDIN"
|
|
||||||
ComplexTableField_popup.ss:
|
|
||||||
NEXT: "NEXT (GOGOGO)"
|
|
||||||
PREVIOUS: "PREVIOUZ"
|
|
||||||
Date:
|
|
||||||
DAY: "DAI"
|
|
||||||
DAYS: "DAIZ"
|
|
||||||
HOUR: "HOUR"
|
|
||||||
HOURS: "HOURZ"
|
|
||||||
MIN: "MIN"
|
|
||||||
MINS: "MINZ"
|
|
||||||
MONTH: "MONTH"
|
|
||||||
MONTHS: "MONTHX"
|
|
||||||
SEC: "SEC"
|
|
||||||
SECS: "SECZ"
|
|
||||||
YEAR: "YEAR"
|
|
||||||
YEARS: "YEARZ"
|
|
||||||
DateField:
|
|
||||||
DropdownField:
|
|
||||||
CHOOSE: "(pik)"
|
|
||||||
EmailField:
|
|
||||||
VALIDATION: "PLZ ENTR AN EMAIL ADDRES."
|
|
||||||
ForgotPasswordEmail.ss:
|
|
||||||
HELLO: "OHI! HOWRU2DAI?"
|
|
||||||
Form:
|
|
||||||
FIELDISREQUIRED: "%s IS REQUIRED"
|
|
||||||
VALIDATIONCREDITNUMBER: "PLZ ENSURE U HAS ENTERD TEH %s CREDIT CARD NUMBR RITE CUZ WE NEED UR MONEY RITE NOW."
|
|
||||||
VALIDATIONFAILED: "VALIDASHUN FAILD1!!1!!!!!!1 WAT NOW?"
|
|
||||||
VALIDATIONNOTUNIQUE: "TEH VALUE ENTERD R NOT UNIQUE"
|
|
||||||
VALIDATIONPASSWORDSDONTMATCH: "SRY BOSS, PASWORDZ DOAN MATCH"
|
|
||||||
VALIDATIONPASSWORDSNOTEMPTY: "PASWORDZ CANT BE EMPTY DOOD"
|
|
||||||
VALIDATIONSTRONGPASSWORD: "PASWORDZ MUST HAS AT LEAST WAN DIGIT AN WAN ALFANUMERIC CHARACTR."
|
|
||||||
VALIDCURRENCY: "PLZ ENTR VALID CURRENCY. CUD U?"
|
|
||||||
HtmlEditorField:
|
|
||||||
BUTTONINSERTLINK: "INSERT LINK"
|
|
||||||
BUTTONREMOVELINK: "REMOOV LINK"
|
|
||||||
CSSCLASS: "ALIGNMENT / STYLE"
|
|
||||||
CSSCLASSCENTER: "SENTERD, ON ITZ OWN."
|
|
||||||
CSSCLASSLEFT: "ON TEH LEFT, WIF TEXT WRAPPIN AROUND."
|
|
||||||
CSSCLASSRIGHT: "ON TEH RITE, WIF TEXT WRAPPIN AROUND."
|
|
||||||
EMAIL: "EMAIL ADDRESZ"
|
|
||||||
FILE: "FIEL"
|
|
||||||
FOLDER: "TEH FOLDER"
|
|
||||||
IMAGE: "INSERT PIKSHUR"
|
|
||||||
IMAGEDIMENSIONS: "DIMENSHUNZ"
|
|
||||||
IMAGEHEIGHTPX: "HEIGHT"
|
|
||||||
IMAGEWIDTHPX: "WIDTH"
|
|
||||||
LINK: "INSERT/EDIT LINK 4 HIGHLIGHTD TEXT"
|
|
||||||
LINKDESCR: "LINK DESCRIPSHUN"
|
|
||||||
LINKEMAIL: "EMAIL ADDRESZ"
|
|
||||||
LINKEXTERNAL: "ANODER WEBSIET"
|
|
||||||
LINKFILE: "DOWNLOAD FIEL"
|
|
||||||
LINKINTERNAL: "PAEG ON DIS SIET"
|
|
||||||
LINKOPENNEWWIN: "OPEN LINK IN NEW WINDOW?"
|
|
||||||
LINKTO: "LINK 2"
|
|
||||||
PAGE: "PAEG"
|
|
||||||
URL: "URL N STUFF"
|
|
||||||
Image_iframe.ss:
|
|
||||||
TITLE: "PIKSHUR UPLOADIN IFRAME"
|
|
||||||
Member:
|
|
||||||
ADDRESS: "ADDRESZ"
|
|
||||||
BUTTONCHANGEPASSWORD: "CHANGE PASWORD"
|
|
||||||
BUTTONLOGIN: "LOG IN"
|
|
||||||
BUTTONLOGINOTHER: "LOG IN AS SOMEONE ELSE"
|
|
||||||
BUTTONLOSTPASSWORD: "I HAS LOST MAH PASWORD"
|
|
||||||
CONFIRMNEWPASSWORD: "CUD U CONFIRM NEW PASWORD PLZ"
|
|
||||||
CONFIRMPASSWORD: "CONFIRM PASWORD"
|
|
||||||
CONTACTINFO: "SUM CONTACT STUFF"
|
|
||||||
EMAIL: "EMAIL"
|
|
||||||
EMAILSIGNUPINTRO1: "TEH LOLCAT SEZ OMG BIGTHX 2 U N U R A NEW MEMBR 4 NOW N UR DETAILZ R LISTD BELOW FOR THAT IF U WANTZ THEM IN SUM TIME"
|
|
||||||
EMAILSIGNUPINTRO2: "U CAN LOGIN TO TEH WEBSITE USINS TEH CREDENTIALZ LISTED BELOW"
|
|
||||||
EMAILSIGNUPSUBJECT: "TEH LOLCAT TANX U 4 SIGNINS UP"
|
|
||||||
ERRORNEWPASSWORD: "UR HAS ENTERD UR NEW PASWORD DIFFERENTLY, PLZ TRY AGAIN, K?"
|
|
||||||
ERRORPASSWORDNOTMATCH: "UR CURRENT PASWORD DOEZ NOT MATCH, PLZ TRY AGAIN, K?"
|
|
||||||
ERRORWRONGCRED: "DAT IS NOT SEEMZ 2 BE TEH RITE E-MAIL ADDRES OR PASWORD. PLZ TRY AGAIN, K?"
|
|
||||||
FIRSTNAME: "FURST NAYM"
|
|
||||||
GREETING: "WELKUM"
|
|
||||||
INTERFACELANG: "INTRFACELANGUEEG"
|
|
||||||
LOGGEDINAS: "URE LOGGD IN AS %s."
|
|
||||||
MOBILE: "MOBAIL"
|
|
||||||
NAME: "NAYM"
|
|
||||||
NEWPASSWORD: "NEW PASWORD"
|
|
||||||
PASSWORD: "PASWORD"
|
|
||||||
PHONE: "FONE"
|
|
||||||
REMEMBERME: "REMEMBR ME NEXT TIME, K?"
|
|
||||||
SUBJECTPASSWORDCHANGED: "UR PASWORD HAS BEEN CHANGD"
|
|
||||||
SUBJECTPASSWORDRESET: "YORE PASWORD RESET LINK"
|
|
||||||
SURNAME: "SHURNAYM"
|
|
||||||
VALIDATIONMEMBEREXISTS: "THAR ALREADY EXISTZ MEMBR WIF DIS EMAILZ"
|
|
||||||
WELCOMEBACK: "WELCUM BACK, %s"
|
|
||||||
YOUROLDPASSWORD: "UR OLD PASWORD"
|
|
||||||
MemberAuthenticator:
|
|
||||||
TITLE: "E-MAIL N PASWORD"
|
|
||||||
NumericField:
|
|
||||||
VALIDATION: "'%s' IZ NOT NUMBR, ONLY NUMBERS CAN BE ACCEPTD 4 DIS FIELD"
|
|
||||||
PhoneNumberField:
|
|
||||||
VALIDATION: "PLZ ENTR VALID FONE NUMBR WE WUNT DISTURB 2 MUCH JUS A BIT"
|
|
||||||
Security:
|
|
||||||
ALREADYLOGGEDIN: "U SHALL NOT PASS!! IF U HAS ANOTHR AKOWNT DAT CAN ACCES DAT PAEG, U CAN LOG IN BELOW."
|
|
||||||
BUTTONSEND: "SEND ME TEH PASWORD RESETZ LINK"
|
|
||||||
CHANGEPASSWORDBELOW: "U CAN CHANGE UR PASWORD BELOW"
|
|
||||||
CHANGEPASSWORDHEADER: "CHANGE UR PASWORD"
|
|
||||||
ENTERNEWPASSWORD: "PLEEZ ENTR NEW PASSWORD. KTHX."
|
|
||||||
ERRORPASSWORDPERMISSION: "U MUST BE LOGGD IN IN ORDR 2 CHANGE UR PASWORD!"
|
|
||||||
LOGGEDOUT: "U HAS BEEN LOGGD OUT. IF U WUD LIEK 2 LOG IN AGAIN, ENTR UR CREDENTIALS BELOW."
|
|
||||||
NOTEPAGESECURED: "TEH PAGE IZ SECURD. ENTR UR CREDENSHALS BELOW AN WE WILL SEND U RITE ALONG."
|
|
||||||
NOTERESETPASSWORD: "ENTR UR E-MAIL ADDRES AN WE R GONA SEND U LINK WIF WHICH U CAN RESET UR PASWORD"
|
|
||||||
PASSWORDSENTHEADER: "I R SENT TEH PASWORD RESET LINK TO '%s'"
|
|
||||||
PASSWORDSENTTEXT: "THXALOT! I R SENT TEH PASWORD RESET LINK TO '%s'"
|
|
||||||
SimpleImageField:
|
|
||||||
NOUPLOAD: "DEREZ NO PIKSHUR UPLOADED"
|
|
||||||
SiteTree:
|
|
||||||
TABMAIN: "MAIN"
|
|
||||||
TableField:
|
|
||||||
ISREQUIRED: "IN %s '%s' IS KINDA REQUIRED"
|
|
||||||
TableField.ss:
|
|
||||||
ToggleCompositeField.ss:
|
|
||||||
HIDE: "HAYD"
|
|
||||||
SHOW: "SHOW"
|
|
||||||
ToggleField:
|
|
||||||
LESS: "lesz"
|
|
||||||
MORE: "mur"
|
|
@ -1244,7 +1244,7 @@ class Versioned_Version extends ViewableData {
|
|||||||
else $component = $component->relation($relation);
|
else $component = $component->relation($relation);
|
||||||
} else {
|
} else {
|
||||||
$component = $component->$relation();
|
$component = $component->$relation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,8 +148,7 @@ class Date extends DBField {
|
|||||||
*/
|
*/
|
||||||
public function FormatI18N($formattingString) {
|
public function FormatI18N($formattingString) {
|
||||||
if($this->value) {
|
if($this->value) {
|
||||||
$fecfrm = strftime($formattingString, strtotime($this->value));
|
return strftime($formattingString, strtotime($this->value));
|
||||||
return utf8_encode($fecfrm);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ class HTMLText extends Text {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If it's got a content tag
|
// If it's got a content tag
|
||||||
if(preg_match('/<(img|embed|object|iframe)[^>]*>/i', $this->value)) {
|
if(preg_match('/<(img|embed|object|iframe|meta|source)[^>]*>/i', $this->value)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ class DirectorTest extends SapphireTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testForceSSLAlternateDomain() {
|
public function testForceSSLAlternateDomain() {
|
||||||
Director::setBaseURL('/');
|
Config::inst()->update('Director', 'alternate_base_url', '/');
|
||||||
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin';
|
$_SERVER['REQUEST_URI'] = Director::baseURL() . 'admin';
|
||||||
$output = Director::forceSSL(array('/^admin/'), 'secure.mysite.com');
|
$output = Director::forceSSL(array('/^admin/'), 'secure.mysite.com');
|
||||||
$this->assertEquals($output, 'https://secure.mysite.com/admin');
|
$this->assertEquals($output, 'https://secure.mysite.com/admin');
|
||||||
|
Loading…
Reference in New Issue
Block a user