Skip to content

Commit ac22734

Browse files
committed
WIP
1 parent 3a9c793 commit ac22734

File tree

9 files changed

+171
-15
lines changed

9 files changed

+171
-15
lines changed

app/Drupal/niklan/niklan.routing.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ niklan.about:
99
niklan.about.settings:
1010
path: '/admin/niklan/about'
1111
defaults:
12-
_title: 'About settings'
12+
_title_callback: '\Drupal\niklan\Form\AboutSettingsForm::title'
1313
_form: '\Drupal\niklan\Form\AboutSettingsForm'
1414
requirements:
1515
_permission: 'administer site configuration'

app/Drupal/niklan/niklan.services.yml

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ services:
1919
Drupal\niklan\Factory\KeyValue\DatabaseLanguageAwareFactory: {}
2020
keyvalue.language_aware.database: '@Drupal\niklan\Factory\KeyValue\DatabaseLanguageAwareFactory'
2121

22+
Drupal\niklan\EventSubscriber\LanguageAwareSettingsRoutes:
23+
tags:
24+
- { name: event_subscriber }
25+
2226
niklan.event_subscriber.term_page_build:
2327
class: Drupal\niklan\EventSubscriber\TermPageBuildSubscriber
2428
arguments: ['@class_resolver']
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Drupal\niklan\EventSubscriber;
6+
7+
use Drupal\Core\Language\LanguageManagerInterface;
8+
use Drupal\Core\Routing\RouteBuildEvent;
9+
use Drupal\Core\Routing\RoutingEvents;
10+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
11+
use Symfony\Component\Routing\Route;
12+
use Symfony\Component\Routing\RouteCollection;
13+
14+
/**
15+
* @ingroup language_aware_key_value
16+
*/
17+
final readonly class LanguageAwareSettingsRoutes implements EventSubscriberInterface {
18+
19+
public const array ROUTES_TO_ENHANCE = [
20+
'niklan.about.settings',
21+
];
22+
23+
public function __construct(
24+
private LanguageManagerInterface $languageManager,
25+
) {}
26+
27+
public function onAlterRoutes(RouteBuildEvent $event): void {
28+
$collection = $event->getRouteCollection();
29+
30+
foreach (self::ROUTES_TO_ENHANCE as $route_name) {
31+
$route = $collection->get($route_name);
32+
33+
if (!$route) {
34+
continue;
35+
}
36+
37+
$this->enhanceRoute($route_name, $route, $collection);
38+
}
39+
}
40+
41+
#[\Override]
42+
public static function getSubscribedEvents(): array {
43+
$events[RoutingEvents::ALTER] = 'onAlterRoutes';
44+
45+
return $events;
46+
}
47+
48+
private function enhanceRoute(string $route_name, Route $base_route, RouteCollection $collection): void {
49+
$base_route->setDefault(
50+
name: 'key_value_language_aware_code',
51+
default: $this->languageManager->getDefaultLanguage()->getId(),
52+
);
53+
54+
$additional_languages = [];
55+
56+
foreach ($this->languageManager->getLanguages() as $language) {
57+
if ($language->isDefault()) {
58+
continue;
59+
}
60+
61+
$additional_languages[] = $language->getId();
62+
}
63+
64+
$route = clone $base_route;
65+
$route->setPath("{$base_route->getPath()}/{key_value_language_aware_code}");
66+
$route->setRequirement(
67+
key: 'key_value_language_aware_code',
68+
regex: '^(' . \implode('|', $additional_languages) . ')$',
69+
);
70+
$collection->add("{$route_name}.translate.language", $route);
71+
}
72+
73+
}

app/Drupal/niklan/src/Form/AboutSettingsForm.php

+12
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
88
use Drupal\Core\Form\FormStateInterface;
99
use Drupal\Core\Messenger\MessengerInterface;
10+
use Drupal\Core\Routing\RouteMatchInterface;
1011
use Drupal\Core\StringTranslation\TranslatableMarkup;
1112
use Drupal\niklan\Repository\KeyValue\AboutSettings;
1213
use Drupal\niklan\Repository\KeyValue\LanguageAwareSettingsStore;
@@ -18,6 +19,7 @@ public function __construct(
1819
protected AboutSettings $settings,
1920
protected MessengerInterface $messenger,
2021
protected CacheTagsInvalidatorInterface $cacheTagsInvalidator,
22+
protected RouteMatchInterface $routeMatch,
2123
) {}
2224

2325
#[\Override]
@@ -26,6 +28,7 @@ public static function create(ContainerInterface $container): self {
2628
$container->get(AboutSettings::class),
2729
$container->get(MessengerInterface::class),
2830
$container->get(CacheTagsInvalidatorInterface::class),
31+
$container->get(RouteMatchInterface::class),
2932
);
3033
}
3134

@@ -96,6 +99,10 @@ public function buildContentSettings(array &$form, FormStateInterface $form_stat
9699
];
97100
}
98101

102+
public static function title(): TranslatableMarkup {
103+
return new TranslatableMarkup('About settings');
104+
}
105+
99106
protected function getMessenger(): MessengerInterface {
100107
return $this->messenger;
101108
}
@@ -108,6 +115,11 @@ protected function getSettings(): LanguageAwareSettingsStore {
108115
return $this->settings;
109116
}
110117

118+
#[\Override]
119+
protected function getRouteMatch(): RouteMatchInterface {
120+
return $this->routeMatch;
121+
}
122+
111123
private function buildPhotoSettings(array &$form, FormStateInterface $form_state): void {
112124
$form['photo'] = [
113125
'#type' => 'fieldset',

app/Drupal/niklan/src/Form/SettingsForm.php

+8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Drupal\Core\Form\FormInterface;
1111
use Drupal\Core\Form\FormStateInterface;
1212
use Drupal\Core\Messenger\MessengerInterface;
13+
use Drupal\Core\Routing\RouteMatchInterface;
1314
use Drupal\Core\StringTranslation\TranslatableMarkup;
1415
use Drupal\niklan\Repository\KeyValue\LanguageAwareSettingsStore;
1516

@@ -27,13 +28,20 @@ abstract protected function doBuildForm(array &$form, FormStateInterface $form_s
2728

2829
abstract protected function doSubmitForm(array &$form, FormStateInterface $form_state): void;
2930

31+
abstract protected function getRouteMatch(): RouteMatchInterface;
32+
3033
#[\Override]
3134
public function validateForm(array &$form, FormStateInterface $form_state): void {
3235
// Not need for an abstract.
3336
}
3437

3538
#[\Override]
3639
public function buildForm(array $form, FormStateInterface $form_state): array {
40+
$language_code = $this
41+
->getRouteMatch()
42+
->getParameter('key_value_language_aware_code');
43+
$this->getSettings()->changeLanguageCode($language_code);
44+
3745
$this->doBuildForm($form, $form_state);
3846

3947
$form['actions']['#type'] = 'actions';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Drupal\niklan\Plugin\Menu;
6+
7+
use Drupal\Component\Plugin\Derivative\DeriverBase;
8+
use Drupal\Core\Language\LanguageManagerInterface;
9+
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
10+
use Drupal\Core\StringTranslation\TranslatableMarkup;
11+
use Drupal\niklan\EventSubscriber\LanguageAwareSettingsRoutes;
12+
use Symfony\Component\DependencyInjection\ContainerInterface;
13+
14+
/**
15+
* @ingroup language_aware_key_value
16+
*/
17+
final class KeyValueLanguageAwareLocalTask extends DeriverBase implements ContainerDeriverInterface {
18+
19+
public function __construct(
20+
private readonly LanguageManagerInterface $languageManager,
21+
) {}
22+
23+
#[\Override]
24+
public static function create(ContainerInterface $container, $base_plugin_id): self {
25+
return new self(
26+
$container->get(LanguageManagerInterface::class),
27+
);
28+
}
29+
30+
#[\Override]
31+
public function getDerivativeDefinitions($base_plugin_definition): array {
32+
foreach (LanguageAwareSettingsRoutes::ROUTES_TO_ENHANCE as $route_name) {
33+
// @todo This tab should be managed by the consumer.
34+
$this->derivatives[$route_name] = [
35+
'title' => new TranslatableMarkup('Settings'),
36+
'route_name' => $route_name,
37+
'base_route' => $route_name,
38+
] + $base_plugin_definition;
39+
40+
foreach ($this->languageManager->getLanguages() as $language) {
41+
$language_task = "key_value_language_aware:$route_name:{$language->getId()}";
42+
$this->derivatives[$language_task] = [
43+
'route_name' => $language->isDefault() ? $route_name : "$route_name.translate.language",
44+
'route_parameters' => [
45+
'key_value_language_aware_code' => $language->getId(),
46+
],
47+
'parent_id' => "{$base_plugin_definition['id']}:$route_name",
48+
'title' => $language->getName(),
49+
'weight' => $language->getWeight(),
50+
] + $base_plugin_definition;
51+
}
52+
}
53+
54+
return $this->derivatives;
55+
}
56+
57+
}

app/Drupal/niklan/src/Repository/KeyValue/AboutSettings.php

+2-8
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55
namespace Drupal\niklan\Repository\KeyValue;
66

7-
use Drupal\Core\StringTranslation\TranslatableMarkup;
8-
97
final class AboutSettings extends LanguageAwareSettingsStore {
108

119
public function getPhotoMediaId(): ?string {
@@ -27,9 +25,7 @@ public function setTitle(string $title): self {
2725
}
2826

2927
public function getTitle(): string {
30-
$default = (string) new TranslatableMarkup("I'm an alien 👽");
31-
32-
return $this->getStore()->get('title', $default);
28+
return $this->getStore()->get('title', "I'm an alien 👽");
3329
}
3430

3531
public function setSubtitle(string $subtitle): self {
@@ -39,9 +35,7 @@ public function setSubtitle(string $subtitle): self {
3935
}
4036

4137
public function getSubtitle(): string {
42-
$default = (string) new TranslatableMarkup('Greetings traveller!');
43-
44-
return $this->getStore()->get('subtitle', $default);
38+
return $this->getStore()->get('subtitle', 'Greetings traveller!');
4539
}
4640

4741
public function setSummary(string $summary): self {

assets/translation/ru.po

-6
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,3 @@ msgstr "Настройки страницы \"Контакты\""
411411

412412
msgid "Configure a contact page."
413413
msgstr "Настройте страницу \"Контакты\"."
414-
415-
msgid "I'm an alien 👽"
416-
msgstr "Я инопланетянин 👽"
417-
418-
msgid "Greetings traveller!"
419-
msgstr "Привет, путешественник!"
+14
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,39 @@
11
_core:
22
default_config_hash: ALaJtTMWaPkrzRKrWM1z4u7BslSR_0tTzlGXfeZPhDQ
33
langcode: ru
4+
applies_admin_routes: false
45
include_invalid_paths: false
56
excluded_paths: ''
67
replaced_titles: ''
78
custom_paths: ''
89
include_home_segment: true
10+
alternative_title_field: ''
911
home_segment_title: Главная
1012
home_segment_keep: false
1113
include_title_segment: false
1214
title_from_page_when_available: true
1315
title_segment_as_link: false
1416
segments_separator: null
1517
use_menu_title_as_fallback: false
18+
use_page_title_as_menu_title_fallback: false
19+
menu_title_preferred_menu: ''
1620
remove_repeated_segments: true
1721
language_path_prefix_as_segment: false
1822
absolute_paths: false
1923
hide_single_home_item: false
24+
term_hierarchy: false
25+
use_site_title: false
2026
add_structured_data_json_ld: false
27+
capitalizator_mode: none
2128
capitalizator_ignored_words: { }
2229
capitalizator_forced_words: { }
2330
capitalizator_forced_words_case_sensitivity: false
2431
capitalizator_forced_words_first_letter: false
2532
follow_redirects: true
33+
limit_segment_display: false
34+
segment_display_limit: null
35+
truncator_mode: false
36+
truncator_length: null
37+
truncator_dots: false
38+
remove_repeated_segments_text_only: false
39+
home_segment_validation_skip: false

0 commit comments

Comments
 (0)