danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Tests for locale.module.
|
danielebarchiesi@0
|
6 *
|
danielebarchiesi@0
|
7 * The test file includes:
|
danielebarchiesi@0
|
8 * - a functional test for the language configuration forms;
|
danielebarchiesi@0
|
9 * - functional tests for the translation functionalities, including searching;
|
danielebarchiesi@0
|
10 * - a functional test for the PO files import feature, including validation;
|
danielebarchiesi@0
|
11 * - functional tests for translations and templates export feature;
|
danielebarchiesi@0
|
12 * - functional tests for the uninstall process;
|
danielebarchiesi@0
|
13 * - a functional test for the language switching feature;
|
danielebarchiesi@0
|
14 * - a functional test for a user's ability to change their default language;
|
danielebarchiesi@0
|
15 * - a functional test for configuring a different path alias per language;
|
danielebarchiesi@0
|
16 * - a functional test for configuring a different path alias per language;
|
danielebarchiesi@0
|
17 * - a functional test for multilingual support by content type and on nodes.
|
danielebarchiesi@0
|
18 * - a functional test for multilingual fields.
|
danielebarchiesi@0
|
19 * - a functional test for comment language.
|
danielebarchiesi@0
|
20 * - a functional test fot language types/negotiation info.
|
danielebarchiesi@0
|
21 */
|
danielebarchiesi@0
|
22
|
danielebarchiesi@0
|
23
|
danielebarchiesi@0
|
24 /**
|
danielebarchiesi@0
|
25 * Functional tests for the language configuration forms.
|
danielebarchiesi@0
|
26 */
|
danielebarchiesi@0
|
27 class LocaleConfigurationTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
28 public static function getInfo() {
|
danielebarchiesi@0
|
29 return array(
|
danielebarchiesi@0
|
30 'name' => 'Language configuration',
|
danielebarchiesi@0
|
31 'description' => 'Adds a new locale and tests changing its status and the default language.',
|
danielebarchiesi@0
|
32 'group' => 'Locale',
|
danielebarchiesi@0
|
33 );
|
danielebarchiesi@0
|
34 }
|
danielebarchiesi@0
|
35
|
danielebarchiesi@0
|
36 function setUp() {
|
danielebarchiesi@0
|
37 parent::setUp('locale');
|
danielebarchiesi@0
|
38 }
|
danielebarchiesi@0
|
39
|
danielebarchiesi@0
|
40 /**
|
danielebarchiesi@0
|
41 * Functional tests for adding, editing and deleting languages.
|
danielebarchiesi@0
|
42 */
|
danielebarchiesi@0
|
43 function testLanguageConfiguration() {
|
danielebarchiesi@0
|
44 global $base_url;
|
danielebarchiesi@0
|
45
|
danielebarchiesi@0
|
46 // User to add and remove language.
|
danielebarchiesi@0
|
47 $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
|
danielebarchiesi@0
|
48 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
49
|
danielebarchiesi@0
|
50 // Add predefined language.
|
danielebarchiesi@0
|
51 $edit = array(
|
danielebarchiesi@0
|
52 'langcode' => 'fr',
|
danielebarchiesi@0
|
53 );
|
danielebarchiesi@0
|
54 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
55 $this->assertText('fr', 'Language added successfully.');
|
danielebarchiesi@0
|
56 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
57
|
danielebarchiesi@0
|
58 // Add custom language.
|
danielebarchiesi@0
|
59 // Code for the language.
|
danielebarchiesi@0
|
60 $langcode = 'xx';
|
danielebarchiesi@0
|
61 // The English name for the language.
|
danielebarchiesi@0
|
62 $name = $this->randomName(16);
|
danielebarchiesi@0
|
63 // The native name for the language.
|
danielebarchiesi@0
|
64 $native = $this->randomName(16);
|
danielebarchiesi@0
|
65 // The domain prefix.
|
danielebarchiesi@0
|
66 $prefix = $langcode;
|
danielebarchiesi@0
|
67 $edit = array(
|
danielebarchiesi@0
|
68 'langcode' => $langcode,
|
danielebarchiesi@0
|
69 'name' => $name,
|
danielebarchiesi@0
|
70 'native' => $native,
|
danielebarchiesi@0
|
71 'prefix' => $prefix,
|
danielebarchiesi@0
|
72 'direction' => '0',
|
danielebarchiesi@0
|
73 );
|
danielebarchiesi@0
|
74 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
75 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
76 $this->assertText($langcode, 'Language code found.');
|
danielebarchiesi@0
|
77 $this->assertText($name, 'Name found.');
|
danielebarchiesi@0
|
78 $this->assertText($native, 'Native found.');
|
danielebarchiesi@0
|
79 $this->assertText($native, 'Test language added.');
|
danielebarchiesi@0
|
80
|
danielebarchiesi@0
|
81 // Check if we can change the default language.
|
danielebarchiesi@0
|
82 $path = 'admin/config/regional/language';
|
danielebarchiesi@0
|
83 $this->drupalGet($path);
|
danielebarchiesi@0
|
84 $this->assertFieldChecked('edit-site-default-en', 'English is the default language.');
|
danielebarchiesi@0
|
85 // Change the default language.
|
danielebarchiesi@0
|
86 $edit = array(
|
danielebarchiesi@0
|
87 'site_default' => $langcode,
|
danielebarchiesi@0
|
88 );
|
danielebarchiesi@0
|
89 $this->drupalPost(NULL, $edit, t('Save configuration'));
|
danielebarchiesi@0
|
90 $this->assertNoFieldChecked('edit-site-default-en', 'Default language updated.');
|
danielebarchiesi@0
|
91 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
92
|
danielebarchiesi@0
|
93 // Check if a valid language prefix is added after changing the default
|
danielebarchiesi@0
|
94 // language.
|
danielebarchiesi@0
|
95 $this->drupalGet('admin/config/regional/language/edit/en');
|
danielebarchiesi@0
|
96 $this->assertFieldByXPath('//input[@name="prefix"]', 'en', 'A valid path prefix has been added to the previous default language.');
|
danielebarchiesi@0
|
97
|
danielebarchiesi@0
|
98 // Ensure we can't delete the default language.
|
danielebarchiesi@0
|
99 $this->drupalGet('admin/config/regional/language/delete/' . $langcode);
|
danielebarchiesi@0
|
100 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
101 $this->assertText(t('The default language cannot be deleted.'), 'Failed to delete the default language.');
|
danielebarchiesi@0
|
102
|
danielebarchiesi@0
|
103 // Check if we can disable a language.
|
danielebarchiesi@0
|
104 $edit = array(
|
danielebarchiesi@0
|
105 'enabled[en]' => FALSE,
|
danielebarchiesi@0
|
106 );
|
danielebarchiesi@0
|
107 $this->drupalPost($path, $edit, t('Save configuration'));
|
danielebarchiesi@0
|
108 $this->assertNoFieldChecked('edit-enabled-en', 'Language disabled.');
|
danielebarchiesi@0
|
109
|
danielebarchiesi@0
|
110 // Set disabled language to be the default and ensure it is re-enabled.
|
danielebarchiesi@0
|
111 $edit = array(
|
danielebarchiesi@0
|
112 'site_default' => 'en',
|
danielebarchiesi@0
|
113 );
|
danielebarchiesi@0
|
114 $this->drupalPost(NULL, $edit, t('Save configuration'));
|
danielebarchiesi@0
|
115 $this->assertFieldChecked('edit-enabled-en', 'Default language re-enabled.');
|
danielebarchiesi@0
|
116
|
danielebarchiesi@0
|
117 // Ensure 'edit' link works.
|
danielebarchiesi@0
|
118 $this->clickLink(t('edit'));
|
danielebarchiesi@0
|
119 $this->assertTitle(t('Edit language | Drupal'), 'Page title is "Edit language".');
|
danielebarchiesi@0
|
120 // Edit a language.
|
danielebarchiesi@0
|
121 $name = $this->randomName(16);
|
danielebarchiesi@0
|
122 $edit = array(
|
danielebarchiesi@0
|
123 'name' => $name,
|
danielebarchiesi@0
|
124 );
|
danielebarchiesi@0
|
125 $this->drupalPost('admin/config/regional/language/edit/' . $langcode, $edit, t('Save language'));
|
danielebarchiesi@0
|
126 $this->assertRaw($name, 'The language has been updated.');
|
danielebarchiesi@0
|
127 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
128
|
danielebarchiesi@0
|
129 // Ensure 'delete' link works.
|
danielebarchiesi@0
|
130 $this->drupalGet('admin/config/regional/language');
|
danielebarchiesi@0
|
131 $this->clickLink(t('delete'));
|
danielebarchiesi@0
|
132 $this->assertText(t('Are you sure you want to delete the language'), '"delete" link is correct.');
|
danielebarchiesi@0
|
133 // Delete an enabled language.
|
danielebarchiesi@0
|
134 $this->drupalGet('admin/config/regional/language/delete/' . $langcode);
|
danielebarchiesi@0
|
135 // First test the 'cancel' link.
|
danielebarchiesi@0
|
136 $this->clickLink(t('Cancel'));
|
danielebarchiesi@0
|
137 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
138 $this->assertRaw($name, 'The language was not deleted.');
|
danielebarchiesi@0
|
139 // Delete the language for real. This a confirm form, we do not need any
|
danielebarchiesi@0
|
140 // fields changed.
|
danielebarchiesi@0
|
141 $this->drupalPost('admin/config/regional/language/delete/' . $langcode, array(), t('Delete'));
|
danielebarchiesi@0
|
142 // We need raw here because %locale will add HTML.
|
danielebarchiesi@0
|
143 $this->assertRaw(t('The language %locale has been removed.', array('%locale' => $name)), 'The test language has been removed.');
|
danielebarchiesi@0
|
144 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
145 // Verify that language is no longer found.
|
danielebarchiesi@0
|
146 $this->drupalGet('admin/config/regional/language/delete/' . $langcode);
|
danielebarchiesi@0
|
147 $this->assertResponse(404, 'Language no longer found.');
|
danielebarchiesi@0
|
148 // Make sure the "language_count" variable has been updated correctly.
|
danielebarchiesi@0
|
149 drupal_static_reset('language_list');
|
danielebarchiesi@0
|
150 $enabled = language_list('enabled');
|
danielebarchiesi@0
|
151 $this->assertEqual(variable_get('language_count', 1), count($enabled[1]), 'Language count is correct.');
|
danielebarchiesi@0
|
152 // Delete a disabled language.
|
danielebarchiesi@0
|
153 // Disable an enabled language.
|
danielebarchiesi@0
|
154 $edit = array(
|
danielebarchiesi@0
|
155 'enabled[fr]' => FALSE,
|
danielebarchiesi@0
|
156 );
|
danielebarchiesi@0
|
157 $this->drupalPost($path, $edit, t('Save configuration'));
|
danielebarchiesi@0
|
158 $this->assertNoFieldChecked('edit-enabled-fr', 'French language disabled.');
|
danielebarchiesi@0
|
159 // Get the count of enabled languages.
|
danielebarchiesi@0
|
160 drupal_static_reset('language_list');
|
danielebarchiesi@0
|
161 $enabled = language_list('enabled');
|
danielebarchiesi@0
|
162 // Delete the disabled language.
|
danielebarchiesi@0
|
163 $this->drupalPost('admin/config/regional/language/delete/fr', array(), t('Delete'));
|
danielebarchiesi@0
|
164 // We need raw here because %locale will add HTML.
|
danielebarchiesi@0
|
165 $this->assertRaw(t('The language %locale has been removed.', array('%locale' => 'French')), 'Disabled language has been removed.');
|
danielebarchiesi@0
|
166 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
167 // Verify that language is no longer found.
|
danielebarchiesi@0
|
168 $this->drupalGet('admin/config/regional/language/delete/fr');
|
danielebarchiesi@0
|
169 $this->assertResponse(404, 'Language no longer found.');
|
danielebarchiesi@0
|
170 // Make sure the "language_count" variable has not changed.
|
danielebarchiesi@0
|
171 $this->assertEqual(variable_get('language_count', 1), count($enabled[1]), 'Language count is correct.');
|
danielebarchiesi@0
|
172
|
danielebarchiesi@0
|
173
|
danielebarchiesi@0
|
174 // Ensure we can't delete the English language.
|
danielebarchiesi@0
|
175 $this->drupalGet('admin/config/regional/language/delete/en');
|
danielebarchiesi@0
|
176 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
177 $this->assertText(t('The English language cannot be deleted.'), 'Failed to delete English language.');
|
danielebarchiesi@0
|
178 }
|
danielebarchiesi@0
|
179
|
danielebarchiesi@0
|
180 }
|
danielebarchiesi@0
|
181
|
danielebarchiesi@0
|
182 /**
|
danielebarchiesi@0
|
183 * Tests localization of the JavaScript libraries.
|
danielebarchiesi@0
|
184 *
|
danielebarchiesi@0
|
185 * Currently, only the jQuery datepicker is localized using Drupal translations.
|
danielebarchiesi@0
|
186 */
|
danielebarchiesi@0
|
187 class LocaleLibraryInfoAlterTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
188 public static function getInfo() {
|
danielebarchiesi@0
|
189 return array(
|
danielebarchiesi@0
|
190 'name' => 'Javascript library localisation',
|
danielebarchiesi@0
|
191 'description' => 'Tests the localisation of JavaScript libraries.',
|
danielebarchiesi@0
|
192 'group' => 'Locale',
|
danielebarchiesi@0
|
193 );
|
danielebarchiesi@0
|
194 }
|
danielebarchiesi@0
|
195
|
danielebarchiesi@0
|
196 function setUp() {
|
danielebarchiesi@0
|
197 parent::setUp('locale', 'locale_test');
|
danielebarchiesi@0
|
198 }
|
danielebarchiesi@0
|
199
|
danielebarchiesi@0
|
200 /**
|
danielebarchiesi@0
|
201 * Verifies that the datepicker can be localized.
|
danielebarchiesi@0
|
202 *
|
danielebarchiesi@0
|
203 * @see locale_library_info_alter()
|
danielebarchiesi@0
|
204 */
|
danielebarchiesi@0
|
205 public function testLibraryInfoAlter() {
|
danielebarchiesi@0
|
206 drupal_add_library('system', 'ui.datepicker');
|
danielebarchiesi@0
|
207 $scripts = drupal_get_js();
|
danielebarchiesi@0
|
208 $this->assertTrue(strpos($scripts, 'locale.datepicker.js'), 'locale.datepicker.js added to scripts.');
|
danielebarchiesi@0
|
209 }
|
danielebarchiesi@0
|
210 }
|
danielebarchiesi@0
|
211
|
danielebarchiesi@0
|
212 /**
|
danielebarchiesi@0
|
213 * Functional tests for JavaScript parsing for translatable strings.
|
danielebarchiesi@0
|
214 */
|
danielebarchiesi@0
|
215 class LocaleJavascriptTranslationTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
216 public static function getInfo() {
|
danielebarchiesi@0
|
217 return array(
|
danielebarchiesi@0
|
218 'name' => 'Javascript translation',
|
danielebarchiesi@0
|
219 'description' => 'Tests parsing js files for translatable strings',
|
danielebarchiesi@0
|
220 'group' => 'Locale',
|
danielebarchiesi@0
|
221 );
|
danielebarchiesi@0
|
222 }
|
danielebarchiesi@0
|
223
|
danielebarchiesi@0
|
224 function setUp() {
|
danielebarchiesi@0
|
225 parent::setUp('locale', 'locale_test');
|
danielebarchiesi@0
|
226 }
|
danielebarchiesi@0
|
227
|
danielebarchiesi@0
|
228 function testFileParsing() {
|
danielebarchiesi@0
|
229
|
danielebarchiesi@0
|
230 $filename = drupal_get_path('module', 'locale_test') . '/locale_test.js';
|
danielebarchiesi@0
|
231
|
danielebarchiesi@0
|
232 // Parse the file to look for source strings.
|
danielebarchiesi@0
|
233 _locale_parse_js_file($filename);
|
danielebarchiesi@0
|
234
|
danielebarchiesi@0
|
235 // Get all of the source strings that were found.
|
danielebarchiesi@0
|
236 $source_strings = db_select('locales_source', 's')
|
danielebarchiesi@0
|
237 ->fields('s', array('source', 'context'))
|
danielebarchiesi@0
|
238 ->condition('s.location', $filename)
|
danielebarchiesi@0
|
239 ->execute()
|
danielebarchiesi@0
|
240 ->fetchAllKeyed();
|
danielebarchiesi@0
|
241
|
danielebarchiesi@0
|
242 // List of all strings that should be in the file.
|
danielebarchiesi@0
|
243 $test_strings = array(
|
danielebarchiesi@0
|
244 "Standard Call t" => '',
|
danielebarchiesi@0
|
245 "Whitespace Call t" => '',
|
danielebarchiesi@0
|
246
|
danielebarchiesi@0
|
247 "Single Quote t" => '',
|
danielebarchiesi@0
|
248 "Single Quote \\'Escaped\\' t" => '',
|
danielebarchiesi@0
|
249 "Single Quote Concat strings t" => '',
|
danielebarchiesi@0
|
250
|
danielebarchiesi@0
|
251 "Double Quote t" => '',
|
danielebarchiesi@0
|
252 "Double Quote \\\"Escaped\\\" t" => '',
|
danielebarchiesi@0
|
253 "Double Quote Concat strings t" => '',
|
danielebarchiesi@0
|
254
|
danielebarchiesi@0
|
255 "Context !key Args t" => "Context string",
|
danielebarchiesi@0
|
256
|
danielebarchiesi@0
|
257 "Context Unquoted t" => "Context string unquoted",
|
danielebarchiesi@0
|
258 "Context Single Quoted t" => "Context string single quoted",
|
danielebarchiesi@0
|
259 "Context Double Quoted t" => "Context string double quoted",
|
danielebarchiesi@0
|
260
|
danielebarchiesi@0
|
261 "Standard Call plural" => '',
|
danielebarchiesi@0
|
262 "Standard Call @count plural" => '',
|
danielebarchiesi@0
|
263 "Whitespace Call plural" => '',
|
danielebarchiesi@0
|
264 "Whitespace Call @count plural" => '',
|
danielebarchiesi@0
|
265
|
danielebarchiesi@0
|
266 "Single Quote plural" => '',
|
danielebarchiesi@0
|
267 "Single Quote @count plural" => '',
|
danielebarchiesi@0
|
268 "Single Quote \\'Escaped\\' plural" => '',
|
danielebarchiesi@0
|
269 "Single Quote \\'Escaped\\' @count plural" => '',
|
danielebarchiesi@0
|
270
|
danielebarchiesi@0
|
271 "Double Quote plural" => '',
|
danielebarchiesi@0
|
272 "Double Quote @count plural" => '',
|
danielebarchiesi@0
|
273 "Double Quote \\\"Escaped\\\" plural" => '',
|
danielebarchiesi@0
|
274 "Double Quote \\\"Escaped\\\" @count plural" => '',
|
danielebarchiesi@0
|
275
|
danielebarchiesi@0
|
276 "Context !key Args plural" => "Context string",
|
danielebarchiesi@0
|
277 "Context !key Args @count plural" => "Context string",
|
danielebarchiesi@0
|
278
|
danielebarchiesi@0
|
279 "Context Unquoted plural" => "Context string unquoted",
|
danielebarchiesi@0
|
280 "Context Unquoted @count plural" => "Context string unquoted",
|
danielebarchiesi@0
|
281 "Context Single Quoted plural" => "Context string single quoted",
|
danielebarchiesi@0
|
282 "Context Single Quoted @count plural" => "Context string single quoted",
|
danielebarchiesi@0
|
283 "Context Double Quoted plural" => "Context string double quoted",
|
danielebarchiesi@0
|
284 "Context Double Quoted @count plural" => "Context string double quoted",
|
danielebarchiesi@0
|
285 );
|
danielebarchiesi@0
|
286
|
danielebarchiesi@0
|
287 // Assert that all strings were found properly.
|
danielebarchiesi@0
|
288 foreach ($test_strings as $str => $context) {
|
danielebarchiesi@0
|
289 $args = array('%source' => $str, '%context' => $context);
|
danielebarchiesi@0
|
290
|
danielebarchiesi@0
|
291 // Make sure that the string was found in the file.
|
danielebarchiesi@0
|
292 $this->assertTrue(isset($source_strings[$str]), format_string('Found source string: %source', $args));
|
danielebarchiesi@0
|
293
|
danielebarchiesi@0
|
294 // Make sure that the proper context was matched.
|
danielebarchiesi@0
|
295 $this->assertTrue(isset($source_strings[$str]) && $source_strings[$str] === $context, strlen($context) > 0 ? format_string('Context for %source is %context', $args) : format_string('Context for %source is blank', $args));
|
danielebarchiesi@0
|
296 }
|
danielebarchiesi@0
|
297
|
danielebarchiesi@0
|
298 $this->assertEqual(count($source_strings), count($test_strings), 'Found correct number of source strings.');
|
danielebarchiesi@0
|
299 }
|
danielebarchiesi@0
|
300 }
|
danielebarchiesi@0
|
301 /**
|
danielebarchiesi@0
|
302 * Functional test for string translation and validation.
|
danielebarchiesi@0
|
303 */
|
danielebarchiesi@0
|
304 class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
305 public static function getInfo() {
|
danielebarchiesi@0
|
306 return array(
|
danielebarchiesi@0
|
307 'name' => 'String translate, search and validate',
|
danielebarchiesi@0
|
308 'description' => 'Adds a new locale and translates its name. Checks the validation of translation strings and search results.',
|
danielebarchiesi@0
|
309 'group' => 'Locale',
|
danielebarchiesi@0
|
310 );
|
danielebarchiesi@0
|
311 }
|
danielebarchiesi@0
|
312
|
danielebarchiesi@0
|
313 function setUp() {
|
danielebarchiesi@0
|
314 parent::setUp('locale');
|
danielebarchiesi@0
|
315 }
|
danielebarchiesi@0
|
316
|
danielebarchiesi@0
|
317 /**
|
danielebarchiesi@0
|
318 * Adds a language and tests string translation by users with the appropriate permissions.
|
danielebarchiesi@0
|
319 */
|
danielebarchiesi@0
|
320 function testStringTranslation() {
|
danielebarchiesi@0
|
321 global $base_url;
|
danielebarchiesi@0
|
322
|
danielebarchiesi@0
|
323 // User to add and remove language.
|
danielebarchiesi@0
|
324 $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
|
danielebarchiesi@0
|
325 // User to translate and delete string.
|
danielebarchiesi@0
|
326 $translate_user = $this->drupalCreateUser(array('translate interface', 'access administration pages'));
|
danielebarchiesi@0
|
327 // Code for the language.
|
danielebarchiesi@0
|
328 $langcode = 'xx';
|
danielebarchiesi@0
|
329 // The English name for the language. This will be translated.
|
danielebarchiesi@0
|
330 $name = $this->randomName(16);
|
danielebarchiesi@0
|
331 // The native name for the language.
|
danielebarchiesi@0
|
332 $native = $this->randomName(16);
|
danielebarchiesi@0
|
333 // The domain prefix.
|
danielebarchiesi@0
|
334 $prefix = $langcode;
|
danielebarchiesi@0
|
335 // This is the language indicator on the translation search screen for
|
danielebarchiesi@0
|
336 // untranslated strings. Copied straight from locale.inc.
|
danielebarchiesi@0
|
337 $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
|
danielebarchiesi@0
|
338 // This will be the translation of $name.
|
danielebarchiesi@0
|
339 $translation = $this->randomName(16);
|
danielebarchiesi@0
|
340
|
danielebarchiesi@0
|
341 // Add custom language.
|
danielebarchiesi@0
|
342 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
343 $edit = array(
|
danielebarchiesi@0
|
344 'langcode' => $langcode,
|
danielebarchiesi@0
|
345 'name' => $name,
|
danielebarchiesi@0
|
346 'native' => $native,
|
danielebarchiesi@0
|
347 'prefix' => $prefix,
|
danielebarchiesi@0
|
348 'direction' => '0',
|
danielebarchiesi@0
|
349 );
|
danielebarchiesi@0
|
350 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
351 // Add string.
|
danielebarchiesi@0
|
352 t($name, array(), array('langcode' => $langcode));
|
danielebarchiesi@0
|
353 // Reset locale cache.
|
danielebarchiesi@0
|
354 locale_reset();
|
danielebarchiesi@0
|
355 $this->assertText($langcode, 'Language code found.');
|
danielebarchiesi@0
|
356 $this->assertText($name, 'Name found.');
|
danielebarchiesi@0
|
357 $this->assertText($native, 'Native found.');
|
danielebarchiesi@0
|
358 // No t() here, we do not want to add this string to the database and it's
|
danielebarchiesi@0
|
359 // surely not translated yet.
|
danielebarchiesi@0
|
360 $this->assertText($native, 'Test language added.');
|
danielebarchiesi@0
|
361 $this->drupalLogout();
|
danielebarchiesi@0
|
362
|
danielebarchiesi@0
|
363 // Search for the name and translate it.
|
danielebarchiesi@0
|
364 $this->drupalLogin($translate_user);
|
danielebarchiesi@0
|
365 $search = array(
|
danielebarchiesi@0
|
366 'string' => $name,
|
danielebarchiesi@0
|
367 'language' => 'all',
|
danielebarchiesi@0
|
368 'translation' => 'all',
|
danielebarchiesi@0
|
369 'group' => 'all',
|
danielebarchiesi@0
|
370 );
|
danielebarchiesi@0
|
371 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
372 // assertText() seems to remove the input field where $name always could be
|
danielebarchiesi@0
|
373 // found, so this is not a false assert. See how assertNoText succeeds
|
danielebarchiesi@0
|
374 // later.
|
danielebarchiesi@0
|
375 $this->assertText($name, 'Search found the name.');
|
danielebarchiesi@0
|
376 $this->assertRaw($language_indicator, 'Name is untranslated.');
|
danielebarchiesi@0
|
377 // Assume this is the only result, given the random name.
|
danielebarchiesi@0
|
378 $this->clickLink(t('edit'));
|
danielebarchiesi@0
|
379 // We save the lid from the path.
|
danielebarchiesi@0
|
380 $matches = array();
|
danielebarchiesi@0
|
381 preg_match('!admin/config/regional/translate/edit/(\d+)!', $this->getUrl(), $matches);
|
danielebarchiesi@0
|
382 $lid = $matches[1];
|
danielebarchiesi@0
|
383 // No t() here, it's surely not translated yet.
|
danielebarchiesi@0
|
384 $this->assertText($name, 'name found on edit screen.');
|
danielebarchiesi@0
|
385 $edit = array(
|
danielebarchiesi@0
|
386 "translations[$langcode]" => $translation,
|
danielebarchiesi@0
|
387 );
|
danielebarchiesi@0
|
388 $this->drupalPost(NULL, $edit, t('Save translations'));
|
danielebarchiesi@0
|
389 $this->assertText(t('The string has been saved.'), 'The string has been saved.');
|
danielebarchiesi@0
|
390 $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
391 $this->assertTrue($name != $translation && t($name, array(), array('langcode' => $langcode)) == $translation, 't() works.');
|
danielebarchiesi@0
|
392 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
393 // The indicator should not be here.
|
danielebarchiesi@0
|
394 $this->assertNoRaw($language_indicator, 'String is translated.');
|
danielebarchiesi@0
|
395
|
danielebarchiesi@0
|
396 // Try to edit a non-existent string and ensure we're redirected correctly.
|
danielebarchiesi@0
|
397 // Assuming we don't have 999,999 strings already.
|
danielebarchiesi@0
|
398 $random_lid = 999999;
|
danielebarchiesi@0
|
399 $this->drupalGet('admin/config/regional/translate/edit/' . $random_lid);
|
danielebarchiesi@0
|
400 $this->assertText(t('String not found'), 'String not found.');
|
danielebarchiesi@0
|
401 $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
402 $this->drupalLogout();
|
danielebarchiesi@0
|
403
|
danielebarchiesi@0
|
404 // Delete the language.
|
danielebarchiesi@0
|
405 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
406 $path = 'admin/config/regional/language/delete/' . $langcode;
|
danielebarchiesi@0
|
407 // This a confirm form, we do not need any fields changed.
|
danielebarchiesi@0
|
408 $this->drupalPost($path, array(), t('Delete'));
|
danielebarchiesi@0
|
409 // We need raw here because %locale will add HTML.
|
danielebarchiesi@0
|
410 $this->assertRaw(t('The language %locale has been removed.', array('%locale' => $name)), 'The test language has been removed.');
|
danielebarchiesi@0
|
411 // Reload to remove $name.
|
danielebarchiesi@0
|
412 $this->drupalGet($path);
|
danielebarchiesi@0
|
413 // Verify that language is no longer found.
|
danielebarchiesi@0
|
414 $this->assertResponse(404, 'Language no longer found.');
|
danielebarchiesi@0
|
415 $this->drupalLogout();
|
danielebarchiesi@0
|
416
|
danielebarchiesi@0
|
417 // Delete the string.
|
danielebarchiesi@0
|
418 $this->drupalLogin($translate_user);
|
danielebarchiesi@0
|
419 $search = array(
|
danielebarchiesi@0
|
420 'string' => $name,
|
danielebarchiesi@0
|
421 'language' => 'all',
|
danielebarchiesi@0
|
422 'translation' => 'all',
|
danielebarchiesi@0
|
423 'group' => 'all',
|
danielebarchiesi@0
|
424 );
|
danielebarchiesi@0
|
425 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
426 // Assume this is the only result, given the random name.
|
danielebarchiesi@0
|
427 $this->clickLink(t('delete'));
|
danielebarchiesi@0
|
428 $this->assertText(t('Are you sure you want to delete the string'), '"delete" link is correct.');
|
danielebarchiesi@0
|
429 // Delete the string.
|
danielebarchiesi@0
|
430 $path = 'admin/config/regional/translate/delete/' . $lid;
|
danielebarchiesi@0
|
431 $this->drupalGet($path);
|
danielebarchiesi@0
|
432 // First test the 'cancel' link.
|
danielebarchiesi@0
|
433 $this->clickLink(t('Cancel'));
|
danielebarchiesi@0
|
434 $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
435 $this->assertRaw($name, 'The string was not deleted.');
|
danielebarchiesi@0
|
436 // Delete the name string.
|
danielebarchiesi@0
|
437 $this->drupalPost('admin/config/regional/translate/delete/' . $lid, array(), t('Delete'));
|
danielebarchiesi@0
|
438 $this->assertText(t('The string has been removed.'), 'The string has been removed message.');
|
danielebarchiesi@0
|
439 $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/translate', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
440 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
441 $this->assertNoText($name, 'Search now can not find the name.');
|
danielebarchiesi@0
|
442 }
|
danielebarchiesi@0
|
443
|
danielebarchiesi@0
|
444 /*
|
danielebarchiesi@0
|
445 * Adds a language and checks that the JavaScript translation files are
|
danielebarchiesi@0
|
446 * properly created and rebuilt on deletion.
|
danielebarchiesi@0
|
447 */
|
danielebarchiesi@0
|
448 function testJavaScriptTranslation() {
|
danielebarchiesi@0
|
449 $user = $this->drupalCreateUser(array('translate interface', 'administer languages', 'access administration pages'));
|
danielebarchiesi@0
|
450 $this->drupalLogin($user);
|
danielebarchiesi@0
|
451
|
danielebarchiesi@0
|
452 $langcode = 'xx';
|
danielebarchiesi@0
|
453 // The English name for the language. This will be translated.
|
danielebarchiesi@0
|
454 $name = $this->randomName(16);
|
danielebarchiesi@0
|
455 // The native name for the language.
|
danielebarchiesi@0
|
456 $native = $this->randomName(16);
|
danielebarchiesi@0
|
457 // The domain prefix.
|
danielebarchiesi@0
|
458 $prefix = $langcode;
|
danielebarchiesi@0
|
459
|
danielebarchiesi@0
|
460 // Add custom language.
|
danielebarchiesi@0
|
461 $edit = array(
|
danielebarchiesi@0
|
462 'langcode' => $langcode,
|
danielebarchiesi@0
|
463 'name' => $name,
|
danielebarchiesi@0
|
464 'native' => $native,
|
danielebarchiesi@0
|
465 'prefix' => $prefix,
|
danielebarchiesi@0
|
466 'direction' => '0',
|
danielebarchiesi@0
|
467 );
|
danielebarchiesi@0
|
468 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
469 drupal_static_reset('language_list');
|
danielebarchiesi@0
|
470
|
danielebarchiesi@0
|
471 // Build the JavaScript translation file.
|
danielebarchiesi@0
|
472 $this->drupalGet('admin/config/regional/translate/translate');
|
danielebarchiesi@0
|
473
|
danielebarchiesi@0
|
474 // Retrieve the id of the first string available in the {locales_source}
|
danielebarchiesi@0
|
475 // table and translate it.
|
danielebarchiesi@0
|
476 $query = db_select('locales_source', 'l');
|
danielebarchiesi@0
|
477 $query->addExpression('min(l.lid)', 'lid');
|
danielebarchiesi@0
|
478 $result = $query->condition('l.location', '%.js%', 'LIKE')
|
danielebarchiesi@0
|
479 ->condition('l.textgroup', 'default')
|
danielebarchiesi@0
|
480 ->execute();
|
danielebarchiesi@0
|
481 $url = 'admin/config/regional/translate/edit/' . $result->fetchObject()->lid;
|
danielebarchiesi@0
|
482 $edit = array('translations['. $langcode .']' => $this->randomName());
|
danielebarchiesi@0
|
483 $this->drupalPost($url, $edit, t('Save translations'));
|
danielebarchiesi@0
|
484
|
danielebarchiesi@0
|
485 // Trigger JavaScript translation parsing and building.
|
danielebarchiesi@0
|
486 require_once DRUPAL_ROOT . '/includes/locale.inc';
|
danielebarchiesi@0
|
487 _locale_rebuild_js($langcode);
|
danielebarchiesi@0
|
488
|
danielebarchiesi@0
|
489 // Retrieve the JavaScript translation hash code for the custom language to
|
danielebarchiesi@0
|
490 // check that the translation file has been properly built.
|
danielebarchiesi@0
|
491 $file = db_select('languages', 'l')
|
danielebarchiesi@0
|
492 ->fields('l', array('javascript'))
|
danielebarchiesi@0
|
493 ->condition('language', $langcode)
|
danielebarchiesi@0
|
494 ->execute()
|
danielebarchiesi@0
|
495 ->fetchObject();
|
danielebarchiesi@0
|
496 $js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/' . $langcode . '_' . $file->javascript . '.js';
|
danielebarchiesi@0
|
497 $this->assertTrue($result = file_exists($js_file), format_string('JavaScript file created: %file', array('%file' => $result ? $js_file : 'not found')));
|
danielebarchiesi@0
|
498
|
danielebarchiesi@0
|
499 // Test JavaScript translation rebuilding.
|
danielebarchiesi@0
|
500 file_unmanaged_delete($js_file);
|
danielebarchiesi@0
|
501 $this->assertTrue($result = !file_exists($js_file), format_string('JavaScript file deleted: %file', array('%file' => $result ? $js_file : 'found')));
|
danielebarchiesi@0
|
502 cache_clear_all();
|
danielebarchiesi@0
|
503 _locale_rebuild_js($langcode);
|
danielebarchiesi@0
|
504 $this->assertTrue($result = file_exists($js_file), format_string('JavaScript file rebuilt: %file', array('%file' => $result ? $js_file : 'not found')));
|
danielebarchiesi@0
|
505 }
|
danielebarchiesi@0
|
506
|
danielebarchiesi@0
|
507 /**
|
danielebarchiesi@0
|
508 * Tests the validation of the translation input.
|
danielebarchiesi@0
|
509 */
|
danielebarchiesi@0
|
510 function testStringValidation() {
|
danielebarchiesi@0
|
511 global $base_url;
|
danielebarchiesi@0
|
512
|
danielebarchiesi@0
|
513 // User to add language and strings.
|
danielebarchiesi@0
|
514 $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages', 'translate interface'));
|
danielebarchiesi@0
|
515 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
516 $langcode = 'xx';
|
danielebarchiesi@0
|
517 // The English name for the language. This will be translated.
|
danielebarchiesi@0
|
518 $name = $this->randomName(16);
|
danielebarchiesi@0
|
519 // The native name for the language.
|
danielebarchiesi@0
|
520 $native = $this->randomName(16);
|
danielebarchiesi@0
|
521 // The domain prefix.
|
danielebarchiesi@0
|
522 $prefix = $langcode;
|
danielebarchiesi@0
|
523 // This is the language indicator on the translation search screen for
|
danielebarchiesi@0
|
524 // untranslated strings. Copied straight from locale.inc.
|
danielebarchiesi@0
|
525 $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
|
danielebarchiesi@0
|
526 // These will be the invalid translations of $name.
|
danielebarchiesi@0
|
527 $key = $this->randomName(16);
|
danielebarchiesi@0
|
528 $bad_translations[$key] = "<script>alert('xss');</script>" . $key;
|
danielebarchiesi@0
|
529 $key = $this->randomName(16);
|
danielebarchiesi@0
|
530 $bad_translations[$key] = '<img SRC="javascript:alert(\'xss\');">' . $key;
|
danielebarchiesi@0
|
531 $key = $this->randomName(16);
|
danielebarchiesi@0
|
532 $bad_translations[$key] = '<<SCRIPT>alert("xss");//<</SCRIPT>' . $key;
|
danielebarchiesi@0
|
533 $key = $this->randomName(16);
|
danielebarchiesi@0
|
534 $bad_translations[$key] ="<BODY ONLOAD=alert('xss')>" . $key;
|
danielebarchiesi@0
|
535
|
danielebarchiesi@0
|
536 // Add custom language.
|
danielebarchiesi@0
|
537 $edit = array(
|
danielebarchiesi@0
|
538 'langcode' => $langcode,
|
danielebarchiesi@0
|
539 'name' => $name,
|
danielebarchiesi@0
|
540 'native' => $native,
|
danielebarchiesi@0
|
541 'prefix' => $prefix,
|
danielebarchiesi@0
|
542 'direction' => '0',
|
danielebarchiesi@0
|
543 );
|
danielebarchiesi@0
|
544 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
545 // Add string.
|
danielebarchiesi@0
|
546 t($name, array(), array('langcode' => $langcode));
|
danielebarchiesi@0
|
547 // Reset locale cache.
|
danielebarchiesi@0
|
548 $search = array(
|
danielebarchiesi@0
|
549 'string' => $name,
|
danielebarchiesi@0
|
550 'language' => 'all',
|
danielebarchiesi@0
|
551 'translation' => 'all',
|
danielebarchiesi@0
|
552 'group' => 'all',
|
danielebarchiesi@0
|
553 );
|
danielebarchiesi@0
|
554 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
555 // Find the edit path.
|
danielebarchiesi@0
|
556 $content = $this->drupalGetContent();
|
danielebarchiesi@0
|
557 $this->assertTrue(preg_match('@(admin/config/regional/translate/edit/[0-9]+)@', $content, $matches), 'Found the edit path.');
|
danielebarchiesi@0
|
558 $path = $matches[0];
|
danielebarchiesi@0
|
559 foreach ($bad_translations as $key => $translation) {
|
danielebarchiesi@0
|
560 $edit = array(
|
danielebarchiesi@0
|
561 "translations[$langcode]" => $translation,
|
danielebarchiesi@0
|
562 );
|
danielebarchiesi@0
|
563 $this->drupalPost($path, $edit, t('Save translations'));
|
danielebarchiesi@0
|
564 // Check for a form error on the textarea.
|
danielebarchiesi@0
|
565 $form_class = $this->xpath('//form[@id="locale-translate-edit-form"]//textarea/@class');
|
danielebarchiesi@0
|
566 $this->assertNotIdentical(FALSE, strpos($form_class[0], 'error'), 'The string was rejected as unsafe.');
|
danielebarchiesi@0
|
567 $this->assertNoText(t('The string has been saved.'), 'The string was not saved.');
|
danielebarchiesi@0
|
568 }
|
danielebarchiesi@0
|
569 }
|
danielebarchiesi@0
|
570
|
danielebarchiesi@0
|
571 /**
|
danielebarchiesi@0
|
572 * Tests translation search form.
|
danielebarchiesi@0
|
573 */
|
danielebarchiesi@0
|
574 function testStringSearch() {
|
danielebarchiesi@0
|
575 global $base_url;
|
danielebarchiesi@0
|
576
|
danielebarchiesi@0
|
577 // User to add and remove language.
|
danielebarchiesi@0
|
578 $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
|
danielebarchiesi@0
|
579 // User to translate and delete string.
|
danielebarchiesi@0
|
580 $translate_user = $this->drupalCreateUser(array('translate interface', 'access administration pages'));
|
danielebarchiesi@0
|
581
|
danielebarchiesi@0
|
582 // Code for the language.
|
danielebarchiesi@0
|
583 $langcode = 'xx';
|
danielebarchiesi@0
|
584 // The English name for the language. This will be translated.
|
danielebarchiesi@0
|
585 $name = $this->randomName(16);
|
danielebarchiesi@0
|
586 // The native name for the language.
|
danielebarchiesi@0
|
587 $native = $this->randomName(16);
|
danielebarchiesi@0
|
588 // The domain prefix.
|
danielebarchiesi@0
|
589 $prefix = $langcode;
|
danielebarchiesi@0
|
590 // This is the language indicator on the translation search screen for
|
danielebarchiesi@0
|
591 // untranslated strings. Copied straight from locale.inc.
|
danielebarchiesi@0
|
592 $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
|
danielebarchiesi@0
|
593 // This will be the translation of $name.
|
danielebarchiesi@0
|
594 $translation = $this->randomName(16);
|
danielebarchiesi@0
|
595
|
danielebarchiesi@0
|
596 // Add custom language.
|
danielebarchiesi@0
|
597 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
598 $edit = array(
|
danielebarchiesi@0
|
599 'langcode' => $langcode,
|
danielebarchiesi@0
|
600 'name' => $name,
|
danielebarchiesi@0
|
601 'native' => $native,
|
danielebarchiesi@0
|
602 'prefix' => $prefix,
|
danielebarchiesi@0
|
603 'direction' => '0',
|
danielebarchiesi@0
|
604 );
|
danielebarchiesi@0
|
605 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
606 // Add string.
|
danielebarchiesi@0
|
607 t($name, array(), array('langcode' => $langcode));
|
danielebarchiesi@0
|
608 // Reset locale cache.
|
danielebarchiesi@0
|
609 locale_reset();
|
danielebarchiesi@0
|
610 $this->drupalLogout();
|
danielebarchiesi@0
|
611
|
danielebarchiesi@0
|
612 // Search for the name.
|
danielebarchiesi@0
|
613 $this->drupalLogin($translate_user);
|
danielebarchiesi@0
|
614 $search = array(
|
danielebarchiesi@0
|
615 'string' => $name,
|
danielebarchiesi@0
|
616 'language' => 'all',
|
danielebarchiesi@0
|
617 'translation' => 'all',
|
danielebarchiesi@0
|
618 'group' => 'all',
|
danielebarchiesi@0
|
619 );
|
danielebarchiesi@0
|
620 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
621 // assertText() seems to remove the input field where $name always could be
|
danielebarchiesi@0
|
622 // found, so this is not a false assert. See how assertNoText succeeds
|
danielebarchiesi@0
|
623 // later.
|
danielebarchiesi@0
|
624 $this->assertText($name, 'Search found the string.');
|
danielebarchiesi@0
|
625
|
danielebarchiesi@0
|
626 // Ensure untranslated string doesn't appear if searching on 'only
|
danielebarchiesi@0
|
627 // translated strings'.
|
danielebarchiesi@0
|
628 $search = array(
|
danielebarchiesi@0
|
629 'string' => $name,
|
danielebarchiesi@0
|
630 'language' => 'all',
|
danielebarchiesi@0
|
631 'translation' => 'translated',
|
danielebarchiesi@0
|
632 'group' => 'all',
|
danielebarchiesi@0
|
633 );
|
danielebarchiesi@0
|
634 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
635 $this->assertText(t('No strings available.'), "Search didn't find the string.");
|
danielebarchiesi@0
|
636
|
danielebarchiesi@0
|
637 // Ensure untranslated string appears if searching on 'only untranslated
|
danielebarchiesi@0
|
638 // strings' in "all" (hasn't been translated to any language).
|
danielebarchiesi@0
|
639 $search = array(
|
danielebarchiesi@0
|
640 'string' => $name,
|
danielebarchiesi@0
|
641 'language' => 'all',
|
danielebarchiesi@0
|
642 'translation' => 'untranslated',
|
danielebarchiesi@0
|
643 'group' => 'all',
|
danielebarchiesi@0
|
644 );
|
danielebarchiesi@0
|
645 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
646 $this->assertNoText(t('No strings available.'), 'Search found the string.');
|
danielebarchiesi@0
|
647
|
danielebarchiesi@0
|
648 // Ensure untranslated string appears if searching on 'only untranslated
|
danielebarchiesi@0
|
649 // strings' in the custom language (hasn't been translated to that specific language).
|
danielebarchiesi@0
|
650 $search = array(
|
danielebarchiesi@0
|
651 'string' => $name,
|
danielebarchiesi@0
|
652 'language' => $langcode,
|
danielebarchiesi@0
|
653 'translation' => 'untranslated',
|
danielebarchiesi@0
|
654 'group' => 'all',
|
danielebarchiesi@0
|
655 );
|
danielebarchiesi@0
|
656 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
657 $this->assertNoText(t('No strings available.'), 'Search found the string.');
|
danielebarchiesi@0
|
658
|
danielebarchiesi@0
|
659 // Add translation.
|
danielebarchiesi@0
|
660 // Assume this is the only result, given the random name.
|
danielebarchiesi@0
|
661 $this->clickLink(t('edit'));
|
danielebarchiesi@0
|
662 // We save the lid from the path.
|
danielebarchiesi@0
|
663 $matches = array();
|
danielebarchiesi@0
|
664 preg_match('!admin/config/regional/translate/edit/(\d)+!', $this->getUrl(), $matches);
|
danielebarchiesi@0
|
665 $lid = $matches[1];
|
danielebarchiesi@0
|
666 $edit = array(
|
danielebarchiesi@0
|
667 "translations[$langcode]" => $translation,
|
danielebarchiesi@0
|
668 );
|
danielebarchiesi@0
|
669 $this->drupalPost(NULL, $edit, t('Save translations'));
|
danielebarchiesi@0
|
670
|
danielebarchiesi@0
|
671 // Ensure translated string does appear if searching on 'only
|
danielebarchiesi@0
|
672 // translated strings'.
|
danielebarchiesi@0
|
673 $search = array(
|
danielebarchiesi@0
|
674 'string' => $translation,
|
danielebarchiesi@0
|
675 'language' => 'all',
|
danielebarchiesi@0
|
676 'translation' => 'translated',
|
danielebarchiesi@0
|
677 'group' => 'all',
|
danielebarchiesi@0
|
678 );
|
danielebarchiesi@0
|
679 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
680 $this->assertNoText(t('No strings available.'), 'Search found the translation.');
|
danielebarchiesi@0
|
681
|
danielebarchiesi@0
|
682 // Ensure translated source string doesn't appear if searching on 'only
|
danielebarchiesi@0
|
683 // untranslated strings'.
|
danielebarchiesi@0
|
684 $search = array(
|
danielebarchiesi@0
|
685 'string' => $name,
|
danielebarchiesi@0
|
686 'language' => 'all',
|
danielebarchiesi@0
|
687 'translation' => 'untranslated',
|
danielebarchiesi@0
|
688 'group' => 'all',
|
danielebarchiesi@0
|
689 );
|
danielebarchiesi@0
|
690 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
691 $this->assertText(t('No strings available.'), "Search didn't find the source string.");
|
danielebarchiesi@0
|
692
|
danielebarchiesi@0
|
693 // Ensure translated string doesn't appear if searching on 'only
|
danielebarchiesi@0
|
694 // untranslated strings'.
|
danielebarchiesi@0
|
695 $search = array(
|
danielebarchiesi@0
|
696 'string' => $translation,
|
danielebarchiesi@0
|
697 'language' => 'all',
|
danielebarchiesi@0
|
698 'translation' => 'untranslated',
|
danielebarchiesi@0
|
699 'group' => 'all',
|
danielebarchiesi@0
|
700 );
|
danielebarchiesi@0
|
701 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
702 $this->assertText(t('No strings available.'), "Search didn't find the translation.");
|
danielebarchiesi@0
|
703
|
danielebarchiesi@0
|
704 // Ensure translated string does appear if searching on the custom language.
|
danielebarchiesi@0
|
705 $search = array(
|
danielebarchiesi@0
|
706 'string' => $translation,
|
danielebarchiesi@0
|
707 'language' => $langcode,
|
danielebarchiesi@0
|
708 'translation' => 'all',
|
danielebarchiesi@0
|
709 'group' => 'all',
|
danielebarchiesi@0
|
710 );
|
danielebarchiesi@0
|
711 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
712 $this->assertNoText(t('No strings available.'), 'Search found the translation.');
|
danielebarchiesi@0
|
713
|
danielebarchiesi@0
|
714 // Ensure translated string doesn't appear if searching on English.
|
danielebarchiesi@0
|
715 $search = array(
|
danielebarchiesi@0
|
716 'string' => $translation,
|
danielebarchiesi@0
|
717 'language' => 'en',
|
danielebarchiesi@0
|
718 'translation' => 'all',
|
danielebarchiesi@0
|
719 'group' => 'all',
|
danielebarchiesi@0
|
720 );
|
danielebarchiesi@0
|
721 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
722 $this->assertText(t('No strings available.'), "Search didn't find the translation.");
|
danielebarchiesi@0
|
723
|
danielebarchiesi@0
|
724 // Search for a string that isn't in the system.
|
danielebarchiesi@0
|
725 $unavailable_string = $this->randomName(16);
|
danielebarchiesi@0
|
726 $search = array(
|
danielebarchiesi@0
|
727 'string' => $unavailable_string,
|
danielebarchiesi@0
|
728 'language' => 'all',
|
danielebarchiesi@0
|
729 'translation' => 'all',
|
danielebarchiesi@0
|
730 'group' => 'all',
|
danielebarchiesi@0
|
731 );
|
danielebarchiesi@0
|
732 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
733 $this->assertText(t('No strings available.'), "Search didn't find the invalid string.");
|
danielebarchiesi@0
|
734 }
|
danielebarchiesi@0
|
735 }
|
danielebarchiesi@0
|
736
|
danielebarchiesi@0
|
737 /**
|
danielebarchiesi@0
|
738 * Tests plural index computation functionality.
|
danielebarchiesi@0
|
739 */
|
danielebarchiesi@0
|
740 class LocalePluralFormatTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
741 public static function getInfo() {
|
danielebarchiesi@0
|
742 return array(
|
danielebarchiesi@0
|
743 'name' => 'Plural formula evaluation',
|
danielebarchiesi@0
|
744 'description' => 'Tests plural formula evaluation for various languages.',
|
danielebarchiesi@0
|
745 'group' => 'Locale',
|
danielebarchiesi@0
|
746 );
|
danielebarchiesi@0
|
747 }
|
danielebarchiesi@0
|
748
|
danielebarchiesi@0
|
749 function setUp() {
|
danielebarchiesi@0
|
750 parent::setUp('locale', 'locale_test');
|
danielebarchiesi@0
|
751
|
danielebarchiesi@0
|
752 $admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
|
danielebarchiesi@0
|
753 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
754
|
danielebarchiesi@0
|
755 // Import some .po files with formulas to set up the environment.
|
danielebarchiesi@0
|
756 // These will also add the languages to the system and enable them.
|
danielebarchiesi@0
|
757 $this->importPoFile($this->getPoFileWithSimplePlural(), array(
|
danielebarchiesi@0
|
758 'langcode' => 'fr',
|
danielebarchiesi@0
|
759 ));
|
danielebarchiesi@0
|
760 $this->importPoFile($this->getPoFileWithComplexPlural(), array(
|
danielebarchiesi@0
|
761 'langcode' => 'hr',
|
danielebarchiesi@0
|
762 ));
|
danielebarchiesi@0
|
763 }
|
danielebarchiesi@0
|
764
|
danielebarchiesi@0
|
765 /**
|
danielebarchiesi@0
|
766 * Tests locale_get_plural() functionality.
|
danielebarchiesi@0
|
767 */
|
danielebarchiesi@0
|
768 function testGetPluralFormat() {
|
danielebarchiesi@0
|
769 $this->drupalGet('locale_test_plural_format_page');
|
danielebarchiesi@0
|
770 $tests = _locale_test_plural_format_tests();
|
danielebarchiesi@0
|
771 $result = array();
|
danielebarchiesi@0
|
772 foreach ($tests as $test) {
|
danielebarchiesi@0
|
773 $this->assertPluralFormat($test['count'], $test['language'], $test['expected-result']);
|
danielebarchiesi@0
|
774 }
|
danielebarchiesi@0
|
775 }
|
danielebarchiesi@0
|
776
|
danielebarchiesi@0
|
777 /**
|
danielebarchiesi@0
|
778 * Helper assert to test locale_get_plural page.
|
danielebarchiesi@0
|
779 *
|
danielebarchiesi@0
|
780 * @param $count
|
danielebarchiesi@0
|
781 * Number for testing.
|
danielebarchiesi@0
|
782 * @param $lang
|
danielebarchiesi@0
|
783 * Language for testing
|
danielebarchiesi@0
|
784 * @param $expected_result
|
danielebarchiesi@0
|
785 * Expected result.
|
danielebarchiesi@0
|
786 * @param $message
|
danielebarchiesi@0
|
787 */
|
danielebarchiesi@0
|
788 function assertPluralFormat($count, $lang, $expected_result) {
|
danielebarchiesi@0
|
789 $message_param = array(
|
danielebarchiesi@0
|
790 '@lang' => $lang,
|
danielebarchiesi@0
|
791 '@count' => $count,
|
danielebarchiesi@0
|
792 '@expected_result' => $expected_result,
|
danielebarchiesi@0
|
793 );
|
danielebarchiesi@0
|
794 $message = t("Computed plural index for '@lang' with count @count is @expected_result.", $message_param);
|
danielebarchiesi@0
|
795
|
danielebarchiesi@0
|
796 $message_param = array(
|
danielebarchiesi@0
|
797 '@lang' => $lang,
|
danielebarchiesi@0
|
798 '@expected_result' => $expected_result,
|
danielebarchiesi@0
|
799 );
|
danielebarchiesi@0
|
800 $this->assertText(format_string('Language: @lang, locale_get_plural: @expected_result.', $message_param, $message));
|
danielebarchiesi@0
|
801 }
|
danielebarchiesi@0
|
802
|
danielebarchiesi@0
|
803 /**
|
danielebarchiesi@0
|
804 * Imports a standalone .po file in a given language.
|
danielebarchiesi@0
|
805 *
|
danielebarchiesi@0
|
806 * @param $contents
|
danielebarchiesi@0
|
807 * Contents of the .po file to import.
|
danielebarchiesi@0
|
808 * @param $options
|
danielebarchiesi@0
|
809 * Additional options to pass to the translation import form.
|
danielebarchiesi@0
|
810 */
|
danielebarchiesi@0
|
811 function importPoFile($contents, array $options = array()) {
|
danielebarchiesi@0
|
812 $name = tempnam('temporary://', "po_") . '.po';
|
danielebarchiesi@0
|
813 file_put_contents($name, $contents);
|
danielebarchiesi@0
|
814 $options['files[file]'] = $name;
|
danielebarchiesi@0
|
815 $this->drupalPost('admin/config/regional/translate/import', $options, t('Import'));
|
danielebarchiesi@0
|
816 drupal_unlink($name);
|
danielebarchiesi@0
|
817 }
|
danielebarchiesi@0
|
818
|
danielebarchiesi@0
|
819 /**
|
danielebarchiesi@0
|
820 * Returns a .po file with a simple plural formula.
|
danielebarchiesi@0
|
821 */
|
danielebarchiesi@0
|
822 function getPoFileWithSimplePlural() {
|
danielebarchiesi@0
|
823 return <<< EOF
|
danielebarchiesi@0
|
824 msgid ""
|
danielebarchiesi@0
|
825 msgstr ""
|
danielebarchiesi@0
|
826 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
827 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
828 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
829 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
830 "Plural-Forms: nplurals=2; plural=(n!=1);\\n"
|
danielebarchiesi@0
|
831
|
danielebarchiesi@0
|
832 msgid "One sheep"
|
danielebarchiesi@0
|
833 msgid_plural "@count sheep"
|
danielebarchiesi@0
|
834 msgstr[0] "un mouton"
|
danielebarchiesi@0
|
835 msgstr[1] "@count moutons"
|
danielebarchiesi@0
|
836
|
danielebarchiesi@0
|
837 msgid "Monday"
|
danielebarchiesi@0
|
838 msgstr "lundi"
|
danielebarchiesi@0
|
839 EOF;
|
danielebarchiesi@0
|
840 }
|
danielebarchiesi@0
|
841
|
danielebarchiesi@0
|
842 /**
|
danielebarchiesi@0
|
843 * Returns a .po file with a complex plural formula.
|
danielebarchiesi@0
|
844 */
|
danielebarchiesi@0
|
845 function getPoFileWithComplexPlural() {
|
danielebarchiesi@0
|
846 return <<< EOF
|
danielebarchiesi@0
|
847 msgid ""
|
danielebarchiesi@0
|
848 msgstr ""
|
danielebarchiesi@0
|
849 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
850 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
851 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
852 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
853 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n"
|
danielebarchiesi@0
|
854
|
danielebarchiesi@0
|
855 msgid "1 hour"
|
danielebarchiesi@0
|
856 msgid_plural "@count hours"
|
danielebarchiesi@0
|
857 msgstr[0] "@count sat"
|
danielebarchiesi@0
|
858 msgstr[1] "@count sata"
|
danielebarchiesi@0
|
859 msgstr[2] "@count sati"
|
danielebarchiesi@0
|
860
|
danielebarchiesi@0
|
861 msgid "Monday"
|
danielebarchiesi@0
|
862 msgstr "Ponedjeljak"
|
danielebarchiesi@0
|
863 EOF;
|
danielebarchiesi@0
|
864 }
|
danielebarchiesi@0
|
865 }
|
danielebarchiesi@0
|
866
|
danielebarchiesi@0
|
867 /**
|
danielebarchiesi@0
|
868 * Functional tests for the import of translation files.
|
danielebarchiesi@0
|
869 */
|
danielebarchiesi@0
|
870 class LocaleImportFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
871 public static function getInfo() {
|
danielebarchiesi@0
|
872 return array(
|
danielebarchiesi@0
|
873 'name' => 'Translation import',
|
danielebarchiesi@0
|
874 'description' => 'Tests the import of locale files.',
|
danielebarchiesi@0
|
875 'group' => 'Locale',
|
danielebarchiesi@0
|
876 );
|
danielebarchiesi@0
|
877 }
|
danielebarchiesi@0
|
878
|
danielebarchiesi@0
|
879 /**
|
danielebarchiesi@0
|
880 * A user able to create languages and import translations.
|
danielebarchiesi@0
|
881 */
|
danielebarchiesi@0
|
882 protected $admin_user = NULL;
|
danielebarchiesi@0
|
883
|
danielebarchiesi@0
|
884 function setUp() {
|
danielebarchiesi@0
|
885 parent::setUp('locale', 'locale_test');
|
danielebarchiesi@0
|
886
|
danielebarchiesi@0
|
887 $this->admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
|
danielebarchiesi@0
|
888 $this->drupalLogin($this->admin_user);
|
danielebarchiesi@0
|
889 }
|
danielebarchiesi@0
|
890
|
danielebarchiesi@0
|
891 /**
|
danielebarchiesi@0
|
892 * Test import of standalone .po files.
|
danielebarchiesi@0
|
893 */
|
danielebarchiesi@0
|
894 function testStandalonePoFile() {
|
danielebarchiesi@0
|
895 // Try importing a .po file.
|
danielebarchiesi@0
|
896 $this->importPoFile($this->getPoFile(), array(
|
danielebarchiesi@0
|
897 'langcode' => 'fr',
|
danielebarchiesi@0
|
898 ));
|
danielebarchiesi@0
|
899
|
danielebarchiesi@0
|
900 // The import should automatically create the corresponding language.
|
danielebarchiesi@0
|
901 $this->assertRaw(t('The language %language has been created.', array('%language' => 'French')), 'The language has been automatically created.');
|
danielebarchiesi@0
|
902
|
danielebarchiesi@0
|
903 // The import should have created 7 strings.
|
danielebarchiesi@0
|
904 $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' => 9, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
|
danielebarchiesi@0
|
905
|
danielebarchiesi@0
|
906 // This import should have saved plural forms to have 2 variants.
|
danielebarchiesi@0
|
907 $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'Plural number initialized.');
|
danielebarchiesi@0
|
908
|
danielebarchiesi@0
|
909 // Ensure we were redirected correctly.
|
danielebarchiesi@0
|
910 $this->assertEqual($this->getUrl(), url('admin/config/regional/translate', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
911
|
danielebarchiesi@0
|
912
|
danielebarchiesi@0
|
913 // Try importing a .po file with invalid tags in the default text group.
|
danielebarchiesi@0
|
914 $this->importPoFile($this->getBadPoFile(), array(
|
danielebarchiesi@0
|
915 'langcode' => 'fr',
|
danielebarchiesi@0
|
916 ));
|
danielebarchiesi@0
|
917
|
danielebarchiesi@0
|
918 // The import should have created 1 string and rejected 2.
|
danielebarchiesi@0
|
919 $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' => 1, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
|
danielebarchiesi@0
|
920 $skip_message = format_plural(2, 'One translation string was skipped because it contains disallowed HTML.', '@count translation strings were skipped because they contain disallowed HTML.');
|
danielebarchiesi@0
|
921 $this->assertRaw($skip_message, 'Unsafe strings were skipped.');
|
danielebarchiesi@0
|
922
|
danielebarchiesi@0
|
923
|
danielebarchiesi@0
|
924 // Try importing a .po file with invalid tags in a non default text group.
|
danielebarchiesi@0
|
925 $this->importPoFile($this->getBadPoFile(), array(
|
danielebarchiesi@0
|
926 'langcode' => 'fr',
|
danielebarchiesi@0
|
927 'group' => 'custom',
|
danielebarchiesi@0
|
928 ));
|
danielebarchiesi@0
|
929
|
danielebarchiesi@0
|
930 // The import should have created 3 strings.
|
danielebarchiesi@0
|
931 $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' => 3, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
|
danielebarchiesi@0
|
932
|
danielebarchiesi@0
|
933
|
danielebarchiesi@0
|
934 // Try importing a .po file which doesn't exist.
|
danielebarchiesi@0
|
935 $name = $this->randomName(16);
|
danielebarchiesi@0
|
936 $this->drupalPost('admin/config/regional/translate/import', array(
|
danielebarchiesi@0
|
937 'langcode' => 'fr',
|
danielebarchiesi@0
|
938 'files[file]' => $name,
|
danielebarchiesi@0
|
939 'group' => 'custom',
|
danielebarchiesi@0
|
940 ), t('Import'));
|
danielebarchiesi@0
|
941 $this->assertEqual($this->getUrl(), url('admin/config/regional/translate/import', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
942 $this->assertText(t('File to import not found.'), 'File to import not found message.');
|
danielebarchiesi@0
|
943
|
danielebarchiesi@0
|
944
|
danielebarchiesi@0
|
945 // Try importing a .po file with overriding strings, and ensure existing
|
danielebarchiesi@0
|
946 // strings are kept.
|
danielebarchiesi@0
|
947 $this->importPoFile($this->getOverwritePoFile(), array(
|
danielebarchiesi@0
|
948 'langcode' => 'fr',
|
danielebarchiesi@0
|
949 'mode' => 1, // Existing strings are kept, only new strings are added.
|
danielebarchiesi@0
|
950 ));
|
danielebarchiesi@0
|
951
|
danielebarchiesi@0
|
952 // The import should have created 1 string.
|
danielebarchiesi@0
|
953 $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' => 1, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
|
danielebarchiesi@0
|
954 // Ensure string wasn't overwritten.
|
danielebarchiesi@0
|
955 $search = array(
|
danielebarchiesi@0
|
956 'string' => 'Montag',
|
danielebarchiesi@0
|
957 'language' => 'fr',
|
danielebarchiesi@0
|
958 'translation' => 'translated',
|
danielebarchiesi@0
|
959 'group' => 'all',
|
danielebarchiesi@0
|
960 );
|
danielebarchiesi@0
|
961 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
962 $this->assertText(t('No strings available.'), 'String not overwritten by imported string.');
|
danielebarchiesi@0
|
963
|
danielebarchiesi@0
|
964 // This import should not have changed number of plural forms.
|
danielebarchiesi@0
|
965 $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'Plural numbers untouched.');
|
danielebarchiesi@0
|
966
|
danielebarchiesi@0
|
967 $this->importPoFile($this->getPoFileWithBrokenPlural(), array(
|
danielebarchiesi@0
|
968 'langcode' => 'fr',
|
danielebarchiesi@0
|
969 'mode' => 1, // Existing strings are kept, only new strings are added.
|
danielebarchiesi@0
|
970 ));
|
danielebarchiesi@0
|
971
|
danielebarchiesi@0
|
972 // Attempt to import broken .po file as well to prove that this
|
danielebarchiesi@0
|
973 // will not overwrite the proper plural formula imported above.
|
danielebarchiesi@0
|
974 $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'Broken plurals: plural numbers untouched.');
|
danielebarchiesi@0
|
975
|
danielebarchiesi@0
|
976 $this->importPoFile($this->getPoFileWithMissingPlural(), array(
|
danielebarchiesi@0
|
977 'langcode' => 'fr',
|
danielebarchiesi@0
|
978 'mode' => 1, // Existing strings are kept, only new strings are added.
|
danielebarchiesi@0
|
979 ));
|
danielebarchiesi@0
|
980
|
danielebarchiesi@0
|
981 // Attempt to import .po file which has no plurals and prove that this
|
danielebarchiesi@0
|
982 // will not overwrite the proper plural formula imported above.
|
danielebarchiesi@0
|
983 $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 2, 'No plurals: plural numbers untouched.');
|
danielebarchiesi@0
|
984
|
danielebarchiesi@0
|
985
|
danielebarchiesi@0
|
986 // Try importing a .po file with overriding strings, and ensure existing
|
danielebarchiesi@0
|
987 // strings are overwritten.
|
danielebarchiesi@0
|
988 $this->importPoFile($this->getOverwritePoFile(), array(
|
danielebarchiesi@0
|
989 'langcode' => 'fr',
|
danielebarchiesi@0
|
990 'mode' => 0, // Strings in the uploaded file replace existing ones, new ones are added.
|
danielebarchiesi@0
|
991 ));
|
danielebarchiesi@0
|
992
|
danielebarchiesi@0
|
993 // The import should have updated 2 strings.
|
danielebarchiesi@0
|
994 $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' => 2, '%delete' => 0)), 'The translation file was successfully imported.');
|
danielebarchiesi@0
|
995 // Ensure string was overwritten.
|
danielebarchiesi@0
|
996 $search = array(
|
danielebarchiesi@0
|
997 'string' => 'Montag',
|
danielebarchiesi@0
|
998 'language' => 'fr',
|
danielebarchiesi@0
|
999 'translation' => 'translated',
|
danielebarchiesi@0
|
1000 'group' => 'all',
|
danielebarchiesi@0
|
1001 );
|
danielebarchiesi@0
|
1002 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
1003 $this->assertNoText(t('No strings available.'), 'String overwritten by imported string.');
|
danielebarchiesi@0
|
1004 // This import should have changed number of plural forms.
|
danielebarchiesi@0
|
1005 $this->assert(db_query("SELECT plurals FROM {languages} WHERE language = 'fr'")->fetchField() == 3, 'Plural numbers changed.');
|
danielebarchiesi@0
|
1006 }
|
danielebarchiesi@0
|
1007
|
danielebarchiesi@0
|
1008 /**
|
danielebarchiesi@0
|
1009 * Test automatic import of a module's translation files when a language is
|
danielebarchiesi@0
|
1010 * enabled.
|
danielebarchiesi@0
|
1011 */
|
danielebarchiesi@0
|
1012 function testAutomaticModuleTranslationImportLanguageEnable() {
|
danielebarchiesi@0
|
1013 // Code for the language - manually set to match the test translation file.
|
danielebarchiesi@0
|
1014 $langcode = 'xx';
|
danielebarchiesi@0
|
1015 // The English name for the language.
|
danielebarchiesi@0
|
1016 $name = $this->randomName(16);
|
danielebarchiesi@0
|
1017 // The native name for the language.
|
danielebarchiesi@0
|
1018 $native = $this->randomName(16);
|
danielebarchiesi@0
|
1019 // The domain prefix.
|
danielebarchiesi@0
|
1020 $prefix = $langcode;
|
danielebarchiesi@0
|
1021
|
danielebarchiesi@0
|
1022 // Create a custom language.
|
danielebarchiesi@0
|
1023 $edit = array(
|
danielebarchiesi@0
|
1024 'langcode' => $langcode,
|
danielebarchiesi@0
|
1025 'name' => $name,
|
danielebarchiesi@0
|
1026 'native' => $native,
|
danielebarchiesi@0
|
1027 'prefix' => $prefix,
|
danielebarchiesi@0
|
1028 'direction' => '0',
|
danielebarchiesi@0
|
1029 );
|
danielebarchiesi@0
|
1030 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
1031
|
danielebarchiesi@0
|
1032 // Ensure the translation file was automatically imported when language was
|
danielebarchiesi@0
|
1033 // added.
|
danielebarchiesi@0
|
1034 $this->assertText(t('One translation file imported for the enabled modules.'), 'Language file automatically imported.');
|
danielebarchiesi@0
|
1035
|
danielebarchiesi@0
|
1036 // Ensure strings were successfully imported.
|
danielebarchiesi@0
|
1037 $search = array(
|
danielebarchiesi@0
|
1038 'string' => 'lundi',
|
danielebarchiesi@0
|
1039 'language' => $langcode,
|
danielebarchiesi@0
|
1040 'translation' => 'translated',
|
danielebarchiesi@0
|
1041 'group' => 'all',
|
danielebarchiesi@0
|
1042 );
|
danielebarchiesi@0
|
1043 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
1044 $this->assertNoText(t('No strings available.'), 'String successfully imported.');
|
danielebarchiesi@0
|
1045 }
|
danielebarchiesi@0
|
1046
|
danielebarchiesi@0
|
1047 /**
|
danielebarchiesi@0
|
1048 * Test msgctxt context support.
|
danielebarchiesi@0
|
1049 */
|
danielebarchiesi@0
|
1050 function testLanguageContext() {
|
danielebarchiesi@0
|
1051 // Try importing a .po file.
|
danielebarchiesi@0
|
1052 $this->importPoFile($this->getPoFileWithContext(), array(
|
danielebarchiesi@0
|
1053 'langcode' => 'hr',
|
danielebarchiesi@0
|
1054 ));
|
danielebarchiesi@0
|
1055
|
danielebarchiesi@0
|
1056 $this->assertIdentical(t('May', array(), array('langcode' => 'hr', 'context' => 'Long month name')), 'Svibanj', 'Long month name context is working.');
|
danielebarchiesi@0
|
1057 $this->assertIdentical(t('May', array(), array('langcode' => 'hr')), 'Svi.', 'Default context is working.');
|
danielebarchiesi@0
|
1058 }
|
danielebarchiesi@0
|
1059
|
danielebarchiesi@0
|
1060 /**
|
danielebarchiesi@0
|
1061 * Test empty msgstr at end of .po file see #611786.
|
danielebarchiesi@0
|
1062 */
|
danielebarchiesi@0
|
1063 function testEmptyMsgstr() {
|
danielebarchiesi@0
|
1064 $langcode = 'hu';
|
danielebarchiesi@0
|
1065
|
danielebarchiesi@0
|
1066 // Try importing a .po file.
|
danielebarchiesi@0
|
1067 $this->importPoFile($this->getPoFileWithMsgstr(), array(
|
danielebarchiesi@0
|
1068 'langcode' => $langcode,
|
danielebarchiesi@0
|
1069 ));
|
danielebarchiesi@0
|
1070
|
danielebarchiesi@0
|
1071 $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' => 1, '%update' => 0, '%delete' => 0)), 'The translation file was successfully imported.');
|
danielebarchiesi@0
|
1072 $this->assertIdentical(t('Operations', array(), array('langcode' => $langcode)), 'Műveletek', 'String imported and translated.');
|
danielebarchiesi@0
|
1073
|
danielebarchiesi@0
|
1074 // Try importing a .po file.
|
danielebarchiesi@0
|
1075 $this->importPoFile($this->getPoFileWithEmptyMsgstr(), array(
|
danielebarchiesi@0
|
1076 'langcode' => $langcode,
|
danielebarchiesi@0
|
1077 'mode' => 0,
|
danielebarchiesi@0
|
1078 ));
|
danielebarchiesi@0
|
1079 $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)), 'The translation file was successfully imported.');
|
danielebarchiesi@0
|
1080 // This is the language indicator on the translation search screen for
|
danielebarchiesi@0
|
1081 // untranslated strings. Copied straight from locale.inc.
|
danielebarchiesi@0
|
1082 $language_indicator = "<em class=\"locale-untranslated\">$langcode</em> ";
|
danielebarchiesi@0
|
1083 $str = "Operations";
|
danielebarchiesi@0
|
1084 $search = array(
|
danielebarchiesi@0
|
1085 'string' => $str,
|
danielebarchiesi@0
|
1086 'language' => 'all',
|
danielebarchiesi@0
|
1087 'translation' => 'all',
|
danielebarchiesi@0
|
1088 'group' => 'all',
|
danielebarchiesi@0
|
1089 );
|
danielebarchiesi@0
|
1090 $this->drupalPost('admin/config/regional/translate/translate', $search, t('Filter'));
|
danielebarchiesi@0
|
1091 // assertText() seems to remove the input field where $str always could be
|
danielebarchiesi@0
|
1092 // found, so this is not a false assert.
|
danielebarchiesi@0
|
1093 $this->assertText($str, 'Search found the string.');
|
danielebarchiesi@0
|
1094 $this->assertRaw($language_indicator, 'String is untranslated again.');
|
danielebarchiesi@0
|
1095 }
|
danielebarchiesi@0
|
1096
|
danielebarchiesi@0
|
1097 /**
|
danielebarchiesi@0
|
1098 * Helper function: import a standalone .po file in a given language.
|
danielebarchiesi@0
|
1099 *
|
danielebarchiesi@0
|
1100 * @param $contents
|
danielebarchiesi@0
|
1101 * Contents of the .po file to import.
|
danielebarchiesi@0
|
1102 * @param $options
|
danielebarchiesi@0
|
1103 * Additional options to pass to the translation import form.
|
danielebarchiesi@0
|
1104 */
|
danielebarchiesi@0
|
1105 function importPoFile($contents, array $options = array()) {
|
danielebarchiesi@0
|
1106 $name = tempnam('temporary://', "po_") . '.po';
|
danielebarchiesi@0
|
1107 file_put_contents($name, $contents);
|
danielebarchiesi@0
|
1108 $options['files[file]'] = $name;
|
danielebarchiesi@0
|
1109 $this->drupalPost('admin/config/regional/translate/import', $options, t('Import'));
|
danielebarchiesi@0
|
1110 drupal_unlink($name);
|
danielebarchiesi@0
|
1111 }
|
danielebarchiesi@0
|
1112
|
danielebarchiesi@0
|
1113 /**
|
danielebarchiesi@0
|
1114 * Helper function that returns a proper .po file.
|
danielebarchiesi@0
|
1115 */
|
danielebarchiesi@0
|
1116 function getPoFile() {
|
danielebarchiesi@0
|
1117 return <<< EOF
|
danielebarchiesi@0
|
1118 msgid ""
|
danielebarchiesi@0
|
1119 msgstr ""
|
danielebarchiesi@0
|
1120 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1121 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1122 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1123 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1124 "Plural-Forms: nplurals=2; plural=(n > 1);\\n"
|
danielebarchiesi@0
|
1125
|
danielebarchiesi@0
|
1126 msgid "One sheep"
|
danielebarchiesi@0
|
1127 msgid_plural "@count sheep"
|
danielebarchiesi@0
|
1128 msgstr[0] "un mouton"
|
danielebarchiesi@0
|
1129 msgstr[1] "@count moutons"
|
danielebarchiesi@0
|
1130
|
danielebarchiesi@0
|
1131 msgid "Monday"
|
danielebarchiesi@0
|
1132 msgstr "lundi"
|
danielebarchiesi@0
|
1133
|
danielebarchiesi@0
|
1134 msgid "Tuesday"
|
danielebarchiesi@0
|
1135 msgstr "mardi"
|
danielebarchiesi@0
|
1136
|
danielebarchiesi@0
|
1137 msgid "Wednesday"
|
danielebarchiesi@0
|
1138 msgstr "mercredi"
|
danielebarchiesi@0
|
1139
|
danielebarchiesi@0
|
1140 msgid "Thursday"
|
danielebarchiesi@0
|
1141 msgstr "jeudi"
|
danielebarchiesi@0
|
1142
|
danielebarchiesi@0
|
1143 msgid "Friday"
|
danielebarchiesi@0
|
1144 msgstr "vendredi"
|
danielebarchiesi@0
|
1145
|
danielebarchiesi@0
|
1146 msgid "Saturday"
|
danielebarchiesi@0
|
1147 msgstr "samedi"
|
danielebarchiesi@0
|
1148
|
danielebarchiesi@0
|
1149 msgid "Sunday"
|
danielebarchiesi@0
|
1150 msgstr "dimanche"
|
danielebarchiesi@0
|
1151 EOF;
|
danielebarchiesi@0
|
1152 }
|
danielebarchiesi@0
|
1153
|
danielebarchiesi@0
|
1154 /**
|
danielebarchiesi@0
|
1155 * Helper function that returns a bad .po file.
|
danielebarchiesi@0
|
1156 */
|
danielebarchiesi@0
|
1157 function getBadPoFile() {
|
danielebarchiesi@0
|
1158 return <<< EOF
|
danielebarchiesi@0
|
1159 msgid ""
|
danielebarchiesi@0
|
1160 msgstr ""
|
danielebarchiesi@0
|
1161 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1162 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1163 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1164 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1165 "Plural-Forms: nplurals=2; plural=(n > 1);\\n"
|
danielebarchiesi@0
|
1166
|
danielebarchiesi@0
|
1167 msgid "Save configuration"
|
danielebarchiesi@0
|
1168 msgstr "Enregistrer la configuration"
|
danielebarchiesi@0
|
1169
|
danielebarchiesi@0
|
1170 msgid "edit"
|
danielebarchiesi@0
|
1171 msgstr "modifier<img SRC="javascript:alert(\'xss\');">"
|
danielebarchiesi@0
|
1172
|
danielebarchiesi@0
|
1173 msgid "delete"
|
danielebarchiesi@0
|
1174 msgstr "supprimer<script>alert('xss');</script>"
|
danielebarchiesi@0
|
1175
|
danielebarchiesi@0
|
1176 EOF;
|
danielebarchiesi@0
|
1177 }
|
danielebarchiesi@0
|
1178
|
danielebarchiesi@0
|
1179 /**
|
danielebarchiesi@0
|
1180 * Helper function that returns a proper .po file, for testing overwriting
|
danielebarchiesi@0
|
1181 * existing translations.
|
danielebarchiesi@0
|
1182 */
|
danielebarchiesi@0
|
1183 function getOverwritePoFile() {
|
danielebarchiesi@0
|
1184 return <<< EOF
|
danielebarchiesi@0
|
1185 msgid ""
|
danielebarchiesi@0
|
1186 msgstr ""
|
danielebarchiesi@0
|
1187 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1188 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1189 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1190 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1191 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n"
|
danielebarchiesi@0
|
1192
|
danielebarchiesi@0
|
1193 msgid "Monday"
|
danielebarchiesi@0
|
1194 msgstr "Montag"
|
danielebarchiesi@0
|
1195
|
danielebarchiesi@0
|
1196 msgid "Day"
|
danielebarchiesi@0
|
1197 msgstr "Jour"
|
danielebarchiesi@0
|
1198 EOF;
|
danielebarchiesi@0
|
1199 }
|
danielebarchiesi@0
|
1200
|
danielebarchiesi@0
|
1201 /**
|
danielebarchiesi@0
|
1202 * Helper function that returns a .po file with context.
|
danielebarchiesi@0
|
1203 */
|
danielebarchiesi@0
|
1204 function getPoFileWithContext() {
|
danielebarchiesi@0
|
1205 // Croatian (code hr) is one the the languages that have a different
|
danielebarchiesi@0
|
1206 // form for the full name and the abbreviated name for the month May.
|
danielebarchiesi@0
|
1207 return <<< EOF
|
danielebarchiesi@0
|
1208 msgid ""
|
danielebarchiesi@0
|
1209 msgstr ""
|
danielebarchiesi@0
|
1210 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1211 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1212 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1213 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1214 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\\n"
|
danielebarchiesi@0
|
1215
|
danielebarchiesi@0
|
1216 msgctxt "Long month name"
|
danielebarchiesi@0
|
1217 msgid "May"
|
danielebarchiesi@0
|
1218 msgstr "Svibanj"
|
danielebarchiesi@0
|
1219
|
danielebarchiesi@0
|
1220 msgid "May"
|
danielebarchiesi@0
|
1221 msgstr "Svi."
|
danielebarchiesi@0
|
1222 EOF;
|
danielebarchiesi@0
|
1223 }
|
danielebarchiesi@0
|
1224
|
danielebarchiesi@0
|
1225 /**
|
danielebarchiesi@0
|
1226 * Helper function that returns a .po file with an empty last item.
|
danielebarchiesi@0
|
1227 */
|
danielebarchiesi@0
|
1228 function getPoFileWithEmptyMsgstr() {
|
danielebarchiesi@0
|
1229 return <<< EOF
|
danielebarchiesi@0
|
1230 msgid ""
|
danielebarchiesi@0
|
1231 msgstr ""
|
danielebarchiesi@0
|
1232 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1233 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1234 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1235 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1236 "Plural-Forms: nplurals=2; plural=(n > 1);\\n"
|
danielebarchiesi@0
|
1237
|
danielebarchiesi@0
|
1238 msgid "Operations"
|
danielebarchiesi@0
|
1239 msgstr ""
|
danielebarchiesi@0
|
1240
|
danielebarchiesi@0
|
1241 EOF;
|
danielebarchiesi@0
|
1242 }
|
danielebarchiesi@0
|
1243 /**
|
danielebarchiesi@0
|
1244 * Helper function that returns a .po file with an empty last item.
|
danielebarchiesi@0
|
1245 */
|
danielebarchiesi@0
|
1246 function getPoFileWithMsgstr() {
|
danielebarchiesi@0
|
1247 return <<< EOF
|
danielebarchiesi@0
|
1248 msgid ""
|
danielebarchiesi@0
|
1249 msgstr ""
|
danielebarchiesi@0
|
1250 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1251 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1252 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1253 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1254 "Plural-Forms: nplurals=2; plural=(n > 1);\\n"
|
danielebarchiesi@0
|
1255
|
danielebarchiesi@0
|
1256 msgid "Operations"
|
danielebarchiesi@0
|
1257 msgstr "Műveletek"
|
danielebarchiesi@0
|
1258
|
danielebarchiesi@0
|
1259 msgid "Will not appear in Drupal core, so we can ensure the test passes"
|
danielebarchiesi@0
|
1260 msgstr ""
|
danielebarchiesi@0
|
1261
|
danielebarchiesi@0
|
1262 EOF;
|
danielebarchiesi@0
|
1263 }
|
danielebarchiesi@0
|
1264
|
danielebarchiesi@0
|
1265
|
danielebarchiesi@0
|
1266 /**
|
danielebarchiesi@0
|
1267 * Returns a .po file with a missing plural formula.
|
danielebarchiesi@0
|
1268 */
|
danielebarchiesi@0
|
1269 function getPoFileWithMissingPlural() {
|
danielebarchiesi@0
|
1270 return <<< EOF
|
danielebarchiesi@0
|
1271 msgid ""
|
danielebarchiesi@0
|
1272 msgstr ""
|
danielebarchiesi@0
|
1273 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1274 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1275 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1276 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1277
|
danielebarchiesi@0
|
1278 msgid "Monday"
|
danielebarchiesi@0
|
1279 msgstr "Ponedjeljak"
|
danielebarchiesi@0
|
1280 EOF;
|
danielebarchiesi@0
|
1281 }
|
danielebarchiesi@0
|
1282
|
danielebarchiesi@0
|
1283 /**
|
danielebarchiesi@0
|
1284 * Returns a .po file with a broken plural formula.
|
danielebarchiesi@0
|
1285 */
|
danielebarchiesi@0
|
1286 function getPoFileWithBrokenPlural() {
|
danielebarchiesi@0
|
1287 return <<< EOF
|
danielebarchiesi@0
|
1288 msgid ""
|
danielebarchiesi@0
|
1289 msgstr ""
|
danielebarchiesi@0
|
1290 "Project-Id-Version: Drupal 7\\n"
|
danielebarchiesi@0
|
1291 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1292 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1293 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1294 "Plural-Forms: broken, will not parse\\n"
|
danielebarchiesi@0
|
1295
|
danielebarchiesi@0
|
1296 msgid "Monday"
|
danielebarchiesi@0
|
1297 msgstr "lundi"
|
danielebarchiesi@0
|
1298 EOF;
|
danielebarchiesi@0
|
1299 }
|
danielebarchiesi@0
|
1300
|
danielebarchiesi@0
|
1301 }
|
danielebarchiesi@0
|
1302
|
danielebarchiesi@0
|
1303 /**
|
danielebarchiesi@0
|
1304 * Functional tests for the export of translation files.
|
danielebarchiesi@0
|
1305 */
|
danielebarchiesi@0
|
1306 class LocaleExportFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
1307 public static function getInfo() {
|
danielebarchiesi@0
|
1308 return array(
|
danielebarchiesi@0
|
1309 'name' => 'Translation export',
|
danielebarchiesi@0
|
1310 'description' => 'Tests the exportation of locale files.',
|
danielebarchiesi@0
|
1311 'group' => 'Locale',
|
danielebarchiesi@0
|
1312 );
|
danielebarchiesi@0
|
1313 }
|
danielebarchiesi@0
|
1314
|
danielebarchiesi@0
|
1315 /**
|
danielebarchiesi@0
|
1316 * A user able to create languages and export translations.
|
danielebarchiesi@0
|
1317 */
|
danielebarchiesi@0
|
1318 protected $admin_user = NULL;
|
danielebarchiesi@0
|
1319
|
danielebarchiesi@0
|
1320 function setUp() {
|
danielebarchiesi@0
|
1321 parent::setUp('locale', 'locale_test');
|
danielebarchiesi@0
|
1322
|
danielebarchiesi@0
|
1323 $this->admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages'));
|
danielebarchiesi@0
|
1324 $this->drupalLogin($this->admin_user);
|
danielebarchiesi@0
|
1325 }
|
danielebarchiesi@0
|
1326
|
danielebarchiesi@0
|
1327 /**
|
danielebarchiesi@0
|
1328 * Test exportation of translations.
|
danielebarchiesi@0
|
1329 */
|
danielebarchiesi@0
|
1330 function testExportTranslation() {
|
danielebarchiesi@0
|
1331 // First import some known translations.
|
danielebarchiesi@0
|
1332 // This will also automatically enable the 'fr' language.
|
danielebarchiesi@0
|
1333 $name = tempnam('temporary://', "po_") . '.po';
|
danielebarchiesi@0
|
1334 file_put_contents($name, $this->getPoFile());
|
danielebarchiesi@0
|
1335 $this->drupalPost('admin/config/regional/translate/import', array(
|
danielebarchiesi@0
|
1336 'langcode' => 'fr',
|
danielebarchiesi@0
|
1337 'files[file]' => $name,
|
danielebarchiesi@0
|
1338 ), t('Import'));
|
danielebarchiesi@0
|
1339 drupal_unlink($name);
|
danielebarchiesi@0
|
1340
|
danielebarchiesi@0
|
1341 // Get the French translations.
|
danielebarchiesi@0
|
1342 $this->drupalPost('admin/config/regional/translate/export', array(
|
danielebarchiesi@0
|
1343 'langcode' => 'fr',
|
danielebarchiesi@0
|
1344 ), t('Export'));
|
danielebarchiesi@0
|
1345
|
danielebarchiesi@0
|
1346 // Ensure we have a translation file.
|
danielebarchiesi@0
|
1347 $this->assertRaw('# French translation of Drupal', 'Exported French translation file.');
|
danielebarchiesi@0
|
1348 // Ensure our imported translations exist in the file.
|
danielebarchiesi@0
|
1349 $this->assertRaw('msgstr "lundi"', 'French translations present in exported file.');
|
danielebarchiesi@0
|
1350 }
|
danielebarchiesi@0
|
1351
|
danielebarchiesi@0
|
1352 /**
|
danielebarchiesi@0
|
1353 * Test exportation of translation template file.
|
danielebarchiesi@0
|
1354 */
|
danielebarchiesi@0
|
1355 function testExportTranslationTemplateFile() {
|
danielebarchiesi@0
|
1356 // Get the translation template file.
|
danielebarchiesi@0
|
1357 // There are two 'Export' buttons on this page, but it somehow works. It'd
|
danielebarchiesi@0
|
1358 // be better if we could use the submit button id like documented but that
|
danielebarchiesi@0
|
1359 // doesn't work.
|
danielebarchiesi@0
|
1360 $this->drupalPost('admin/config/regional/translate/export', array(), t('Export'));
|
danielebarchiesi@0
|
1361 // Ensure we have a translation file.
|
danielebarchiesi@0
|
1362 $this->assertRaw('# LANGUAGE translation of PROJECT', 'Exported translation template file.');
|
danielebarchiesi@0
|
1363 }
|
danielebarchiesi@0
|
1364
|
danielebarchiesi@0
|
1365 /**
|
danielebarchiesi@0
|
1366 * Helper function that returns a proper .po file.
|
danielebarchiesi@0
|
1367 */
|
danielebarchiesi@0
|
1368 function getPoFile() {
|
danielebarchiesi@0
|
1369 return <<< EOF
|
danielebarchiesi@0
|
1370 msgid ""
|
danielebarchiesi@0
|
1371 msgstr ""
|
danielebarchiesi@0
|
1372 "Project-Id-Version: Drupal 6\\n"
|
danielebarchiesi@0
|
1373 "MIME-Version: 1.0\\n"
|
danielebarchiesi@0
|
1374 "Content-Type: text/plain; charset=UTF-8\\n"
|
danielebarchiesi@0
|
1375 "Content-Transfer-Encoding: 8bit\\n"
|
danielebarchiesi@0
|
1376 "Plural-Forms: nplurals=2; plural=(n > 1);\\n"
|
danielebarchiesi@0
|
1377
|
danielebarchiesi@0
|
1378 msgid "Monday"
|
danielebarchiesi@0
|
1379 msgstr "lundi"
|
danielebarchiesi@0
|
1380 EOF;
|
danielebarchiesi@0
|
1381 }
|
danielebarchiesi@0
|
1382
|
danielebarchiesi@0
|
1383 }
|
danielebarchiesi@0
|
1384
|
danielebarchiesi@0
|
1385 /**
|
danielebarchiesi@0
|
1386 * Tests for the st() function.
|
danielebarchiesi@0
|
1387 */
|
danielebarchiesi@0
|
1388 class LocaleInstallTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
1389 public static function getInfo() {
|
danielebarchiesi@0
|
1390 return array(
|
danielebarchiesi@0
|
1391 'name' => 'String translation using st()',
|
danielebarchiesi@0
|
1392 'description' => 'Tests that st() works like t().',
|
danielebarchiesi@0
|
1393 'group' => 'Locale',
|
danielebarchiesi@0
|
1394 );
|
danielebarchiesi@0
|
1395 }
|
danielebarchiesi@0
|
1396
|
danielebarchiesi@0
|
1397 function setUp() {
|
danielebarchiesi@0
|
1398 parent::setUp('locale');
|
danielebarchiesi@0
|
1399
|
danielebarchiesi@0
|
1400 // st() lives in install.inc, so ensure that it is loaded for all tests.
|
danielebarchiesi@0
|
1401 require_once DRUPAL_ROOT . '/includes/install.inc';
|
danielebarchiesi@0
|
1402 }
|
danielebarchiesi@0
|
1403
|
danielebarchiesi@0
|
1404 /**
|
danielebarchiesi@0
|
1405 * Verify that function signatures of t() and st() are equal.
|
danielebarchiesi@0
|
1406 */
|
danielebarchiesi@0
|
1407 function testFunctionSignatures() {
|
danielebarchiesi@0
|
1408 $reflector_t = new ReflectionFunction('t');
|
danielebarchiesi@0
|
1409 $reflector_st = new ReflectionFunction('st');
|
danielebarchiesi@0
|
1410 $this->assertEqual($reflector_t->getParameters(), $reflector_st->getParameters(), 'Function signatures of t() and st() are equal.');
|
danielebarchiesi@0
|
1411 }
|
danielebarchiesi@0
|
1412 }
|
danielebarchiesi@0
|
1413
|
danielebarchiesi@0
|
1414 /**
|
danielebarchiesi@0
|
1415 * Locale uninstall with English UI functional test.
|
danielebarchiesi@0
|
1416 */
|
danielebarchiesi@0
|
1417 class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
1418 public static function getInfo() {
|
danielebarchiesi@0
|
1419 return array(
|
danielebarchiesi@0
|
1420 'name' => 'Locale uninstall (EN)',
|
danielebarchiesi@0
|
1421 'description' => 'Tests the uninstall process using the built-in UI language.',
|
danielebarchiesi@0
|
1422 'group' => 'Locale',
|
danielebarchiesi@0
|
1423 );
|
danielebarchiesi@0
|
1424 }
|
danielebarchiesi@0
|
1425
|
danielebarchiesi@0
|
1426 /**
|
danielebarchiesi@0
|
1427 * The default language set for the UI before uninstall.
|
danielebarchiesi@0
|
1428 */
|
danielebarchiesi@0
|
1429 protected $language;
|
danielebarchiesi@0
|
1430
|
danielebarchiesi@0
|
1431 function setUp() {
|
danielebarchiesi@0
|
1432 parent::setUp('locale');
|
danielebarchiesi@0
|
1433 $this->language = 'en';
|
danielebarchiesi@0
|
1434 }
|
danielebarchiesi@0
|
1435
|
danielebarchiesi@0
|
1436 /**
|
danielebarchiesi@0
|
1437 * Check if the values of the Locale variables are correct after uninstall.
|
danielebarchiesi@0
|
1438 */
|
danielebarchiesi@0
|
1439 function testUninstallProcess() {
|
danielebarchiesi@0
|
1440 $locale_module = array('locale');
|
danielebarchiesi@0
|
1441
|
danielebarchiesi@0
|
1442 // Add a new language and optionally set it as default.
|
danielebarchiesi@0
|
1443 require_once DRUPAL_ROOT . '/includes/locale.inc';
|
danielebarchiesi@0
|
1444 locale_add_language('fr', 'French', 'Français', LANGUAGE_LTR, '', '', TRUE, $this->language == 'fr');
|
danielebarchiesi@0
|
1445
|
danielebarchiesi@0
|
1446 // Check the UI language.
|
danielebarchiesi@0
|
1447 drupal_language_initialize();
|
danielebarchiesi@0
|
1448 global $language;
|
danielebarchiesi@0
|
1449 $this->assertEqual($language->language, $this->language, format_string('Current language: %lang', array('%lang' => $language->language)));
|
danielebarchiesi@0
|
1450
|
danielebarchiesi@0
|
1451 // Enable multilingual workflow option for articles.
|
danielebarchiesi@0
|
1452 variable_set('language_content_type_article', 1);
|
danielebarchiesi@0
|
1453
|
danielebarchiesi@0
|
1454 // Change JavaScript translations directory.
|
danielebarchiesi@0
|
1455 variable_set('locale_js_directory', 'js_translations');
|
danielebarchiesi@0
|
1456
|
danielebarchiesi@0
|
1457 // Build the JavaScript translation file for French.
|
danielebarchiesi@0
|
1458 $user = $this->drupalCreateUser(array('translate interface', 'access administration pages'));
|
danielebarchiesi@0
|
1459 $this->drupalLogin($user);
|
danielebarchiesi@0
|
1460 $this->drupalGet('admin/config/regional/translate/translate');
|
danielebarchiesi@0
|
1461 $string = db_query('SELECT min(lid) AS lid FROM {locales_source} WHERE location LIKE :location AND textgroup = :textgroup', array(
|
danielebarchiesi@0
|
1462 ':location' => '%.js%',
|
danielebarchiesi@0
|
1463 ':textgroup' => 'default',
|
danielebarchiesi@0
|
1464 ))->fetchObject();
|
danielebarchiesi@0
|
1465 $edit = array('translations[fr]' => 'french translation');
|
danielebarchiesi@0
|
1466 $this->drupalPost('admin/config/regional/translate/edit/' . $string->lid, $edit, t('Save translations'));
|
danielebarchiesi@0
|
1467 _locale_rebuild_js('fr');
|
danielebarchiesi@0
|
1468 $file = db_query('SELECT javascript FROM {languages} WHERE language = :language', array(':language' => 'fr'))->fetchObject();
|
danielebarchiesi@0
|
1469 $js_file = 'public://' . variable_get('locale_js_directory', 'languages') . '/fr_' . $file->javascript . '.js';
|
danielebarchiesi@0
|
1470 $this->assertTrue($result = file_exists($js_file), format_string('JavaScript file created: %file', array('%file' => $result ? $js_file : 'none')));
|
danielebarchiesi@0
|
1471
|
danielebarchiesi@0
|
1472 // Disable string caching.
|
danielebarchiesi@0
|
1473 variable_set('locale_cache_strings', 0);
|
danielebarchiesi@0
|
1474
|
danielebarchiesi@0
|
1475 // Change language negotiation options.
|
danielebarchiesi@0
|
1476 drupal_load('module', 'locale');
|
danielebarchiesi@0
|
1477 variable_set('language_types', drupal_language_types() + array('language_custom' => TRUE));
|
danielebarchiesi@0
|
1478 variable_set('language_negotiation_' . LANGUAGE_TYPE_INTERFACE, locale_language_negotiation_info());
|
danielebarchiesi@0
|
1479 variable_set('language_negotiation_' . LANGUAGE_TYPE_CONTENT, locale_language_negotiation_info());
|
danielebarchiesi@0
|
1480 variable_set('language_negotiation_' . LANGUAGE_TYPE_URL, locale_language_negotiation_info());
|
danielebarchiesi@0
|
1481
|
danielebarchiesi@0
|
1482 // Change language providers settings.
|
danielebarchiesi@0
|
1483 variable_set('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX);
|
danielebarchiesi@0
|
1484 variable_set('locale_language_negotiation_session_param', TRUE);
|
danielebarchiesi@0
|
1485
|
danielebarchiesi@0
|
1486 // Uninstall Locale.
|
danielebarchiesi@0
|
1487 module_disable($locale_module);
|
danielebarchiesi@0
|
1488 drupal_uninstall_modules($locale_module);
|
danielebarchiesi@0
|
1489
|
danielebarchiesi@0
|
1490 // Visit the front page.
|
danielebarchiesi@0
|
1491 $this->drupalGet('');
|
danielebarchiesi@0
|
1492
|
danielebarchiesi@0
|
1493 // Check the init language logic.
|
danielebarchiesi@0
|
1494 drupal_language_initialize();
|
danielebarchiesi@0
|
1495 $this->assertEqual($language->language, 'en', format_string('Language after uninstall: %lang', array('%lang' => $language->language)));
|
danielebarchiesi@0
|
1496
|
danielebarchiesi@0
|
1497 // Check JavaScript files deletion.
|
danielebarchiesi@0
|
1498 $this->assertTrue($result = !file_exists($js_file), format_string('JavaScript file deleted: %file', array('%file' => $result ? $js_file : 'found')));
|
danielebarchiesi@0
|
1499
|
danielebarchiesi@0
|
1500 // Check language count.
|
danielebarchiesi@0
|
1501 $language_count = variable_get('language_count', 1);
|
danielebarchiesi@0
|
1502 $this->assertEqual($language_count, 1, format_string('Language count: %count', array('%count' => $language_count)));
|
danielebarchiesi@0
|
1503
|
danielebarchiesi@0
|
1504 // Check language negotiation.
|
danielebarchiesi@0
|
1505 require_once DRUPAL_ROOT . '/includes/language.inc';
|
danielebarchiesi@0
|
1506 $this->assertTrue(count(language_types()) == count(drupal_language_types()), 'Language types reset');
|
danielebarchiesi@0
|
1507 $language_negotiation = language_negotiation_get(LANGUAGE_TYPE_INTERFACE) == LANGUAGE_NEGOTIATION_DEFAULT;
|
danielebarchiesi@0
|
1508 $this->assertTrue($language_negotiation, format_string('Interface language negotiation: %setting', array('%setting' => $language_negotiation ? 'none' : 'set')));
|
danielebarchiesi@0
|
1509 $language_negotiation = language_negotiation_get(LANGUAGE_TYPE_CONTENT) == LANGUAGE_NEGOTIATION_DEFAULT;
|
danielebarchiesi@0
|
1510 $this->assertTrue($language_negotiation, format_string('Content language negotiation: %setting', array('%setting' => $language_negotiation ? 'none' : 'set')));
|
danielebarchiesi@0
|
1511 $language_negotiation = language_negotiation_get(LANGUAGE_TYPE_URL) == LANGUAGE_NEGOTIATION_DEFAULT;
|
danielebarchiesi@0
|
1512 $this->assertTrue($language_negotiation, format_string('URL language negotiation: %setting', array('%setting' => $language_negotiation ? 'none' : 'set')));
|
danielebarchiesi@0
|
1513
|
danielebarchiesi@0
|
1514 // Check language providers settings.
|
danielebarchiesi@0
|
1515 $this->assertFalse(variable_get('locale_language_negotiation_url_part', FALSE), 'URL language provider indicator settings cleared.');
|
danielebarchiesi@0
|
1516 $this->assertFalse(variable_get('locale_language_negotiation_session_param', FALSE), 'Visit language provider settings cleared.');
|
danielebarchiesi@0
|
1517
|
danielebarchiesi@0
|
1518 // Check JavaScript parsed.
|
danielebarchiesi@0
|
1519 $javascript_parsed_count = count(variable_get('javascript_parsed', array()));
|
danielebarchiesi@0
|
1520 $this->assertEqual($javascript_parsed_count, 0, format_string('JavaScript parsed count: %count', array('%count' => $javascript_parsed_count)));
|
danielebarchiesi@0
|
1521
|
danielebarchiesi@0
|
1522 // Check multilingual workflow option for articles.
|
danielebarchiesi@0
|
1523 $multilingual = variable_get('language_content_type_article', 0);
|
danielebarchiesi@0
|
1524 $this->assertEqual($multilingual, 0, format_string('Multilingual workflow option: %status', array('%status' => $multilingual ? 'enabled': 'disabled')));
|
danielebarchiesi@0
|
1525
|
danielebarchiesi@0
|
1526 // Check JavaScript translations directory.
|
danielebarchiesi@0
|
1527 $locale_js_directory = variable_get('locale_js_directory', 'languages');
|
danielebarchiesi@0
|
1528 $this->assertEqual($locale_js_directory, 'languages', format_string('JavaScript translations directory: %dir', array('%dir' => $locale_js_directory)));
|
danielebarchiesi@0
|
1529
|
danielebarchiesi@0
|
1530 // Check string caching.
|
danielebarchiesi@0
|
1531 $locale_cache_strings = variable_get('locale_cache_strings', 1);
|
danielebarchiesi@0
|
1532 $this->assertEqual($locale_cache_strings, 1, format_string('String caching: %status', array('%status' => $locale_cache_strings ? 'enabled': 'disabled')));
|
danielebarchiesi@0
|
1533 }
|
danielebarchiesi@0
|
1534 }
|
danielebarchiesi@0
|
1535
|
danielebarchiesi@0
|
1536 /**
|
danielebarchiesi@0
|
1537 * Locale uninstall with French UI functional test.
|
danielebarchiesi@0
|
1538 *
|
danielebarchiesi@0
|
1539 * Because this class extends LocaleUninstallFunctionalTest, it doesn't require a new
|
danielebarchiesi@0
|
1540 * test of its own. Rather, it switches the default UI language in setUp and then
|
danielebarchiesi@0
|
1541 * runs the testUninstallProcess (which it inherits from LocaleUninstallFunctionalTest)
|
danielebarchiesi@0
|
1542 * to test with this new language.
|
danielebarchiesi@0
|
1543 */
|
danielebarchiesi@0
|
1544 class LocaleUninstallFrenchFunctionalTest extends LocaleUninstallFunctionalTest {
|
danielebarchiesi@0
|
1545 public static function getInfo() {
|
danielebarchiesi@0
|
1546 return array(
|
danielebarchiesi@0
|
1547 'name' => 'Locale uninstall (FR)',
|
danielebarchiesi@0
|
1548 'description' => 'Tests the uninstall process using French as interface language.',
|
danielebarchiesi@0
|
1549 'group' => 'Locale',
|
danielebarchiesi@0
|
1550 );
|
danielebarchiesi@0
|
1551 }
|
danielebarchiesi@0
|
1552
|
danielebarchiesi@0
|
1553 function setUp() {
|
danielebarchiesi@0
|
1554 parent::setUp();
|
danielebarchiesi@0
|
1555 $this->language = 'fr';
|
danielebarchiesi@0
|
1556 }
|
danielebarchiesi@0
|
1557 }
|
danielebarchiesi@0
|
1558
|
danielebarchiesi@0
|
1559 /**
|
danielebarchiesi@0
|
1560 * Functional tests for the language switching feature.
|
danielebarchiesi@0
|
1561 */
|
danielebarchiesi@0
|
1562 class LocaleLanguageSwitchingFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
1563
|
danielebarchiesi@0
|
1564 public static function getInfo() {
|
danielebarchiesi@0
|
1565 return array(
|
danielebarchiesi@0
|
1566 'name' => 'Language switching',
|
danielebarchiesi@0
|
1567 'description' => 'Tests for the language switching feature.',
|
danielebarchiesi@0
|
1568 'group' => 'Locale',
|
danielebarchiesi@0
|
1569 );
|
danielebarchiesi@0
|
1570 }
|
danielebarchiesi@0
|
1571
|
danielebarchiesi@0
|
1572 function setUp() {
|
danielebarchiesi@0
|
1573 parent::setUp('locale');
|
danielebarchiesi@0
|
1574
|
danielebarchiesi@0
|
1575 // Create and login user.
|
danielebarchiesi@0
|
1576 $admin_user = $this->drupalCreateUser(array('administer blocks', 'administer languages', 'translate interface', 'access administration pages'));
|
danielebarchiesi@0
|
1577 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
1578 }
|
danielebarchiesi@0
|
1579
|
danielebarchiesi@0
|
1580 /**
|
danielebarchiesi@0
|
1581 * Functional tests for the language switcher block.
|
danielebarchiesi@0
|
1582 */
|
danielebarchiesi@0
|
1583 function testLanguageBlock() {
|
danielebarchiesi@0
|
1584 // Enable the language switching block.
|
danielebarchiesi@0
|
1585 $language_type = LANGUAGE_TYPE_INTERFACE;
|
danielebarchiesi@0
|
1586 $edit = array(
|
danielebarchiesi@0
|
1587 "blocks[locale_{$language_type}][region]" => 'sidebar_first',
|
danielebarchiesi@0
|
1588 );
|
danielebarchiesi@0
|
1589 $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
|
danielebarchiesi@0
|
1590
|
danielebarchiesi@0
|
1591 // Add language.
|
danielebarchiesi@0
|
1592 $edit = array(
|
danielebarchiesi@0
|
1593 'langcode' => 'fr',
|
danielebarchiesi@0
|
1594 );
|
danielebarchiesi@0
|
1595 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
1596
|
danielebarchiesi@0
|
1597 // Enable URL language detection and selection.
|
danielebarchiesi@0
|
1598 $edit = array('language[enabled][locale-url]' => '1');
|
danielebarchiesi@0
|
1599 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
1600
|
danielebarchiesi@0
|
1601 // Assert that the language switching block is displayed on the frontpage.
|
danielebarchiesi@0
|
1602 $this->drupalGet('');
|
danielebarchiesi@0
|
1603 $this->assertText(t('Languages'), 'Language switcher block found.');
|
danielebarchiesi@0
|
1604
|
danielebarchiesi@0
|
1605 // Assert that only the current language is marked as active.
|
danielebarchiesi@0
|
1606 list($language_switcher) = $this->xpath('//div[@id=:id]/div[@class="content"]', array(':id' => 'block-locale-' . $language_type));
|
danielebarchiesi@0
|
1607 $links = array(
|
danielebarchiesi@0
|
1608 'active' => array(),
|
danielebarchiesi@0
|
1609 'inactive' => array(),
|
danielebarchiesi@0
|
1610 );
|
danielebarchiesi@0
|
1611 $anchors = array(
|
danielebarchiesi@0
|
1612 'active' => array(),
|
danielebarchiesi@0
|
1613 'inactive' => array(),
|
danielebarchiesi@0
|
1614 );
|
danielebarchiesi@0
|
1615 foreach ($language_switcher->ul->li as $link) {
|
danielebarchiesi@0
|
1616 $classes = explode(" ", (string) $link['class']);
|
danielebarchiesi@0
|
1617 list($language) = array_intersect($classes, array('en', 'fr'));
|
danielebarchiesi@0
|
1618 if (in_array('active', $classes)) {
|
danielebarchiesi@0
|
1619 $links['active'][] = $language;
|
danielebarchiesi@0
|
1620 }
|
danielebarchiesi@0
|
1621 else {
|
danielebarchiesi@0
|
1622 $links['inactive'][] = $language;
|
danielebarchiesi@0
|
1623 }
|
danielebarchiesi@0
|
1624 $anchor_classes = explode(" ", (string) $link->a['class']);
|
danielebarchiesi@0
|
1625 if (in_array('active', $anchor_classes)) {
|
danielebarchiesi@0
|
1626 $anchors['active'][] = $language;
|
danielebarchiesi@0
|
1627 }
|
danielebarchiesi@0
|
1628 else {
|
danielebarchiesi@0
|
1629 $anchors['inactive'][] = $language;
|
danielebarchiesi@0
|
1630 }
|
danielebarchiesi@0
|
1631 }
|
danielebarchiesi@0
|
1632 $this->assertIdentical($links, array('active' => array('en'), 'inactive' => array('fr')), 'Only the current language list item is marked as active on the language switcher block.');
|
danielebarchiesi@0
|
1633 $this->assertIdentical($anchors, array('active' => array('en'), 'inactive' => array('fr')), 'Only the current language anchor is marked as active on the language switcher block.');
|
danielebarchiesi@0
|
1634 }
|
danielebarchiesi@0
|
1635 }
|
danielebarchiesi@0
|
1636
|
danielebarchiesi@0
|
1637 /**
|
danielebarchiesi@0
|
1638 * Test browser language detection.
|
danielebarchiesi@0
|
1639 */
|
danielebarchiesi@0
|
1640 class LocaleBrowserDetectionTest extends DrupalUnitTestCase {
|
danielebarchiesi@0
|
1641
|
danielebarchiesi@0
|
1642 public static function getInfo() {
|
danielebarchiesi@0
|
1643 return array(
|
danielebarchiesi@0
|
1644 'name' => 'Browser language detection',
|
danielebarchiesi@0
|
1645 'description' => 'Tests for the browser language detection.',
|
danielebarchiesi@0
|
1646 'group' => 'Locale',
|
danielebarchiesi@0
|
1647 );
|
danielebarchiesi@0
|
1648 }
|
danielebarchiesi@0
|
1649
|
danielebarchiesi@0
|
1650 /**
|
danielebarchiesi@0
|
1651 * Unit tests for the locale_language_from_browser() function.
|
danielebarchiesi@0
|
1652 */
|
danielebarchiesi@0
|
1653 function testLanguageFromBrowser() {
|
danielebarchiesi@0
|
1654 // Load the required functions.
|
danielebarchiesi@0
|
1655 require_once DRUPAL_ROOT . '/includes/locale.inc';
|
danielebarchiesi@0
|
1656
|
danielebarchiesi@0
|
1657 $languages = array(
|
danielebarchiesi@0
|
1658 // In our test case, 'en' has priority over 'en-US'.
|
danielebarchiesi@0
|
1659 'en' => (object) array(
|
danielebarchiesi@0
|
1660 'language' => 'en',
|
danielebarchiesi@0
|
1661 ),
|
danielebarchiesi@0
|
1662 'en-US' => (object) array(
|
danielebarchiesi@0
|
1663 'language' => 'en-US',
|
danielebarchiesi@0
|
1664 ),
|
danielebarchiesi@0
|
1665 // But 'fr-CA' has priority over 'fr'.
|
danielebarchiesi@0
|
1666 'fr-CA' => (object) array(
|
danielebarchiesi@0
|
1667 'language' => 'fr-CA',
|
danielebarchiesi@0
|
1668 ),
|
danielebarchiesi@0
|
1669 'fr' => (object) array(
|
danielebarchiesi@0
|
1670 'language' => 'fr',
|
danielebarchiesi@0
|
1671 ),
|
danielebarchiesi@0
|
1672 // 'es-MX' is alone.
|
danielebarchiesi@0
|
1673 'es-MX' => (object) array(
|
danielebarchiesi@0
|
1674 'language' => 'es-MX',
|
danielebarchiesi@0
|
1675 ),
|
danielebarchiesi@0
|
1676 // 'pt' is alone.
|
danielebarchiesi@0
|
1677 'pt' => (object) array(
|
danielebarchiesi@0
|
1678 'language' => 'pt',
|
danielebarchiesi@0
|
1679 ),
|
danielebarchiesi@0
|
1680 // Language codes with more then one dash are actually valid.
|
danielebarchiesi@0
|
1681 // eh-oh-laa-laa is the official language code of the Teletubbies.
|
danielebarchiesi@0
|
1682 'eh-oh-laa-laa' => (object) array(
|
danielebarchiesi@0
|
1683 'language' => 'eh-oh-laa-laa',
|
danielebarchiesi@0
|
1684 ),
|
danielebarchiesi@0
|
1685 );
|
danielebarchiesi@0
|
1686
|
danielebarchiesi@0
|
1687 $test_cases = array(
|
danielebarchiesi@0
|
1688 // Equal qvalue for each language, choose the site prefered one.
|
danielebarchiesi@0
|
1689 'en,en-US,fr-CA,fr,es-MX' => 'en',
|
danielebarchiesi@0
|
1690 'en-US,en,fr-CA,fr,es-MX' => 'en',
|
danielebarchiesi@0
|
1691 'fr,en' => 'en',
|
danielebarchiesi@0
|
1692 'en,fr' => 'en',
|
danielebarchiesi@0
|
1693 'en-US,fr' => 'en',
|
danielebarchiesi@0
|
1694 'fr,en-US' => 'en',
|
danielebarchiesi@0
|
1695 'fr,fr-CA' => 'fr-CA',
|
danielebarchiesi@0
|
1696 'fr-CA,fr' => 'fr-CA',
|
danielebarchiesi@0
|
1697 'fr' => 'fr-CA',
|
danielebarchiesi@0
|
1698 'fr;q=1' => 'fr-CA',
|
danielebarchiesi@0
|
1699 'fr,es-MX' => 'fr-CA',
|
danielebarchiesi@0
|
1700 'fr,es' => 'fr-CA',
|
danielebarchiesi@0
|
1701 'es,fr' => 'fr-CA',
|
danielebarchiesi@0
|
1702 'es-MX,de' => 'es-MX',
|
danielebarchiesi@0
|
1703 'de,es-MX' => 'es-MX',
|
danielebarchiesi@0
|
1704
|
danielebarchiesi@0
|
1705 // Different cases and whitespace.
|
danielebarchiesi@0
|
1706 'en' => 'en',
|
danielebarchiesi@0
|
1707 'En' => 'en',
|
danielebarchiesi@0
|
1708 'EN' => 'en',
|
danielebarchiesi@0
|
1709 ' en' => 'en',
|
danielebarchiesi@0
|
1710 'en ' => 'en',
|
danielebarchiesi@0
|
1711 'en, fr' => 'en',
|
danielebarchiesi@0
|
1712
|
danielebarchiesi@0
|
1713 // A less specific language from the browser matches a more specific one
|
danielebarchiesi@0
|
1714 // from the website, and the other way around for compatibility with
|
danielebarchiesi@0
|
1715 // some versions of Internet Explorer.
|
danielebarchiesi@0
|
1716 'es' => 'es-MX',
|
danielebarchiesi@0
|
1717 'es-MX' => 'es-MX',
|
danielebarchiesi@0
|
1718 'pt' => 'pt',
|
danielebarchiesi@0
|
1719 'pt-PT' => 'pt',
|
danielebarchiesi@0
|
1720 'pt-PT;q=0.5,pt-BR;q=1,en;q=0.7' => 'en',
|
danielebarchiesi@0
|
1721 'pt-PT;q=1,pt-BR;q=0.5,en;q=0.7' => 'en',
|
danielebarchiesi@0
|
1722 'pt-PT;q=0.4,pt-BR;q=0.1,en;q=0.7' => 'en',
|
danielebarchiesi@0
|
1723 'pt-PT;q=0.1,pt-BR;q=0.4,en;q=0.7' => 'en',
|
danielebarchiesi@0
|
1724
|
danielebarchiesi@0
|
1725 // Language code with several dashes are valid. The less specific language
|
danielebarchiesi@0
|
1726 // from the browser matches the more specific one from the website.
|
danielebarchiesi@0
|
1727 'eh-oh-laa-laa' => 'eh-oh-laa-laa',
|
danielebarchiesi@0
|
1728 'eh-oh-laa' => 'eh-oh-laa-laa',
|
danielebarchiesi@0
|
1729 'eh-oh' => 'eh-oh-laa-laa',
|
danielebarchiesi@0
|
1730 'eh' => 'eh-oh-laa-laa',
|
danielebarchiesi@0
|
1731
|
danielebarchiesi@0
|
1732 // Different qvalues.
|
danielebarchiesi@0
|
1733 'fr,en;q=0.5' => 'fr-CA',
|
danielebarchiesi@0
|
1734 'fr,en;q=0.5,fr-CA;q=0.25' => 'fr',
|
danielebarchiesi@0
|
1735
|
danielebarchiesi@0
|
1736 // Silly wildcards are also valid.
|
danielebarchiesi@0
|
1737 '*,fr-CA;q=0.5' => 'en',
|
danielebarchiesi@0
|
1738 '*,en;q=0.25' => 'fr-CA',
|
danielebarchiesi@0
|
1739 'en,en-US;q=0.5,fr;q=0.25' => 'en',
|
danielebarchiesi@0
|
1740 'en-US,en;q=0.5,fr;q=0.25' => 'en-US',
|
danielebarchiesi@0
|
1741
|
danielebarchiesi@0
|
1742 // Unresolvable cases.
|
danielebarchiesi@0
|
1743 '' => FALSE,
|
danielebarchiesi@0
|
1744 'de,pl' => FALSE,
|
danielebarchiesi@0
|
1745 'iecRswK4eh' => FALSE,
|
danielebarchiesi@0
|
1746 $this->randomName(10) => FALSE,
|
danielebarchiesi@0
|
1747 );
|
danielebarchiesi@0
|
1748
|
danielebarchiesi@0
|
1749 foreach ($test_cases as $accept_language => $expected_result) {
|
danielebarchiesi@0
|
1750 $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $accept_language;
|
danielebarchiesi@0
|
1751 $result = locale_language_from_browser($languages);
|
danielebarchiesi@0
|
1752 $this->assertIdentical($result, $expected_result, format_string("Language selection '@accept-language' selects '@result', result = '@actual'", array('@accept-language' => $accept_language, '@result' => $expected_result, '@actual' => isset($result) ? $result : 'none')));
|
danielebarchiesi@0
|
1753 }
|
danielebarchiesi@0
|
1754 }
|
danielebarchiesi@0
|
1755 }
|
danielebarchiesi@0
|
1756
|
danielebarchiesi@0
|
1757 /**
|
danielebarchiesi@0
|
1758 * Functional tests for a user's ability to change their default language.
|
danielebarchiesi@0
|
1759 */
|
danielebarchiesi@0
|
1760 class LocaleUserLanguageFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
1761 public static function getInfo() {
|
danielebarchiesi@0
|
1762 return array(
|
danielebarchiesi@0
|
1763 'name' => 'User language settings',
|
danielebarchiesi@0
|
1764 'description' => "Tests user's ability to change their default language.",
|
danielebarchiesi@0
|
1765 'group' => 'Locale',
|
danielebarchiesi@0
|
1766 );
|
danielebarchiesi@0
|
1767 }
|
danielebarchiesi@0
|
1768
|
danielebarchiesi@0
|
1769 function setUp() {
|
danielebarchiesi@0
|
1770 parent::setUp('locale');
|
danielebarchiesi@0
|
1771 }
|
danielebarchiesi@0
|
1772
|
danielebarchiesi@0
|
1773 /**
|
danielebarchiesi@0
|
1774 * Test if user can change their default language.
|
danielebarchiesi@0
|
1775 */
|
danielebarchiesi@0
|
1776 function testUserLanguageConfiguration() {
|
danielebarchiesi@0
|
1777 global $base_url;
|
danielebarchiesi@0
|
1778
|
danielebarchiesi@0
|
1779 // User to add and remove language.
|
danielebarchiesi@0
|
1780 $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
|
danielebarchiesi@0
|
1781 // User to change their default language.
|
danielebarchiesi@0
|
1782 $web_user = $this->drupalCreateUser();
|
danielebarchiesi@0
|
1783
|
danielebarchiesi@0
|
1784 // Add custom language.
|
danielebarchiesi@0
|
1785 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
1786 // Code for the language.
|
danielebarchiesi@0
|
1787 $langcode = 'xx';
|
danielebarchiesi@0
|
1788 // The English name for the language.
|
danielebarchiesi@0
|
1789 $name = $this->randomName(16);
|
danielebarchiesi@0
|
1790 // The native name for the language.
|
danielebarchiesi@0
|
1791 $native = $this->randomName(16);
|
danielebarchiesi@0
|
1792 // The domain prefix.
|
danielebarchiesi@0
|
1793 $prefix = 'xx';
|
danielebarchiesi@0
|
1794 $edit = array(
|
danielebarchiesi@0
|
1795 'langcode' => $langcode,
|
danielebarchiesi@0
|
1796 'name' => $name,
|
danielebarchiesi@0
|
1797 'native' => $native,
|
danielebarchiesi@0
|
1798 'prefix' => $prefix,
|
danielebarchiesi@0
|
1799 'direction' => '0',
|
danielebarchiesi@0
|
1800 );
|
danielebarchiesi@0
|
1801 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
1802
|
danielebarchiesi@0
|
1803 // Add custom language and disable it.
|
danielebarchiesi@0
|
1804 // Code for the language.
|
danielebarchiesi@0
|
1805 $langcode_disabled = 'xx-yy';
|
danielebarchiesi@0
|
1806 // The English name for the language. This will be translated.
|
danielebarchiesi@0
|
1807 $name_disabled = $this->randomName(16);
|
danielebarchiesi@0
|
1808 // The native name for the language.
|
danielebarchiesi@0
|
1809 $native_disabled = $this->randomName(16);
|
danielebarchiesi@0
|
1810 // The domain prefix.
|
danielebarchiesi@0
|
1811 $prefix_disabled = $langcode_disabled;
|
danielebarchiesi@0
|
1812 $edit = array(
|
danielebarchiesi@0
|
1813 'langcode' => $langcode_disabled,
|
danielebarchiesi@0
|
1814 'name' => $name_disabled,
|
danielebarchiesi@0
|
1815 'native' => $native_disabled,
|
danielebarchiesi@0
|
1816 'prefix' => $prefix_disabled,
|
danielebarchiesi@0
|
1817 'direction' => '0',
|
danielebarchiesi@0
|
1818 );
|
danielebarchiesi@0
|
1819 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
1820 // Disable the language.
|
danielebarchiesi@0
|
1821 $edit = array(
|
danielebarchiesi@0
|
1822 'enabled[' . $langcode_disabled . ']' => FALSE,
|
danielebarchiesi@0
|
1823 );
|
danielebarchiesi@0
|
1824 $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
|
danielebarchiesi@0
|
1825 $this->drupalLogout();
|
danielebarchiesi@0
|
1826
|
danielebarchiesi@0
|
1827 // Login as normal user and edit account settings.
|
danielebarchiesi@0
|
1828 $this->drupalLogin($web_user);
|
danielebarchiesi@0
|
1829 $path = 'user/' . $web_user->uid . '/edit';
|
danielebarchiesi@0
|
1830 $this->drupalGet($path);
|
danielebarchiesi@0
|
1831 // Ensure language settings fieldset is available.
|
danielebarchiesi@0
|
1832 $this->assertText(t('Language settings'), 'Language settings available.');
|
danielebarchiesi@0
|
1833 // Ensure custom language is present.
|
danielebarchiesi@0
|
1834 $this->assertText($name, 'Language present on form.');
|
danielebarchiesi@0
|
1835 // Ensure disabled language isn't present.
|
danielebarchiesi@0
|
1836 $this->assertNoText($name_disabled, 'Disabled language not present on form.');
|
danielebarchiesi@0
|
1837 // Switch to our custom language.
|
danielebarchiesi@0
|
1838 $edit = array(
|
danielebarchiesi@0
|
1839 'language' => $langcode,
|
danielebarchiesi@0
|
1840 );
|
danielebarchiesi@0
|
1841 $this->drupalPost($path, $edit, t('Save'));
|
danielebarchiesi@0
|
1842 // Ensure form was submitted successfully.
|
danielebarchiesi@0
|
1843 $this->assertText(t('The changes have been saved.'), 'Changes were saved.');
|
danielebarchiesi@0
|
1844 // Check if language was changed.
|
danielebarchiesi@0
|
1845 $elements = $this->xpath('//input[@id=:id]', array(':id' => 'edit-language-' . $langcode));
|
danielebarchiesi@0
|
1846 $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), 'Default language successfully updated.');
|
danielebarchiesi@0
|
1847
|
danielebarchiesi@0
|
1848 $this->drupalLogout();
|
danielebarchiesi@0
|
1849 }
|
danielebarchiesi@0
|
1850 }
|
danielebarchiesi@0
|
1851
|
danielebarchiesi@0
|
1852 /**
|
danielebarchiesi@0
|
1853 * Functional test for language handling during user creation.
|
danielebarchiesi@0
|
1854 */
|
danielebarchiesi@0
|
1855 class LocaleUserCreationTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
1856
|
danielebarchiesi@0
|
1857 public static function getInfo() {
|
danielebarchiesi@0
|
1858 return array(
|
danielebarchiesi@0
|
1859 'name' => 'User creation',
|
danielebarchiesi@0
|
1860 'description' => 'Tests whether proper language is stored for new users and access to language selector.',
|
danielebarchiesi@0
|
1861 'group' => 'Locale',
|
danielebarchiesi@0
|
1862 );
|
danielebarchiesi@0
|
1863 }
|
danielebarchiesi@0
|
1864
|
danielebarchiesi@0
|
1865 function setUp() {
|
danielebarchiesi@0
|
1866 parent::setUp('locale');
|
danielebarchiesi@0
|
1867 variable_set('user_register', USER_REGISTER_VISITORS);
|
danielebarchiesi@0
|
1868 }
|
danielebarchiesi@0
|
1869
|
danielebarchiesi@0
|
1870 /**
|
danielebarchiesi@0
|
1871 * Functional test for language handling during user creation.
|
danielebarchiesi@0
|
1872 */
|
danielebarchiesi@0
|
1873 function testLocalUserCreation() {
|
danielebarchiesi@0
|
1874 // User to add and remove language and create new users.
|
danielebarchiesi@0
|
1875 $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages', 'administer users'));
|
danielebarchiesi@0
|
1876 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
1877
|
danielebarchiesi@0
|
1878 // Add predefined language.
|
danielebarchiesi@0
|
1879 $langcode = 'fr';
|
danielebarchiesi@0
|
1880 $edit = array(
|
danielebarchiesi@0
|
1881 'langcode' => 'fr',
|
danielebarchiesi@0
|
1882 );
|
danielebarchiesi@0
|
1883 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
1884 $this->assertText($langcode, 'Language added successfully.');
|
danielebarchiesi@0
|
1885 $this->assertEqual($this->getUrl(), url('admin/config/regional/language', array('absolute' => TRUE)), 'Correct page redirection.');
|
danielebarchiesi@0
|
1886
|
danielebarchiesi@0
|
1887 // Set language negotiation.
|
danielebarchiesi@0
|
1888 $edit = array(
|
danielebarchiesi@0
|
1889 'language[enabled][locale-url]' => TRUE,
|
danielebarchiesi@0
|
1890 );
|
danielebarchiesi@0
|
1891 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
1892 $this->assertText(t('Language negotiation configuration saved.'), 'Set language negotiation.');
|
danielebarchiesi@0
|
1893
|
danielebarchiesi@0
|
1894 // Check if the language selector is available on admin/people/create and
|
danielebarchiesi@0
|
1895 // set to the currently active language.
|
danielebarchiesi@0
|
1896 $this->drupalGet($langcode . '/admin/people/create');
|
danielebarchiesi@0
|
1897 $this->assertFieldChecked("edit-language-$langcode", 'Global language set in the language selector.');
|
danielebarchiesi@0
|
1898
|
danielebarchiesi@0
|
1899 // Create a user with the admin/people/create form and check if the correct
|
danielebarchiesi@0
|
1900 // language is set.
|
danielebarchiesi@0
|
1901 $username = $this->randomName(10);
|
danielebarchiesi@0
|
1902 $edit = array(
|
danielebarchiesi@0
|
1903 'name' => $username,
|
danielebarchiesi@0
|
1904 'mail' => $this->randomName(4) . '@example.com',
|
danielebarchiesi@0
|
1905 'pass[pass1]' => $username,
|
danielebarchiesi@0
|
1906 'pass[pass2]' => $username,
|
danielebarchiesi@0
|
1907 );
|
danielebarchiesi@0
|
1908
|
danielebarchiesi@0
|
1909 $this->drupalPost($langcode . '/admin/people/create', $edit, t('Create new account'));
|
danielebarchiesi@0
|
1910
|
danielebarchiesi@0
|
1911 $user = user_load_by_name($username);
|
danielebarchiesi@0
|
1912 $this->assertEqual($user->language, $langcode, 'New user has correct language set.');
|
danielebarchiesi@0
|
1913
|
danielebarchiesi@0
|
1914 // Register a new user and check if the language selector is hidden.
|
danielebarchiesi@0
|
1915 $this->drupalLogout();
|
danielebarchiesi@0
|
1916
|
danielebarchiesi@0
|
1917 $this->drupalGet($langcode . '/user/register');
|
danielebarchiesi@0
|
1918 $this->assertNoFieldByName('language[fr]', 'Language selector is not accessible.');
|
danielebarchiesi@0
|
1919
|
danielebarchiesi@0
|
1920 $username = $this->randomName(10);
|
danielebarchiesi@0
|
1921 $edit = array(
|
danielebarchiesi@0
|
1922 'name' => $username,
|
danielebarchiesi@0
|
1923 'mail' => $this->randomName(4) . '@example.com',
|
danielebarchiesi@0
|
1924 );
|
danielebarchiesi@0
|
1925
|
danielebarchiesi@0
|
1926 $this->drupalPost($langcode . '/user/register', $edit, t('Create new account'));
|
danielebarchiesi@0
|
1927
|
danielebarchiesi@0
|
1928 $user = user_load_by_name($username);
|
danielebarchiesi@0
|
1929 $this->assertEqual($user->language, $langcode, 'New user has correct language set.');
|
danielebarchiesi@0
|
1930
|
danielebarchiesi@0
|
1931 // Test if the admin can use the language selector and if the
|
danielebarchiesi@0
|
1932 // correct language is was saved.
|
danielebarchiesi@0
|
1933 $user_edit = $langcode . '/user/' . $user->uid . '/edit';
|
danielebarchiesi@0
|
1934
|
danielebarchiesi@0
|
1935 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
1936 $this->drupalGet($user_edit);
|
danielebarchiesi@0
|
1937 $this->assertFieldChecked("edit-language-$langcode", 'Language selector is accessible and correct language is selected.');
|
danielebarchiesi@0
|
1938
|
danielebarchiesi@0
|
1939 // Set pass_raw so we can login the new user.
|
danielebarchiesi@0
|
1940 $user->pass_raw = $this->randomName(10);
|
danielebarchiesi@0
|
1941 $edit = array(
|
danielebarchiesi@0
|
1942 'pass[pass1]' => $user->pass_raw,
|
danielebarchiesi@0
|
1943 'pass[pass2]' => $user->pass_raw,
|
danielebarchiesi@0
|
1944 );
|
danielebarchiesi@0
|
1945
|
danielebarchiesi@0
|
1946 $this->drupalPost($user_edit, $edit, t('Save'));
|
danielebarchiesi@0
|
1947
|
danielebarchiesi@0
|
1948 $this->drupalLogin($user);
|
danielebarchiesi@0
|
1949 $this->drupalGet($user_edit);
|
danielebarchiesi@0
|
1950 $this->assertFieldChecked("edit-language-$langcode", 'Language selector is accessible and correct language is selected.');
|
danielebarchiesi@0
|
1951 }
|
danielebarchiesi@0
|
1952 }
|
danielebarchiesi@0
|
1953
|
danielebarchiesi@0
|
1954 /**
|
danielebarchiesi@0
|
1955 * Functional tests for configuring a different path alias per language.
|
danielebarchiesi@0
|
1956 */
|
danielebarchiesi@0
|
1957 class LocalePathFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
1958 public static function getInfo() {
|
danielebarchiesi@0
|
1959 return array(
|
danielebarchiesi@0
|
1960 'name' => 'Path language settings',
|
danielebarchiesi@0
|
1961 'description' => 'Checks you can configure a language for individual URL aliases.',
|
danielebarchiesi@0
|
1962 'group' => 'Locale',
|
danielebarchiesi@0
|
1963 );
|
danielebarchiesi@0
|
1964 }
|
danielebarchiesi@0
|
1965
|
danielebarchiesi@0
|
1966 function setUp() {
|
danielebarchiesi@0
|
1967 parent::setUp('locale', 'path');
|
danielebarchiesi@0
|
1968 }
|
danielebarchiesi@0
|
1969
|
danielebarchiesi@0
|
1970 /**
|
danielebarchiesi@0
|
1971 * Test if a language can be associated with a path alias.
|
danielebarchiesi@0
|
1972 */
|
danielebarchiesi@0
|
1973 function testPathLanguageConfiguration() {
|
danielebarchiesi@0
|
1974 global $base_url;
|
danielebarchiesi@0
|
1975
|
danielebarchiesi@0
|
1976 // User to add and remove language.
|
danielebarchiesi@0
|
1977 $admin_user = $this->drupalCreateUser(array('administer languages', 'create page content', 'administer url aliases', 'create url aliases', 'access administration pages'));
|
danielebarchiesi@0
|
1978
|
danielebarchiesi@0
|
1979 // Add custom language.
|
danielebarchiesi@0
|
1980 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
1981 // Code for the language.
|
danielebarchiesi@0
|
1982 $langcode = 'xx';
|
danielebarchiesi@0
|
1983 // The English name for the language.
|
danielebarchiesi@0
|
1984 $name = $this->randomName(16);
|
danielebarchiesi@0
|
1985 // The native name for the language.
|
danielebarchiesi@0
|
1986 $native = $this->randomName(16);
|
danielebarchiesi@0
|
1987 // The domain prefix.
|
danielebarchiesi@0
|
1988 $prefix = $langcode;
|
danielebarchiesi@0
|
1989 $edit = array(
|
danielebarchiesi@0
|
1990 'langcode' => $langcode,
|
danielebarchiesi@0
|
1991 'name' => $name,
|
danielebarchiesi@0
|
1992 'native' => $native,
|
danielebarchiesi@0
|
1993 'prefix' => $prefix,
|
danielebarchiesi@0
|
1994 'direction' => '0',
|
danielebarchiesi@0
|
1995 );
|
danielebarchiesi@0
|
1996 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
1997
|
danielebarchiesi@0
|
1998 // Check that the "xx" front page is not available when path prefixes are
|
danielebarchiesi@0
|
1999 // not enabled yet.
|
danielebarchiesi@0
|
2000 $this->drupalPost('admin/config/regional/language/configure', array(), t('Save settings'));
|
danielebarchiesi@0
|
2001 $this->drupalGet($prefix);
|
danielebarchiesi@0
|
2002 $this->assertResponse(404, 'The "xx" front page is not available yet.');
|
danielebarchiesi@0
|
2003
|
danielebarchiesi@0
|
2004 // Enable URL language detection and selection.
|
danielebarchiesi@0
|
2005 $edit = array('language[enabled][locale-url]' => 1);
|
danielebarchiesi@0
|
2006 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
2007
|
danielebarchiesi@0
|
2008 // Create a node.
|
danielebarchiesi@0
|
2009 $node = $this->drupalCreateNode(array('type' => 'page'));
|
danielebarchiesi@0
|
2010
|
danielebarchiesi@0
|
2011 // Create a path alias in default language (English).
|
danielebarchiesi@0
|
2012 $path = 'admin/config/search/path/add';
|
danielebarchiesi@0
|
2013 $english_path = $this->randomName(8);
|
danielebarchiesi@0
|
2014 $edit = array(
|
danielebarchiesi@0
|
2015 'source' => 'node/' . $node->nid,
|
danielebarchiesi@0
|
2016 'alias' => $english_path,
|
danielebarchiesi@0
|
2017 'language' => 'en',
|
danielebarchiesi@0
|
2018 );
|
danielebarchiesi@0
|
2019 $this->drupalPost($path, $edit, t('Save'));
|
danielebarchiesi@0
|
2020
|
danielebarchiesi@0
|
2021 // Create a path alias in new custom language.
|
danielebarchiesi@0
|
2022 $custom_language_path = $this->randomName(8);
|
danielebarchiesi@0
|
2023 $edit = array(
|
danielebarchiesi@0
|
2024 'source' => 'node/' . $node->nid,
|
danielebarchiesi@0
|
2025 'alias' => $custom_language_path,
|
danielebarchiesi@0
|
2026 'language' => $langcode,
|
danielebarchiesi@0
|
2027 );
|
danielebarchiesi@0
|
2028 $this->drupalPost($path, $edit, t('Save'));
|
danielebarchiesi@0
|
2029
|
danielebarchiesi@0
|
2030 // Confirm English language path alias works.
|
danielebarchiesi@0
|
2031 $this->drupalGet($english_path);
|
danielebarchiesi@0
|
2032 $this->assertText($node->title, 'English alias works.');
|
danielebarchiesi@0
|
2033
|
danielebarchiesi@0
|
2034 // Confirm custom language path alias works.
|
danielebarchiesi@0
|
2035 $this->drupalGet($prefix . '/' . $custom_language_path);
|
danielebarchiesi@0
|
2036 $this->assertText($node->title, 'Custom language alias works.');
|
danielebarchiesi@0
|
2037
|
danielebarchiesi@0
|
2038 // Create a custom path.
|
danielebarchiesi@0
|
2039 $custom_path = $this->randomName(8);
|
danielebarchiesi@0
|
2040
|
danielebarchiesi@0
|
2041 // Check priority of language for alias by source path.
|
danielebarchiesi@0
|
2042 $edit = array(
|
danielebarchiesi@0
|
2043 'source' => 'node/' . $node->nid,
|
danielebarchiesi@0
|
2044 'alias' => $custom_path,
|
danielebarchiesi@0
|
2045 'language' => LANGUAGE_NONE,
|
danielebarchiesi@0
|
2046 );
|
danielebarchiesi@0
|
2047 path_save($edit);
|
danielebarchiesi@0
|
2048 $lookup_path = drupal_lookup_path('alias', 'node/' . $node->nid, 'en');
|
danielebarchiesi@0
|
2049 $this->assertEqual($english_path, $lookup_path, 'English language alias has priority.');
|
danielebarchiesi@0
|
2050 // Same check for language 'xx'.
|
danielebarchiesi@0
|
2051 $lookup_path = drupal_lookup_path('alias', 'node/' . $node->nid, $prefix);
|
danielebarchiesi@0
|
2052 $this->assertEqual($custom_language_path, $lookup_path, 'Custom language alias has priority.');
|
danielebarchiesi@0
|
2053 path_delete($edit);
|
danielebarchiesi@0
|
2054
|
danielebarchiesi@0
|
2055 // Create language nodes to check priority of aliases.
|
danielebarchiesi@0
|
2056 $first_node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
|
danielebarchiesi@0
|
2057 $second_node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));
|
danielebarchiesi@0
|
2058
|
danielebarchiesi@0
|
2059 // Assign a custom path alias to the first node with the English language.
|
danielebarchiesi@0
|
2060 $edit = array(
|
danielebarchiesi@0
|
2061 'source' => 'node/' . $first_node->nid,
|
danielebarchiesi@0
|
2062 'alias' => $custom_path,
|
danielebarchiesi@0
|
2063 'language' => 'en',
|
danielebarchiesi@0
|
2064 );
|
danielebarchiesi@0
|
2065 path_save($edit);
|
danielebarchiesi@0
|
2066
|
danielebarchiesi@0
|
2067 // Assign a custom path alias to second node with LANGUAGE_NONE.
|
danielebarchiesi@0
|
2068 $edit = array(
|
danielebarchiesi@0
|
2069 'source' => 'node/' . $second_node->nid,
|
danielebarchiesi@0
|
2070 'alias' => $custom_path,
|
danielebarchiesi@0
|
2071 'language' => LANGUAGE_NONE,
|
danielebarchiesi@0
|
2072 );
|
danielebarchiesi@0
|
2073 path_save($edit);
|
danielebarchiesi@0
|
2074
|
danielebarchiesi@0
|
2075 // Test that both node titles link to our path alias.
|
danielebarchiesi@0
|
2076 $this->drupalGet('<front>');
|
danielebarchiesi@0
|
2077 $custom_path_url = base_path() . (variable_get('clean_url', 0) ? $custom_path : '?q=' . $custom_path);
|
danielebarchiesi@0
|
2078 $elements = $this->xpath('//a[@href=:href and .=:title]', array(':href' => $custom_path_url, ':title' => $first_node->title));
|
danielebarchiesi@0
|
2079 $this->assertTrue(!empty($elements), 'First node links to the path alias.');
|
danielebarchiesi@0
|
2080 $elements = $this->xpath('//a[@href=:href and .=:title]', array(':href' => $custom_path_url, ':title' => $second_node->title));
|
danielebarchiesi@0
|
2081 $this->assertTrue(!empty($elements), 'Second node links to the path alias.');
|
danielebarchiesi@0
|
2082
|
danielebarchiesi@0
|
2083 // Confirm that the custom path leads to the first node.
|
danielebarchiesi@0
|
2084 $this->drupalGet($custom_path);
|
danielebarchiesi@0
|
2085 $this->assertText($first_node->title, 'Custom alias returns first node.');
|
danielebarchiesi@0
|
2086
|
danielebarchiesi@0
|
2087 // Confirm that the custom path with prefix leads to the second node.
|
danielebarchiesi@0
|
2088 $this->drupalGet($prefix . '/' . $custom_path);
|
danielebarchiesi@0
|
2089 $this->assertText($second_node->title, 'Custom alias with prefix returns second node.');
|
danielebarchiesi@0
|
2090 }
|
danielebarchiesi@0
|
2091 }
|
danielebarchiesi@0
|
2092
|
danielebarchiesi@0
|
2093 /**
|
danielebarchiesi@0
|
2094 * Functional tests for multilingual support on nodes.
|
danielebarchiesi@0
|
2095 */
|
danielebarchiesi@0
|
2096 class LocaleContentFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
2097 public static function getInfo() {
|
danielebarchiesi@0
|
2098 return array(
|
danielebarchiesi@0
|
2099 'name' => 'Content language settings',
|
danielebarchiesi@0
|
2100 'description' => 'Checks you can enable multilingual support on content types and configure a language for a node.',
|
danielebarchiesi@0
|
2101 'group' => 'Locale',
|
danielebarchiesi@0
|
2102 );
|
danielebarchiesi@0
|
2103 }
|
danielebarchiesi@0
|
2104
|
danielebarchiesi@0
|
2105 function setUp() {
|
danielebarchiesi@0
|
2106 parent::setUp('locale');
|
danielebarchiesi@0
|
2107 }
|
danielebarchiesi@0
|
2108
|
danielebarchiesi@0
|
2109 /**
|
danielebarchiesi@0
|
2110 * Verifies that machine name fields are always LTR.
|
danielebarchiesi@0
|
2111 */
|
danielebarchiesi@0
|
2112 function testMachineNameLTR() {
|
danielebarchiesi@0
|
2113 // User to add and remove language.
|
danielebarchiesi@0
|
2114 $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages'));
|
danielebarchiesi@0
|
2115
|
danielebarchiesi@0
|
2116 // Log in as admin.
|
danielebarchiesi@0
|
2117 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
2118
|
danielebarchiesi@0
|
2119 // Verify that the machine name field is LTR for a new content type.
|
danielebarchiesi@0
|
2120 $this->drupalGet('admin/structure/types/add');
|
danielebarchiesi@0
|
2121 $this->assertFieldByXpath('//input[@name="type" and @dir="ltr"]', NULL, 'The machine name field is LTR when no additional language is configured.');
|
danielebarchiesi@0
|
2122
|
danielebarchiesi@0
|
2123 // Install the Arabic language (which is RTL) and configure as the default.
|
danielebarchiesi@0
|
2124 $edit = array();
|
danielebarchiesi@0
|
2125 $edit['langcode'] = 'ar';
|
danielebarchiesi@0
|
2126 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
2127
|
danielebarchiesi@0
|
2128 $edit = array();
|
danielebarchiesi@0
|
2129 $edit['site_default'] = 'ar';
|
danielebarchiesi@0
|
2130 $this->drupalPost(NULL, $edit, t('Save configuration'));
|
danielebarchiesi@0
|
2131
|
danielebarchiesi@0
|
2132 // Verify that the machine name field is still LTR for a new content type.
|
danielebarchiesi@0
|
2133 $this->drupalGet('admin/structure/types/add');
|
danielebarchiesi@0
|
2134 $this->assertFieldByXpath('//input[@name="type" and @dir="ltr"]', NULL, 'The machine name field is LTR when the default language is RTL.');
|
danielebarchiesi@0
|
2135 }
|
danielebarchiesi@0
|
2136
|
danielebarchiesi@0
|
2137 /**
|
danielebarchiesi@0
|
2138 * Test if a content type can be set to multilingual and language setting is
|
danielebarchiesi@0
|
2139 * present on node add and edit forms.
|
danielebarchiesi@0
|
2140 */
|
danielebarchiesi@0
|
2141 function testContentTypeLanguageConfiguration() {
|
danielebarchiesi@0
|
2142 global $base_url;
|
danielebarchiesi@0
|
2143
|
danielebarchiesi@0
|
2144 // User to add and remove language.
|
danielebarchiesi@0
|
2145 $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages'));
|
danielebarchiesi@0
|
2146 // User to create a node.
|
danielebarchiesi@0
|
2147 $web_user = $this->drupalCreateUser(array('create article content', 'create page content', 'edit any page content'));
|
danielebarchiesi@0
|
2148
|
danielebarchiesi@0
|
2149 // Add custom language.
|
danielebarchiesi@0
|
2150 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
2151 // Code for the language.
|
danielebarchiesi@0
|
2152 $langcode = 'xx';
|
danielebarchiesi@0
|
2153 // The English name for the language.
|
danielebarchiesi@0
|
2154 $name = $this->randomName(16);
|
danielebarchiesi@0
|
2155 // The native name for the language.
|
danielebarchiesi@0
|
2156 $native = $this->randomName(16);
|
danielebarchiesi@0
|
2157 // The domain prefix.
|
danielebarchiesi@0
|
2158 $prefix = $langcode;
|
danielebarchiesi@0
|
2159 $edit = array(
|
danielebarchiesi@0
|
2160 'langcode' => $langcode,
|
danielebarchiesi@0
|
2161 'name' => $name,
|
danielebarchiesi@0
|
2162 'native' => $native,
|
danielebarchiesi@0
|
2163 'prefix' => $prefix,
|
danielebarchiesi@0
|
2164 'direction' => '0',
|
danielebarchiesi@0
|
2165 );
|
danielebarchiesi@0
|
2166 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
2167
|
danielebarchiesi@0
|
2168 // Add disabled custom language.
|
danielebarchiesi@0
|
2169 // Code for the language.
|
danielebarchiesi@0
|
2170 $langcode_disabled = 'xx-yy';
|
danielebarchiesi@0
|
2171 // The English name for the language.
|
danielebarchiesi@0
|
2172 $name_disabled = $this->randomName(16);
|
danielebarchiesi@0
|
2173 // The native name for the language.
|
danielebarchiesi@0
|
2174 $native_disabled = $this->randomName(16);
|
danielebarchiesi@0
|
2175 // The domain prefix.
|
danielebarchiesi@0
|
2176 $prefix_disabled = $langcode_disabled;
|
danielebarchiesi@0
|
2177 $edit = array(
|
danielebarchiesi@0
|
2178 'langcode' => $langcode_disabled,
|
danielebarchiesi@0
|
2179 'name' => $name_disabled,
|
danielebarchiesi@0
|
2180 'native' => $native_disabled,
|
danielebarchiesi@0
|
2181 'prefix' => $prefix_disabled,
|
danielebarchiesi@0
|
2182 'direction' => '0',
|
danielebarchiesi@0
|
2183 );
|
danielebarchiesi@0
|
2184 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add custom language'));
|
danielebarchiesi@0
|
2185 // Disable second custom language.
|
danielebarchiesi@0
|
2186 $path = 'admin/config/regional/language';
|
danielebarchiesi@0
|
2187 $edit = array(
|
danielebarchiesi@0
|
2188 'enabled[' . $langcode_disabled . ']' => FALSE,
|
danielebarchiesi@0
|
2189 );
|
danielebarchiesi@0
|
2190 $this->drupalPost($path, $edit, t('Save configuration'));
|
danielebarchiesi@0
|
2191
|
danielebarchiesi@0
|
2192 // Set "Basic page" content type to use multilingual support.
|
danielebarchiesi@0
|
2193 $this->drupalGet('admin/structure/types/manage/page');
|
danielebarchiesi@0
|
2194 $this->assertText(t('Multilingual support'), 'Multilingual support fieldset present on content type configuration form.');
|
danielebarchiesi@0
|
2195 $edit = array(
|
danielebarchiesi@0
|
2196 'language_content_type' => 1,
|
danielebarchiesi@0
|
2197 );
|
danielebarchiesi@0
|
2198 $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
|
danielebarchiesi@0
|
2199 $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), 'Basic page content type has been updated.');
|
danielebarchiesi@0
|
2200 $this->drupalLogout();
|
danielebarchiesi@0
|
2201
|
danielebarchiesi@0
|
2202 // Verify language selection is not present on add article form.
|
danielebarchiesi@0
|
2203 $this->drupalLogin($web_user);
|
danielebarchiesi@0
|
2204 $this->drupalGet('node/add/article');
|
danielebarchiesi@0
|
2205 // Verify language select list is not present.
|
danielebarchiesi@0
|
2206 $this->assertNoFieldByName('language', NULL, 'Language select not present on add article form.');
|
danielebarchiesi@0
|
2207
|
danielebarchiesi@0
|
2208 // Verify language selection appears on add "Basic page" form.
|
danielebarchiesi@0
|
2209 $this->drupalGet('node/add/page');
|
danielebarchiesi@0
|
2210 // Verify language select list is present.
|
danielebarchiesi@0
|
2211 $this->assertFieldByName('language', NULL, 'Language select present on add Basic page form.');
|
danielebarchiesi@0
|
2212 // Ensure enabled language appears.
|
danielebarchiesi@0
|
2213 $this->assertText($name, 'Enabled language present.');
|
danielebarchiesi@0
|
2214 // Ensure disabled language doesn't appear.
|
danielebarchiesi@0
|
2215 $this->assertNoText($name_disabled, 'Disabled language not present.');
|
danielebarchiesi@0
|
2216
|
danielebarchiesi@0
|
2217 // Create "Basic page" content.
|
danielebarchiesi@0
|
2218 $node_title = $this->randomName();
|
danielebarchiesi@0
|
2219 $node_body = $this->randomName();
|
danielebarchiesi@0
|
2220 $edit = array(
|
danielebarchiesi@0
|
2221 'type' => 'page',
|
danielebarchiesi@0
|
2222 'title' => $node_title,
|
danielebarchiesi@0
|
2223 'body' => array($langcode => array(array('value' => $node_body))),
|
danielebarchiesi@0
|
2224 'language' => $langcode,
|
danielebarchiesi@0
|
2225 );
|
danielebarchiesi@0
|
2226 $node = $this->drupalCreateNode($edit);
|
danielebarchiesi@0
|
2227 // Edit the content and ensure correct language is selected.
|
danielebarchiesi@0
|
2228 $path = 'node/' . $node->nid . '/edit';
|
danielebarchiesi@0
|
2229 $this->drupalGet($path);
|
danielebarchiesi@0
|
2230 $this->assertRaw('<option value="' . $langcode . '" selected="selected">' . $name . '</option>', 'Correct language selected.');
|
danielebarchiesi@0
|
2231 // Ensure we can change the node language.
|
danielebarchiesi@0
|
2232 $edit = array(
|
danielebarchiesi@0
|
2233 'language' => 'en',
|
danielebarchiesi@0
|
2234 );
|
danielebarchiesi@0
|
2235 $this->drupalPost($path, $edit, t('Save'));
|
danielebarchiesi@0
|
2236 $this->assertRaw(t('%title has been updated.', array('%title' => $node_title)), 'Basic page content updated.');
|
danielebarchiesi@0
|
2237
|
danielebarchiesi@0
|
2238 $this->drupalLogout();
|
danielebarchiesi@0
|
2239 }
|
danielebarchiesi@0
|
2240 }
|
danielebarchiesi@0
|
2241
|
danielebarchiesi@0
|
2242 /**
|
danielebarchiesi@0
|
2243 * Test UI language negotiation
|
danielebarchiesi@0
|
2244 * 1. URL (PATH) > DEFAULT
|
danielebarchiesi@0
|
2245 * UI Language base on URL prefix, browser language preference has no
|
danielebarchiesi@0
|
2246 * influence:
|
danielebarchiesi@0
|
2247 * admin/config
|
danielebarchiesi@0
|
2248 * UI in site default language
|
danielebarchiesi@0
|
2249 * zh-hans/admin/config
|
danielebarchiesi@0
|
2250 * UI in Chinese
|
danielebarchiesi@0
|
2251 * blah-blah/admin/config
|
danielebarchiesi@0
|
2252 * 404
|
danielebarchiesi@0
|
2253 * 2. URL (PATH) > BROWSER > DEFAULT
|
danielebarchiesi@0
|
2254 * admin/config
|
danielebarchiesi@0
|
2255 * UI in user's browser language preference if the site has that
|
danielebarchiesi@0
|
2256 * language enabled, if not, the default language
|
danielebarchiesi@0
|
2257 * zh-hans/admin/config
|
danielebarchiesi@0
|
2258 * UI in Chinese
|
danielebarchiesi@0
|
2259 * blah-blah/admin/config
|
danielebarchiesi@0
|
2260 * 404
|
danielebarchiesi@0
|
2261 * 3. URL (DOMAIN) > DEFAULT
|
danielebarchiesi@0
|
2262 * http://example.com/admin/config
|
danielebarchiesi@0
|
2263 * UI language in site default
|
danielebarchiesi@0
|
2264 * http://example.cn/admin/config
|
danielebarchiesi@0
|
2265 * UI language in Chinese
|
danielebarchiesi@0
|
2266 */
|
danielebarchiesi@0
|
2267 class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
2268 public static function getInfo() {
|
danielebarchiesi@0
|
2269 return array(
|
danielebarchiesi@0
|
2270 'name' => 'UI language negotiation',
|
danielebarchiesi@0
|
2271 'description' => 'Test UI language switching by URL path prefix and domain.',
|
danielebarchiesi@0
|
2272 'group' => 'Locale',
|
danielebarchiesi@0
|
2273 );
|
danielebarchiesi@0
|
2274 }
|
danielebarchiesi@0
|
2275
|
danielebarchiesi@0
|
2276 function setUp() {
|
danielebarchiesi@0
|
2277 parent::setUp('locale', 'locale_test');
|
danielebarchiesi@0
|
2278 require_once DRUPAL_ROOT . '/includes/language.inc';
|
danielebarchiesi@0
|
2279 drupal_load('module', 'locale');
|
danielebarchiesi@0
|
2280 $admin_user = $this->drupalCreateUser(array('administer languages', 'translate interface', 'access administration pages', 'administer blocks'));
|
danielebarchiesi@0
|
2281 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
2282 }
|
danielebarchiesi@0
|
2283
|
danielebarchiesi@0
|
2284 /**
|
danielebarchiesi@0
|
2285 * Tests for language switching by URL path.
|
danielebarchiesi@0
|
2286 */
|
danielebarchiesi@0
|
2287 function testUILanguageNegotiation() {
|
danielebarchiesi@0
|
2288 // A few languages to switch to.
|
danielebarchiesi@0
|
2289 // This one is unknown, should get the default lang version.
|
danielebarchiesi@0
|
2290 $language_unknown = 'blah-blah';
|
danielebarchiesi@0
|
2291 // For testing browser lang preference.
|
danielebarchiesi@0
|
2292 $language_browser_fallback = 'vi';
|
danielebarchiesi@0
|
2293 // For testing path prefix.
|
danielebarchiesi@0
|
2294 $language = 'zh-hans';
|
danielebarchiesi@0
|
2295 // For setting browser language preference to 'vi'.
|
danielebarchiesi@0
|
2296 $http_header_browser_fallback = array("Accept-Language: $language_browser_fallback;q=1");
|
danielebarchiesi@0
|
2297 // For setting browser language preference to some unknown.
|
danielebarchiesi@0
|
2298 $http_header_blah = array("Accept-Language: blah;q=1");
|
danielebarchiesi@0
|
2299
|
danielebarchiesi@0
|
2300 // This domain should switch the UI to Chinese.
|
danielebarchiesi@0
|
2301 $language_domain = 'example.cn';
|
danielebarchiesi@0
|
2302
|
danielebarchiesi@0
|
2303 // Setup the site languages by installing two languages.
|
danielebarchiesi@0
|
2304 require_once DRUPAL_ROOT . '/includes/locale.inc';
|
danielebarchiesi@0
|
2305 locale_add_language($language_browser_fallback);
|
danielebarchiesi@0
|
2306 locale_add_language($language);
|
danielebarchiesi@0
|
2307
|
danielebarchiesi@0
|
2308 // We will look for this string in the admin/config screen to see if the
|
danielebarchiesi@0
|
2309 // corresponding translated string is shown.
|
danielebarchiesi@0
|
2310 $default_string = 'Configure languages for content and the user interface';
|
danielebarchiesi@0
|
2311
|
danielebarchiesi@0
|
2312 // Set the default language in order for the translated string to be registered
|
danielebarchiesi@0
|
2313 // into database when seen by t(). Without doing this, our target string
|
danielebarchiesi@0
|
2314 // is for some reason not found when doing translate search. This might
|
danielebarchiesi@0
|
2315 // be some bug.
|
danielebarchiesi@0
|
2316 drupal_static_reset('language_list');
|
danielebarchiesi@0
|
2317 $languages = language_list('enabled');
|
danielebarchiesi@0
|
2318 variable_set('language_default', $languages[1]['vi']);
|
danielebarchiesi@0
|
2319 // First visit this page to make sure our target string is searchable.
|
danielebarchiesi@0
|
2320 $this->drupalGet('admin/config');
|
danielebarchiesi@0
|
2321 // Now the t()'ed string is in db so switch the language back to default.
|
danielebarchiesi@0
|
2322 variable_del('language_default');
|
danielebarchiesi@0
|
2323
|
danielebarchiesi@0
|
2324 // Translate the string.
|
danielebarchiesi@0
|
2325 $language_browser_fallback_string = "In $language_browser_fallback In $language_browser_fallback In $language_browser_fallback";
|
danielebarchiesi@0
|
2326 $language_string = "In $language In $language In $language";
|
danielebarchiesi@0
|
2327 // Do a translate search of our target string.
|
danielebarchiesi@0
|
2328 $edit = array( 'string' => $default_string);
|
danielebarchiesi@0
|
2329 $this->drupalPost('admin/config/regional/translate/translate', $edit, t('Filter'));
|
danielebarchiesi@0
|
2330 // Should find the string and now click edit to post translated string.
|
danielebarchiesi@0
|
2331 $this->clickLink('edit');
|
danielebarchiesi@0
|
2332 $edit = array(
|
danielebarchiesi@0
|
2333 "translations[$language_browser_fallback]" => $language_browser_fallback_string,
|
danielebarchiesi@0
|
2334 "translations[$language]" => $language_string,
|
danielebarchiesi@0
|
2335 );
|
danielebarchiesi@0
|
2336 $this->drupalPost(NULL, $edit, t('Save translations'));
|
danielebarchiesi@0
|
2337
|
danielebarchiesi@0
|
2338 // Configure URL language rewrite.
|
danielebarchiesi@0
|
2339 variable_set('locale_language_negotiation_url_type', LANGUAGE_TYPE_INTERFACE);
|
danielebarchiesi@0
|
2340
|
danielebarchiesi@0
|
2341 $tests = array(
|
danielebarchiesi@0
|
2342 // Default, browser preference should have no influence.
|
danielebarchiesi@0
|
2343 array(
|
danielebarchiesi@0
|
2344 'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
|
danielebarchiesi@0
|
2345 'path' => 'admin/config',
|
danielebarchiesi@0
|
2346 'expect' => $default_string,
|
danielebarchiesi@0
|
2347 'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
|
danielebarchiesi@0
|
2348 'http_header' => $http_header_browser_fallback,
|
danielebarchiesi@0
|
2349 'message' => 'URL (PATH) > DEFAULT: no language prefix, UI language is default and the browser language preference setting is not used.',
|
danielebarchiesi@0
|
2350 ),
|
danielebarchiesi@0
|
2351 // Language prefix.
|
danielebarchiesi@0
|
2352 array(
|
danielebarchiesi@0
|
2353 'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
|
danielebarchiesi@0
|
2354 'path' => "$language/admin/config",
|
danielebarchiesi@0
|
2355 'expect' => $language_string,
|
danielebarchiesi@0
|
2356 'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
|
danielebarchiesi@0
|
2357 'http_header' => $http_header_browser_fallback,
|
danielebarchiesi@0
|
2358 'message' => 'URL (PATH) > DEFAULT: with language prefix, UI language is switched based on path prefix',
|
danielebarchiesi@0
|
2359 ),
|
danielebarchiesi@0
|
2360 // Default, go by browser preference.
|
danielebarchiesi@0
|
2361 array(
|
danielebarchiesi@0
|
2362 'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER),
|
danielebarchiesi@0
|
2363 'path' => 'admin/config',
|
danielebarchiesi@0
|
2364 'expect' => $language_browser_fallback_string,
|
danielebarchiesi@0
|
2365 'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_BROWSER,
|
danielebarchiesi@0
|
2366 'http_header' => $http_header_browser_fallback,
|
danielebarchiesi@0
|
2367 'message' => 'URL (PATH) > BROWSER: no language prefix, UI language is determined by browser language preference',
|
danielebarchiesi@0
|
2368 ),
|
danielebarchiesi@0
|
2369 // Prefix, switch to the language.
|
danielebarchiesi@0
|
2370 array(
|
danielebarchiesi@0
|
2371 'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER),
|
danielebarchiesi@0
|
2372 'path' => "$language/admin/config",
|
danielebarchiesi@0
|
2373 'expect' => $language_string,
|
danielebarchiesi@0
|
2374 'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
|
danielebarchiesi@0
|
2375 'http_header' => $http_header_browser_fallback,
|
danielebarchiesi@0
|
2376 'message' => 'URL (PATH) > BROWSER: with langage prefix, UI language is based on path prefix',
|
danielebarchiesi@0
|
2377 ),
|
danielebarchiesi@0
|
2378 // Default, browser language preference is not one of site's lang.
|
danielebarchiesi@0
|
2379 array(
|
danielebarchiesi@0
|
2380 'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LOCALE_LANGUAGE_NEGOTIATION_BROWSER, LANGUAGE_NEGOTIATION_DEFAULT),
|
danielebarchiesi@0
|
2381 'path' => 'admin/config',
|
danielebarchiesi@0
|
2382 'expect' => $default_string,
|
danielebarchiesi@0
|
2383 'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
|
danielebarchiesi@0
|
2384 'http_header' => $http_header_blah,
|
danielebarchiesi@0
|
2385 'message' => 'URL (PATH) > BROWSER > DEFAULT: no language prefix and browser language preference set to unknown language should use default language',
|
danielebarchiesi@0
|
2386 ),
|
danielebarchiesi@0
|
2387 );
|
danielebarchiesi@0
|
2388
|
danielebarchiesi@0
|
2389 foreach ($tests as $test) {
|
danielebarchiesi@0
|
2390 $this->runTest($test);
|
danielebarchiesi@0
|
2391 }
|
danielebarchiesi@0
|
2392
|
danielebarchiesi@0
|
2393 // Unknown language prefix should return 404.
|
danielebarchiesi@0
|
2394 variable_set('language_negotiation_' . LANGUAGE_TYPE_INTERFACE, locale_language_negotiation_info());
|
danielebarchiesi@0
|
2395 $this->drupalGet("$language_unknown/admin/config", array(), $http_header_browser_fallback);
|
danielebarchiesi@0
|
2396 $this->assertResponse(404, "Unknown language path prefix should return 404");
|
danielebarchiesi@0
|
2397
|
danielebarchiesi@0
|
2398 // Setup for domain negotiation, first configure the language to have domain
|
danielebarchiesi@0
|
2399 // URL. We use HTTPS and a port to make sure that only the domain name is used.
|
danielebarchiesi@0
|
2400 $edit = array('prefix' => '', 'domain' => "https://$language_domain:99");
|
danielebarchiesi@0
|
2401 $this->drupalPost("admin/config/regional/language/edit/$language", $edit, t('Save language'));
|
danielebarchiesi@0
|
2402 // Set the site to use domain language negotiation.
|
danielebarchiesi@0
|
2403
|
danielebarchiesi@0
|
2404 $tests = array(
|
danielebarchiesi@0
|
2405 // Default domain, browser preference should have no influence.
|
danielebarchiesi@0
|
2406 array(
|
danielebarchiesi@0
|
2407 'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
|
danielebarchiesi@0
|
2408 'locale_language_negotiation_url_part' => LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN,
|
danielebarchiesi@0
|
2409 'path' => 'admin/config',
|
danielebarchiesi@0
|
2410 'expect' => $default_string,
|
danielebarchiesi@0
|
2411 'expected_provider' => LANGUAGE_NEGOTIATION_DEFAULT,
|
danielebarchiesi@0
|
2412 'http_header' => $http_header_browser_fallback,
|
danielebarchiesi@0
|
2413 'message' => 'URL (DOMAIN) > DEFAULT: default domain should get default language',
|
danielebarchiesi@0
|
2414 ),
|
danielebarchiesi@0
|
2415 // Language domain specific URL, we set the $_SERVER['HTTP_HOST'] in
|
danielebarchiesi@0
|
2416 // locale_test.module hook_boot() to simulate this.
|
danielebarchiesi@0
|
2417 array(
|
danielebarchiesi@0
|
2418 'language_negotiation' => array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT),
|
danielebarchiesi@0
|
2419 'locale_language_negotiation_url_part' => LOCALE_LANGUAGE_NEGOTIATION_URL_DOMAIN,
|
danielebarchiesi@0
|
2420 'locale_test_domain' => $language_domain . ':88',
|
danielebarchiesi@0
|
2421 'path' => 'admin/config',
|
danielebarchiesi@0
|
2422 'expect' => $language_string,
|
danielebarchiesi@0
|
2423 'expected_provider' => LOCALE_LANGUAGE_NEGOTIATION_URL,
|
danielebarchiesi@0
|
2424 'http_header' => $http_header_browser_fallback,
|
danielebarchiesi@0
|
2425 'message' => 'URL (DOMAIN) > DEFAULT: domain example.cn should switch to Chinese',
|
danielebarchiesi@0
|
2426 ),
|
danielebarchiesi@0
|
2427 );
|
danielebarchiesi@0
|
2428
|
danielebarchiesi@0
|
2429 foreach ($tests as $test) {
|
danielebarchiesi@0
|
2430 $this->runTest($test);
|
danielebarchiesi@0
|
2431 }
|
danielebarchiesi@0
|
2432 }
|
danielebarchiesi@0
|
2433
|
danielebarchiesi@0
|
2434 private function runTest($test) {
|
danielebarchiesi@0
|
2435 if (!empty($test['language_negotiation'])) {
|
danielebarchiesi@0
|
2436 $negotiation = array_flip($test['language_negotiation']);
|
danielebarchiesi@0
|
2437 language_negotiation_set(LANGUAGE_TYPE_INTERFACE, $negotiation);
|
danielebarchiesi@0
|
2438 }
|
danielebarchiesi@0
|
2439 if (!empty($test['locale_language_negotiation_url_part'])) {
|
danielebarchiesi@0
|
2440 variable_set('locale_language_negotiation_url_part', $test['locale_language_negotiation_url_part']);
|
danielebarchiesi@0
|
2441 }
|
danielebarchiesi@0
|
2442 if (!empty($test['locale_test_domain'])) {
|
danielebarchiesi@0
|
2443 variable_set('locale_test_domain', $test['locale_test_domain']);
|
danielebarchiesi@0
|
2444 }
|
danielebarchiesi@0
|
2445 $this->drupalGet($test['path'], array(), $test['http_header']);
|
danielebarchiesi@0
|
2446 $this->assertText($test['expect'], $test['message']);
|
danielebarchiesi@0
|
2447 $this->assertText(t('Language negotiation provider: @name', array('@name' => $test['expected_provider'])));
|
danielebarchiesi@0
|
2448 }
|
danielebarchiesi@0
|
2449
|
danielebarchiesi@0
|
2450 /**
|
danielebarchiesi@0
|
2451 * Test URL language detection when the requested URL has no language.
|
danielebarchiesi@0
|
2452 */
|
danielebarchiesi@0
|
2453 function testUrlLanguageFallback() {
|
danielebarchiesi@0
|
2454 // Add the Italian language.
|
danielebarchiesi@0
|
2455 $language_browser_fallback = 'it';
|
danielebarchiesi@0
|
2456 locale_add_language($language_browser_fallback);
|
danielebarchiesi@0
|
2457 $languages = language_list();
|
danielebarchiesi@0
|
2458
|
danielebarchiesi@0
|
2459 // Enable the path prefix for the default language: this way any unprefixed
|
danielebarchiesi@0
|
2460 // URL must have a valid fallback value.
|
danielebarchiesi@0
|
2461 $edit = array('prefix' => 'en');
|
danielebarchiesi@0
|
2462 $this->drupalPost('admin/config/regional/language/edit/en', $edit, t('Save language'));
|
danielebarchiesi@0
|
2463
|
danielebarchiesi@0
|
2464 // Enable browser and URL language detection.
|
danielebarchiesi@0
|
2465 $edit = array(
|
danielebarchiesi@0
|
2466 'language[enabled][locale-browser]' => TRUE,
|
danielebarchiesi@0
|
2467 'language[enabled][locale-url]' => TRUE,
|
danielebarchiesi@0
|
2468 'language[weight][locale-browser]' => -8,
|
danielebarchiesi@0
|
2469 'language[weight][locale-url]' => -10,
|
danielebarchiesi@0
|
2470 );
|
danielebarchiesi@0
|
2471 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
2472 $this->drupalGet('admin/config/regional/language/configure');
|
danielebarchiesi@0
|
2473
|
danielebarchiesi@0
|
2474 // Enable the language switcher block.
|
danielebarchiesi@0
|
2475 $edit = array('blocks[locale_language][region]' => 'sidebar_first');
|
danielebarchiesi@0
|
2476 $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
|
danielebarchiesi@0
|
2477
|
danielebarchiesi@0
|
2478 // Access the front page without specifying any valid URL language prefix
|
danielebarchiesi@0
|
2479 // and having as browser language preference a non-default language.
|
danielebarchiesi@0
|
2480 $http_header = array("Accept-Language: $language_browser_fallback;q=1");
|
danielebarchiesi@0
|
2481 $this->drupalGet('', array(), $http_header);
|
danielebarchiesi@0
|
2482
|
danielebarchiesi@0
|
2483 // Check that the language switcher active link matches the given browser
|
danielebarchiesi@0
|
2484 // language.
|
danielebarchiesi@0
|
2485 $args = array(':url' => base_path() . (!empty($GLOBALS['conf']['clean_url']) ? $language_browser_fallback : "?q=$language_browser_fallback"));
|
danielebarchiesi@0
|
2486 $fields = $this->xpath('//div[@id="block-locale-language"]//a[@class="language-link active" and @href=:url]', $args);
|
danielebarchiesi@0
|
2487 $this->assertTrue($fields[0] == $languages[$language_browser_fallback]->native, 'The browser language is the URL active language');
|
danielebarchiesi@0
|
2488
|
danielebarchiesi@0
|
2489 // Check that URLs are rewritten using the given browser language.
|
danielebarchiesi@0
|
2490 $fields = $this->xpath('//div[@id="site-name"]//a[@rel="home" and @href=:url]//span', $args);
|
danielebarchiesi@0
|
2491 $this->assertTrue($fields[0] == 'Drupal', 'URLs are rewritten using the browser language.');
|
danielebarchiesi@0
|
2492 }
|
danielebarchiesi@0
|
2493
|
danielebarchiesi@0
|
2494 /**
|
danielebarchiesi@0
|
2495 * Tests url() when separate domains are used for multiple languages.
|
danielebarchiesi@0
|
2496 */
|
danielebarchiesi@0
|
2497 function testLanguageDomain() {
|
danielebarchiesi@0
|
2498 // Add the Italian language, without protocol.
|
danielebarchiesi@0
|
2499 $langcode = 'it';
|
danielebarchiesi@0
|
2500 locale_add_language($langcode, 'Italian', 'Italian', LANGUAGE_LTR, 'it.example.com', '', TRUE, FALSE);
|
danielebarchiesi@0
|
2501
|
danielebarchiesi@0
|
2502 // Add the French language, with protocol.
|
danielebarchiesi@0
|
2503 $langcode = 'fr';
|
danielebarchiesi@0
|
2504 locale_add_language($langcode, 'French', 'French', LANGUAGE_LTR, 'http://fr.example.com', '', TRUE, FALSE);
|
danielebarchiesi@0
|
2505
|
danielebarchiesi@0
|
2506 // Enable language URL detection.
|
danielebarchiesi@0
|
2507 $negotiation = array_flip(array(LOCALE_LANGUAGE_NEGOTIATION_URL, LANGUAGE_NEGOTIATION_DEFAULT));
|
danielebarchiesi@0
|
2508 language_negotiation_set(LANGUAGE_TYPE_INTERFACE, $negotiation);
|
danielebarchiesi@0
|
2509
|
danielebarchiesi@0
|
2510 variable_set('locale_language_negotiation_url_part', 1);
|
danielebarchiesi@0
|
2511
|
danielebarchiesi@0
|
2512 global $is_https;
|
danielebarchiesi@0
|
2513 $languages = language_list();
|
danielebarchiesi@0
|
2514
|
danielebarchiesi@0
|
2515 foreach (array('it', 'fr') as $langcode) {
|
danielebarchiesi@0
|
2516 // Build the link we're going to test based on the clean URL setting.
|
danielebarchiesi@0
|
2517 $link = (!empty($GLOBALS['conf']['clean_url'])) ? $langcode . '.example.com/admin' : $langcode . '.example.com/?q=admin';
|
danielebarchiesi@0
|
2518
|
danielebarchiesi@0
|
2519 // Test URL in another language.
|
danielebarchiesi@0
|
2520 // Base path gives problems on the testbot, so $correct_link is hard-coded.
|
danielebarchiesi@0
|
2521 // @see UrlAlterFunctionalTest::assertUrlOutboundAlter (path.test).
|
danielebarchiesi@0
|
2522 $url = url('admin', array('language' => $languages[$langcode]));
|
danielebarchiesi@0
|
2523 $url_scheme = ($is_https) ? 'https://' : 'http://';
|
danielebarchiesi@0
|
2524 $correct_link = $url_scheme . $link;
|
danielebarchiesi@0
|
2525 $this->assertTrue($url == $correct_link, format_string('The url() function returns the right url (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
|
danielebarchiesi@0
|
2526
|
danielebarchiesi@0
|
2527 // Test HTTPS via options.
|
danielebarchiesi@0
|
2528 variable_set('https', TRUE);
|
danielebarchiesi@0
|
2529 $url = url('admin', array('https' => TRUE, 'language' => $languages[$langcode]));
|
danielebarchiesi@0
|
2530 $correct_link = 'https://' . $link;
|
danielebarchiesi@0
|
2531 $this->assertTrue($url == $correct_link, format_string('The url() function returns the right https url (via options) (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
|
danielebarchiesi@0
|
2532 variable_set('https', FALSE);
|
danielebarchiesi@0
|
2533
|
danielebarchiesi@0
|
2534 // Test HTTPS via current URL scheme.
|
danielebarchiesi@0
|
2535 $temp_https = $is_https;
|
danielebarchiesi@0
|
2536 $is_https = TRUE;
|
danielebarchiesi@0
|
2537 $url = url('admin', array('language' => $languages[$langcode]));
|
danielebarchiesi@0
|
2538 $correct_link = 'https://' . $link;
|
danielebarchiesi@0
|
2539 $this->assertTrue($url == $correct_link, format_string('The url() function returns the right url (via current url scheme) (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
|
danielebarchiesi@0
|
2540 $is_https = $temp_https;
|
danielebarchiesi@0
|
2541 }
|
danielebarchiesi@0
|
2542 }
|
danielebarchiesi@0
|
2543 }
|
danielebarchiesi@0
|
2544
|
danielebarchiesi@0
|
2545 /**
|
danielebarchiesi@0
|
2546 * Test that URL rewriting works as expected.
|
danielebarchiesi@0
|
2547 */
|
danielebarchiesi@0
|
2548 class LocaleUrlRewritingTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
2549 public static function getInfo() {
|
danielebarchiesi@0
|
2550 return array(
|
danielebarchiesi@0
|
2551 'name' => 'URL rewriting',
|
danielebarchiesi@0
|
2552 'description' => 'Test that URL rewriting works as expected.',
|
danielebarchiesi@0
|
2553 'group' => 'Locale',
|
danielebarchiesi@0
|
2554 );
|
danielebarchiesi@0
|
2555 }
|
danielebarchiesi@0
|
2556
|
danielebarchiesi@0
|
2557 function setUp() {
|
danielebarchiesi@0
|
2558 parent::setUp('locale');
|
danielebarchiesi@0
|
2559
|
danielebarchiesi@0
|
2560 // Create and login user.
|
danielebarchiesi@0
|
2561 $this->web_user = $this->drupalCreateUser(array('administer languages', 'access administration pages'));
|
danielebarchiesi@0
|
2562 $this->drupalLogin($this->web_user);
|
danielebarchiesi@0
|
2563
|
danielebarchiesi@0
|
2564 // Install French language.
|
danielebarchiesi@0
|
2565 $edit = array();
|
danielebarchiesi@0
|
2566 $edit['langcode'] = 'fr';
|
danielebarchiesi@0
|
2567 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
2568
|
danielebarchiesi@0
|
2569 // Install Italian language.
|
danielebarchiesi@0
|
2570 $edit = array();
|
danielebarchiesi@0
|
2571 $edit['langcode'] = 'it';
|
danielebarchiesi@0
|
2572 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
2573
|
danielebarchiesi@0
|
2574 // Disable Italian language.
|
danielebarchiesi@0
|
2575 $edit = array('enabled[it]' => FALSE);
|
danielebarchiesi@0
|
2576 $this->drupalPost('admin/config/regional/language', $edit, t('Save configuration'));
|
danielebarchiesi@0
|
2577
|
danielebarchiesi@0
|
2578 // Enable URL language detection and selection.
|
danielebarchiesi@0
|
2579 $edit = array('language[enabled][locale-url]' => 1);
|
danielebarchiesi@0
|
2580 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
2581
|
danielebarchiesi@0
|
2582 // Reset static caching.
|
danielebarchiesi@0
|
2583 drupal_static_reset('language_list');
|
danielebarchiesi@0
|
2584 drupal_static_reset('locale_url_outbound_alter');
|
danielebarchiesi@0
|
2585 drupal_static_reset('locale_language_url_rewrite_url');
|
danielebarchiesi@0
|
2586 }
|
danielebarchiesi@0
|
2587
|
danielebarchiesi@0
|
2588 /**
|
danielebarchiesi@0
|
2589 * Check that disabled or non-installed languages are not considered.
|
danielebarchiesi@0
|
2590 */
|
danielebarchiesi@0
|
2591 function testUrlRewritingEdgeCases() {
|
danielebarchiesi@0
|
2592 // Check URL rewriting with a disabled language.
|
danielebarchiesi@0
|
2593 $languages = language_list();
|
danielebarchiesi@0
|
2594 $this->checkUrl($languages['it'], 'Path language is ignored if language is disabled.', 'URL language negotiation does not work with disabled languages');
|
danielebarchiesi@0
|
2595
|
danielebarchiesi@0
|
2596 // Check URL rewriting with a non-installed language.
|
danielebarchiesi@0
|
2597 $non_existing = language_default();
|
danielebarchiesi@0
|
2598 $non_existing->language = $this->randomName();
|
danielebarchiesi@0
|
2599 $non_existing->prefix = $this->randomName();
|
danielebarchiesi@0
|
2600 $this->checkUrl($non_existing, 'Path language is ignored if language is not installed.', 'URL language negotiation does not work with non-installed languages');
|
danielebarchiesi@0
|
2601 }
|
danielebarchiesi@0
|
2602
|
danielebarchiesi@0
|
2603 /**
|
danielebarchiesi@0
|
2604 * Check URL rewriting for the given language.
|
danielebarchiesi@0
|
2605 *
|
danielebarchiesi@0
|
2606 * The test is performed with a fixed URL (the default front page) to simply
|
danielebarchiesi@0
|
2607 * check that language prefixes are not added to it and that the prefixed URL
|
danielebarchiesi@0
|
2608 * is actually not working.
|
danielebarchiesi@0
|
2609 *
|
danielebarchiesi@0
|
2610 * @param string $language
|
danielebarchiesi@0
|
2611 * The language prefix, e.g. 'es'.
|
danielebarchiesi@0
|
2612 * @param string $message1
|
danielebarchiesi@0
|
2613 * Message to display in assertion that language prefixes are not added.
|
danielebarchiesi@0
|
2614 * @param string $message2
|
danielebarchiesi@0
|
2615 * The message to display confirming prefixed URL is not working.
|
danielebarchiesi@0
|
2616 */
|
danielebarchiesi@0
|
2617 private function checkUrl($language, $message1, $message2) {
|
danielebarchiesi@0
|
2618 $options = array('language' => $language);
|
danielebarchiesi@0
|
2619 $base_path = trim(base_path(), '/');
|
danielebarchiesi@0
|
2620 $rewritten_path = trim(str_replace(array('?q=', $base_path), '', url('node', $options)), '/');
|
danielebarchiesi@0
|
2621 $segments = explode('/', $rewritten_path, 2);
|
danielebarchiesi@0
|
2622 $prefix = $segments[0];
|
danielebarchiesi@0
|
2623 $path = isset($segments[1]) ? $segments[1] : $prefix;
|
danielebarchiesi@0
|
2624 // If the rewritten URL has not a language prefix we pick the right one from
|
danielebarchiesi@0
|
2625 // the language object so we can always check the prefixed URL.
|
danielebarchiesi@0
|
2626 if ($this->assertNotEqual($language->prefix, $prefix, $message1)) {
|
danielebarchiesi@0
|
2627 $prefix = $language->prefix;
|
danielebarchiesi@0
|
2628 }
|
danielebarchiesi@0
|
2629 $this->drupalGet("$prefix/$path");
|
danielebarchiesi@0
|
2630 $this->assertResponse(404, $message2);
|
danielebarchiesi@0
|
2631 }
|
danielebarchiesi@0
|
2632 }
|
danielebarchiesi@0
|
2633
|
danielebarchiesi@0
|
2634 /**
|
danielebarchiesi@0
|
2635 * Functional test for multilingual fields.
|
danielebarchiesi@0
|
2636 */
|
danielebarchiesi@0
|
2637 class LocaleMultilingualFieldsFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
2638 public static function getInfo() {
|
danielebarchiesi@0
|
2639 return array(
|
danielebarchiesi@0
|
2640 'name' => 'Multilingual fields',
|
danielebarchiesi@0
|
2641 'description' => 'Test multilingual support for fields.',
|
danielebarchiesi@0
|
2642 'group' => 'Locale',
|
danielebarchiesi@0
|
2643 );
|
danielebarchiesi@0
|
2644 }
|
danielebarchiesi@0
|
2645
|
danielebarchiesi@0
|
2646 function setUp() {
|
danielebarchiesi@0
|
2647 parent::setUp('locale');
|
danielebarchiesi@0
|
2648 // Setup users.
|
danielebarchiesi@0
|
2649 $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages', 'create page content', 'edit own page content'));
|
danielebarchiesi@0
|
2650 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
2651
|
danielebarchiesi@0
|
2652 // Add a new language.
|
danielebarchiesi@0
|
2653 require_once DRUPAL_ROOT . '/includes/locale.inc';
|
danielebarchiesi@0
|
2654 locale_add_language('it', 'Italian', 'Italiano', LANGUAGE_LTR, '', '', TRUE, FALSE);
|
danielebarchiesi@0
|
2655
|
danielebarchiesi@0
|
2656 // Enable URL language detection and selection.
|
danielebarchiesi@0
|
2657 $edit = array('language[enabled][locale-url]' => '1');
|
danielebarchiesi@0
|
2658 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
2659
|
danielebarchiesi@0
|
2660 // Set "Basic page" content type to use multilingual support.
|
danielebarchiesi@0
|
2661 $edit = array(
|
danielebarchiesi@0
|
2662 'language_content_type' => 1,
|
danielebarchiesi@0
|
2663 );
|
danielebarchiesi@0
|
2664 $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
|
danielebarchiesi@0
|
2665 $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Basic page')), 'Basic page content type has been updated.');
|
danielebarchiesi@0
|
2666
|
danielebarchiesi@0
|
2667 // Make node body translatable.
|
danielebarchiesi@0
|
2668 $field = field_info_field('body');
|
danielebarchiesi@0
|
2669 $field['translatable'] = TRUE;
|
danielebarchiesi@0
|
2670 field_update_field($field);
|
danielebarchiesi@0
|
2671 }
|
danielebarchiesi@0
|
2672
|
danielebarchiesi@0
|
2673 /**
|
danielebarchiesi@0
|
2674 * Test if field languages are correctly set through the node form.
|
danielebarchiesi@0
|
2675 */
|
danielebarchiesi@0
|
2676 function testMultilingualNodeForm() {
|
danielebarchiesi@0
|
2677 // Create "Basic page" content.
|
danielebarchiesi@0
|
2678 $langcode = LANGUAGE_NONE;
|
danielebarchiesi@0
|
2679 $title_key = "title";
|
danielebarchiesi@0
|
2680 $title_value = $this->randomName(8);
|
danielebarchiesi@0
|
2681 $body_key = "body[$langcode][0][value]";
|
danielebarchiesi@0
|
2682 $body_value = $this->randomName(16);
|
danielebarchiesi@0
|
2683
|
danielebarchiesi@0
|
2684 // Create node to edit.
|
danielebarchiesi@0
|
2685 $edit = array();
|
danielebarchiesi@0
|
2686 $edit[$title_key] = $title_value;
|
danielebarchiesi@0
|
2687 $edit[$body_key] = $body_value;
|
danielebarchiesi@0
|
2688 $edit['language'] = 'en';
|
danielebarchiesi@0
|
2689 $this->drupalPost('node/add/page', $edit, t('Save'));
|
danielebarchiesi@0
|
2690
|
danielebarchiesi@0
|
2691 // Check that the node exists in the database.
|
danielebarchiesi@0
|
2692 $node = $this->drupalGetNodeByTitle($edit[$title_key]);
|
danielebarchiesi@0
|
2693 $this->assertTrue($node, 'Node found in database.');
|
danielebarchiesi@0
|
2694
|
danielebarchiesi@0
|
2695 $assert = isset($node->body['en']) && !isset($node->body[LANGUAGE_NONE]) && $node->body['en'][0]['value'] == $body_value;
|
danielebarchiesi@0
|
2696 $this->assertTrue($assert, 'Field language correctly set.');
|
danielebarchiesi@0
|
2697
|
danielebarchiesi@0
|
2698 // Change node language.
|
danielebarchiesi@0
|
2699 $this->drupalGet("node/$node->nid/edit");
|
danielebarchiesi@0
|
2700 $edit = array(
|
danielebarchiesi@0
|
2701 $title_key => $this->randomName(8),
|
danielebarchiesi@0
|
2702 'language' => 'it'
|
danielebarchiesi@0
|
2703 );
|
danielebarchiesi@0
|
2704 $this->drupalPost(NULL, $edit, t('Save'));
|
danielebarchiesi@0
|
2705 $node = $this->drupalGetNodeByTitle($edit[$title_key]);
|
danielebarchiesi@0
|
2706 $this->assertTrue($node, 'Node found in database.');
|
danielebarchiesi@0
|
2707
|
danielebarchiesi@0
|
2708 $assert = isset($node->body['it']) && !isset($node->body['en']) && $node->body['it'][0]['value'] == $body_value;
|
danielebarchiesi@0
|
2709 $this->assertTrue($assert, 'Field language correctly changed.');
|
danielebarchiesi@0
|
2710
|
danielebarchiesi@0
|
2711 // Enable content language URL detection.
|
danielebarchiesi@0
|
2712 language_negotiation_set(LANGUAGE_TYPE_CONTENT, array(LOCALE_LANGUAGE_NEGOTIATION_URL => 0));
|
danielebarchiesi@0
|
2713
|
danielebarchiesi@0
|
2714 // Test multilingual field language fallback logic.
|
danielebarchiesi@0
|
2715 $this->drupalGet("it/node/$node->nid");
|
danielebarchiesi@0
|
2716 $this->assertRaw($body_value, 'Body correctly displayed using Italian as requested language');
|
danielebarchiesi@0
|
2717
|
danielebarchiesi@0
|
2718 $this->drupalGet("node/$node->nid");
|
danielebarchiesi@0
|
2719 $this->assertRaw($body_value, 'Body correctly displayed using English as requested language');
|
danielebarchiesi@0
|
2720 }
|
danielebarchiesi@0
|
2721
|
danielebarchiesi@0
|
2722 /*
|
danielebarchiesi@0
|
2723 * Test multilingual field display settings.
|
danielebarchiesi@0
|
2724 */
|
danielebarchiesi@0
|
2725 function testMultilingualDisplaySettings() {
|
danielebarchiesi@0
|
2726 // Create "Basic page" content.
|
danielebarchiesi@0
|
2727 $langcode = LANGUAGE_NONE;
|
danielebarchiesi@0
|
2728 $title_key = "title";
|
danielebarchiesi@0
|
2729 $title_value = $this->randomName(8);
|
danielebarchiesi@0
|
2730 $body_key = "body[$langcode][0][value]";
|
danielebarchiesi@0
|
2731 $body_value = $this->randomName(16);
|
danielebarchiesi@0
|
2732
|
danielebarchiesi@0
|
2733 // Create node to edit.
|
danielebarchiesi@0
|
2734 $edit = array();
|
danielebarchiesi@0
|
2735 $edit[$title_key] = $title_value;
|
danielebarchiesi@0
|
2736 $edit[$body_key] = $body_value;
|
danielebarchiesi@0
|
2737 $edit['language'] = 'en';
|
danielebarchiesi@0
|
2738 $this->drupalPost('node/add/page', $edit, t('Save'));
|
danielebarchiesi@0
|
2739
|
danielebarchiesi@0
|
2740 // Check that the node exists in the database.
|
danielebarchiesi@0
|
2741 $node = $this->drupalGetNodeByTitle($edit[$title_key]);
|
danielebarchiesi@0
|
2742 $this->assertTrue($node, 'Node found in database.');
|
danielebarchiesi@0
|
2743
|
danielebarchiesi@0
|
2744 // Check if node body is showed.
|
danielebarchiesi@0
|
2745 $this->drupalGet("node/$node->nid");
|
danielebarchiesi@0
|
2746 $body = $this->xpath('//div[@id=:id]//div[@property="content:encoded"]/p', array(':id' => 'node-' . $node->nid));
|
danielebarchiesi@0
|
2747 $this->assertEqual(current($body), $node->body['en'][0]['value'], 'Node body is correctly showed.');
|
danielebarchiesi@0
|
2748 }
|
danielebarchiesi@0
|
2749 }
|
danielebarchiesi@0
|
2750
|
danielebarchiesi@0
|
2751 /**
|
danielebarchiesi@0
|
2752 * Functional tests for comment language.
|
danielebarchiesi@0
|
2753 */
|
danielebarchiesi@0
|
2754 class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
2755
|
danielebarchiesi@0
|
2756 public static function getInfo() {
|
danielebarchiesi@0
|
2757 return array(
|
danielebarchiesi@0
|
2758 'name' => 'Comment language',
|
danielebarchiesi@0
|
2759 'description' => 'Tests for comment language.',
|
danielebarchiesi@0
|
2760 'group' => 'Locale',
|
danielebarchiesi@0
|
2761 );
|
danielebarchiesi@0
|
2762 }
|
danielebarchiesi@0
|
2763
|
danielebarchiesi@0
|
2764 function setUp() {
|
danielebarchiesi@0
|
2765 parent::setUp('locale', 'locale_test');
|
danielebarchiesi@0
|
2766
|
danielebarchiesi@0
|
2767 // Create and login user.
|
danielebarchiesi@0
|
2768 $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'administer content types', 'administer comments', 'create article content'));
|
danielebarchiesi@0
|
2769 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
2770
|
danielebarchiesi@0
|
2771 // Add language.
|
danielebarchiesi@0
|
2772 $edit = array('langcode' => 'fr');
|
danielebarchiesi@0
|
2773 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
2774
|
danielebarchiesi@0
|
2775 // Set "Article" content type to use multilingual support.
|
danielebarchiesi@0
|
2776 $edit = array('language_content_type' => 1);
|
danielebarchiesi@0
|
2777 $this->drupalPost('admin/structure/types/manage/article', $edit, t('Save content type'));
|
danielebarchiesi@0
|
2778
|
danielebarchiesi@0
|
2779 // Enable content language negotiation UI.
|
danielebarchiesi@0
|
2780 variable_set('locale_test_content_language_type', TRUE);
|
danielebarchiesi@0
|
2781
|
danielebarchiesi@0
|
2782 // Set interface language detection to user and content language detection
|
danielebarchiesi@0
|
2783 // to URL. Disable inheritance from interface language to ensure content
|
danielebarchiesi@0
|
2784 // language will fall back to the default language if no URL language can be
|
danielebarchiesi@0
|
2785 // detected.
|
danielebarchiesi@0
|
2786 $edit = array(
|
danielebarchiesi@0
|
2787 'language[enabled][locale-user]' => TRUE,
|
danielebarchiesi@0
|
2788 'language_content[enabled][locale-url]' => TRUE,
|
danielebarchiesi@0
|
2789 'language_content[enabled][locale-interface]' => FALSE,
|
danielebarchiesi@0
|
2790 );
|
danielebarchiesi@0
|
2791 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
2792
|
danielebarchiesi@0
|
2793 // Change user language preference, this way interface language is always
|
danielebarchiesi@0
|
2794 // French no matter what path prefix the URLs have.
|
danielebarchiesi@0
|
2795 $edit = array('language' => 'fr');
|
danielebarchiesi@0
|
2796 $this->drupalPost("user/{$admin_user->uid}/edit", $edit, t('Save'));
|
danielebarchiesi@0
|
2797
|
danielebarchiesi@0
|
2798 // Make comment body translatable.
|
danielebarchiesi@0
|
2799 $field = field_info_field('comment_body');
|
danielebarchiesi@0
|
2800 $field['translatable'] = TRUE;
|
danielebarchiesi@0
|
2801 field_update_field($field);
|
danielebarchiesi@0
|
2802 $this->assertTrue(field_is_translatable('comment', $field), 'Comment body is translatable.');
|
danielebarchiesi@0
|
2803 }
|
danielebarchiesi@0
|
2804
|
danielebarchiesi@0
|
2805 /**
|
danielebarchiesi@0
|
2806 * Test that comment language is properly set.
|
danielebarchiesi@0
|
2807 */
|
danielebarchiesi@0
|
2808 function testCommentLanguage() {
|
danielebarchiesi@0
|
2809 drupal_static_reset('language_list');
|
danielebarchiesi@0
|
2810
|
danielebarchiesi@0
|
2811 // Create two nodes, one for english and one for french, and comment each
|
danielebarchiesi@0
|
2812 // node using both english and french as content language by changing URL
|
danielebarchiesi@0
|
2813 // language prefixes. Meanwhile interface language is always French, which
|
danielebarchiesi@0
|
2814 // is the user language preference. This way we can ensure that node
|
danielebarchiesi@0
|
2815 // language and interface language do not influence comment language, as
|
danielebarchiesi@0
|
2816 // only content language has to.
|
danielebarchiesi@0
|
2817 foreach (language_list() as $node_langcode => $node_language) {
|
danielebarchiesi@0
|
2818 $language_none = LANGUAGE_NONE;
|
danielebarchiesi@0
|
2819
|
danielebarchiesi@0
|
2820 // Create "Article" content.
|
danielebarchiesi@0
|
2821 $title = $this->randomName();
|
danielebarchiesi@0
|
2822 $edit = array(
|
danielebarchiesi@0
|
2823 "title" => $title,
|
danielebarchiesi@0
|
2824 "body[$language_none][0][value]" => $this->randomName(),
|
danielebarchiesi@0
|
2825 "language" => $node_langcode,
|
danielebarchiesi@0
|
2826 );
|
danielebarchiesi@0
|
2827 $this->drupalPost("node/add/article", $edit, t('Save'));
|
danielebarchiesi@0
|
2828 $node = $this->drupalGetNodeByTitle($title);
|
danielebarchiesi@0
|
2829
|
danielebarchiesi@0
|
2830 foreach (language_list() as $langcode => $language) {
|
danielebarchiesi@0
|
2831 // Post a comment with content language $langcode.
|
danielebarchiesi@0
|
2832 $prefix = empty($language->prefix) ? '' : $language->prefix . '/';
|
danielebarchiesi@0
|
2833 $comment_values[$node_langcode][$langcode] = $this->randomName();
|
danielebarchiesi@0
|
2834 // Initially field form widgets have no language.
|
danielebarchiesi@0
|
2835 $edit = array(
|
danielebarchiesi@0
|
2836 'subject' => $this->randomName(),
|
danielebarchiesi@0
|
2837 "comment_body[$language_none][0][value]" => $comment_values[$node_langcode][$langcode],
|
danielebarchiesi@0
|
2838 );
|
danielebarchiesi@0
|
2839 $this->drupalPost("{$prefix}node/{$node->nid}", $edit, t('Preview'));
|
danielebarchiesi@0
|
2840 // After the first submit the submitted entity language is taken into
|
danielebarchiesi@0
|
2841 // account.
|
danielebarchiesi@0
|
2842 $edit = array(
|
danielebarchiesi@0
|
2843 'subject' => $edit['subject'],
|
danielebarchiesi@0
|
2844 "comment_body[$langcode][0][value]" => $comment_values[$node_langcode][$langcode],
|
danielebarchiesi@0
|
2845 );
|
danielebarchiesi@0
|
2846 $this->drupalPost(NULL, $edit, t('Save'));
|
danielebarchiesi@0
|
2847
|
danielebarchiesi@0
|
2848 // Check that comment language matches the current content language.
|
danielebarchiesi@0
|
2849 $cid = db_select('comment', 'c')
|
danielebarchiesi@0
|
2850 ->fields('c', array('cid'))
|
danielebarchiesi@0
|
2851 ->condition('nid', $node->nid)
|
danielebarchiesi@0
|
2852 ->orderBy('cid', 'DESC')
|
danielebarchiesi@0
|
2853 ->range(0, 1)
|
danielebarchiesi@0
|
2854 ->execute()
|
danielebarchiesi@0
|
2855 ->fetchField();
|
danielebarchiesi@0
|
2856 $comment = comment_load($cid);
|
danielebarchiesi@0
|
2857 $comment_langcode = entity_language('comment', $comment);
|
danielebarchiesi@0
|
2858 $args = array('%node_language' => $node_langcode, '%comment_language' => $comment_langcode, '%langcode' => $langcode);
|
danielebarchiesi@0
|
2859 $this->assertEqual($comment_langcode, $langcode, format_string('The comment posted with content language %langcode and belonging to the node with language %node_language has language %comment_language', $args));
|
danielebarchiesi@0
|
2860 $this->assertEqual($comment->comment_body[$langcode][0]['value'], $comment_values[$node_langcode][$langcode], 'Comment body correctly stored.');
|
danielebarchiesi@0
|
2861 }
|
danielebarchiesi@0
|
2862 }
|
danielebarchiesi@0
|
2863
|
danielebarchiesi@0
|
2864 // Check that comment bodies appear in the administration UI.
|
danielebarchiesi@0
|
2865 $this->drupalGet('admin/content/comment');
|
danielebarchiesi@0
|
2866 foreach ($comment_values as $node_values) {
|
danielebarchiesi@0
|
2867 foreach ($node_values as $value) {
|
danielebarchiesi@0
|
2868 $this->assertRaw($value);
|
danielebarchiesi@0
|
2869 }
|
danielebarchiesi@0
|
2870 }
|
danielebarchiesi@0
|
2871 }
|
danielebarchiesi@0
|
2872
|
danielebarchiesi@0
|
2873 }
|
danielebarchiesi@0
|
2874
|
danielebarchiesi@0
|
2875 /**
|
danielebarchiesi@0
|
2876 * Functional tests for localizing date formats.
|
danielebarchiesi@0
|
2877 */
|
danielebarchiesi@0
|
2878 class LocaleDateFormatsFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
2879
|
danielebarchiesi@0
|
2880 public static function getInfo() {
|
danielebarchiesi@0
|
2881 return array(
|
danielebarchiesi@0
|
2882 'name' => 'Localize date formats',
|
danielebarchiesi@0
|
2883 'description' => 'Tests for the localization of date formats.',
|
danielebarchiesi@0
|
2884 'group' => 'Locale',
|
danielebarchiesi@0
|
2885 );
|
danielebarchiesi@0
|
2886 }
|
danielebarchiesi@0
|
2887
|
danielebarchiesi@0
|
2888 function setUp() {
|
danielebarchiesi@0
|
2889 parent::setUp('locale');
|
danielebarchiesi@0
|
2890
|
danielebarchiesi@0
|
2891 // Create and login user.
|
danielebarchiesi@0
|
2892 $admin_user = $this->drupalCreateUser(array('administer site configuration', 'administer languages', 'access administration pages', 'create article content'));
|
danielebarchiesi@0
|
2893 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
2894 }
|
danielebarchiesi@0
|
2895
|
danielebarchiesi@0
|
2896 /**
|
danielebarchiesi@0
|
2897 * Functional tests for localizing date formats.
|
danielebarchiesi@0
|
2898 */
|
danielebarchiesi@0
|
2899 function testLocalizeDateFormats() {
|
danielebarchiesi@0
|
2900 // Add language.
|
danielebarchiesi@0
|
2901 $edit = array(
|
danielebarchiesi@0
|
2902 'langcode' => 'fr',
|
danielebarchiesi@0
|
2903 );
|
danielebarchiesi@0
|
2904 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
2905
|
danielebarchiesi@0
|
2906 // Set language negotiation.
|
danielebarchiesi@0
|
2907 $language_type = LANGUAGE_TYPE_INTERFACE;
|
danielebarchiesi@0
|
2908 $edit = array(
|
danielebarchiesi@0
|
2909 "{$language_type}[enabled][locale-url]" => TRUE,
|
danielebarchiesi@0
|
2910 );
|
danielebarchiesi@0
|
2911 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
2912
|
danielebarchiesi@0
|
2913 // Configure date formats.
|
danielebarchiesi@0
|
2914 $this->drupalGet('admin/config/regional/date-time/locale');
|
danielebarchiesi@0
|
2915 $this->assertText('Français', 'Configured languages appear.');
|
danielebarchiesi@0
|
2916 $edit = array(
|
danielebarchiesi@0
|
2917 'date_format_long' => 'd.m.Y - H:i',
|
danielebarchiesi@0
|
2918 'date_format_medium' => 'd.m.Y - H:i',
|
danielebarchiesi@0
|
2919 'date_format_short' => 'd.m.Y - H:i',
|
danielebarchiesi@0
|
2920 );
|
danielebarchiesi@0
|
2921 $this->drupalPost('admin/config/regional/date-time/locale/fr/edit', $edit, t('Save configuration'));
|
danielebarchiesi@0
|
2922 $this->assertText(t('Configuration saved.'), 'French date formats updated.');
|
danielebarchiesi@0
|
2923 $edit = array(
|
danielebarchiesi@0
|
2924 'date_format_long' => 'j M Y - g:ia',
|
danielebarchiesi@0
|
2925 'date_format_medium' => 'j M Y - g:ia',
|
danielebarchiesi@0
|
2926 'date_format_short' => 'j M Y - g:ia',
|
danielebarchiesi@0
|
2927 );
|
danielebarchiesi@0
|
2928 $this->drupalPost('admin/config/regional/date-time/locale/en/edit', $edit, t('Save configuration'));
|
danielebarchiesi@0
|
2929 $this->assertText(t('Configuration saved.'), 'English date formats updated.');
|
danielebarchiesi@0
|
2930
|
danielebarchiesi@0
|
2931 // Create node content.
|
danielebarchiesi@0
|
2932 $node = $this->drupalCreateNode(array('type' => 'article'));
|
danielebarchiesi@0
|
2933
|
danielebarchiesi@0
|
2934 // Configure format for the node posted date changes with the language.
|
danielebarchiesi@0
|
2935 $this->drupalGet('node/' . $node->nid);
|
danielebarchiesi@0
|
2936 $english_date = format_date($node->created, 'custom', 'j M Y');
|
danielebarchiesi@0
|
2937 $this->assertText($english_date, 'English date format appears');
|
danielebarchiesi@0
|
2938 $this->drupalGet('fr/node/' . $node->nid);
|
danielebarchiesi@0
|
2939 $french_date = format_date($node->created, 'custom', 'd.m.Y');
|
danielebarchiesi@0
|
2940 $this->assertText($french_date, 'French date format appears');
|
danielebarchiesi@0
|
2941 }
|
danielebarchiesi@0
|
2942 }
|
danielebarchiesi@0
|
2943
|
danielebarchiesi@0
|
2944 /**
|
danielebarchiesi@0
|
2945 * Functional test for language types/negotiation info.
|
danielebarchiesi@0
|
2946 */
|
danielebarchiesi@0
|
2947 class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
2948
|
danielebarchiesi@0
|
2949 public static function getInfo() {
|
danielebarchiesi@0
|
2950 return array(
|
danielebarchiesi@0
|
2951 'name' => 'Language negotiation info',
|
danielebarchiesi@0
|
2952 'description' => 'Tests alterations to language types/negotiation info.',
|
danielebarchiesi@0
|
2953 'group' => 'Locale',
|
danielebarchiesi@0
|
2954 );
|
danielebarchiesi@0
|
2955 }
|
danielebarchiesi@0
|
2956
|
danielebarchiesi@0
|
2957 function setUp() {
|
danielebarchiesi@0
|
2958 parent::setUp('locale');
|
danielebarchiesi@0
|
2959 require_once DRUPAL_ROOT .'/includes/language.inc';
|
danielebarchiesi@0
|
2960 $admin_user = $this->drupalCreateUser(array('administer languages', 'access administration pages', 'view the administration theme'));
|
danielebarchiesi@0
|
2961 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
2962 $this->drupalPost('admin/config/regional/language/add', array('langcode' => 'it'), t('Add language'));
|
danielebarchiesi@0
|
2963 }
|
danielebarchiesi@0
|
2964
|
danielebarchiesi@0
|
2965 /**
|
danielebarchiesi@0
|
2966 * Tests alterations to language types/negotiation info.
|
danielebarchiesi@0
|
2967 */
|
danielebarchiesi@0
|
2968 function testInfoAlterations() {
|
danielebarchiesi@0
|
2969 // Enable language type/negotiation info alterations.
|
danielebarchiesi@0
|
2970 variable_set('locale_test_language_types', TRUE);
|
danielebarchiesi@0
|
2971 variable_set('locale_test_language_negotiation_info', TRUE);
|
danielebarchiesi@0
|
2972 $this->languageNegotiationUpdate();
|
danielebarchiesi@0
|
2973
|
danielebarchiesi@0
|
2974 // Check that fixed language types are properly configured without the need
|
danielebarchiesi@0
|
2975 // of saving the language negotiation settings.
|
danielebarchiesi@0
|
2976 $this->checkFixedLanguageTypes();
|
danielebarchiesi@0
|
2977
|
danielebarchiesi@0
|
2978 // Make the content language type configurable by updating the language
|
danielebarchiesi@0
|
2979 // negotiation settings with the proper flag enabled.
|
danielebarchiesi@0
|
2980 variable_set('locale_test_content_language_type', TRUE);
|
danielebarchiesi@0
|
2981 $this->languageNegotiationUpdate();
|
danielebarchiesi@0
|
2982 $type = LANGUAGE_TYPE_CONTENT;
|
danielebarchiesi@0
|
2983 $language_types = variable_get('language_types', drupal_language_types());
|
danielebarchiesi@0
|
2984 $this->assertTrue($language_types[$type], 'Content language type is configurable.');
|
danielebarchiesi@0
|
2985
|
danielebarchiesi@0
|
2986 // Enable some core and custom language providers. The test language type is
|
danielebarchiesi@0
|
2987 // supposed to be configurable.
|
danielebarchiesi@0
|
2988 $test_type = 'test_language_type';
|
danielebarchiesi@0
|
2989 $provider = LOCALE_LANGUAGE_NEGOTIATION_INTERFACE;
|
danielebarchiesi@0
|
2990 $test_provider = 'test_language_provider';
|
danielebarchiesi@0
|
2991 $form_field = $type . '[enabled]['. $provider .']';
|
danielebarchiesi@0
|
2992 $edit = array(
|
danielebarchiesi@0
|
2993 $form_field => TRUE,
|
danielebarchiesi@0
|
2994 $type . '[enabled][' . $test_provider . ']' => TRUE,
|
danielebarchiesi@0
|
2995 $test_type . '[enabled][' . $test_provider . ']' => TRUE,
|
danielebarchiesi@0
|
2996 );
|
danielebarchiesi@0
|
2997 $this->drupalPost('admin/config/regional/language/configure', $edit, t('Save settings'));
|
danielebarchiesi@0
|
2998
|
danielebarchiesi@0
|
2999 // Remove the interface language provider by updating the language
|
danielebarchiesi@0
|
3000 // negotiation settings with the proper flag enabled.
|
danielebarchiesi@0
|
3001 variable_set('locale_test_language_negotiation_info_alter', TRUE);
|
danielebarchiesi@0
|
3002 $this->languageNegotiationUpdate();
|
danielebarchiesi@0
|
3003 $negotiation = variable_get("language_negotiation_$type", array());
|
danielebarchiesi@0
|
3004 $this->assertFalse(isset($negotiation[$provider]), 'Interface language provider removed from the stored settings.');
|
danielebarchiesi@0
|
3005 $this->assertNoFieldByXPath("//input[@name=\"$form_field\"]", NULL, 'Interface language provider unavailable.');
|
danielebarchiesi@0
|
3006
|
danielebarchiesi@0
|
3007 // Check that type-specific language providers can be assigned only to the
|
danielebarchiesi@0
|
3008 // corresponding language types.
|
danielebarchiesi@0
|
3009 foreach (language_types_configurable() as $type) {
|
danielebarchiesi@0
|
3010 $form_field = $type . '[enabled][test_language_provider_ts]';
|
danielebarchiesi@0
|
3011 if ($type == $test_type) {
|
danielebarchiesi@0
|
3012 $this->assertFieldByXPath("//input[@name=\"$form_field\"]", NULL, format_string('Type-specific test language provider available for %type.', array('%type' => $type)));
|
danielebarchiesi@0
|
3013 }
|
danielebarchiesi@0
|
3014 else {
|
danielebarchiesi@0
|
3015 $this->assertNoFieldByXPath("//input[@name=\"$form_field\"]", NULL, format_string('Type-specific test language provider unavailable for %type.', array('%type' => $type)));
|
danielebarchiesi@0
|
3016 }
|
danielebarchiesi@0
|
3017 }
|
danielebarchiesi@0
|
3018
|
danielebarchiesi@0
|
3019 // Check language negotiation results.
|
danielebarchiesi@0
|
3020 $this->drupalGet('');
|
danielebarchiesi@0
|
3021 $last = variable_get('locale_test_language_negotiation_last', array());
|
danielebarchiesi@0
|
3022 foreach (language_types() as $type) {
|
danielebarchiesi@0
|
3023 $langcode = $last[$type];
|
danielebarchiesi@0
|
3024 $value = $type == LANGUAGE_TYPE_CONTENT || strpos($type, 'test') !== FALSE ? 'it' : 'en';
|
danielebarchiesi@0
|
3025 $this->assertEqual($langcode, $value, format_string('The negotiated language for %type is %language', array('%type' => $type, '%language' => $langcode)));
|
danielebarchiesi@0
|
3026 }
|
danielebarchiesi@0
|
3027
|
danielebarchiesi@0
|
3028 // Disable locale_test and check that everything is set back to the original
|
danielebarchiesi@0
|
3029 // status.
|
danielebarchiesi@0
|
3030 $this->languageNegotiationUpdate('disable');
|
danielebarchiesi@0
|
3031
|
danielebarchiesi@0
|
3032 // Check that only the core language types are available.
|
danielebarchiesi@0
|
3033 foreach (language_types() as $type) {
|
danielebarchiesi@0
|
3034 $this->assertTrue(strpos($type, 'test') === FALSE, format_string('The %type language is still available', array('%type' => $type)));
|
danielebarchiesi@0
|
3035 }
|
danielebarchiesi@0
|
3036
|
danielebarchiesi@0
|
3037 // Check that fixed language types are properly configured, even those
|
danielebarchiesi@0
|
3038 // previously set to configurable.
|
danielebarchiesi@0
|
3039 $this->checkFixedLanguageTypes();
|
danielebarchiesi@0
|
3040
|
danielebarchiesi@0
|
3041 // Check that unavailable language providers are not present in the
|
danielebarchiesi@0
|
3042 // negotiation settings.
|
danielebarchiesi@0
|
3043 $negotiation = variable_get("language_negotiation_$type", array());
|
danielebarchiesi@0
|
3044 $this->assertFalse(isset($negotiation[$test_provider]), 'The disabled test language provider is not part of the content language negotiation settings.');
|
danielebarchiesi@0
|
3045
|
danielebarchiesi@0
|
3046 // Check that configuration page presents the correct options and settings.
|
danielebarchiesi@0
|
3047 $this->assertNoRaw(t('Test language detection'), 'No test language type configuration available.');
|
danielebarchiesi@0
|
3048 $this->assertNoRaw(t('This is a test language provider'), 'No test language provider available.');
|
danielebarchiesi@0
|
3049 }
|
danielebarchiesi@0
|
3050
|
danielebarchiesi@0
|
3051 /**
|
danielebarchiesi@0
|
3052 * Update language types/negotiation information.
|
danielebarchiesi@0
|
3053 *
|
danielebarchiesi@0
|
3054 * Manually invoke locale_modules_enabled()/locale_modules_disabled() since
|
danielebarchiesi@0
|
3055 * they would not be invoked after enabling/disabling locale_test the first
|
danielebarchiesi@0
|
3056 * time.
|
danielebarchiesi@0
|
3057 */
|
danielebarchiesi@0
|
3058 private function languageNegotiationUpdate($op = 'enable') {
|
danielebarchiesi@0
|
3059 static $last_op = NULL;
|
danielebarchiesi@0
|
3060 $modules = array('locale_test');
|
danielebarchiesi@0
|
3061
|
danielebarchiesi@0
|
3062 // Enable/disable locale_test only if we did not already before.
|
danielebarchiesi@0
|
3063 if ($last_op != $op) {
|
danielebarchiesi@0
|
3064 $function = "module_{$op}";
|
danielebarchiesi@0
|
3065 $function($modules);
|
danielebarchiesi@0
|
3066 // Reset hook implementation cache.
|
danielebarchiesi@0
|
3067 module_implements(NULL, FALSE, TRUE);
|
danielebarchiesi@0
|
3068 }
|
danielebarchiesi@0
|
3069
|
danielebarchiesi@0
|
3070 drupal_static_reset('language_types_info');
|
danielebarchiesi@0
|
3071 drupal_static_reset('language_negotiation_info');
|
danielebarchiesi@0
|
3072 $function = "locale_modules_{$op}d";
|
danielebarchiesi@0
|
3073 if (function_exists($function)) {
|
danielebarchiesi@0
|
3074 $function($modules);
|
danielebarchiesi@0
|
3075 }
|
danielebarchiesi@0
|
3076
|
danielebarchiesi@0
|
3077 $this->drupalGet('admin/config/regional/language/configure');
|
danielebarchiesi@0
|
3078 }
|
danielebarchiesi@0
|
3079
|
danielebarchiesi@0
|
3080 /**
|
danielebarchiesi@0
|
3081 * Check that language negotiation for fixed types matches the stored one.
|
danielebarchiesi@0
|
3082 */
|
danielebarchiesi@0
|
3083 private function checkFixedLanguageTypes() {
|
danielebarchiesi@0
|
3084 drupal_static_reset('language_types_info');
|
danielebarchiesi@0
|
3085 foreach (language_types_info() as $type => $info) {
|
danielebarchiesi@0
|
3086 if (isset($info['fixed'])) {
|
danielebarchiesi@0
|
3087 $negotiation = variable_get("language_negotiation_$type", array());
|
danielebarchiesi@0
|
3088 $equal = count($info['fixed']) == count($negotiation);
|
danielebarchiesi@0
|
3089 while ($equal && list($id) = each($negotiation)) {
|
danielebarchiesi@0
|
3090 list(, $info_id) = each($info['fixed']);
|
danielebarchiesi@0
|
3091 $equal = $info_id == $id;
|
danielebarchiesi@0
|
3092 }
|
danielebarchiesi@0
|
3093 $this->assertTrue($equal, format_string('language negotiation for %type is properly set up', array('%type' => $type)));
|
danielebarchiesi@0
|
3094 }
|
danielebarchiesi@0
|
3095 }
|
danielebarchiesi@0
|
3096 }
|
danielebarchiesi@0
|
3097 }
|
danielebarchiesi@0
|
3098
|
danielebarchiesi@0
|
3099 /**
|
danielebarchiesi@0
|
3100 * Functional tests for CSS alter functions.
|
danielebarchiesi@0
|
3101 */
|
danielebarchiesi@0
|
3102 class LocaleCSSAlterTest extends DrupalWebTestCase {
|
danielebarchiesi@0
|
3103 public static function getInfo() {
|
danielebarchiesi@0
|
3104 return array(
|
danielebarchiesi@0
|
3105 'name' => 'CSS altering',
|
danielebarchiesi@0
|
3106 'description' => 'Test CSS alter functions.',
|
danielebarchiesi@0
|
3107 'group' => 'Locale',
|
danielebarchiesi@0
|
3108 );
|
danielebarchiesi@0
|
3109 }
|
danielebarchiesi@0
|
3110
|
danielebarchiesi@0
|
3111 function setUp() {
|
danielebarchiesi@0
|
3112 parent::setUp('locale');
|
danielebarchiesi@0
|
3113 }
|
danielebarchiesi@0
|
3114
|
danielebarchiesi@0
|
3115 /**
|
danielebarchiesi@0
|
3116 * Verifies that -rtl.css file is added directly after LTR .css file.
|
danielebarchiesi@0
|
3117 */
|
danielebarchiesi@0
|
3118 function testCSSFilesOrderInRTLMode() {
|
danielebarchiesi@0
|
3119 global $base_url;
|
danielebarchiesi@0
|
3120
|
danielebarchiesi@0
|
3121 // User to add and remove language.
|
danielebarchiesi@0
|
3122 $admin_user = $this->drupalCreateUser(array('administer languages', 'administer content types', 'access administration pages'));
|
danielebarchiesi@0
|
3123
|
danielebarchiesi@0
|
3124 // Log in as admin.
|
danielebarchiesi@0
|
3125 $this->drupalLogin($admin_user);
|
danielebarchiesi@0
|
3126
|
danielebarchiesi@0
|
3127 // Install the Arabic language (which is RTL) and configure as the default.
|
danielebarchiesi@0
|
3128 $edit = array();
|
danielebarchiesi@0
|
3129 $edit['langcode'] = 'ar';
|
danielebarchiesi@0
|
3130 $this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
|
danielebarchiesi@0
|
3131
|
danielebarchiesi@0
|
3132 $edit = array();
|
danielebarchiesi@0
|
3133 $edit['site_default'] = 'ar';
|
danielebarchiesi@0
|
3134 $this->drupalPost(NULL, $edit, t('Save configuration'));
|
danielebarchiesi@0
|
3135
|
danielebarchiesi@0
|
3136 // Verify that the -rtl.css file is added directly after LTR file.
|
danielebarchiesi@0
|
3137 $this->drupalGet('');
|
danielebarchiesi@0
|
3138 $query_string = '?' . variable_get('css_js_query_string', '0');
|
danielebarchiesi@0
|
3139 $this->assertRaw('@import url("' . $base_url . '/modules/system/system.base.css' . $query_string . '");' . "\n" . '@import url("' . $base_url . '/modules/system/system.base-rtl.css' . $query_string . '");' . "\n", 'CSS: system.base-rtl.css is added directly after system.base.css.');
|
danielebarchiesi@0
|
3140 $this->assertRaw('@import url("' . $base_url . '/modules/system/system.menus.css' . $query_string . '");' . "\n" . '@import url("' . $base_url . '/modules/system/system.menus-rtl.css' . $query_string . '");' . "\n", 'CSS: system.menus-rtl.css is added directly after system.menus.css.');
|
danielebarchiesi@0
|
3141 $this->assertRaw('@import url("' . $base_url . '/modules/system/system.messages.css' . $query_string . '");' . "\n" . '@import url("' . $base_url . '/modules/system/system.messages-rtl.css' . $query_string . '");' . "\n", 'CSS: system.messages-rtl.css is added directly after system.messages.css.');
|
danielebarchiesi@0
|
3142 }
|
danielebarchiesi@0
|
3143 }
|