Show fallback banner when current-locale translation is missing
DocumentViewer computes viewLocale and isFallback at mount; banner links authenticated owners to the editor for the current UI locale. Adds documents.fallback_notice + locale_names to all 16 lang files (en+ja human-translated, others mirror en for now).
This commit is contained in:
@@ -4,25 +4,32 @@
|
||||
|
||||
use App\Models\Document;
|
||||
use App\Services\DocumentService;
|
||||
use Livewire\Component;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Livewire\Component;
|
||||
|
||||
class DocumentViewer extends Component
|
||||
{
|
||||
public Document $document;
|
||||
public $backlinks = [];
|
||||
public $renderedContent = '';
|
||||
public string $renderedContent = '';
|
||||
public string $viewLocale = '';
|
||||
public bool $isFallback = false;
|
||||
|
||||
public function mount(Document $document, DocumentService $documentService)
|
||||
{
|
||||
$this->document = $document;
|
||||
$this->document = $document->load('translations');
|
||||
|
||||
$this->renderedContent = $this->document->processLinks();
|
||||
$current = App::getLocale();
|
||||
$translation = $document->translationFor($current, fallback: true);
|
||||
|
||||
$this->backlinks = $documentService->getBacklinks($this->document);
|
||||
$this->viewLocale = $translation?->locale ?? $document->default_locale;
|
||||
$this->isFallback = ($current !== $this->viewLocale);
|
||||
$this->renderedContent = $document->processLinks();
|
||||
$this->backlinks = $documentService->getBacklinks($document);
|
||||
|
||||
if (Auth::check()) {
|
||||
$documentService->recordDocumentAccess($this->document, Auth::id());
|
||||
$documentService->recordDocumentAccess($document, Auth::id());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Inhalt',
|
||||
'content_placeholder' => 'Schreiben Sie hier Ihren Markdown...',
|
||||
'saving' => 'Speichern...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -123,6 +130,25 @@
|
||||
'back_to_home' => 'Zurück zur Startseite',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Profil',
|
||||
|
||||
@@ -41,6 +41,11 @@
|
||||
'saving' => 'Saving...',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -125,6 +130,25 @@
|
||||
'back_to_home' => 'Back to Home',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Profile',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Contenido',
|
||||
'content_placeholder' => 'Escriba su markdown aquí...',
|
||||
'saving' => 'Guardando...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -123,6 +130,25 @@
|
||||
'back_to_home' => 'Volver al inicio',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Perfil',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Contenu',
|
||||
'content_placeholder' => 'Écrivez votre markdown ici...',
|
||||
'saving' => 'Enregistrement...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -123,6 +130,25 @@
|
||||
'back_to_home' => 'Retour à l\'accueil',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Profil',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'सामग्री',
|
||||
'content_placeholder' => 'यहां अपना मार्कडाउन लिखें...',
|
||||
'saving' => 'सहेजा जा रहा है...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'होम पर वापस जाएं',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'प्रोफ़ाइल',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Contenuto',
|
||||
'content_placeholder' => 'Scrivi il tuo markdown qui...',
|
||||
'saving' => 'Salvataggio...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'Torna alla Home',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Profilo',
|
||||
|
||||
@@ -41,6 +41,11 @@
|
||||
'saving' => '保存中...',
|
||||
'translation_added' => '翻訳を追加しました。',
|
||||
'translation_deleted' => '翻訳を削除しました。',
|
||||
'fallback_notice' => 'この記事には選択した言語の翻訳がありません。元の言語版を表示しています。',
|
||||
'add_translation' => '翻訳を追加',
|
||||
'set_as_default' => 'デフォルトに設定',
|
||||
'delete_translation_blocked' => 'デフォルト言語の翻訳は削除できません。',
|
||||
'translation_tabs_label' => '言語',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -125,6 +130,14 @@
|
||||
'back_to_home' => 'ホームに戻る',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => '英語', 'ja' => '日本語',
|
||||
'zh-CN' => '簡体字中国語', 'zh-TW' => '繁体字中国語',
|
||||
'ko' => '韓国語', 'hi' => 'ヒンディー語', 'vi' => 'ベトナム語', 'tr' => 'トルコ語',
|
||||
'de' => 'ドイツ語', 'fr' => 'フランス語', 'es' => 'スペイン語', 'pt-BR' => 'ポルトガル語(ブラジル)',
|
||||
'ru' => 'ロシア語', 'uk' => 'ウクライナ語', 'it' => 'イタリア語', 'pl' => 'ポーランド語',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'プロフィール',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => '내용',
|
||||
'content_placeholder' => '여기에 마크다운을 작성하세요...',
|
||||
'saving' => '저장 중...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -123,6 +130,25 @@
|
||||
'back_to_home' => '홈으로 돌아가기',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => '프로필',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Treść',
|
||||
'content_placeholder' => 'Napisz swój markdown tutaj...',
|
||||
'saving' => 'Zapisywanie...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'Wróć do strony głównej',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Profil',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Conteúdo',
|
||||
'content_placeholder' => 'Escreva seu markdown aqui...',
|
||||
'saving' => 'Salvando...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'Voltar para Início',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Perfil',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Содержимое',
|
||||
'content_placeholder' => 'Напишите здесь ваш markdown...',
|
||||
'saving' => 'Сохранение...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'Вернуться на главную',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Профиль',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'İçerik',
|
||||
'content_placeholder' => 'Markdown\'ınızı buraya yazın...',
|
||||
'saving' => 'Kaydediliyor...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'Ana Sayfaya Dön',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Profil',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Вміст',
|
||||
'content_placeholder' => 'Напишіть тут ваш markdown...',
|
||||
'saving' => 'Збереження...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'Повернутися на головну',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Профіль',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => 'Nội dung',
|
||||
'content_placeholder' => 'Viết markdown của bạn ở đây...',
|
||||
'saving' => 'Đang lưu...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -124,6 +131,25 @@
|
||||
'back_to_home' => 'Quay lại trang chủ',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => 'Hồ sơ',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => '内容',
|
||||
'content_placeholder' => '在此输入Markdown内容...',
|
||||
'saving' => '保存中...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -123,6 +130,25 @@
|
||||
'back_to_home' => '返回首页',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => '个人资料',
|
||||
|
||||
@@ -39,6 +39,13 @@
|
||||
'content_label' => '內容',
|
||||
'content_placeholder' => '在此輸入Markdown內容...',
|
||||
'saving' => '儲存中...',
|
||||
'fallback_notice' => 'A translation in your selected language is not available. Showing the :locale version.',
|
||||
'add_translation' => 'Add translation',
|
||||
'translation_added' => 'Translation added.',
|
||||
'translation_deleted' => 'Translation deleted.',
|
||||
'set_as_default' => 'Set as default',
|
||||
'delete_translation_blocked' => 'The default-language translation cannot be deleted.',
|
||||
'translation_tabs_label' => 'Languages',
|
||||
],
|
||||
|
||||
// Quick Switcher
|
||||
@@ -123,6 +130,25 @@
|
||||
'back_to_home' => '返回首頁',
|
||||
],
|
||||
|
||||
'locale_names' => [
|
||||
'en' => 'English',
|
||||
'ja' => 'Japanese',
|
||||
'zh-CN' => 'Simplified Chinese',
|
||||
'zh-TW' => 'Traditional Chinese',
|
||||
'ko' => 'Korean',
|
||||
'hi' => 'Hindi',
|
||||
'vi' => 'Vietnamese',
|
||||
'tr' => 'Turkish',
|
||||
'de' => 'German',
|
||||
'fr' => 'French',
|
||||
'es' => 'Spanish',
|
||||
'pt-BR' => 'Portuguese (Brazil)',
|
||||
'ru' => 'Russian',
|
||||
'uk' => 'Ukrainian',
|
||||
'it' => 'Italian',
|
||||
'pl' => 'Polish',
|
||||
],
|
||||
|
||||
// Profile
|
||||
'profile' => [
|
||||
'title' => '個人資料',
|
||||
|
||||
@@ -1,4 +1,20 @@
|
||||
<div class="max-w-4xl mx-auto p-4 sm:p-6 lg:p-8">
|
||||
@if($isFallback)
|
||||
<div class="mb-4 p-4 bg-amber-50 border border-amber-300 rounded-md flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3">
|
||||
<p class="text-sm text-amber-800">
|
||||
{{ __('messages.documents.fallback_notice', ['locale' => __('messages.locale_names.' . $viewLocale)]) }}
|
||||
</p>
|
||||
@auth
|
||||
@can('update', $document)
|
||||
<a href="{{ route('documents.translations.edit', ['document' => $document, 'locale' => app()->getLocale()]) }}"
|
||||
class="inline-flex items-center justify-center px-3 py-2 bg-amber-600 text-white text-sm font-medium rounded-md hover:bg-amber-700">
|
||||
{{ __('messages.documents.add_translation') }}
|
||||
</a>
|
||||
@endcan
|
||||
@endauth
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<!-- Document Header -->
|
||||
<div class="mb-6 sm:mb-8">
|
||||
<div class="flex flex-col sm:flex-row sm:items-start sm:justify-between gap-4 mb-4">
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\Document;
|
||||
use App\Models\DocumentTranslation;
|
||||
use App\Models\User;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\App;
|
||||
use Tests\TestCase;
|
||||
|
||||
class DocumentI18nTest extends TestCase
|
||||
{
|
||||
use RefreshDatabase;
|
||||
|
||||
public function test_viewer_shows_current_locale_translation(): void
|
||||
{
|
||||
$doc = Document::factory()->create(['default_locale' => 'en', 'slug' => 'hello']);
|
||||
$doc->translations()->where('locale', 'en')->update(['title' => 'Hello', 'content' => 'Hi', 'rendered_html' => '<p>Hi</p>']);
|
||||
DocumentTranslation::factory()->create([
|
||||
'document_id' => $doc->id,
|
||||
'locale' => 'ja',
|
||||
'title' => 'こんにちは',
|
||||
'content' => 'やあ',
|
||||
'rendered_html' => '<p>やあ</p>',
|
||||
]);
|
||||
|
||||
session()->put('locale', 'ja');
|
||||
$response = $this->get(route('documents.show', $doc));
|
||||
|
||||
$response->assertOk();
|
||||
$response->assertSee('こんにちは');
|
||||
$response->assertSee('やあ', false);
|
||||
}
|
||||
|
||||
public function test_viewer_falls_back_with_banner_when_locale_missing(): void
|
||||
{
|
||||
$doc = Document::factory()->create(['default_locale' => 'en', 'slug' => 'fb']);
|
||||
$doc->translations()->where('locale', 'en')->update(['title' => 'Hello', 'content' => 'Hi', 'rendered_html' => '<p>Hi</p>']);
|
||||
|
||||
session()->put('locale', 'ja');
|
||||
$response = $this->get(route('documents.show', $doc));
|
||||
|
||||
$response->assertOk();
|
||||
$response->assertSee('Hello'); // fallback content
|
||||
// banner present (use the JA translation key value)
|
||||
$response->assertSeeText(__('messages.documents.fallback_notice', [], 'ja'));
|
||||
}
|
||||
|
||||
public function test_no_banner_when_translation_exists(): void
|
||||
{
|
||||
$doc = Document::factory()->create(['default_locale' => 'en', 'slug' => 'nb']);
|
||||
$doc->translations()->where('locale', 'en')->update(['title' => 'Hello', 'content' => 'Hi', 'rendered_html' => '<p>Hi</p>']);
|
||||
DocumentTranslation::factory()->create([
|
||||
'document_id' => $doc->id,
|
||||
'locale' => 'ja',
|
||||
'title' => 'こんにちは',
|
||||
'content' => 'やあ',
|
||||
'rendered_html' => '<p>やあ</p>',
|
||||
]);
|
||||
|
||||
session()->put('locale', 'ja');
|
||||
$response = $this->get(route('documents.show', $doc));
|
||||
|
||||
$response->assertOk();
|
||||
$response->assertDontSeeText(__('messages.documents.fallback_notice', [], 'ja'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user