LocaleBehavior.php 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. namespace plugins\locale;
  3. use Yii;
  4. use yii\base\Behavior;
  5. use yii\web\Application;
  6. /**
  7. * Class LocaleBehavior
  8. * @package common\behaviors
  9. */
  10. class LocaleBehavior extends Behavior
  11. {
  12. /**
  13. * @var string
  14. */
  15. public $cookieName = '_locale';
  16. /**
  17. * @var bool
  18. */
  19. public $enablePreferredLanguage = true;
  20. /**
  21. * @return array
  22. */
  23. public function events()
  24. {
  25. return [
  26. Application::EVENT_BEFORE_REQUEST => 'beforeRequest'
  27. ];
  28. }
  29. /**
  30. * Resolve application language by checking user cookies, preferred language and profile settings
  31. */
  32. public function beforeRequest()
  33. {
  34. if (!Yii::$app instanceof Application) {
  35. return true;
  36. }
  37. $hasCookie = Yii::$app->getRequest()->getCookies()->has($this->cookieName);
  38. $forceUpdate = Yii::$app->session->hasFlash('forceUpdateLocale');
  39. if ($hasCookie && !$forceUpdate)
  40. {
  41. $locale = Yii::$app->getRequest()->getCookies()->getValue($this->cookieName);
  42. } else {
  43. $locale = $this->resolveLocale();
  44. }
  45. Yii::$app->language = $locale;
  46. }
  47. public function resolveLocale()
  48. {
  49. $locale = Yii::$app->language;
  50. if (!Yii::$app->user->isGuest && Yii::$app->user->identity->profile->locale) {
  51. $locale = Yii::$app->user->getIdentity()->profile->locale;
  52. } elseif ($this->enablePreferredLanguage) {
  53. $locale = Yii::$app->request->getPreferredLanguage($this->getAvailableLocales());
  54. }
  55. return $locale;
  56. }
  57. /**
  58. * @return array
  59. */
  60. protected function getAvailableLocales()
  61. {
  62. return array_keys(Plugin::$language);
  63. }
  64. }