diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php index 349554814907db2580adca536a6c03b0510fee0b..6d777aa404875a54ed1bb8e30894497c75ad932f 100644 --- a/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php +++ b/core/modules/language/lib/Drupal/language/Tests/LanguageUILanguageNegotiationTest.php @@ -103,15 +103,29 @@ class LanguageUILanguageNegotiationTest extends WebTestBase { $language_browser_fallback_string = "In $langcode_browser_fallback In $langcode_browser_fallback In $langcode_browser_fallback"; $language_string = "In $langcode In $langcode In $langcode"; // Do a translate search of our target string. - $edit = array( 'string' => $default_string); - $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Filter')); - // Should find the string and now click edit to post translated string. - $this->clickLink('edit'); + $search = array( + 'string' => $default_string, + 'langcode' => $langcode_browser_fallback, + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; + $edit = array( + $lid => $language_browser_fallback_string, + ); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); + + $search = array( + 'string' => $default_string, + 'langcode' => $langcode, + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; $edit = array( - "translations[$langcode_browser_fallback][0]" => $language_browser_fallback_string, - "translations[$langcode][0]" => $language_string, + $lid => $language_string, ); - $this->drupalPost(NULL, $edit, t('Save translations')); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); // Configure URL language rewrite. variable_set('language_negotiation_url_type', LANGUAGE_TYPE_INTERFACE); diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php index 3beee64b24a9d1afe028ec2d96ed918f5b2c9a41..6fe77c2c82e2183308fadfcffacd5c79e3b6c055 100644 --- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleImportFunctionalTest.php @@ -91,7 +91,7 @@ class LocaleImportFunctionalTest extends WebTestBase { // Ensure string wasn't overwritten. $search = array( 'string' => 'Montag', - 'language' => 'fr', + 'langcode' => 'fr', 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -113,7 +113,7 @@ class LocaleImportFunctionalTest extends WebTestBase { // Ensure string was overwritten. $search = array( 'string' => 'Montag', - 'language' => 'fr', + 'langcode' => 'fr', 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -149,7 +149,7 @@ class LocaleImportFunctionalTest extends WebTestBase { // Ensure string wasn't overwritten. $search = array( 'string' => 'januari', - 'language' => 'fr', + 'langcode' => 'fr', 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -168,7 +168,7 @@ class LocaleImportFunctionalTest extends WebTestBase { // Ensure string was overwritten. $search = array( 'string' => 'januari', - 'language' => 'fr', + 'langcode' => 'fr', 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -201,7 +201,7 @@ class LocaleImportFunctionalTest extends WebTestBase { // Ensure strings were successfully imported. $search = array( 'string' => 'lundi', - 'language' => $langcode, + 'langcode' => $langcode, 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -241,20 +241,15 @@ class LocaleImportFunctionalTest extends WebTestBase { 'overwrite_options[not_customized]' => TRUE, )); $this->assertRaw(t('The translation was successfully imported. There are %number newly created translated strings, %update strings were updated and %delete strings were removed.', array('%number' => 0, '%update' => 0, '%delete' => 1)), t('The translation file was successfully imported.')); - // This is the language indicator on the translation search screen for - // untranslated strings. - $language_indicator = "$langcode "; + $str = "Operations"; $search = array( 'string' => $str, - 'language' => 'all', - 'translation' => 'all', + 'langcode' => $langcode, + 'translation' => 'untranslated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); - // assertText() seems to remove the input field where $str always could be - // found, so this is not a false assert. - $this->assertText($str, t('Search found the string.')); - $this->assertRaw($language_indicator, t('String is untranslated again.')); + $this->assertText($str, t('Search found the string as untranslated.')); } /** diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocalePluralFormatTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocalePluralFormatTest.php index 6d45d2152258e87d52f1e101fa55cd16c3d6c93f..8054ca13be653f5e35addf1c420de9250f8514d1 100644 --- a/core/modules/locale/lib/Drupal/locale/Tests/LocalePluralFormatTest.php +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocalePluralFormatTest.php @@ -160,29 +160,41 @@ class LocalePluralFormatTest extends WebTestBase { // Check if the source appears on the translation page. $this->drupalGet('admin/config/regional/translate'); - $this->assertText("1 hour, @count hours"); + $this->assertText("1 hour"); + $this->assertText("@count hours"); // Look up editing page for this plural string and check fields. - $lid = db_query("SELECT lid FROM {locales_source} WHERE source = :source AND context = ''", array(':source' => "1 hour" . LOCALE_PLURAL_DELIMITER . "@count hours"))->fetchField(); - $path = 'admin/config/regional/translate/edit/' . $lid; + $path = 'admin/config/regional/translate/'; $this->drupalGet($path); // Labels for plural editing elements. $this->assertText('Singular form'); $this->assertText('First plural form'); $this->assertText('2. plural form'); - // Plural values for both languages. - $this->assertFieldById('edit-translations-hr-0', '@count sat'); - $this->assertFieldById('edit-translations-hr-1', '@count sata'); - $this->assertFieldById('edit-translations-hr-2', '@count sati'); - $this->assertNoFieldById('edit-translations-hr-3'); - $this->assertFieldById('edit-translations-fr-0', '1 heure'); - $this->assertFieldById('edit-translations-fr-1', '@count heures'); - $this->assertNoFieldById('edit-translations-fr-2'); - - // Edit some translations and see if that took effect. + $this->assertNoText('3. plural form'); + + // Plural values for langcode hr. + $this->assertText('@count sat'); + $this->assertText('@count sata'); + $this->assertText('@count sati'); + + // Edit langcode hr translations and see if that took effect. + $edit = array( + 'strings[10][translations][1]' => '@count sata edited', + ); + $this->drupalPost($path, $edit, t('Save translations')); + + $search = array( + 'langcode' => 'fr', + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); + // Plural values for the langcode fr. + $this->assertText('1 heure'); + $this->assertText('@count heures'); + $this->assertNoText('2. plural form'); + + // Edit langcode fr translations and see if that took effect. $edit = array( - 'translations[fr][0]' => '1 heure edited', - 'translations[hr][1]' => '@count sata edited', + 'strings[10][translations][0]' => '1 heure edited', ); $this->drupalPost($path, $edit, t('Save translations')); @@ -191,17 +203,31 @@ class LocalePluralFormatTest extends WebTestBase { // not save our source string for performance optimization if we do not ask // specifically for a language. format_plural(1, '1 day', '@count days', array(), array('langcode' => 'fr')); - // Look up editing page for this plural string and check fields. $lid = db_query("SELECT lid FROM {locales_source} WHERE source = :source AND context = ''", array(':source' => "1 day" . LOCALE_PLURAL_DELIMITER . "@count days"))->fetchField(); - $path = 'admin/config/regional/translate/edit/' . $lid; + // Look up editing page for this plural string and check fields. + $search = array( + 'string' => '1 day', + 'langcode' => 'fr', + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); + + // Save complete translations for the string in langcode fr. + $edit = array( + "strings[$lid][translations][0]" => '1 jour', + "strings[$lid][translations][1]" => '@count jours', + ); + $this->drupalPost($path, $edit, t('Save translations')); - // Save complete translations for the string in both languages. + // Save complete translations for the string in langcode hr. + $search = array( + 'string' => '1 day', + 'langcode' => 'hr', + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); $edit = array( - 'translations[fr][0]' => '1 jour', - 'translations[fr][1]' => '@count jours', - 'translations[hr][0]' => '@count dan', - 'translations[hr][1]' => '@count dana', - 'translations[hr][2]' => '@count dana', + "strings[$lid][translations][0]" => '@count dan', + "strings[$lid][translations][1]" => '@count dana', + "strings[$lid][translations][2]" => '@count dana', ); $this->drupalPost($path, $edit, t('Save translations')); @@ -222,7 +248,6 @@ class LocalePluralFormatTest extends WebTestBase { $this->assertRaw("msgid \"1 day\"\nmsgid_plural \"@count days\"\nmsgstr[0] \"@count dan\"\nmsgstr[1] \"@count dana\"\nmsgstr[2] \"@count dana\"", t('Added Croatian plural translations exported properly.')); } - /** * Imports a standalone .po file in a given language. * diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationTest.php index 28e0834ba48d3f0b307ca0f4753382d2a3b3aaed..3fbf2ff84032dc2a226f7d7a02178eaf0a9943c9 100644 --- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationTest.php +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleTranslationTest.php @@ -67,21 +67,19 @@ class LocaleTranslationTest extends WebTestBase { $this->drupalLogin($translate_user); $search = array( 'string' => $name, - 'language' => 'all', - 'translation' => 'all', + 'langcode' => $langcode, + 'translation' => 'untranslated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); - // assertText() seems to remove the input field where $name always could be - // found, so this is not a false assert. See how assertNoText succeeds - // later. - $this->assertText($name, t('Search found the name.')); - $this->assertRaw($language_indicator, t('Name is untranslated.')); + $this->assertText($name, t('Search found the string as untranslated.')); + // Assume this is the only result, given the random name. - $this->clickLink(t('edit')); // We save the lid from the path. - $matches = array(); - preg_match('!admin/config/regional/translate/edit/(\d+)!', $this->getUrl(), $matches); - $lid = $matches[1]; + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; + $edit = array( + $lid => $this->randomName(), + ); // No t() here, it's surely not translated yet. $this->assertText($name, t('name found on edit screen.')); $this->assertNoText('English', t('No way to translate the string to English.')); @@ -91,24 +89,46 @@ class LocaleTranslationTest extends WebTestBase { $this->drupalLogout(); $this->drupalLogin($translate_user); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); - // assertText() seems to remove the input field where $name always could be - // found, so this is not a false assert. See how assertNoText succeeds - // later. - $this->assertText($name, t('Search found the name.')); - $this->assertRaw($language_indicator, t('Name is untranslated.')); + $this->assertText($name, t('Search found the string as untranslated.')); + // Assume this is the only result, given the random name. - $this->clickLink(t('edit')); - $string_edit_url = $this->getUrl(); + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; $edit = array( - "translations[$langcode][0]" => $translation, - 'translations[en][0]' => $translation_to_en, + $lid => $translation, ); - $this->drupalPost(NULL, $edit, t('Save translations')); - $this->assertText(t('The string has been saved.'), t('The string has been saved.')); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); + $this->assertText(t('The strings have been saved.'), t('The strings have been saved.')); $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), t('Correct page redirection.')); - $this->drupalGet($string_edit_url); + $search = array( + 'string' => $name, + 'langcode' => $langcode, + 'translation' => 'translated', + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); $this->assertRaw($translation, t('Non-English translation properly saved.')); + + + $search = array( + 'string' => $name, + 'langcode' => 'en', + 'translation' => 'untranslated', + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; + $edit = array( + $lid => $translation_to_en, + ); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); + $search = array( + 'string' => $name, + 'langcode' => 'en', + 'translation' => 'translated', + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); $this->assertRaw($translation_to_en, t('English translation properly saved.')); + $this->assertTrue($name != $translation && t($name, array(), array('langcode' => $langcode)) == $translation, t('t() works for non-English.')); // Refresh the locale() cache to get fresh data from t() below. We are in // the same HTTP request and therefore t() is not refreshed by saving the @@ -117,16 +137,15 @@ class LocaleTranslationTest extends WebTestBase { // Now we should get the proper fresh translation from t(). $this->assertTrue($name != $translation_to_en && t($name, array(), array('langcode' => 'en')) == $translation_to_en, t('t() works for English.')); $this->assertTrue(t($name, array(), array('langcode' => LANGUAGE_SYSTEM)) == $name, t('t() works for LANGUAGE_SYSTEM.')); + + $search = array( + 'string' => $name, + 'langcode' => 'en', + 'translation' => 'untranslated', + ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); - // The indicator should not be here. - $this->assertNoRaw($language_indicator, t('String is translated.')); - - // Try to edit a non-existent string and ensure we're redirected correctly. - // Assuming we don't have 999,999 strings already. - $random_lid = 999999; - $this->drupalGet('admin/config/regional/translate/edit/' . $random_lid); - $this->assertText(t('String not found'), t('String not found.')); - $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), t('Correct page redirection.')); + $this->assertText(t('No strings available.'), t('String is translated.')); + $this->drupalLogout(); // Delete the language. @@ -147,26 +166,26 @@ class LocaleTranslationTest extends WebTestBase { $this->drupalLogin($translate_user); $search = array( 'string' => $name, - 'language' => 'all', - 'translation' => 'all', + 'langcode' => 'en', + 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); // Assume this is the only result, given the random name. - $this->clickLink(t('delete')); - $this->assertText(t('Are you sure you want to delete the string'), t('"delete" link is correct.')); - // Delete the string. - $path = 'admin/config/regional/translate/delete/' . $lid; - $this->drupalGet($path); - // First test the 'cancel' link. - $this->clickLink(t('Cancel')); - $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), t('Correct page redirection.')); - $this->assertRaw($name, t('The string was not deleted.')); - // Delete the name string. - $this->drupalPost('admin/config/regional/translate/delete/' . $lid, array(), t('Delete')); - $this->assertText(t('The string has been removed.'), t('The string has been removed message.')); - $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), t('Correct page redirection.')); + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; + $edit = array( + $lid => '', + ); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); + $this->assertRaw($name, t('The strings have been saved.')); + $this->drupalLogin($translate_user); + $search = array( + 'string' => $name, + 'langcode' => 'en', + 'translation' => 'untranslated', + ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); - $this->assertNoText($name, t('Search now can not find the name.')); + $this->assertNoText(t('No strings available.'), t('The translation has been removed')); } /* @@ -192,16 +211,29 @@ class LocaleTranslationTest extends WebTestBase { drupal_static_reset('language_list'); // Build the JavaScript translation file. - $this->drupalGet('admin/config/regional/translate/translate'); - // Retrieve the id of the first string available in the {locales_source} - // table and translate it. - $query = db_select('locales_source', 'l'); - $query->addExpression('min(l.lid)', 'lid'); - $result = $query->condition('l.location', '%.js%', 'LIKE')->execute(); - $url = 'admin/config/regional/translate/edit/' . $result->fetchObject()->lid; - $edit = array('translations['. $langcode .'][0]' => $this->randomName()); - $this->drupalPost($url, $edit, t('Save translations')); + // Retrieve the source string of the first string available in the + // {locales_source} table and translate it. + $source = db_select('locales_source', 'l') + ->fields('l', array('source')) + ->condition('l.location', '%.js%', 'LIKE') + ->range(0, 1) + ->execute() + ->fetchField(); + + $search = array( + 'string' => $source, + 'langcode' => $langcode, + 'translation' => 'all', + ); + $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); + + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; + $edit = array( + $lid => $this->randomName(), + ); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); // Trigger JavaScript translation parsing and building. _locale_rebuild_js($langcode); @@ -230,9 +262,7 @@ class LocaleTranslationTest extends WebTestBase { $langcode = 'xx'; // The English name for the language. This will be translated. $name = $this->randomName(16); - // This is the language indicator on the translation search screen for - // untranslated strings. - $language_indicator = "$langcode "; + // These will be the invalid translations of $name. $key = $this->randomName(16); $bad_translations[$key] = "" . $key; @@ -256,19 +286,19 @@ class LocaleTranslationTest extends WebTestBase { // Reset locale cache. $search = array( 'string' => $name, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'all', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); // Find the edit path. - $content = $this->drupalGetContent(); - $this->assertTrue(preg_match('@(admin/config/regional/translate/edit/[0-9]+)@', $content, $matches), t('Found the edit path.')); - $path = $matches[0]; + + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; foreach ($bad_translations as $key => $translation) { $edit = array( - "translations[$langcode][0]" => $translation, + $lid => $translation, ); - $this->drupalPost($path, $edit, t('Save translations')); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); // Check for a form error on the textarea. $form_class = $this->xpath('//form[@id="locale-translate-edit-form"]//textarea/@class'); $this->assertNotIdentical(FALSE, strpos($form_class[0], 'error'), t('The string was rejected as unsafe.')); @@ -306,6 +336,15 @@ class LocaleTranslationTest extends WebTestBase { 'direction' => '0', ); $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language')); + + $edit = array( + 'predefined_langcode' => 'custom', + 'langcode' => 'yy', + 'name' => $this->randomName(16), + 'direction' => '0', + ); + $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language')); + // Add string. t($name, array(), array('langcode' => $langcode)); // Reset locale cache. @@ -316,7 +355,7 @@ class LocaleTranslationTest extends WebTestBase { $this->drupalLogin($translate_user); $search = array( 'string' => $name, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'all', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -329,7 +368,7 @@ class LocaleTranslationTest extends WebTestBase { // translated strings'. $search = array( 'string' => $name, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -339,7 +378,7 @@ class LocaleTranslationTest extends WebTestBase { // strings'. $search = array( 'string' => $name, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'untranslated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -347,21 +386,19 @@ class LocaleTranslationTest extends WebTestBase { // Add translation. // Assume this is the only result, given the random name. - $this->clickLink(t('edit')); // We save the lid from the path. - $matches = array(); - preg_match('!admin/config/regional/translate/edit/(\d)+!', $this->getUrl(), $matches); - $lid = $matches[1]; + $textarea = current($this->xpath('//textarea')); + $lid = (string) $textarea[0]['name']; $edit = array( - "translations[$langcode][0]" => $translation, + $lid => $translation, ); - $this->drupalPost(NULL, $edit, t('Save translations')); + $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Save translations')); // Ensure translated string does appear if searching on 'only // translated strings'. $search = array( 'string' => $translation, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'translated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -371,7 +408,7 @@ class LocaleTranslationTest extends WebTestBase { // untranslated strings'. $search = array( 'string' => $name, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'untranslated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -381,7 +418,7 @@ class LocaleTranslationTest extends WebTestBase { // untranslated strings'. $search = array( 'string' => $translation, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'untranslated', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -390,7 +427,7 @@ class LocaleTranslationTest extends WebTestBase { // Ensure translated string does appear if searching on the custom language. $search = array( 'string' => $translation, - 'language' => $langcode, + 'langcode' => $langcode, 'translation' => 'all', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -399,7 +436,7 @@ class LocaleTranslationTest extends WebTestBase { // Ensure translated string doesn't appear if searching in System (English). $search = array( 'string' => $translation, - 'language' => LANGUAGE_SYSTEM, + 'langcode' => 'yy', 'translation' => 'all', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); @@ -409,7 +446,7 @@ class LocaleTranslationTest extends WebTestBase { $unavailable_string = $this->randomName(16); $search = array( 'string' => $unavailable_string, - 'language' => 'all', + 'langcode' => $langcode, 'translation' => 'all', ); $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter')); diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php index 72868e9e1bc3b03eb1d8963257d58f897e6c12be..71aff68bfb3d81ef8119c6cb9542fc983546cb74 100644 --- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php +++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php @@ -61,11 +61,13 @@ class LocaleUninstallTest extends WebTestBase { $user = $this->drupalCreateUser(array('translate interface', 'access administration pages')); $this->drupalLogin($user); $this->drupalGet('admin/config/regional/translate/translate'); - $string = db_query('SELECT min(lid) AS lid FROM {locales_source} WHERE location LIKE :location', array( + $string = db_query('SELECT min(lid) AS lid, source FROM {locales_source} WHERE location LIKE :location', array( ':location' => '%.js%', ))->fetchObject(); - $edit = array('translations[fr][0]' => 'french translation'); - $this->drupalPost('admin/config/regional/translate/edit/' . $string->lid, $edit, t('Save translations')); + $edit = array('string' => $string->source); + $this->drupalPost('admin/config/regional/translate', $edit, t('Filter')); + $edit = array('strings[' . $string->lid . '][translations][0]' => 'french translation'); + $this->drupalPost('admin/config/regional/translate', $edit, t('Save translations')); _locale_rebuild_js('fr'); $locale_javascripts = variable_get('locale_translation_javascript', array()); $js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/fr_' . $locale_javascripts['fr'] . '.js'; diff --git a/core/modules/locale/locale-rtl.css b/core/modules/locale/locale-rtl.css index aaf1988dd17d0ea777536ade858af113e232e967..3ec55313e70382fb446d4b80ca3108e8f5ebfe30 100644 --- a/core/modules/locale/locale-rtl.css +++ b/core/modules/locale/locale-rtl.css @@ -1,12 +1,11 @@ - #locale-translation-filter-form .form-item-language, #locale-translation-filter-form .form-item-translation, #locale-translation-filter-form .form-item-group { float: right; - padding-left: .8em; + padding-left: 1em; padding-right: 0; } #locale-translation-filter-form .form-actions { float: right; - padding: 3ex 1em 0 0; + padding: 3.5ex 0 0 0; } diff --git a/core/modules/locale/locale.css b/core/modules/locale/locale.css index 6c03945dd8bb31b61372a6d407166a4f163f6a64..09ddcc645daa72da04a95d70d60c585da7404585 100644 --- a/core/modules/locale/locale.css +++ b/core/modules/locale/locale.css @@ -1,14 +1,9 @@ -.locale-untranslated { - font-style: normal; - text-decoration: line-through; -} - -#locale-translation-filter-form .form-item-language, -#locale-translation-filter-form .form-item-translation, -#locale-translation-filter-form .form-item-customized { +#locale-translate-filter-form .form-item-langcode, +#locale-translate-filter-form .form-item-translation, +#locale-translate-filter-form .form-item-customized { float: left; /* LTR */ - padding-right: .8em; /* LTR */ - margin: 0.1em; + padding-right: 1em; /* LTR */ + margin-bottom: 0; /** * In Opera 9, DOM elements with the property of "overflow: auto" * will partially hide its contents with unnecessary scrollbars when @@ -16,10 +11,24 @@ */ width: 15em; } -#locale-translation-filter-form .form-type-select select { +#locale-translate-filter-form .form-type-select select { width: 100%; } -#locale-translation-filter-form .form-actions { +#locale-translate-filter-form .form-actions { float: left; /* LTR */ - padding: 3ex 0 0 1em; /* LTR */ + padding: 3.5ex 0 0 0em; /* LTR */ +} +#locale-translate-edit-form th{ + width: 50%; + table-layout: fixed; +} +#locale-translate-edit-form tr .form-item{ + white-space: normal; +} +#locale-translate-edit-form td { + vertical-align: top +} + +#locale-translate-edit-form tr.changed { + background: #FFB; } diff --git a/core/modules/locale/locale.js b/core/modules/locale/locale.js new file mode 100644 index 0000000000000000000000000000000000000000..15a9760068d614bbecad9209b9acb4765c695616 --- /dev/null +++ b/core/modules/locale/locale.js @@ -0,0 +1,39 @@ +(function ($) { + +"use strict"; + +/** + * Markes changes of translations + */ +Drupal.behaviors.localetranslatedirty = { + attach: function (context, settings) { + $("#edit-strings textarea").change(function(){ + // Marking the row. + $(this).parents("tr") + .addClass('changed') + .each(function() { + var marker = Drupal.theme('localeTranslateChangedMarker'); + var cell = $(this).find('td:first div.form-item'); + if (cell.find('abbr.tabledrag-changed').length == 0) { + cell.append(marker); + } + }); + // Help text on top of table. + if (!$(this).parents("table").hasClass("changed")) { + $(this).parents("table") + .addClass("changed") + .before($(Drupal.theme('localeTranslateChangedWarning')).hide().fadeIn('slow')); + } + }); + } +}; + +Drupal.theme.prototype.localeTranslateChangedMarker = function () { + return '*'; +}; + +Drupal.theme.prototype.localeTranslateChangedWarning = function () { + return '
'; +}; + +})(jQuery); diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module index 35f8032b5d13073b81fe81957d18273dcd1a7505..b3ad5e762db8ba842d2f80495840811b5b6bc9d6 100644 --- a/core/modules/locale/locale.module +++ b/core/modules/locale/locale.module @@ -111,7 +111,7 @@ function locale_menu() { $items['admin/config/regional/translate'] = array( 'title' => 'User interface translation', 'description' => 'Translate the built-in user interface.', - 'page callback' => 'locale_translate_seek_screen', + 'page callback' => 'locale_translate_screen', 'access arguments' => array('translate interface'), 'file' => 'locale.pages.inc', 'weight' => -5, @@ -139,20 +139,6 @@ function locale_menu() { 'type' => MENU_LOCAL_TASK, 'file' => 'locale.bulk.inc', ); - $items['admin/config/regional/translate/edit/%'] = array( - 'title' => 'Edit string', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('locale_translate_edit_form', 5), - 'access arguments' => array('translate interface'), - 'file' => 'locale.pages.inc', - ); - $items['admin/config/regional/translate/delete/%'] = array( - 'title' => 'Delete string', - 'page callback' => 'locale_translate_delete_page', - 'page arguments' => array(5), - 'access arguments' => array('translate interface'), - 'file' => 'locale.pages.inc', - ); // Localize date formats. $items['admin/config/regional/date-time/locale'] = array( @@ -265,6 +251,10 @@ function locale_theme() { 'locale_date_format_form' => array( 'render element' => 'form', ), + 'locale_translate_edit_form_strings' => array( + 'render element' => 'form', + 'file' => 'locale.pages.inc', + ), ); } diff --git a/core/modules/locale/locale.pages.inc b/core/modules/locale/locale.pages.inc index aaabec72a308a8a4cc5d0b3befdd84fc5653b8e4..4032020606a150ae799b4602f03b578763c09cdb 100644 --- a/core/modules/locale/locale.pages.inc +++ b/core/modules/locale/locale.pages.inc @@ -10,152 +10,79 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * String search screen. */ -function locale_translate_seek_screen() { +function locale_translate_screen() { // Add CSS. drupal_add_css(drupal_get_path('module', 'locale') . '/locale.css'); - - $elements = drupal_get_form('locale_translation_filter_form'); - $output = drupal_render($elements); - $output .= _locale_translate_seek(); - return $output; + drupal_add_js(drupal_get_path('module', 'locale') . '/locale.js'); + return array( + 'filter' => drupal_get_form('locale_translate_filter_form'), + 'form' => drupal_get_form('locale_translate_edit_form'), + ); } /** - * Perform a string search and display results in a table + * Build a string search query. */ -function _locale_translate_seek() { - $output = ''; - - // We have at least one criterion to match - if (!($query = _locale_translate_seek_query())) { - $query = array( - 'translation' => 'all', - 'language' => 'all', - 'customized' => 'all', - 'string' => '', - ); - } +function locale_translate_query() { + $filter_values = locale_translate_filter_values(); $sql_query = db_select('locales_source', 's'); - $sql_query->leftJoin('locales_target', 't', 't.lid = s.lid'); + // Language is sanitized to be one of the possible options in + // locale_translate_filter_values(). + $sql_query->leftJoin('locales_target', 't', "t.lid = s.lid AND t.language = :langcode", array(':langcode' => $filter_values['langcode'])); $sql_query->fields('s', array('source', 'location', 'context', 'lid')); $sql_query->fields('t', array('translation', 'language', 'customized')); - // Compute LIKE section. - switch ($query['translation']) { + if (!empty($filter_values['string'])) { + $sql_query->condition(db_or() + ->condition('s.source', '%' . db_like($filter_values['string']) . '%', 'LIKE') + ->condition('t.translation', '%' . db_like($filter_values['string']) . '%', 'LIKE') + ); + } + + // Add translation status conditions. + switch ($filter_values['translation']) { case 'translated': - $sql_query->condition('t.translation', '%' . db_like($query['string']) . '%', 'LIKE'); - $sql_query->orderBy('t.translation', 'DESC'); - if ($query['customized'] != 'all') { - $sql_query->condition('t.customized', $query['customized']); + $sql_query->isNotNull('t.translation'); + if ($filter_values['customized'] != 'all') { + $sql_query->condition('t.customized', $filter_values['customized']); } break; case 'untranslated': - $sql_query->condition(db_and() - ->condition('s.source', '%' . db_like($query['string']) . '%', 'LIKE') - ->isNull('t.translation') - ); - $sql_query->orderBy('s.source'); - break; - case 'all' : - default: - $condition = db_or() - ->condition('s.source', '%' . db_like($query['string']) . '%', 'LIKE'); - if ($query['language'] != LANGUAGE_SYSTEM) { - // Only search in translations if the language is not forced to system language. - $condition->condition('t.translation', '%' . db_like($query['string']) . '%', 'LIKE'); - } - $sql_query->condition($condition); + $sql_query->isNull('t.translation'); break; } - $limit_language = NULL; - if ($query['language'] != LANGUAGE_SYSTEM && $query['language'] != 'all') { - $sql_query->condition('language', $query['language']); - $limit_language = $query['language']; - } - - $sql_query = $sql_query - ->extend('Drupal\Core\Database\Query\PagerSelectExtender') - ->limit(50); - $locales = $sql_query->execute(); - - $header = array(t('String'), t('Context'), ($limit_language) ? t('Language') : t('Languages'), array('data' => t('Operations'), 'colspan' => '2')); - - $strings = array(); - foreach ($locales as $locale) { - if (!isset($strings[$locale->lid])) { - $strings[$locale->lid] = array( - 'languages' => array(), - 'location' => $locale->location, - 'source' => $locale->source, - 'context' => $locale->context, - ); - } - if (isset($locale->language)) { - $strings[$locale->lid]['languages'][$locale->language] = $locale->translation; - } - } - - $rows = array(); - foreach ($strings as $lid => $string) { - $rows[] = array( - array('data' => check_plain(truncate_utf8(str_replace(LOCALE_PLURAL_DELIMITER, ', ', $string['source']), 150, FALSE, TRUE)) . '