2008-03-20 04:00:49 +01:00
< ? php
2011-11-26 14:34:11 +01:00
require_once 'Zend/Translate.php' ;
2008-06-15 15:33:53 +02:00
/**
2012-04-12 08:02:46 +02:00
* @ package framework
2008-06-15 15:33:53 +02:00
* @ subpackage tests
*/
2008-03-20 04:00:49 +01:00
class i18nTest extends SapphireTest {
2008-11-06 03:50:14 +01:00
/**
* @ var string $tmpBasePath Used to write language files .
2012-03-24 04:38:57 +01:00
* We don ' t want to store them inside framework ( or in any web - accessible place )
2008-11-06 03:50:14 +01:00
* in case something goes wrong with the file parsing .
*/
protected $alternateBaseSavePath ;
/**
* @ var string $alternateBasePath Fake webroot with a single module
* / i18ntestmodule which contains some files with _t () calls .
*/
protected $alternateBasePath ;
2010-04-12 04:03:16 +02:00
protected $extraDataObjects = array (
'i18nTest_DataObject'
);
2008-11-06 03:50:14 +01:00
function setUp () {
parent :: setUp ();
2011-03-30 08:49:11 +02:00
$this -> alternateBasePath = $this -> getCurrentAbsolutePath () . " /_fakewebroot " ;
2008-11-06 03:50:14 +01:00
$this -> alternateBaseSavePath = TEMP_FOLDER . '/i18nTextCollectorTest_webroot' ;
FileSystem :: makeFolder ( $this -> alternateBaseSavePath );
2011-11-26 14:34:11 +01:00
Director :: setBaseFolder ( $this -> alternateBasePath );
2008-11-06 03:50:14 +01:00
2011-03-23 04:43:50 +01:00
// Push a template loader running from the fake webroot onto the stack.
2011-11-26 14:34:11 +01:00
$templateManifest = new SS_TemplateManifest ( $this -> alternateBasePath , false , true );
$templateManifest -> regenerate ( false );
SS_TemplateLoader :: instance () -> pushManifest ( $templateManifest );
$this -> _oldTheme = SSViewer :: current_theme ();
SSViewer :: set_theme ( 'testtheme1' );
2011-03-23 04:43:50 +01:00
2010-10-15 05:23:02 +02:00
$this -> originalLocale = i18n :: get_locale ();
2011-11-26 14:34:11 +01:00
// Override default adapter to avoid cached translations between tests.
// Emulates behaviour in i18n::get_translators()
$this -> origAdapter = i18n :: get_translator ( 'core' );
$adapter = new Zend_Translate ( array (
'adapter' => 'i18nRailsYamlAdapter' ,
'locale' => i18n :: default_locale (),
'disableNotices' => true ,
));
i18n :: register_translator ( $adapter , 'core' );
$adapter -> removeCache ();
i18n :: include_by_locale ( 'en' );
2008-11-06 03:50:14 +01:00
}
function tearDown () {
2011-03-23 04:43:50 +01:00
SS_TemplateLoader :: instance () -> popManifest ();
2010-10-15 05:23:02 +02:00
i18n :: set_locale ( $this -> originalLocale );
2011-11-26 14:34:11 +01:00
Director :: setBaseFolder ( null );
SSViewer :: set_theme ( $this -> _oldTheme );
i18n :: register_translator ( $this -> origAdapter , 'core' );
2008-12-04 23:38:32 +01:00
parent :: tearDown ();
2008-11-06 03:50:14 +01:00
}
2010-10-15 05:23:02 +02:00
function testDateFormatFromLocale () {
i18n :: set_locale ( 'en_US' );
2011-05-30 11:33:27 +02:00
$this -> assertEquals ( 'MMM d, y' , i18n :: get_date_format ());
2010-10-15 05:23:02 +02:00
i18n :: set_locale ( 'en_NZ' );
$this -> assertEquals ( 'd/MM/yyyy' , i18n :: get_date_format ());
i18n :: set_locale ( 'en_US' );
}
function testTimeFormatFromLocale () {
i18n :: set_locale ( 'en_US' );
2011-05-30 11:33:27 +02:00
$this -> assertEquals ( 'h:mm:ss a' , i18n :: get_time_format ());
2010-10-15 05:23:02 +02:00
i18n :: set_locale ( 'de_DE' );
$this -> assertEquals ( 'HH:mm:ss' , i18n :: get_time_format ());
i18n :: set_locale ( 'en_US' );
}
function testDateFormatCustom () {
i18n :: set_locale ( 'en_US' );
2011-05-30 11:33:27 +02:00
$this -> assertEquals ( 'MMM d, y' , i18n :: get_date_format ());
2010-10-15 05:23:02 +02:00
i18n :: set_date_format ( 'd/MM/yyyy' );
$this -> assertEquals ( 'd/MM/yyyy' , i18n :: get_date_format ());
}
function testTimeFormatCustom () {
i18n :: set_locale ( 'en_US' );
2011-05-30 11:33:27 +02:00
$this -> assertEquals ( 'h:mm:ss a' , i18n :: get_time_format ());
2010-10-15 05:23:02 +02:00
i18n :: set_time_format ( 'HH:mm:ss' );
$this -> assertEquals ( 'HH:mm:ss' , i18n :: get_time_format ());
}
2008-03-20 04:00:49 +01:00
function testGetExistingTranslations () {
$translations = i18n :: get_existing_translations ();
$this -> assertTrue ( isset ( $translations [ 'en_US' ]), 'Checking for en_US translation' );
2011-11-26 14:34:11 +01:00
$this -> assertEquals ( $translations [ 'en_US' ], 'English (United States)' );
2008-03-20 04:00:49 +01:00
$this -> assertTrue ( isset ( $translations [ 'de_DE' ]), 'Checking for de_DE translation' );
}
2008-10-29 22:07:17 +01:00
function testDataObjectFieldLabels () {
$oldLocale = i18n :: get_locale ();
i18n :: set_locale ( 'de_DE' );
2008-11-01 14:26:08 +01:00
$obj = new i18nTest_DataObject ();
2008-10-29 22:07:17 +01:00
2011-11-26 14:34:11 +01:00
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTest_DataObject.MyProperty' => 'MyProperty'
), 'en_US' );
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTest_DataObject.MyProperty' => 'Mein Attribut'
), 'de_DE' );
2008-10-29 22:07:17 +01:00
$this -> assertEquals (
$obj -> fieldLabel ( 'MyProperty' ),
'Mein Attribut'
);
2011-11-26 14:34:11 +01:00
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTest_DataObject.MyUntranslatedProperty' => 'Mein Attribut'
), 'en_US' );
2008-10-29 22:07:17 +01:00
$this -> assertEquals (
$obj -> fieldLabel ( 'MyUntranslatedProperty' ),
'My Untranslated Property'
);
i18n :: set_locale ( $oldLocale );
}
2008-11-01 14:26:08 +01:00
function testProvideI18nEntities () {
$oldLocale = i18n :: get_locale ();
i18n :: set_locale ( 'en_US' );
2011-11-26 14:34:11 +01:00
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTest_Object.MyProperty' => 'Untranslated'
), 'en_US' );
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTest_Object.my_translatable_property' => 'Übersetzt'
), 'de_DE' );
2008-11-01 14:26:08 +01:00
$this -> assertEquals (
i18nTest_Object :: $my_translatable_property ,
'Untranslated'
);
$this -> assertEquals (
i18nTest_Object :: my_translatable_property (),
'Untranslated'
);
i18n :: set_locale ( 'en_US' );
$this -> assertEquals (
i18nTest_Object :: my_translatable_property (),
'Untranslated' ,
'Getter returns original static value when called in default locale'
);
i18n :: set_locale ( 'de_DE' );
$this -> assertEquals (
i18nTest_Object :: my_translatable_property (),
'Übersetzt' ,
'Getter returns translated value when called in another locale'
);
}
2008-11-06 03:50:14 +01:00
function testTemplateTranslation () {
$oldLocale = i18n :: get_locale ();
2011-04-12 05:11:33 +02:00
2008-11-06 03:50:14 +01:00
i18n :: set_locale ( 'en_US' );
2011-11-26 14:34:11 +01:00
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTestModule.MAINTEMPLATE' => 'Main Template' ,
2012-04-18 03:21:07 +02:00
'i18nTestModule.ss.SPRINTFNONAMESPACE' => 'My replacement no namespace: %s' ,
2011-11-26 14:34:11 +01:00
'i18nTestModule.LAYOUTTEMPLATE' => 'Layout Template' ,
2012-04-18 03:21:07 +02:00
'i18nTestModule.ss.LAYOUTTEMPLATENONAMESPACE' => 'Layout Template no namespace' ,
2011-11-26 14:34:11 +01:00
'i18nTestModule.SPRINTFNAMESPACE' => 'My replacement: %s' ,
'i18nTestModule.WITHNAMESPACE' => 'Include Entity with Namespace' ,
2012-04-18 03:21:07 +02:00
'i18nTestModuleInclude.ss.NONAMESPACE' => 'Include Entity without Namespace' ,
2011-11-26 14:34:11 +01:00
'i18nTestModuleInclude.ss.SPRINTFINCLUDENAMESPACE' => 'My include replacement: %s' ,
2012-04-18 03:21:07 +02:00
'i18nTestModuleInclude.ss.SPRINTFINCLUDENONAMESPACE' => 'My include replacement no namespace: %s'
2011-11-26 14:34:11 +01:00
), 'en_US' );
2008-11-06 03:50:14 +01:00
$viewer = new SSViewer ( 'i18nTestModule' );
$parsedHtml = $viewer -> process ( new ArrayData ( array ( 'TestProperty' => 'TestPropertyValue' )));
$this -> assertContains (
" Layout Template \n " ,
$parsedHtml
);
2012-04-18 03:21:07 +02:00
$this -> assertContains (
" Layout Template no namespace \n " ,
$parsedHtml
);
2008-11-06 03:50:14 +01:00
i18n :: set_locale ( 'de_DE' );
2011-11-26 14:34:11 +01:00
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTestModule.MAINTEMPLATE' => 'TRANS Main Template' ,
2012-04-18 03:21:07 +02:00
'i18nTestModule.ss.SPRINTFNONAMESPACE' => 'TRANS My replacement no namespace: %s' ,
2011-11-26 14:34:11 +01:00
'i18nTestModule.LAYOUTTEMPLATE' => 'TRANS Layout Template' ,
2012-04-18 03:21:07 +02:00
'i18nTestModule.ss.LAYOUTTEMPLATENONAMESPACE' => 'TRANS Layout Template no namespace' ,
2011-11-26 14:34:11 +01:00
'i18nTestModule.SPRINTFNAMESPACE' => 'TRANS My replacement: %s' ,
'i18nTestModule.WITHNAMESPACE' => 'TRANS Include Entity with Namespace' ,
2012-04-18 03:21:07 +02:00
'i18nTestModuleInclude.ss.NONAMESPACE' => 'TRANS Include Entity without Namespace' ,
2011-11-26 14:34:11 +01:00
'i18nTestModuleInclude.ss.SPRINTFINCLUDENAMESPACE' => 'TRANS My include replacement: %s' ,
2012-04-18 03:21:07 +02:00
'i18nTestModuleInclude.ss.SPRINTFINCLUDENONAMESPACE' => 'TRANS My include replacement no namespace: %s'
2011-11-26 14:34:11 +01:00
), 'de_DE' );
2008-11-06 03:50:14 +01:00
$viewer = new SSViewer ( 'i18nTestModule' );
$parsedHtml = $viewer -> process ( new ArrayData ( array ( 'TestProperty' => 'TestPropertyValue' )));
$this -> assertContains (
" TRANS Main Template \n " ,
$parsedHtml
);
$this -> assertContains (
" TRANS Layout Template \n " ,
$parsedHtml
);
2012-04-18 03:21:07 +02:00
$this -> assertContains (
" TRANS Layout Template no namespace " ,
$parsedHtml
);
2008-11-06 03:50:14 +01:00
$this -> assertContains (
" TRANS My replacement: TestPropertyValue " ,
$parsedHtml
);
$this -> assertContains (
" TRANS Include Entity with Namespace " ,
$parsedHtml
);
2012-04-18 03:21:07 +02:00
$this -> assertContains (
" TRANS Include Entity without Namespace " ,
$parsedHtml
);
2008-11-06 03:50:14 +01:00
$this -> assertContains (
" TRANS My include replacement: TestPropertyValue " ,
$parsedHtml
);
2012-04-18 03:21:07 +02:00
$this -> assertContains (
" TRANS My include replacement no namespace: TestPropertyValue " ,
$parsedHtml
);
2008-11-06 03:50:14 +01:00
i18n :: set_locale ( $oldLocale );
}
2011-04-12 05:11:33 +02:00
function testNewTMethodSignature () {
global $lang ;
$oldLocale = i18n :: get_locale ();
i18n :: set_locale ( 'en_US' );
2012-04-16 08:58:42 +02:00
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTestModule.NEWMETHODSIG' => 'TRANS New _t method signature test' ,
2012-05-01 20:56:07 +02:00
'i18nTestModule.INJECTIONS' => 'TRANS Hello {name} {greeting}. But it is late, {goodbye}' ,
'i18nTestModule.INJECTIONSLEGACY' => 'TRANS Hello %s %s. But it is late, %s' ,
2012-04-16 08:58:42 +02:00
), 'en_US' );
2011-04-12 05:11:33 +02:00
$entity = " i18nTestModule.INJECTIONS " ;
$default = " Hello { name} { greeting}. But it is late, { goodbye} " ;
$translated = i18n :: _t ( 'i18nTestModule.NEWMETHODSIG' , " New _t method signature test " );
$this -> assertContains (
" TRANS New _t method signature test " ,
$translated
);
$translated = i18n :: _t ( $entity . '_DOES_NOT_EXIST' , $default , array ( " name " => " Mark " , " greeting " => " welcome " , " goodbye " => " bye " ));
$this -> assertContains (
" Hello Mark welcome. But it is late, bye " ,
$translated , " Testing fallback to the translation default (but using the injection array) "
);
$translated = i18n :: _t ( $entity , $default , array ( " name " => " Paul " , " greeting " => " good you are here " , " goodbye " => " see you " ));
$this -> assertContains (
" TRANS Hello Paul good you are here. But it is late, see you " ,
$translated , " Testing entity, default string and injection array "
);
$translated = i18n :: _t ( $entity , $default , " New context (this should be ignored) " , array ( " name " => " Steffen " , " greeting " => " willkommen " , " goodbye " => " wiedersehen " ));
$this -> assertContains (
" TRANS Hello Steffen willkommen. But it is late, wiedersehen " ,
$translated , " Full test of translation, using default, context and injection array "
);
$translated = i18n :: _t ( $entity , array ( " name " => " Cat " , " greeting " => " meow " , " goodbye " => " meow " ));
$this -> assertContains (
" TRANS Hello Cat meow. But it is late, meow " ,
$translated , " Testing a translation with just entity and injection array "
);
2012-05-01 20:56:07 +02:00
$translated = i18n :: _t (
'i18nTestModule.INJECTIONSLEGACY' , // has %s placeholders
array ( " name " => " Cat " , " greeting2 " => " meow " , " goodbye " => " meow " )
);
$this -> assertContains (
" TRANS Hello Cat meow. But it is late, meow " ,
$translated , " Testing sprintf placeholders with named injections "
);
$translated = i18n :: _t (
'i18nTestModule.INJECTIONS' , // has {name} placeholders
array ( " Cat " , " meow " , " meow " )
);
$this -> assertContains (
" TRANS Hello Cat meow. But it is late, meow " ,
$translated , " Testing named injection placeholders with unnamed injections "
);
2011-04-12 05:11:33 +02:00
i18n :: set_locale ( $oldLocale );
}
/**
* See @ i18nTestModule . ss for the template that is being used for this test
* */
function testNewTemplateTranslation () {
global $lang ;
$oldLocale = i18n :: get_locale ();
i18n :: set_locale ( 'en_US' );
2012-04-16 08:58:42 +02:00
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTestModule.NEWMETHODSIG' => 'TRANS New _t method signature test' ,
'i18nTestModule.INJECTIONS' => 'TRANS Hello {name} {greeting}. But it is late, {goodbye}'
), 'en_US' );
2011-04-12 05:11:33 +02:00
$viewer = new SSViewer ( 'i18nTestModule' );
$parsedHtml = $viewer -> process ( new ArrayData ( array ( 'TestProperty' => 'TestPropertyValue' )));
$this -> assertContains (
" Hello Mark welcome. But it is late, bye \n " ,
$parsedHtml , " Testing fallback to the translation default (but using the injection array) "
);
2012-04-16 08:58:42 +02:00
2011-04-12 05:11:33 +02:00
$this -> assertContains (
" TRANS Hello Paul good you are here. But it is late, see you \n " ,
$parsedHtml , " Testing entity, default string and injection array "
);
$this -> assertContains (
" TRANS Hello Cat meow. But it is late, meow \n " ,
$parsedHtml , " Testing a translation with just entity and injection array "
);
//test injected calls
$this -> assertContains (
" TRANS Hello " . Director :: absoluteBaseURL () . " " . i18n :: get_locale () . " . But it is late, global calls \n " ,
$parsedHtml , " Testing a translation with just entity and injection array, but with global variables injected in "
);
i18n :: set_locale ( $oldLocale );
}
2009-04-30 01:15:38 +02:00
function testGetLocaleFromLang () {
$this -> assertEquals ( 'en_US' , i18n :: get_locale_from_lang ( 'en' ));
$this -> assertEquals ( 'de_DE' , i18n :: get_locale_from_lang ( 'de_DE' ));
$this -> assertEquals ( 'xy_XY' , i18n :: get_locale_from_lang ( 'xy' ));
}
2010-12-03 01:27:41 +01:00
function testValidateLocale () {
$this -> assertTrue ( i18n :: validate_locale ( 'en_US' ), 'Known locale in underscore format is valid' );
$this -> assertTrue ( i18n :: validate_locale ( 'en-US' ), 'Known locale in dash format is valid' );
$this -> assertFalse ( i18n :: validate_locale ( 'en' ), 'Short lang format is not valid' );
$this -> assertFalse ( i18n :: validate_locale ( 'xx_XX' ), 'Unknown locale in correct format is not valid' );
$this -> assertFalse ( i18n :: validate_locale ( '' ), 'Empty string is not valid' );
}
2011-11-26 14:34:11 +01:00
function testTranslate () {
$oldLocale = i18n :: get_locale ();
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTestModule.ENTITY' => 'Entity with "Double Quotes"' ,
), 'en_US' );
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTestModule.ENTITY' => 'Entity with "Double Quotes" (de)' ,
'i18nTestModule.ADDITION' => 'Addition (de)' ,
), 'de' );
i18n :: get_translator ( 'core' ) -> getAdapter () -> addTranslation ( array (
'i18nTestModule.ENTITY' => 'Entity with "Double Quotes" (de_AT)' ,
), 'de_AT' );
$this -> assertEquals ( i18n :: _t ( 'i18nTestModule.ENTITY' ), 'Entity with "Double Quotes"' ,
'Returns translation in default language'
);
i18n :: set_locale ( 'de' );
$this -> assertEquals ( i18n :: _t ( 'i18nTestModule.ENTITY' ), 'Entity with "Double Quotes" (de)' ,
'Returns translation according to current locale'
);
i18n :: set_locale ( 'de_AT' );
$this -> assertEquals ( i18n :: _t ( 'i18nTestModule.ENTITY' ), 'Entity with "Double Quotes" (de_AT)' ,
'Returns specific regional translation if available'
);
$this -> assertEquals ( i18n :: _t ( 'i18nTestModule.ADDITION' ), 'Addition (de)' ,
'Returns fallback non-regional translation if regional is not available'
);
i18n :: set_locale ( 'fr' );
$this -> assertEquals ( i18n :: _t ( 'i18nTestModule.ENTITY' ), '' ,
'Returns empty translation without default string if locale is not found'
);
$this -> assertEquals ( i18n :: _t ( 'i18nTestModule.ENTITY' , 'default' ), 'default' ,
'Returns default string if locale is not found'
);
i18n :: set_locale ( $oldLocale );
}
function testIncludeByLocale () {
// Looping through modules, so we can test the translation autoloading
// Load non-exclusive to retain core class autoloading
$classManifest = new SS_ClassManifest ( $this -> alternateBasePath , true , true , false );
SS_ClassLoader :: instance () -> pushManifest ( $classManifest );
$adapter = i18n :: get_translator ( 'core' ) -> getAdapter ();
$this -> assertTrue ( $adapter -> isAvailable ( 'en' ));
$this -> assertFalse ( $adapter -> isAvailable ( 'de' ));
$this -> assertFalse ( $adapter -> isTranslated ( 'i18nTestModule.ENTITY' , 'de' ),
'Existing unloaded entity not available before call'
);
$this -> assertFalse ( $adapter -> isTranslated ( 'i18nTestModule.ENTITY' , 'af' ),
'Non-existing unloaded entity not available before call'
);
2010-10-15 03:15:54 +02:00
2011-11-26 14:34:11 +01:00
i18n :: include_by_locale ( 'de' );
$this -> assertTrue ( $adapter -> isAvailable ( 'en' ));
$this -> assertTrue ( $adapter -> isAvailable ( 'de' ));
$this -> assertTrue ( $adapter -> isTranslated ( 'i18nTestModule.ENTITY' , null , 'de' ), 'Includes module files' );
$this -> assertTrue ( $adapter -> isTranslated ( 'i18nTestTheme1.LAYOUTTEMPLATE' , null , 'de' ), 'Includes theme files' );
$this -> assertTrue ( $adapter -> isTranslated ( 'i18nTestModule.OTHERENTITY' , null , 'de' ), 'Includes submodule files' );
SS_ClassLoader :: instance () -> popManifest ();
2010-10-15 03:15:54 +02:00
}
2012-05-29 13:54:49 +02:00
function testIncludeByLocaleWithoutFallbackLanguage () {
$classManifest = new SS_ClassManifest ( $this -> alternateBasePath , true , true , false );
SS_ClassLoader :: instance () -> pushManifest ( $classManifest );
$adapter = i18n :: get_translator ( 'core' ) -> getAdapter ();
$this -> assertTrue ( $adapter -> isAvailable ( 'en' ));
$this -> assertFalse ( $adapter -> isAvailable ( 'mi' )); // not defined at all
$this -> assertFalse ( $adapter -> isAvailable ( 'mi_NZ' )); // defined, but not loaded yet
$this -> assertFalse ( $adapter -> isTranslated ( 'i18nTestModule.ENTITY' , 'mi' ),
'Existing unloaded entity not available before call'
);
$this -> assertFalse ( $adapter -> isTranslated ( 'i18nTestModule.ENTITY' , 'mi_NZ' ),
'Non-existing unloaded entity not available before call'
);
i18n :: include_by_locale ( 'mi_NZ' );
$this -> assertFalse ( $adapter -> isAvailable ( 'mi' ));
$this -> assertTrue ( $adapter -> isAvailable ( 'mi_NZ' ));
$this -> assertTrue ( $adapter -> isTranslated ( 'i18nTestModule.ENTITY' , null , 'mi_NZ' ), 'Includes module files' );
SS_ClassLoader :: instance () -> popManifest ();
}
2011-11-26 14:34:11 +01:00
function testRegisterTranslator () {
$translator = new Zend_Translate ( array (
'adapter' => 'i18nTest_CustomTranslatorAdapter' ,
'disableNotices' => true ,
));
i18n :: register_translator ( $translator , 'custom' , 10 );
$translators = i18n :: get_translators ();
$this -> assertArrayHasKey ( 'custom' , $translators [ 10 ]);
2012-05-09 12:43:22 +02:00
$this -> assertInstanceOf ( 'Zend_Translate' , $translators [ 10 ][ 'custom' ]);
$this -> assertInstanceOf ( 'i18nTest_CustomTranslatorAdapter' , $translators [ 10 ][ 'custom' ] -> getAdapter ());
2011-11-26 14:34:11 +01:00
i18n :: unregister_translator ( 'custom' );
$translators = i18n :: get_translators ();
$this -> assertArrayNotHasKey ( 'custom' , $translators [ 10 ]);
}
function testMultipleTranslators () {
// Looping through modules, so we can test the translation autoloading
// Load non-exclusive to retain core class autoloading
$classManifest = new SS_ClassManifest ( $this -> alternateBasePath , true , true , false );
SS_ClassLoader :: instance () -> pushManifest ( $classManifest );
2012-04-15 16:46:30 +02:00
// Changed manifest, so we also need to unset all previously collected messages.
// The easiest way to do this it to register a new adapter.
$adapter = new Zend_Translate ( array (
'adapter' => 'i18nRailsYamlAdapter' ,
'locale' => i18n :: default_locale (),
'disableNotices' => true ,
));
i18n :: register_translator ( $adapter , 'core' );
2011-11-26 14:34:11 +01:00
i18n :: set_locale ( 'en_US' );
2012-04-15 16:46:30 +02:00
2011-11-26 14:34:11 +01:00
$this -> assertEquals (
i18n :: _t ( 'i18nTestModule.ENTITY' ),
'Entity with "Double Quotes"'
);
$this -> assertEquals (
i18n :: _t ( 'AdapterEntity1' , 'AdapterEntity1' ),
'AdapterEntity1' ,
'Falls back to default string if not found'
);
// Add a new translator
$translator = new Zend_Translate ( array (
'adapter' => 'i18nTest_CustomTranslatorAdapter' ,
'disableNotices' => true ,
));
i18n :: register_translator ( $translator , 'custom' , 11 );
$this -> assertEquals (
i18n :: _t ( 'i18nTestModule.ENTITY' ),
2012-05-28 02:29:50 +02:00
'i18nTestModule.ENTITY CustomAdapter (en_US)' ,
2011-11-26 14:34:11 +01:00
'Existing entities overruled by adapter with higher priority'
);
$this -> assertEquals (
i18n :: _t ( 'AdapterEntity1' , 'AdapterEntity1' ),
2012-05-28 02:29:50 +02:00
'AdapterEntity1 CustomAdapter (en_US)' ,
2011-11-26 14:34:11 +01:00
'New entities only defined in new adapter are detected'
);
2012-05-28 04:10:58 +02:00
2011-11-26 14:34:11 +01:00
// Add a second new translator to test priorities
$translator = new Zend_Translate ( array (
'adapter' => 'i18nTest_OtherCustomTranslatorAdapter' ,
'disableNotices' => true ,
));
i18n :: register_translator ( $translator , 'othercustom_lower_prio' , 5 );
$this -> assertEquals (
i18n :: _t ( 'i18nTestModule.ENTITY' ),
2012-05-28 02:29:50 +02:00
'i18nTestModule.ENTITY CustomAdapter (en_US)' ,
2011-11-26 14:34:11 +01:00
'Adapter with lower priority loses'
);
// Add a third new translator to test priorities
$translator = new Zend_Translate ( array (
'adapter' => 'i18nTest_OtherCustomTranslatorAdapter' ,
'disableNotices' => true ,
));
2012-05-28 04:10:58 +02:00
2011-11-26 14:34:11 +01:00
i18n :: register_translator ( $translator , 'othercustom_higher_prio' , 15 );
2012-05-28 04:10:58 +02:00
2011-11-26 14:34:11 +01:00
$this -> assertEquals (
i18n :: _t ( 'i18nTestModule.ENTITY' ),
2012-05-28 06:20:28 +02:00
'i18nTestModule.ENTITY OtherCustomAdapter (en_US)' ,
2011-11-26 14:34:11 +01:00
'Adapter with higher priority wins'
);
i18n :: unregister_translator ( 'custom' );
i18n :: unregister_translator ( 'othercustom_lower_prio' );
i18n :: unregister_translator ( 'othercustom_higher_prio' );
SS_ClassLoader :: instance () -> popManifest ();
}
2008-10-29 22:07:17 +01:00
}
2008-11-01 14:26:08 +01:00
class i18nTest_DataObject extends DataObject implements TestOnly {
2008-10-29 22:07:17 +01:00
static $db = array (
'MyProperty' => 'Varchar' ,
'MyUntranslatedProperty' => 'Text'
);
static $has_one = array (
'HasOneRelation' => 'Member'
);
static $has_many = array (
'HasManyRelation' => 'Member'
);
static $many_many = array (
'ManyManyRelation' => 'Member'
);
2009-04-29 02:07:39 +02:00
/**
*
* @ param boolean $includerelations a boolean value to indicate if the labels returned include relation fields
*
*/
function fieldLabels ( $includerelations = true ) {
$labels = parent :: fieldLabels ( $includerelations );
2008-11-02 21:01:49 +01:00
$labels [ 'MyProperty' ] = _t ( 'i18nTest_DataObject.MyProperty' , 'My Property' );
return $labels ;
}
2008-05-16 06:14:50 +02:00
}
2008-11-01 14:26:08 +01:00
class i18nTest_Object extends Object implements TestOnly , i18nEntityProvider {
static $my_translatable_property = " Untranslated " ;
static function my_translatable_property () {
return _t ( " i18nTest_Object.my_translatable_property " , self :: $my_translatable_property );
}
function provideI18nEntities () {
return array (
" i18nTest_Object.my_translatable_property " => array (
self :: $my_translatable_property
)
);
}
}
2012-02-12 21:22:11 +01:00
2011-11-26 14:34:11 +01:00
class i18nTest_CustomTranslatorAdapter extends Zend_Translate_Adapter implements TestOnly , i18nTranslateAdapterInterface {
protected function _loadTranslationData ( $filename , $locale , array $options = array ()) {
return array (
$locale => array (
'AdapterEntity1' => 'AdapterEntity1 CustomAdapter (' . $locale . ')' ,
'i18nTestModule.ENTITY' => 'i18nTestModule.ENTITY CustomAdapter (' . $locale . ')' ,
)
);
}
function toString () {
return 'i18nTest_CustomTranslatorAdapter' ;
}
function getFilenameForLocale ( $locale ) {
return false ; // not file based
}
}
class i18nTest_OtherCustomTranslatorAdapter extends Zend_Translate_Adapter implements TestOnly , i18nTranslateAdapterInterface {
protected function _loadTranslationData ( $filename , $locale , array $options = array ()) {
return array (
$locale => array (
'i18nTestModule.ENTITY' => 'i18nTestModule.ENTITY OtherCustomAdapter (' . $locale . ')' ,
)
);
}
function toString () {
return 'i18nTest_OtherCustomTranslatorAdapter' ;
}
function getFilenameForLocale ( $locale ) {
return false ; // not file based
}
}