Просмотр исходного кода

fix(library): 切换界面语言不再丢查询串、不再改掉 wiki 的内容语言

语言切换器对具名路由按路由参数重新生成地址:筛选、页码、搜索词全部丢失;
wiki 的路径参数也叫 {lang},被换成界面语言,界面反而没切换。改为保留当前
地址,只替换 ?lang=(SetLocale 只认查询串)。

搜索页翻页与「您是不是要找」链接把语言过滤写成 lang,控制器读的是 language:
翻页会切换界面语言并丢掉过滤。改为 language。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
visuddhinanda 3 дней назад
Родитель
Сommit
092f29f2c7

+ 3 - 10
api-v13/resources/views/components/language-switcher.blade.php

@@ -2,16 +2,9 @@
 $currentLocale = app()->getLocale();
 $languages = config('mint.languages');
 $currentLanguage = $languages[$currentLocale] ?? 'en';
-// 首页等无名路由用当前 URL 追加 ?lang= ,具名路由仍按路由参数生成,保持原有链接形式
-$localeUrl = function (string $locale) {
-    $routeName = Route::currentRouteName();
-
-    if ($routeName) {
-        return route($routeName, array_merge(request()->route()->parameters(), ['lang' => $locale]));
-    }
-
-    return request()->fullUrlWithQuery(['lang' => $locale]);
-};
+// 当前地址原样保留(路径参数与查询串都不动),只替换 ?lang=(SetLocale 中间件只认查询串)。
+// 不能按路由参数重新生成:wiki 的路径参数也叫 {lang},会被换成界面语言;查询串(筛选、页码、搜索词)也会丢。
+$localeUrl = fn (string $locale) => request()->fullUrlWithQuery(['lang' => $locale]);
 @endphp
 
 <div class="language-switcher">

+ 4 - 3
api-v13/resources/views/library/search.blade.php

@@ -1,6 +1,6 @@
 {{-- resources/views/library/search.blade.php
      全站统一搜索结果页。
-     路由:/library/search?q=&type=&category=&lang=
+     路由:/library/search?q=&type=&category=&language=(不能用 lang:那是界面语言)
      原 wiki/search.blade.php 移至此处,@extends 路径更新,
      搜索框改用 <x-ui.search-input>,空状态改用 <x-ui.empty-state>。
 --}}
@@ -51,7 +51,8 @@
     routeName="library.search"
     :queryParams="array_filter([
                 'q'        => $query,
-                'lang'     => $lang,
+                // 控制器读的是 language;lang 是界面语言(SetLocale)
+                'language' => $lang,
                 'category' => $category !== 'all' ? $category : null,
             ])" />
 @endif
@@ -103,7 +104,7 @@
     <div class="wiki-sidebar-title">{{ __('library.did_you_mean') }}</div>
     <ul class="wiki-related-list">
         <li>
-            <a href="{{ route('library.search', ['q' => substr($query, 0, -1), 'lang' => $lang]) }}">
+            <a href="{{ route('library.search', ['q' => substr($query, 0, -1), 'language' => $lang]) }}">
                 {{ substr($query, 0, -1) }}
             </a>
         </li>

+ 22 - 0
api-v13/tests/Feature/LibraryLanguageSwitcherTest.php

@@ -0,0 +1,22 @@
+<?php
+
+use Illuminate\Foundation\Testing\RefreshDatabase;
+
+uses(RefreshDatabase::class);
+
+/**
+ * 语言切换器(x-language-switcher):保留当前地址的路径与查询串,只替换 ?lang=。
+ *
+ * 以前按路由参数重新生成地址:筛选、页码、搜索词会丢;wiki 的路径参数也叫 {lang},会被换成界面语言。
+ */
+it('keeps the current query string when switching the ui language', function () {
+    $this->get('/library/tipitaka/channels?type=translation&page=2')
+        ->assertOk()
+        ->assertSee('/library/tipitaka/channels?type=translation&amp;page=2&amp;lang=zh-Hans', false);
+});
+
+it('replaces an existing lang parameter instead of adding a second one', function () {
+    $this->get('/library/tipitaka/channels?lang=my&type=translation')
+        ->assertOk()
+        ->assertSee('/library/tipitaka/channels?lang=zh-Hans&amp;type=translation', false);
+});