ShuntRequestController.php 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace Tools\Controller;
  3. use App\Controller\AppController;
  4. use Cake\Core\Configure;
  5. use Cake\I18n\I18n;
  6. use RuntimeException;
  7. /**
  8. * Language switching
  9. *
  10. * Needs Configure:
  11. * - allowedLanguages (language mapping)
  12. * - defaultLanguage (optional, uses first of allowedLanguages otherwise)
  13. *
  14. * Mapping
  15. *
  16. * de => ['locale' => 'de_DE', 'name' => 'Deutsch'], ...
  17. *
  18. * @property \Cake\Controller\Component\FlashComponent $Flash
  19. */
  20. class ShuntRequestController extends AppController {
  21. /**
  22. * @var string|null
  23. */
  24. protected $modelClass = '';
  25. /**
  26. * @return void
  27. */
  28. public function initialize(): void {
  29. parent::initialize();
  30. if (!isset($this->Flash)) {
  31. $this->loadComponent('Flash');
  32. }
  33. }
  34. /**
  35. * Switch language as post link.
  36. *
  37. * @param string|null $language
  38. * @throws \RuntimeException
  39. * @return \Cake\Http\Response
  40. */
  41. public function language($language = null) {
  42. $this->getRequest()->allowMethod(['post']);
  43. $allowedLanguages = (array)Configure::read('Config.allowedLanguages');
  44. if (!$language) {
  45. $language = Configure::read('Config.defaultLanguage');
  46. }
  47. if (!$language && $allowedLanguages) {
  48. $keys = array_keys($allowedLanguages);
  49. $language = $allowedLanguages[array_shift($keys)];
  50. }
  51. if (!array_key_exists($language, $allowedLanguages)) {
  52. throw new RuntimeException('Invalid Language');
  53. }
  54. $language = $allowedLanguages[$language];
  55. $this->getRequest()->getSession()->write('Config.language', $language['locale']);
  56. I18n::setLocale($language['locale']);
  57. $this->Flash->success(__d('tools', 'Language switched to {0}', $language['name']));
  58. return $this->redirect($this->referer('/', true));
  59. }
  60. }