PageRenderTime 51ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/module/Rubedo/src/Rubedo/Internationalization/Current.php

https://github.com/hgregoire/rubedo
PHP | 142 lines | 90 code | 15 blank | 37 comment | 29 complexity | 51f51b7dcd9458e6dddeaae4b4fd1f5f MD5 | raw file
  1. <?php
  2. /**
  3. * Rubedo -- ECM solution Copyright (c) 2013, WebTales
  4. * (http://www.webtales.fr/). All rights reserved. licensing@webtales.fr
  5. * Open Source License
  6. * ------------------------------------------------------------------------------------------
  7. * Rubedo is licensed under the terms of the Open Source GPL 3.0 license.
  8. *
  9. * @category Rubedo
  10. * @package Rubedo
  11. * @copyright Copyright (c) 2012-2013 WebTales (http://www.webtales.fr)
  12. * @license http://www.gnu.org/licenses/gpl.html Open Source GPL 3.0 license
  13. */
  14. namespace Rubedo\Internationalization;
  15. use Rubedo\Services\Manager;
  16. use Rubedo\Interfaces\Internationalization\ICurrent;
  17. use Rubedo\Collection\AbstractLocalizableCollection;
  18. /**
  19. * Determine current localization
  20. *
  21. *
  22. * @author jbourdin
  23. * @category Rubedo
  24. * @package Rubedo
  25. */
  26. class Current implements ICurrent
  27. {
  28. public function resolveLocalization($siteId = null, $forceLocal = null, $cookieValue = null)
  29. {
  30. $locale = null;
  31. $site = null;
  32. $browserArray = Manager::getService('CurrentLocalization')->getBrowserLanguages();
  33. if ($siteId) {
  34. $site = Manager::getService('Sites')->findById($siteId);
  35. if (! isset($site['languages']) || ! is_array($site['languages'])) {
  36. $site['languages'] = array();
  37. }
  38. }
  39. if ($site) {
  40. $user = Manager::getService('CurrentUser')->getCurrentUser();
  41. if ($forceLocal && in_array($forceLocal, $site['languages'])) {
  42. // if locale is forced through URL
  43. $locale = $forceLocal;
  44. } elseif ($user && isset($user['preferedLanguage']) && isset($user['preferedLanguage'][$siteId]) && in_array($user['preferedLanguage'][$siteId], $site['languages'])) {
  45. // if prefered locale is known for current user
  46. $locale = $user['preferedLanguage'][$siteId];
  47. } elseif (! $user && isset($cookieValue) && in_array($cookieValue, $site['languages'])) {
  48. // fetch current locale from cookie
  49. $locale = $cookieValue;
  50. } else {
  51. // default strategy
  52. if (isset($site['useBrowserLanguage']) && $site['useBrowserLanguage'] == true) {
  53. // use browser settings
  54. $locale = $this->findBestMatchForBrowser($site['languages'], $browserArray);
  55. if (! $locale) {
  56. // fallback to default
  57. $locale = $site['defaultLanguage'];
  58. }
  59. } else {
  60. // use default
  61. $locale = $site['defaultLanguage'];
  62. }
  63. if (! isset($locale)) {
  64. // if nothing works, use english
  65. $locale = 'en';
  66. }
  67. }
  68. AbstractLocalizableCollection::setLocalizationStrategy($site['locStrategy']);
  69. if ($site['locStrategy'] == 'fallback') {
  70. AbstractLocalizableCollection::setFallbackLocale($site['defaultLanguage']);
  71. }
  72. if ($user) {
  73. if(!isset($user['preferedLanguage'][$siteId]) || $user['preferedLanguage'][$siteId] != $locale){
  74. $user['preferedLanguage'][$siteId] = $locale;
  75. Manager::getService('Users')->update($user);
  76. }
  77. }
  78. } else {
  79. $locale = 'en';
  80. }
  81. // set the collection with locale as working language
  82. AbstractLocalizableCollection::setWorkingLocale($locale);
  83. AbstractLocalizableCollection::setIncludeI18n(false);
  84. return $locale;
  85. }
  86. /**
  87. * find first match of site language for given user preferences through browser
  88. *
  89. * @param array $languages
  90. * @param array $browserArray
  91. * @return string NULL
  92. */
  93. protected function findBestMatchForBrowser($languages, $browserArray)
  94. {
  95. foreach ($browserArray as $locale) {
  96. if (in_array($locale, $languages)) {
  97. return $locale;
  98. }
  99. }
  100. return null;
  101. }
  102. public function getCurrentLocalization()
  103. {
  104. return AbstractLocalizableCollection::getWorkingLocale();
  105. }
  106. public function getBrowserLanguages ()
  107. {
  108. // init browser languages
  109. $browserLanguages = array();
  110. if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  111. $httpValue = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
  112. if (! empty($httpValue)) {
  113. $languages = explode(',', $httpValue);
  114. foreach ($languages as $language) {
  115. list ($locale) = explode(';', $language);
  116. $browserLanguages[] = $locale;
  117. }
  118. }
  119. if (empty($browserLanguages)) {
  120. $browserLanguages = array(
  121. 'en'
  122. );
  123. }
  124. }
  125. return $browserLanguages;
  126. }
  127. }