use Closure;
use Cubist\Backpack\app\Magic\Models\Locale;
+use Illuminate\Auth\SessionGuard;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
+use Illuminate\Support\Facades\Auth;
class LocaleSelector
{
+
+
public function handle(Request $request, Closure $next)
{
$class = Locale::getLocaleClass();
- $locales = $class::where(['enabled' => 1])->orderBy('default', 'DESC')->get();
- foreach ($locales as $locale) {
+ $localeEntities = $class::orderBy('default', 'DESC')->get();
+ $locales = [];
+ foreach ($localeEntities as $locale) {
+ $locales[$locale->locale] = $locale;
if ($locale->default) {
$defaultLocale = $locale->locale;
- break;
}
}
$selectedLocale = $this->_getLocaleByDomain($request, $locales);
- if (null === $selectedLocale) {
- $selectedLocale = $defaultLocale;
+ // If the locale is not found, we redirect to the default
+ // If the locale is disabled, the user is not an admin and the url
+ // is not in the backend, we redirect too.
+
+ if (
+ null === $selectedLocale ||
+ !(
+ $locales[$selectedLocale]->enabled ||
+ $this->_isAdmin()
+ )
+ ) {
+ $domain = $this->_getDomainByLocale($locales[$defaultLocale]);
+ // redirect to default locale
+ if (null === $domain) {
+ abort(401);
+ }
+ $protocol = $_SERVER['HTTPS'] ? 'https://' : 'http://';
+ $url = $protocol . $domain;
+ return redirect($url);
}
$this->setLocale($selectedLocale);
app('translator')->setFallback($locale);
}
+ protected function _getDomainByLocale($locale)
+ {
+ $domains = $locale->domains;
+ if (is_string($locale->domains)) {
+ $domains = json_decode($locale->domains, true);
+ }
+ foreach ($domains as $domain) {
+ if ($domain['env'] !== App::environment()) {
+ continue;
+ }
+ return $domain['domain'];
+ }
+ return null;
+ }
+
/**
* @param Request $request
* @param Locale[] $locales
}
return $map[$httpdomain] ?? null;
}
+
+ protected function _isAdmin()
+ {
+ $user = backpack_user();
+ if (null === $user) {
+ return false;
+ }
+ return $user->can('backpack_translation');
+
+ }
}