Browse Source

Add language switch.

Mark Scherer 10 years ago
parent
commit
bdd237b325
2 changed files with 56 additions and 0 deletions
  1. 6 0
      config/routes.php
  2. 50 0
      src/Controller/ShuntRequestController.php

+ 6 - 0
config/routes.php

@@ -0,0 +1,6 @@
+<?php
+use Cake\Routing\Router;
+
+Router::plugin('Tools', function ($routes) {
+    $routes->fallbacks('DashedRoute');
+});

+ 50 - 0
src/Controller/ShuntRequestController.php

@@ -0,0 +1,50 @@
+<?php
+namespace Tools\Controller;
+
+use App\Controller\AppController;
+use Cake\Core\Configure;
+use Cake\I18n\I18n;
+
+/**
+ * Language switching
+ *
+ * Needs Configure:
+ * - allowedLanguages (language mapping)
+ * - defaultLanguage (optional, uses first of allowedLanguages otherwise)
+ *
+ * Mapping
+ *
+ * de => ['locale' => 'de_DE', 'name' => 'Deutsch'], ...
+ */
+class ShuntRequestController extends AppController {
+
+	/**
+	 * Switch language as post link.
+	 *
+	 * @param string|null $language
+	 * @return void
+	 */
+	public function language($language = null) {
+		$this->request->allowMethod(['post']);
+
+		$allowedLanguages = (array)Configure::read('Config.allowedLanguages');
+		if (!$language) {
+			$language = Configure::read('Config.defaultLanguage');
+		}
+		if (!$language) {
+			$keys = array_keys($allowedLanguages);
+			$language = $allowedLanguages[array_shift($keys)];
+		}
+
+		if (!array_key_exists($language, $allowedLanguages)) {
+			throw new \RuntimeException('Invalid Language');
+		}
+		$language = $allowedLanguages[$language];
+
+		$this->request->session()->write('Config.language', $language['locale']);
+		I18n::locale($language['locale']);
+		$this->Flash->success(__d('tools', 'Language switched to {0}', $language['name']));
+		return $this->redirect($this->referer('/', true));
+	}
+
+}