123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- <?php
- /**
- * Basic Locale Source tests.
- */
- class TMGMTLocaleSourceTestCase extends TMGMTBaseTestCase {
- static function getInfo() {
- return array(
- 'name' => 'Locale Source tests',
- 'description' => 'Exporting source data from locale and saving translations back',
- 'group' => 'Translation Management',
- );
- }
- function setUp() {
- parent::setUp(array('tmgmt_locale'));
- $this->langcode = 'de';
- $this->context = 'default';
- $file = new stdClass();
- $file->uri = drupal_realpath(drupal_get_path('module', 'tmgmt_locale') . '/tests/test.xx.po');
- $this->pofile = file_save($file);
- $this->setEnvironment($this->langcode);
- $this->setEnvironment('es');
- }
- /**
- * Tests translation of a locale singular term.
- */
- function testSingularTerm() {
- // Load PO file to create a locale structure in the database.
- _locale_import_po($this->pofile, $this->langcode, LOCALE_IMPORT_OVERWRITE, $this->context);
- // Obtain one locale string with translation.
- $locale_object = db_query('SELECT * FROM {locales_source} WHERE source = :source LIMIT 1', array(':source' => 'Hello World'))->fetchObject();
- $source_text = $locale_object->source;
- // Create the new job and job item.
- $job = $this->createJob();
- $job->translator = $this->default_translator->name;
- $job->settings = array();
- $job->save();
- $item1 = $job->addItem('locale', 'default', $locale_object->lid);
- // Check the structure of the imported data.
- $this->assertEqual($item1->item_id, $locale_object->lid, 'Locale Strings object correctly saved');
- $this->assertEqual('Locale', $item1->getSourceType());
- $this->assertEqual('Hello World', $item1->getSourceLabel());
- $job->requestTranslation();
- foreach ($job->getItems() as $item) {
- /* @var $item TMGMTJobItem */
- $item->acceptTranslation();
- $this->assertTrue($item->isAccepted());
- // The source is now available in en and de.
- $this->assertJobItemLangCodes($item, 'en', array('en', 'de'));
- }
- // Check string translation.
- $expected_translation = $job->target_language . '_' . $source_text;
- $this->assertTranslation($locale_object->lid, 'de', $expected_translation);
- // Translate the german translation to spanish.
- $target_langcode = 'es';
- $job = $this->createJob('de', $target_langcode);
- $job->translator = $this->default_translator->name;
- $job->settings = array();
- $job->save();
- $item1 = $job->addItem('locale', 'default', $locale_object->lid);
- $this->assertEqual('Locale', $item1->getSourceType());
- $this->assertEqual($expected_translation, $item1->getSourceLabel());
- $job->requestTranslation();
- foreach ($job->getItems() as $item) {
- /* @var $item TMGMTJobItem */
- $item->acceptTranslation();
- $this->assertTrue($item->isAccepted());
- // The source should be now available for en, de and es languages.
- $this->assertJobItemLangCodes($item, 'en', array('en', 'de', 'es'));
- }
- // Check string translation.
- $this->assertTranslation($locale_object->lid, $target_langcode, $job->target_language . '_' . $expected_translation);
- }
- /**
- * Test if the source is able to pull content in requested language.
- */
- function testRequestDataForSpecificLanguage() {
- $this->setEnvironment('cs');
- _locale_import_po($this->pofile, $this->langcode, LOCALE_IMPORT_OVERWRITE, $this->context);
- $locale_object = db_query('SELECT * FROM {locales_source} WHERE source = :source LIMIT 1', array(':source' => 'Hello World'))->fetchObject();
- $plugin = new TMGMTLocaleSourcePluginController('locale', 'locale');
- $reflection_plugin = new ReflectionClass('TMGMTLocaleSourcePluginController');
- $updateTranslation = $reflection_plugin->getMethod('updateTranslation');
- $updateTranslation->setAccessible(TRUE);
- $updateTranslation->invoke($plugin, $locale_object->lid, 'de', 'de translation');
- // Create the new job and job item.
- $job = $this->createJob('de', 'cs');
- $job->save();
- $job->addItem('locale', 'default', $locale_object->lid);
- $data = $job->getData();
- $this->assertEqual($data[1]['singular']['#text'], 'de translation');
- // Create new job item with a source language for which the translation
- // does not exit.
- $job = $this->createJob('es', 'cs');
- $job->save();
- try {
- $job->addItem('locale', 'default', $locale_object->lid);
- $this->fail('The job item should not be added as there is no translation for language "es"');
- }
- catch (TMGMTException $e) {
- $languages = language_list();
- $this->assertEqual(t('Unable to load %language translation for the locale %id',
- array('%language' => $languages['es']->name, '%id' => $locale_object->lid)), $e->getMessage());
- }
- }
- /**
- * Verifies that strings that need escaping are correctly identified.
- */
- function testEscaping() {
- $lid = db_insert('locales_source')
- ->fields(array(
- 'source' => '@place-holders need %to be !esc_aped.',
- 'textgroup' => 'default',
- 'context' => '',
- ))
- ->execute();
- $job = $this->createJob('en', 'de');
- $job->translator = $this->default_translator->name;
- $job->settings = array();
- $job->save();
- $item = $job->addItem('locale', 'default', $lid);
- $data = $item->getData();
- $expected_escape = array(
- 0 => array('string' => '@place-holders'),
- 20 => array('string' => '%to'),
- 27 => array('string' => '!esc_aped'),
- );
- $this->assertEqual($data['singular']['#escape'], $expected_escape);
- // Invalid patterns that should be ignored.
- $lid = db_insert('locales_source')
- ->fields(array(
- 'source' => '@ % ! example',
- 'textgroup' => 'default',
- 'context' => '',
- ))
- ->execute();
- $item = $job->addItem('locale', 'default', $lid);
- $data = $item->getData();
- $this->assertTrue(empty($data[$lid]['#escape']));
- }
- /**
- * Tests that system behaves correctly with an non-existing locales.
- */
- function testInexistantSource() {
- // Create inexistant locale object.
- $locale_object = new stdClass();
- $locale_object->lid = 0;
- // Create the job.
- $job = $this->createJob();
- $job->translator = $this->default_translator->name;
- $job->settings = array();
- $job->save();
- // Create the job item.
- try {
- $job->addItem('locale', 'default', $locale_object->lid);
- $this->fail('Job item add with an inexistant locale.');
- }
- catch (TMGMTException $e) {
- $this->pass('Exception thrown when trying to translate non-existing locale string');
- }
- // Try to translate a source string without translation from german to
- // spanish.
- $lid = db_insert('locales_source')
- ->fields(array(
- 'source' => 'No translation',
- 'textgroup' => 'default',
- 'context' => '',
- ))
- ->execute();
- $job = $this->createJob('de', 'fr');
- $job->translator = $this->default_translator->name;
- $job->settings = array();
- $job->save();
- try {
- $job->addItem('locale', 'default', $lid);
- $this->fail('Job item add with an non-existing locale did not fail.');
- }
- catch (TMGMTException $e) {
- $this->pass('Job item add with an non-existing locale did fail.');
- }
- }
- /**
- * Asserts a locale translation.
- *
- * @param int $lid
- * The locale source id.
- * @param string $target_langcode
- * The target language code.
- * @param string $expected_translation
- * The expected translation.
- */
- public function assertTranslation($lid, $target_langcode, $expected_translation) {
- $actual_translation = db_query('SELECT translation FROM {locales_target} WHERE lid = :lid AND language = :language', array(
- ':lid' => $lid,
- ':language' => $target_langcode
- ))->fetchField();
- $this->assertEqual($actual_translation, $expected_translation);
- }
- }
|