[stable9] Read available l10n files also from theme folder
* Read available l10n files also from theme folder The old behaviour was that only languages could be used for an app that are already present in the apps/$app/l10n folder. If there is a themed l10n that is not present in the apps default l10n folder the language could not be used and the texts are not translated. With this change this is possible and also the l10n files are loaded even if the default l10n doesn't contain the l10n file. * Inject server root - allows proper testing and separation of concerns
This commit is contained in:
parent
f8b1e2cca1
commit
85a0dd3689
|
@ -64,17 +64,23 @@ class Factory implements IFactory {
|
|||
/** @var IUserSession */
|
||||
protected $userSession;
|
||||
|
||||
/** @var string */
|
||||
protected $serverRoot;
|
||||
|
||||
/**
|
||||
* @param IConfig $config
|
||||
* @param IRequest $request
|
||||
* @param IUserSession $userSession
|
||||
* @param string $serverRoot
|
||||
*/
|
||||
public function __construct(IConfig $config,
|
||||
IRequest $request,
|
||||
IUserSession $userSession) {
|
||||
IUserSession $userSession,
|
||||
$serverRoot) {
|
||||
$this->config = $config;
|
||||
$this->request = $request;
|
||||
$this->userSession = $userSession;
|
||||
$this->serverRoot = $serverRoot;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -186,6 +192,23 @@ class Factory implements IFactory {
|
|||
}
|
||||
}
|
||||
|
||||
// merge with translations from theme
|
||||
$theme = $this->config->getSystemValue('theme');
|
||||
if (!empty($theme)) {
|
||||
$themeDir = $this->serverRoot . '/themes/' . $theme . substr($dir, strlen($this->serverRoot));
|
||||
|
||||
if (is_dir($themeDir)) {
|
||||
$files = scandir($themeDir);
|
||||
if ($files !== false) {
|
||||
foreach ($files as $file) {
|
||||
if (substr($file, -5) === '.json' && substr($file, 0, 4) !== 'l10n') {
|
||||
$available[] = substr($file, 0, -5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->availableLanguages[$key] = $available;
|
||||
return $available;
|
||||
}
|
||||
|
@ -263,24 +286,24 @@ class Factory implements IFactory {
|
|||
$i18nDir = $this->findL10nDir($app);
|
||||
$transFile = strip_tags($i18nDir) . strip_tags($lang) . '.json';
|
||||
|
||||
if ((\OC_Helper::isSubDirectory($transFile, \OC::$SERVERROOT . '/core/l10n/')
|
||||
|| \OC_Helper::isSubDirectory($transFile, \OC::$SERVERROOT . '/lib/l10n/')
|
||||
|| \OC_Helper::isSubDirectory($transFile, \OC::$SERVERROOT . '/settings/l10n/')
|
||||
if ((\OC_Helper::isSubDirectory($transFile, $this->serverRoot . '/core/l10n/')
|
||||
|| \OC_Helper::isSubDirectory($transFile, $this->serverRoot . '/lib/l10n/')
|
||||
|| \OC_Helper::isSubDirectory($transFile, $this->serverRoot . '/settings/l10n/')
|
||||
|| \OC_Helper::isSubDirectory($transFile, \OC_App::getAppPath($app) . '/l10n/')
|
||||
)
|
||||
&& file_exists($transFile)) {
|
||||
// load the translations file
|
||||
$languageFiles[] = $transFile;
|
||||
}
|
||||
|
||||
// merge with translations from theme
|
||||
$theme = $this->config->getSystemValue('theme');
|
||||
if (!empty($theme)) {
|
||||
$transFile = \OC::$SERVERROOT . '/themes/' . $theme . substr($transFile, strlen(\OC::$SERVERROOT));
|
||||
$transFile = $this->serverRoot . '/themes/' . $theme . substr($transFile, strlen($this->serverRoot));
|
||||
if (file_exists($transFile)) {
|
||||
$languageFiles[] = $transFile;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $languageFiles;
|
||||
}
|
||||
|
@ -293,14 +316,14 @@ class Factory implements IFactory {
|
|||
*/
|
||||
protected function findL10nDir($app = null) {
|
||||
if (in_array($app, ['core', 'lib', 'settings'])) {
|
||||
if (file_exists(\OC::$SERVERROOT . '/' . $app . '/l10n/')) {
|
||||
return \OC::$SERVERROOT . '/' . $app . '/l10n/';
|
||||
if (file_exists($this->serverRoot . '/' . $app . '/l10n/')) {
|
||||
return $this->serverRoot . '/' . $app . '/l10n/';
|
||||
}
|
||||
} else if ($app && \OC_App::getAppPath($app) !== false) {
|
||||
// Check if the app is in the app folder
|
||||
return \OC_App::getAppPath($app) . '/l10n/';
|
||||
}
|
||||
return \OC::$SERVERROOT . '/core/l10n/';
|
||||
return $this->serverRoot . '/core/l10n/';
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -263,7 +263,8 @@ class Server extends ServerContainer implements IServerContainer {
|
|||
return new \OC\L10N\Factory(
|
||||
$c->getConfig(),
|
||||
$c->getRequest(),
|
||||
$c->getUserSession()
|
||||
$c->getUserSession(),
|
||||
\OC::$SERVERROOT
|
||||
);
|
||||
});
|
||||
$this->registerService('URLGenerator', function (Server $c) {
|
||||
|
|
|
@ -28,6 +28,9 @@ class FactoryTest extends TestCase {
|
|||
/** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */
|
||||
protected $userSession;
|
||||
|
||||
/** @var string */
|
||||
protected $serverRoot;
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
|
@ -42,6 +45,8 @@ class FactoryTest extends TestCase {
|
|||
->getMock();
|
||||
|
||||
$this->userSession = $this->getMock('\OCP\IUserSession');
|
||||
|
||||
$this->serverRoot = \OC::$SERVERROOT;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -54,12 +59,13 @@ class FactoryTest extends TestCase {
|
|||
->setConstructorArgs([
|
||||
$this->config,
|
||||
$this->request,
|
||||
$this->userSession
|
||||
$this->userSession,
|
||||
$this->serverRoot,
|
||||
])
|
||||
->setMethods($methods)
|
||||
->getMock();
|
||||
} else {
|
||||
return new Factory($this->config, $this->request, $this->userSession);
|
||||
return new Factory($this->config, $this->request, $this->userSession, $this->serverRoot);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -287,6 +293,24 @@ class FactoryTest extends TestCase {
|
|||
];
|
||||
}
|
||||
|
||||
public function testFindAvailableLanguagesWithThemes() {
|
||||
$this->serverRoot .= '/tests/data';
|
||||
$app = 'files';
|
||||
|
||||
$factory = $this->getFactory(['findL10nDir']);
|
||||
$factory->expects($this->once())
|
||||
->method('findL10nDir')
|
||||
->with($app)
|
||||
->willReturn($this->serverRoot . '/apps/files/l10n/');
|
||||
$this->config
|
||||
->expects($this->once())
|
||||
->method('getSystemValue')
|
||||
->with('theme')
|
||||
->willReturn('abc');
|
||||
|
||||
$this->assertEquals(['en', 'zz'], $factory->findAvailableLanguages($app), '', 0.0, 10, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataLanguageExists
|
||||
*
|
||||
|
|
|
@ -124,7 +124,7 @@ class L10nLegacyTest extends \Test\TestCase {
|
|||
}
|
||||
|
||||
public function testFactoryGetLanguageCode() {
|
||||
$factory = new \OC\L10N\Factory($this->getMock('OCP\IConfig'), $this->getMock('OCP\IRequest'), $this->getMock('OCP\IUserSession'));
|
||||
$factory = new \OC\L10N\Factory($this->getMock('OCP\IConfig'), $this->getMock('OCP\IRequest'), $this->getMock('OCP\IUserSession'), \OC::$SERVERROOT);
|
||||
$l = $factory->get('lib', 'de');
|
||||
$this->assertEquals('de', $l->getLanguageCode());
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ class L10nTest extends TestCase {
|
|||
$request = $this->getMock('OCP\IRequest');
|
||||
/** @var IUserSession $userSession */
|
||||
$userSession = $this->getMock('OCP\IUserSession');
|
||||
return new Factory($config, $request, $userSession);
|
||||
return new Factory($config, $request, $userSession, \OC::$SERVERROOT);
|
||||
}
|
||||
|
||||
public function testGermanPluralTranslations() {
|
||||
|
|
Loading…
Reference in New Issue