ソースを参照

Fix #3835: theme switcher broken when theme is not available (#3874)

* FIx the function: add an error slide

* i18n for the error message

* fix the message

* i18n: nl

* phpcbf

* Typographic quotation marks
+fr +en-US

* Unicode instead of entities

* Whitespace

Co-authored-by: Alexandre Alapetite <alexandre@alapetite.fr>
maTh 4 年 前
コミット
c23702eaa5

+ 1 - 0
app/i18n/cz/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Show the navigation buttons',	// TODO - Translation
 		'theme' => 'Vzhled',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/de/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Zeige Navigations-Buttons',
 		'theme' => 'Erscheinungsbild',
+		'theme_not_available' => 'Das Erscheinungsbild “%s” ist nicht mehr verfügbar. Bitte ein anderes auswählen.',
 		'thumbnail' => array(
 			'label' => 'Vorschaubild',
 			'landscape' => 'Querformat',

+ 1 - 0
app/i18n/en-us/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Show the navigation buttons',
 		'theme' => 'Theme',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',
 		'thumbnail' => array(
 			'label' => 'Thumbnail',
 			'landscape' => 'Landscape',

+ 1 - 0
app/i18n/en/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Show the navigation buttons',
 		'theme' => 'Theme',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',
 		'thumbnail' => array(
 			'label' => 'Thumbnail',
 			'landscape' => 'Landscape',

+ 1 - 0
app/i18n/es/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Show the navigation buttons',	// TODO - Translation
 		'theme' => 'Tema',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/fr/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Afficher les boutons de navigation',
 		'theme' => 'Thème',
+		'theme_not_available' => 'Le thème “%s” n’est plus disponible. Veuillez choisir un autre thème.',
 		'thumbnail' => array(
 			'label' => 'Miniature',
 			'landscape' => 'Paysage',

+ 1 - 0
app/i18n/he/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Show the navigation buttons',	// TODO - Translation
 		'theme' => 'ערכת נושא',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/it/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Show the navigation buttons',	// TODO - Translation
 		'theme' => 'Tema',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/ja/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'ナビゲーションボタンを表示する',
 		'theme' => 'テーマ',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'サムネイル',
 			'landscape' => 'ランドスケープ',

+ 1 - 0
app/i18n/kr/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => '내비게이션 버튼 보이기',
 		'theme' => '테마',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/nl/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Toon navigatieknoppen',
 		'theme' => 'Thema',
+		'theme_not_available' => 'Het “%s” thema is niet meer beschikbaar. Kies een ander thema.',
 		'thumbnail' => array(
 			'label' => 'Miniatuur',
 			'landscape' => 'Liggend',

+ 1 - 0
app/i18n/oc/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Mostrar los botons de navigacion',
 		'theme' => 'Tèma',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/pl/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Pokaż przyciski nawigacyjne',
 		'theme' => 'Motyw',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/pt-br/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Mostrar botões de navegação',
 		'theme' => 'Tema',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/ru/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Показать кнопки навигации',
 		'theme' => 'Тема',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/sk/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Zobraziť tlačidlá oznámenia',
 		'theme' => 'Vzhľad',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/tr/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => 'Gezinti düğmelerini göster',
 		'theme' => 'Tema',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 1 - 0
app/i18n/zh-cn/conf.php

@@ -39,6 +39,7 @@ return array(
 		),
 		'show_nav_buttons' => '显示导航按钮',
 		'theme' => '主题',
+		'theme_not_available' => 'The “%s” theme is not available anymore. Please choose another theme.',	// TODO - Translation
 		'thumbnail' => array(
 			'label' => 'Thumbnail',	// TODO - Translation
 			'landscape' => 'Landscape',	// TODO - Translation

+ 39 - 21
app/views/configure/display.phtml

@@ -26,21 +26,26 @@
 			<label class="group-name" for="theme"><?= _t('conf.display.theme') ?></label>
 			<div class="group-controls">
 				<ul class="slides">
-					<?php $slides = count($this->themes); $i = 1; ?>
+					<?php $slides = count($this->themes); $i = 1; $themeAvailable = false; ?>
 					<?php foreach($this->themes as $theme) { ?>
-						<input type="radio" name="theme" id="img-<?= $i ?>" <?=
-							FreshRSS_Context::$user_conf->theme === $theme['id'] ? 'checked="checked"' : '' ?> value="<?= $theme['id'] ?>"
-							data-leave-validation="<?= (FreshRSS_Context::$user_conf->theme === $theme['id']) ? 1 : 0 ?>"/>
+						<?php if (FreshRSS_Context::$user_conf->theme === $theme['id']) {
+							$checked = 'checked="checked"';
+							$themeAvailable = true;
+						} else {
+							$checked = '';
+						} ?>
+						<input type="radio" name="theme" id="img-<?= $i ?>" <?= $checked ?> value="<?= $theme['id'] ?>"
+							data-leave-validation="<?= (FreshRSS_Context::$user_conf->theme === $theme['id']) ? 1 : 0 ?>" />
 						<li class="slide-container">
 							<div class="slide">
-								<img src="<?= Minz_Url::display('/themes/' . $theme['id'] . '/thumbs/original.png') ?>"/>
+								<img src="<?= Minz_Url::display('/themes/' . $theme['id'] . '/thumbs/original.png') ?>" />
 							</div>
 							<div class="nav">
 								<?php if ($i !== 1) {?>
-									<label for="img-<?= $i - 1 ?>" class="prev">&#x2039;</label>
+									<label for="img-<?= $i - 1 ?>" class="prev"></label>
 								<?php } ?>
 								<?php if ($i !== $slides) {?>
-									<label for="img-<?= $i + 1 ?>" class="next">&#x203a;</label>
+									<label for="img-<?= $i + 1 ?>" class="next"></label>
 								<?php } ?>
 							</div>
 							<div class="properties">
@@ -51,6 +56,19 @@
 						</li>
 						<?php $i++ ?>
 					<?php } ?>
+					<?php if (!$themeAvailable) {?>
+						<input type="radio" name="theme" checked="checked" value="Origine" data-leave-validation="0" />
+						<li class="slide-container">
+							<div class="slide">
+							</div>
+							<div class="nav">
+								<label for="img-<?= $i - 1 ?>" class="prev">‹</label>
+							</div>
+							<div class="properties alert-error">
+								<div><?= _t('conf.display.theme_not_available', FreshRSS_Context::$user_conf->theme)?></div>
+							</div>
+						</li>
+					<?php }?>
 				</ul>
 			</div>
 		</div>
@@ -119,45 +137,45 @@
 							<th><?= _t('conf.display.icon.top_line') ?></th>
 							<td><input type="checkbox" name="topline_read" value="1"<?=
 								FreshRSS_Context::$user_conf->topline_read ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_read ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_read ?>" /></td>
 							<td><input type="checkbox" name="topline_favorite" value="1"<?=
 								FreshRSS_Context::$user_conf->topline_favorite ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_favorite ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_favorite ?>" /></td>
 							<td><input type="checkbox" disabled="disabled" /></td>
 							<td><input type="checkbox" disabled="disabled" /></td>
 							<td><input type="checkbox" name="topline_summary" value="1"<?=
 								FreshRSS_Context::$user_conf->topline_summary ? 'checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_summary ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_summary ?>" /></td>
 							<td><input type="checkbox" name="topline_display_authors" value="1"<?=
 								FreshRSS_Context::$user_conf->topline_display_authors ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_display_authors ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_display_authors ?>" /></td>
 							<td><input type="checkbox" name="topline_date" value="1"<?=
 								FreshRSS_Context::$user_conf->topline_date ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_date ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_date ?>" /></td>
 							<td><input type="checkbox" name="topline_link" value="1"<?= FreshRSS_Context::$user_conf->topline_link ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_link ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->topline_link ?>" /></td>
 						</tr><tr>
 							<th><?= _t('conf.display.icon.bottom_line') ?></th>
 							<td><input type="checkbox" name="bottomline_read" value="1"<?=
 								FreshRSS_Context::$user_conf->bottomline_read ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_read ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_read ?>" /></td>
 							<td><input type="checkbox" name="bottomline_favorite" value="1"<?=
 								FreshRSS_Context::$user_conf->bottomline_favorite ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_favorite ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_favorite ?>" /></td>
 							<td><input type="checkbox" name="bottomline_tags" value="1"<?=
 								FreshRSS_Context::$user_conf->bottomline_tags ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_tags ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_tags ?>" /></td>
 							<td><input type="checkbox" name="bottomline_sharing" value="1"<?=
 								FreshRSS_Context::$user_conf->bottomline_sharing ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_sharing ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_sharing ?>" /></td>
 							<td><input type="checkbox" disabled="disabled" /></td>
 							<td><input type="checkbox" disabled="disabled" /></td>
 							<td><input type="checkbox" name="bottomline_date" value="1"<?=
 								FreshRSS_Context::$user_conf->bottomline_date ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_date ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_date ?>" /></td>
 							<td><input type="checkbox" name="bottomline_link" value="1"<?=
 								FreshRSS_Context::$user_conf->bottomline_link ? ' checked="checked"' : '' ?>
-								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_link ?>"/></td>
+								data-leave-validation="<?= FreshRSS_Context::$user_conf->bottomline_link ?>" /></td>
 						</tr>
 					</tbody>
 				</table>
@@ -169,7 +187,7 @@
 			<div class="group-controls">
 				<input type="number" id="html5_notif_timeout" name="html5_notif_timeout" value="<?=
 					FreshRSS_Context::$user_conf->html5_notif_timeout ?>"
-					data-leave-validation="<?= FreshRSS_Context::$user_conf->html5_notif_timeout ?>"/> <?= _t('conf.display.notif_html5.seconds') ?>
+					data-leave-validation="<?= FreshRSS_Context::$user_conf->html5_notif_timeout ?>" /> <?= _t('conf.display.notif_html5.seconds') ?>
 			</div>
 		</div>
 
@@ -178,7 +196,7 @@
 				<label class="checkbox" for="show_nav_buttons">
 					<input type="checkbox" name="show_nav_buttons" id="show_nav_buttons" value="1"<?=
 						FreshRSS_Context::$user_conf->show_nav_buttons ? ' checked="checked"' : '' ?>
-						data-leave-validation="<?= FreshRSS_Context::$user_conf->show_nav_buttons ?>"/>
+						data-leave-validation="<?= FreshRSS_Context::$user_conf->show_nav_buttons ?>" />
 					<?= _t('conf.display.show_nav_buttons') ?>
 				</label>
 			</div>

+ 1 - 0
cli/i18n/ignore/en-us.php

@@ -160,6 +160,7 @@ return array(
 	'conf.display.notif_html5.timeout',
 	'conf.display.show_nav_buttons',
 	'conf.display.theme',
+	'conf.display.theme_not_available',
 	'conf.display.thumbnail.label',
 	'conf.display.thumbnail.landscape',
 	'conf.display.thumbnail.none',