Browse Source

Merge pull request #5192 from cakephp/3.0-locale-path

Add ability to provide custom paths for locale files.
José Lorenzo Rodríguez 11 years ago
parent
commit
66571d78a9

+ 3 - 0
src/Core/App.php

@@ -114,6 +114,9 @@ class App {
 		if ($type === 'Plugin') {
 			return (array)Configure::read('App.paths.plugins');
 		}
+		if (empty($plugin) && $type === 'Locale') {
+			return (array)Configure::read('App.paths.locales');
+		}
 		if (empty($plugin) && $type === 'Template') {
 			return (array)Configure::read('App.paths.templates');
 		}

+ 13 - 8
src/I18n/MessagesFileLoader.php

@@ -151,23 +151,28 @@ class MessagesFileLoader {
 			$locale['language']
 		];
 
-		// If space is not added after slash, the character after it remains lowercased
-		$pluginName = Inflector::camelize(str_replace('/', '/ ', $this->_name));
-		$basePath = APP . 'Locale' . DS;
-		$searchPath = [];
+		$searchPaths = [];
 
-		foreach ($folders as $folder) {
-			$searchPath[] = $basePath . $folder . DS;
+		$localePaths = App::path('Locale');
+		if (empty($localePaths)) {
+			$localePaths[] = APP . 'Locale' . DS;
+		}
+		foreach ($localePaths as $path) {
+			foreach ($folders as $folder) {
+				$searchPaths[] = $path . $folder . DS;
+			}
 		}
 
+		// If space is not added after slash, the character after it remains lowercased
+		$pluginName = Inflector::camelize(str_replace('/', '/ ', $this->_name));
 		if (Plugin::loaded($pluginName)) {
 			$basePath = Plugin::classPath($pluginName) . 'Locale' . DS;
 			foreach ($folders as $folder) {
-				$searchPath[] = $basePath . $folder . DS;
+				$searchPaths[] = $basePath . $folder . DS;
 			}
 		}
 
-		return $searchPath;
+		return $searchPaths;
 	}
 
 }

+ 65 - 0
tests/TestCase/I18n/MessagesFileLoaderTest.php

@@ -0,0 +1,65 @@
+<?php
+/**
+ * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
+ * @since         3.0.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\TestCase\I18n;
+
+use Cake\Core\Configure;
+use Cake\I18n\MessagesFileLoader;
+use Cake\TestSuite\TestCase;
+
+/**
+ * MessagesFileLoaderTest class
+ *
+ */
+class MessagesFileLoaderTest extends TestCase {
+
+/**
+ * Set Up
+ *
+ * @return void
+ */
+	public function setUp() {
+		parent::setUp();
+		$this->localePaths = Configure::read('App.paths.locales');
+	}
+
+/**
+ * Tear down method
+ *
+ * @return void
+ */
+	public function tearDown() {
+		parent::tearDown();
+		Configure::write('App.paths.locales', $this->localePaths);
+	}
+
+/**
+ * test reading file from custom locale folder
+ *
+ * @return void
+ */
+	public function testCustomLocalePath() {
+		$loader = new MessagesFileLoader('default', 'en');
+		$package = $loader();
+		$messages = $package->getMessages();
+		$this->assertEquals('Po (translated)', $messages['Plural Rule 1']);
+
+		Configure::write('App.paths.locales', [TEST_APP . 'custom_locale' . DS]);
+		$loader = new MessagesFileLoader('default', 'en');
+		$package = $loader();
+		$messages = $package->getMessages();
+		$this->assertEquals('Po (translated) from custom folder', $messages['Plural Rule 1']);
+	}
+
+}

+ 2 - 1
tests/bootstrap.php

@@ -79,7 +79,8 @@ Configure::write('App', [
 	'cssBaseUrl' => 'css/',
 	'paths' => [
 		'plugins' => [TEST_APP . 'Plugin' . DS],
-		'templates' => [APP . 'Template' . DS]
+		'templates' => [APP . 'Template' . DS],
+		'locales' => [APP . 'Locale' . DS],
 	]
 ]);
 

+ 2 - 0
tests/test_app/custom_locale/en/default.po

@@ -0,0 +1,2 @@
+msgid "Plural Rule 1"
+msgstr "Po (translated) from custom folder"