Commit 53b72740 authored by webchick's avatar webchick

Issue #2323259 by Sutharsan, vijaycs85, Gábor Hojtsy: Fixed Local translation...

Issue #2323259 by Sutharsan, vijaycs85, Gábor Hojtsy: Fixed Local translation file detection is not semantic version compatible.
parent 18aa4abd
......@@ -60,8 +60,8 @@ protected function getLanguage($langcode) {
* Finds installer translations either for a specific or all languages.
*
* Filenames must match the pattern:
* - 'drupal-[number].*.[langcode].po
* - 'drupal-[number].*.*.po
* - 'drupal-[version].[langcode].po (if langcode is provided)
* - 'drupal-[version].*.po (if no langcode is provided)
*
* @param string $langcode
* (optional) The language code corresponding to the language for which we
......@@ -75,10 +75,27 @@ protected function getLanguage($langcode) {
* @see file_scan_directory()
*/
public function findTranslationFiles($langcode = NULL) {
$files = file_scan_directory($this->directory, '!drupal-\d+\.[^\.]+\.' . (!empty($langcode) ? preg_quote($langcode, '!') : '[^\.]+') . '\.po$!', array('recurse' => FALSE));
$files = file_scan_directory($this->directory, $this->getTranslationFilesPattern($langcode), array('recurse' => FALSE));
return $files;
}
/**
* Provides translation file name pattern.
*
* @param string $langcode
* (optional) The language code corresponding to the language for which we
* want to find translation files.
*
* @return string
* String file pattern.
*/
protected function getTranslationFilesPattern($langcode = NULL) {
// The file name matches: drupal-[release version].[language code].po
// When provided the $langcode is use as language code. If not provided all
// language codes will match.
return '!drupal-[0-9a-z\.-]+\.' . (!empty($langcode) ? preg_quote($langcode, '!') : '[^\.]+') . '\.po$!';
}
/**
* Reads the given Gettext PO files into a data structure.
*
......
<?php
/**
* @file
* Definition of Drupal\system\Tests\Installer\InstallTranslationFilePatternTest.
*/
namespace Drupal\system\Tests\Installer;
use Drupal\Core\StringTranslation\Translator\FileTranslation;
use Drupal\Tests\UnitTestCase;
/**
* Tests for installer language support.
*
* @group Installer
*/
class InstallTranslationFilePatternTest extends UnitTestCase {
/**
* @var \Drupal\Core\StringTranslation\Translator\FileTranslation
*/
protected $fileTranslation;
/**
* @var \ReflectionMethod
*/
protected $filePatternMethod;
/**
* {@inheritdoc}
*/
protected function setup() {
parent::setUp();
$this->fileTranslation = new FileTranslation('filename');
$method = new \ReflectionMethod('\Drupal\Core\StringTranslation\Translator\FileTranslation', 'getTranslationFilesPattern');
$method->setAccessible(true);
$this->filePatternMethod = $method;
}
/**
* @dataProvider providerValidTranslationFiles
*/
public function testFilesPatternValid($langcode, $filename) {
$pattern = $this->filePatternMethod->invoke($this->fileTranslation, $langcode);
$this->assertNotEmpty(preg_match($pattern, $filename));
}
/**
* @return array
*/
public function providerValidTranslationFiles() {
return array(
array('hu', 'drupal-8.0.0-alpha1.hu.po'),
array('ta', 'drupal-8.10.10-beta12.ta.po'),
array('hi', 'drupal-8.0.0.hi.po'),
);
}
/**
* @dataProvider providerInvalidTranslationFiles
*/
public function testFilesPatternInvalid($langcode, $filename) {
$pattern = $this->filePatternMethod->invoke($this->fileTranslation, $langcode);
$this->assertEmpty(preg_match($pattern, $filename));
}
/**
* @return array
*/
public function providerInvalidTranslationFiles() {
return array(
array('hu', 'drupal-alpha1-*-hu.po'),
array('ta', 'drupal-beta12.ta'),
array('hi', 'drupal-hi.po'),
array('de', 'drupal-dummy-de.po'),
array('hu', 'drupal-10.0.1.alpha1-hu.po'),
);
}
}
......@@ -27,17 +27,16 @@ class InstallerLanguageDirectionTest extends InstallerTestBase {
* {@inheritdoc}
*/
protected function setUpLanguage() {
// Place a custom local translation in the translations directory.
mkdir(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations', 0777, TRUE);
file_put_contents(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations/drupal-8.0.0.ar.po', "msgid \"\"\nmsgstr \"\"\nmsgid \"Save and continue\"\nmsgstr \"Save and continue Arabic\"");
parent::setUpLanguage();
// After selecting a different language than English, all following screens
// should be translated already.
// @todo Instead of actually downloading random translations that cannot be
// asserted, write and supply a translation file. Until then, take
// over whichever string happens to be there, but ensure that the English
// string no longer appears.
$elements = $this->xpath('//input[@type="submit"]/@value');
$string = (string) current($elements);
$this->assertNotEqual($string, 'Save and continue');
$this->translations['Save and continue'] = $string;
$this->assertEqual((string) current($elements), 'Save and continue Arabic');
$this->translations['Save and continue'] = 'Save and continue Arabic';
// Verify that language direction is right-to-left.
$direction = (string) current($this->xpath('/html/@dir'));
......
......@@ -2,12 +2,12 @@
/**
* @file
* Definition of Drupal\system\Tests\Installer\InstallerLanguageTest.
* Contains Drupal\system\Tests\Installer\InstallerLanguageTest.
*/
namespace Drupal\system\Tests\Installer;
use Drupal\simpletest\WebTestBase;
use Drupal\simpletest\KernelTestBase;
use Drupal\Core\StringTranslation\Translator\FileTranslation;
/**
......@@ -15,7 +15,7 @@
*
* @group Installer
*/
class InstallerLanguageTest extends WebTestBase {
class InstallerLanguageTest extends KernelTestBase {
/**
* Tests that the installer can find translation files.
......@@ -24,9 +24,9 @@ function testInstallerTranslationFiles() {
// Different translation files would be found depending on which language
// we are looking for.
$expected_translation_files = array(
NULL => array('drupal-8.0.hu.po', 'drupal-8.0.de.po'),
'de' => array('drupal-8.0.de.po'),
'hu' => array('drupal-8.0.hu.po'),
NULL => array('drupal-8.0.0-beta2.hu.po', 'drupal-8.0.0.de.po'),
'de' => array('drupal-8.0.0.de.po'),
'hu' => array('drupal-8.0.0-beta2.hu.po'),
'it' => array(),
);
......
......@@ -28,17 +28,16 @@ class InstallerTranslationTest extends InstallerTestBase {
* Overrides InstallerTest::setUpLanguage().
*/
protected function setUpLanguage() {
// Place a custom local translation in the translations directory.
mkdir(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations', 0777, TRUE);
file_put_contents(DRUPAL_ROOT . '/' . $this->siteDirectory . '/files/translations/drupal-8.0.0.de.po', "msgid \"\"\nmsgstr \"\"\nmsgid \"Save and continue\"\nmsgstr \"Save and continue German\"");
parent::setUpLanguage();
// After selecting a different language than English, all following screens
// should be translated already.
// @todo Instead of actually downloading random translations that cannot be
// asserted, write and supply a German translation file. Until then, take
// over whichever string happens to be there, but ensure that the English
// string no longer appears.
$elements = $this->xpath('//input[@type="submit"]/@value');
$string = (string) current($elements);
$this->assertNotEqual($string, 'Save and continue');
$this->translations['Save and continue'] = $string;
$this->assertEqual((string) current($elements), 'Save and continue German');
$this->translations['Save and continue'] = 'Save and continue German';
// Check the language direction.
$direction = (string) current($this->xpath('/html/@dir'));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment