10 private const LNG_FD =
'fd:dbxContent|config-lng';
12 private const TRANSLATE_KEYS = array(
13 'lng_translate_provider',
14 'lng_translate_api_key',
15 'lng_translate_api_url',
16 'lng_translate_model',
19 private function addLngFld($oForm,
string $name):
void {
20 $oForm->add_fld($name,
'fd::',
'fd::',
'fd::',
'fd::',
'fd::',
'fd::',
'fd::',
'fd::',
'fd::', self::LNG_FD);
26 private function buildFormData(): array {
27 $contentCfg =
dbx()->get_config(
'dbxContent');
28 if (!is_array($contentCfg)) {
29 $contentCfg = array();
33 'lng_translate_provider' => strtolower(trim((
string) ($contentCfg[
'lng_translate_provider'] ??
'copy'))),
34 'lng_translate_api_key' => (
string) ($contentCfg[
'lng_translate_api_key'] ??
''),
35 'lng_translate_api_url' => (
string) ($contentCfg[
'lng_translate_api_url'] ??
''),
36 'lng_translate_model' => (
string) ($contentCfg[
'lng_translate_model'] ??
'gpt-4o-mini'),
39 if ($data[
'lng_translate_provider'] ===
'' || $data[
'lng_translate_provider'] ===
'undef') {
40 $data[
'lng_translate_provider'] =
'copy';
42 if ($data[
'lng_translate_model'] ===
'' || $data[
'lng_translate_model'] ===
'undef') {
43 $data[
'lng_translate_model'] =
'gpt-4o-mini';
46 $dbxCfg =
dbx()->get_config(
'dbx');
47 if (!is_array($dbxCfg)) {
51 $data[
'default_lng'] = strtolower(trim((
string) ($dbxCfg[
'default_lng'] ??
'de')));
52 if ($data[
'default_lng'] ===
'' || $data[
'default_lng'] ===
'undef') {
53 $data[
'default_lng'] =
'de';
56 $accessible = $dbxCfg[
'accessible_lng'] ??
'de';
57 if (is_array($accessible)) {
58 $data[
'accessible_lng'] = implode(
',', $accessible);
60 $data[
'accessible_lng'] = trim((
string) $accessible);
62 if ($data[
'accessible_lng'] ===
'' || $data[
'accessible_lng'] ===
'undef') {
63 $data[
'accessible_lng'] = $data[
'default_lng'];
66 $homeCfg =
dbx()->get_config(
'dbxHome');
67 $data[
'home_cid'] = is_array($homeCfg) ? (string) ($homeCfg[
'cid'] ??
'1') :
'1';
68 if ($data[
'home_cid'] ===
'' || $data[
'home_cid'] ===
'undef') {
69 $data[
'home_cid'] =
'1';
78 private function normalizeAccessibleLng($raw,
string $defaultLng): array {
81 foreach ($raw as $val) {
82 $val = strtolower(trim((
string) $val));
83 if ($val !==
'' && preg_match(
'/^[a-z]{2,3}$/', $val)) {
88 $parts = preg_split(
'/\s*,\s*/', (
string) $raw, -1, PREG_SPLIT_NO_EMPTY);
89 if (is_array($parts)) {
90 foreach ($parts as $val) {
91 $val = strtolower(trim((
string) $val));
92 if ($val !==
'' && preg_match(
'/^[a-z]{2,3}$/', $val)) {
99 $out = array_values(array_unique(
$out));
100 if ($defaultLng !==
'' && !in_array($defaultLng,
$out,
true)) {
101 array_unshift(
$out, $defaultLng);
104 $out = array($defaultLng !==
'' ? $defaultLng :
'de');
110 private function saveLngConfig(array
$config):
void {
111 $defaultLng = strtolower(trim((
string) (
$config[
'default_lng'] ??
'de')));
112 if ($defaultLng ===
'' || !preg_match(
'/^[a-z]{2,3}$/', $defaultLng)) {
116 $accessibleList = $this->normalizeAccessibleLng(
$config[
'accessible_lng'] ?? $defaultLng, $defaultLng);
118 $dbxCfg =
dbx()->get_config(
'dbx');
119 if (!is_array($dbxCfg)) {
122 $dbxCfg[
'default_lng'] = $defaultLng;
123 $dbxCfg[
'accessible_lng'] = implode(
',', $accessibleList);
124 dbx()->set_config(
'dbx', $dbxCfg);
126 $homeCid = trim((
string) (
$config[
'home_cid'] ??
'1'));
127 if ($homeCid ===
'' || !ctype_digit($homeCid)) {
131 $homeCfg =
dbx()->get_config(
'dbxHome');
132 if (!is_array($homeCfg)) {
135 $homeCfg[
'cid'] = $homeCid;
136 dbx()->set_config(
'dbxHome', $homeCfg);
139 private function saveTranslateConfig(array
$config):
void {
140 $contentCfg =
dbx()->get_config(
'dbxContent');
141 if (!is_array($contentCfg)) {
142 $contentCfg = array();
145 foreach (self::TRANSLATE_KEYS as $key) {
146 if (!array_key_exists($key,
$config)) {
149 $contentCfg[$key] =
$config[$key];
152 if (!isset($contentCfg[
'dbxConfig_modul']) || $contentCfg[
'dbxConfig_modul'] ===
'') {
153 $contentCfg[
'dbxConfig_modul'] =
'secure';
156 dbx()->set_config(
'dbxContent', $contentCfg);
159 public function run($action =
'') {
160 $data = $this->buildFormData();
162 $oForm =
dbx()->get_system_obj(
'dbxForm');
163 $oForm->init(
'form-dbxContent-config',
'config-dbxContent-shell');
164 $oForm->_action = $action !==
''
166 :
'?dbx_modul=dbxAdmin&dbx_run1=config&dbx_run2=edit&xmodul=dbxContent';
167 $oForm->_dd = self::LNG_FD;
168 $oForm->_data = $data;
169 $oForm->_fld_change_state =
'*';
171 $help =
dbx()->get_include_obj(
'dbxAdminHelp',
'dbxAdmin');
172 $help->attachForm($oForm,
'content_lng');
174 $oForm->add_rep(
'section_languages',
'Sprachen');
175 $oForm->add_rep(
'languages_hint',
'Master- und Zielsprachen steuern CMS-Tabellen, Tree-Badges und Startseiten-Aufloesung.');
176 $oForm->add_rep(
'section_translate',
'Uebersetzung (API)');
177 $oForm->add_rep(
'translate_hint',
'Provider und API-Zugang fuer automatische Uebersetzung bei Sync und Provision.');
179 $this->addLngFld($oForm,
'default_lng');
180 $this->addLngFld($oForm,
'accessible_lng');
181 $this->addLngFld($oForm,
'home_cid');
183 $this->addLngFld($oForm,
'lng_translate_provider');
184 $this->addLngFld($oForm,
'lng_translate_api_key');
185 $this->addLngFld($oForm,
'lng_translate_api_url');
186 $this->addLngFld($oForm,
'lng_translate_model');
188 $saveBtn =
dbx()->get_system_obj(
'dbxTPL')->get_tpl(
'dbx|button-submit', array(
189 'label' =>
'Sprach-Config speichern',
191 $oForm->add_obj(
'button',
'obj-value', $saveBtn);
192 $oForm->add_obj(
'bar_actions',
'obj-value', $saveBtn);
194 if ($oForm->submit() && !$oForm->errors()) {
195 $config = is_array($oForm->_post) ? $oForm->_post : array();
196 foreach (array(
'button',
'bar_actions') as $skip) {
201 $this->saveTranslateConfig(
$config);
207 'Sprach-Config gespeichert',
208 'master=' . (
string) (
$config[
'default_lng'] ??
'') .
'; provider=' . (
string) (
$config[
'lng_translate_provider'] ??
'')
211 $oForm->_data = $this->buildFormData();
214 $this->applyBarReps($oForm);
216 return $oForm->run();
219 private function applyBarReps($oForm): void {
221 $oForm->add_rep(
'bar_title',
'CMS — Sprachen & Uebersetzung');
224 'Aktiver Uebersetzungs-Provider: ' . $provider .
' (nach Speichern neu geladen)'
226 $oForm->add_rep(
'bar_icon',
'bi-translate');
227 $oForm->add_rep(
'bar_class',
'dbx-module-bar');
228 $oForm->add_rep(
'bar_title_class',
'dbx-module-bar-titleblock');
229 $oForm->add_rep(
'bar_actions_class',
'dbx-module-bar-actions');
230 $oForm->add_rep(
'current_provider', $provider);