File: D:/HostingSpaces/Eurotools/euro-tools.nl/app/KommaApp/Languages/LanguageService.php
<?php
namespace App\KommaApp\Languages;
use App\KommaApp\Languages\Models\Language;
use App\KommaApp\Kms\Core\AbstractTranslatableModel;
use App\KommaApp\Pages\Models\Page;
use App\KommaApp\Routes\Models\Route;
use App\KommaApp\Shop\Categories\Models\Category;
use App\KommaApp\Shop\Categories\Models\CategoryTranslation;
use App\KommaApp\Shop\Products\Product\Product;
use App\KommaApp\Shop\Products\Product\ProductTranslation;
/**
* Can fill some models with their respective translation models.
* And in the future will be able to set and change the users site language
*
* Class LanguageService
* @package App\KommaApp\Core
*/
class LanguageService
{
/**
* @param Page $page
* @param AbstractTranslatableModel|null $model
* @return object
*/
public function getOtherLanguagesRoutes(Page $page, AbstractTranslatableModel $model = null)
{
// Load route because we want to use the route column to get all related routes
$page->load('translation.route');
$languageSwitch = (object)[
'metaTranslationRoutes' => [],
'languageMenuRoutes' => []
];
$availableTranslationIds = [];
// First inject language route on available site languages into the language switch
foreach (\App::getSite()->languages as $language) {
$alias = '';
if ($language->id == \App::getSite()->default_language_id) {
$alias = '';
} else {
$alias = $language->iso_2;
}
$languageSwitch->languageMenuRoutes[$language->id] = (object)[
'iso' => $language->iso_2,
'route' => $alias
];
$availableTranslationIds[] = $language->id;
}
// Then inject page route
if($page->translation->route) {
$pageTranslationRoutes = Route::where('route', $page->translation->route->route)
->whereIn('language_id', $availableTranslationIds)
->get();
} else {
$pageTranslationRoutes = [];
}
foreach ($pageTranslationRoutes as $translationRoute) {
$languageSwitch->languageMenuRoutes[$translationRoute->language_id]->route = $translationRoute->alias;
}
// Check if a subModel is defined like a product or a post
if ($model) {
//dd($languageSwitch->languageMenuRoutes);
switch (get_class($model)) {
case Category::class:
$parentModel = $model->getParent();
foreach (\App::getSite()->languages as $language) {
if ($categoryTranslation = CategoryTranslation::where('category_id', '=', $model->id)->where('language_id', '=', $language->id)->first()) {
$routeString = $language->iso_2.'/';
if ($parentModel->lft > 1 && $parentCategoryTranslation = CategoryTranslation::where('category_id',
'=', $parentModel->id)->where('language_id', '=', $language->id)->first()) {
$routeString .= $parentCategoryTranslation->slug . '/';
}
$routeString .= $categoryTranslation->slug;
$languageSwitch->languageMenuRoutes[$language->id]->route = $routeString;
}
}
break;
case Product::class:
foreach (\App::getSite()->languages as $language) {
if ($productTranslation = ProductTranslation::where('product_id', '=', $model->id)->where('language_id', '=', $language->id)->first()) {
if(empty($productTranslation->slug)) continue;
$routeString = $languageSwitch->languageMenuRoutes[$language->id]->route;
$routeString .= '/'.$productTranslation->slug;
$languageSwitch->languageMenuRoutes[$language->id]->route = $routeString;
}
}
break;
}
} // If not then we are on a page so the metaTranslation are the same as available page translations
else {
// Loop through page translations again and look up the found translations in the language menu routes
// so now only the defined translation of the page will be add to the meta routes
foreach ($pageTranslationRoutes as $translationRoute) {
if (isset($languageSwitch->languageMenuRoutes[$translationRoute->language_id])) {
$languageSwitch->metaTranslationRoutes[$translationRoute->language_id] = $languageSwitch->languageMenuRoutes[$translationRoute->language_id];
}
}
}
return $languageSwitch;
}
}