回答編集履歴
15
修正
test
CHANGED
@@ -52,31 +52,31 @@
|
|
52
52
|
|
53
53
|
|
54
54
|
|
55
|
-
|
55
|
+
if ($lang !== null) {
|
56
56
|
|
57
|
-
if (
|
58
57
|
|
59
|
-
$lang !== null
|
60
58
|
|
59
|
+
// デフォルトロケールまたは存在しないロケールならフォールバック
|
60
|
+
|
61
|
-
|
61
|
+
if (
|
62
62
|
|
63
63
|
$lang === config('app.fallback_locale')
|
64
64
|
|
65
65
|
|| !in_array($lang, $this->possibleLocales, true)
|
66
66
|
|
67
|
-
)
|
67
|
+
) {
|
68
68
|
|
69
|
-
)
|
69
|
+
return redirect()->route(substr($route->getName(), 5));
|
70
70
|
|
71
|
-
return redirect()->route(substr($route->getName(), 5));
|
72
|
-
|
73
|
-
}
|
71
|
+
}
|
74
72
|
|
75
73
|
|
76
74
|
|
77
|
-
// ロケールの設定
|
75
|
+
// ロケールの設定
|
78
76
|
|
79
|
-
App::setLocale($lang);
|
77
|
+
App::setLocale($lang);
|
78
|
+
|
79
|
+
}
|
80
80
|
|
81
81
|
|
82
82
|
|
14
修正
test
CHANGED
@@ -56,9 +56,15 @@
|
|
56
56
|
|
57
57
|
if (
|
58
58
|
|
59
|
-
$lang ==
|
59
|
+
$lang !== null
|
60
60
|
|
61
|
+
&& (
|
62
|
+
|
63
|
+
$lang === config('app.fallback_locale')
|
64
|
+
|
61
|
-
|| !in_array($lang, $this->possibleLocales, true)
|
65
|
+
|| !in_array($lang, $this->possibleLocales, true)
|
66
|
+
|
67
|
+
)
|
62
68
|
|
63
69
|
) {
|
64
70
|
|
13
フォールバック設定
test
CHANGED
@@ -38,19 +38,39 @@
|
|
38
38
|
|
39
39
|
{
|
40
40
|
|
41
|
+
protected $possibleLocales = ['ja', 'en', 'cn', 'ru'];
|
42
|
+
|
43
|
+
|
44
|
+
|
41
45
|
public function handle(Request $request, Closure $next)
|
42
46
|
|
43
47
|
{
|
44
48
|
|
49
|
+
$route = $request->route();
|
50
|
+
|
45
|
-
$lang = $r
|
51
|
+
$lang = $route->parameter('lang');
|
46
52
|
|
47
53
|
|
48
54
|
|
49
|
-
|
55
|
+
// デフォルトロケールまたは存在しないロケールならフォールバック
|
50
56
|
|
57
|
+
if (
|
58
|
+
|
51
|
-
|
59
|
+
$lang === config('app.fallback_locale')
|
60
|
+
|
61
|
+
|| !in_array($lang, $this->possibleLocales, true)
|
62
|
+
|
63
|
+
) {
|
64
|
+
|
65
|
+
return redirect()->route(substr($route->getName(), 5));
|
52
66
|
|
53
67
|
}
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
// ロケールの設定
|
72
|
+
|
73
|
+
App::setLocale($lang);
|
54
74
|
|
55
75
|
|
56
76
|
|
12
修正
test
CHANGED
@@ -122,11 +122,7 @@
|
|
122
122
|
|
123
123
|
return route(
|
124
124
|
|
125
|
-
$params['lang'] === config('app.fallback_locale')
|
125
|
+
$params['lang'] === config('app.fallback_locale') ? $name : "lang.$name",
|
126
|
-
|
127
|
-
? $name
|
128
|
-
|
129
|
-
: "$params[lang].$name",
|
130
126
|
|
131
127
|
$params
|
132
128
|
|
11
リファクタ
test
CHANGED
@@ -116,15 +116,19 @@
|
|
116
116
|
|
117
117
|
{
|
118
118
|
|
119
|
-
$
|
119
|
+
$params['lang'] += App::getLocale();
|
120
120
|
|
121
121
|
|
122
122
|
|
123
123
|
return route(
|
124
124
|
|
125
|
-
$lang === config('app.fallback_locale')
|
125
|
+
$params['lang'] === config('app.fallback_locale')
|
126
126
|
|
127
|
+
? $name
|
128
|
+
|
127
|
-
$params
|
129
|
+
: "$params[lang].$name",
|
130
|
+
|
131
|
+
$params
|
128
132
|
|
129
133
|
);
|
130
134
|
|
10
修正
test
CHANGED
@@ -159,3 +159,7 @@
|
|
159
159
|
|
160
160
|
|
161
161
|
これで `route_i18n` を使って定義するのはどうでしょうか?現在表示しているページの言語にあったルーティングを暗黙的に書けます。言語を切り替えるときもそれを `$params` に渡せば、引数のほうが優先されるので問題ありません。
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
中身の多言語化に関しては通常どおり `__` 関数を使うだけですね。とても簡単です。
|
9
修正
test
CHANGED
@@ -122,7 +122,7 @@
|
|
122
122
|
|
123
123
|
return route(
|
124
124
|
|
125
|
-
$lang === config('fallback_locale') ? $name : "$lang.$name",
|
125
|
+
$lang === config('app.fallback_locale') ? $name : "$lang.$name",
|
126
126
|
|
127
127
|
$params + compact('lang')
|
128
128
|
|
8
リファクタ
test
CHANGED
@@ -24,11 +24,117 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
-
#
|
27
|
+
# 実装方針
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
+
#### ミドルウェアの作成
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
```php
|
36
|
+
|
37
|
+
class LocaleMiddleware
|
38
|
+
|
39
|
+
{
|
40
|
+
|
41
|
+
public function handle(Request $request, Closure $next)
|
42
|
+
|
43
|
+
{
|
44
|
+
|
45
|
+
$lang = $request->route('lang');
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
if ($lang) {
|
50
|
+
|
51
|
+
App::setLocale($lang);
|
52
|
+
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
return $next($request);
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
}
|
62
|
+
|
63
|
+
```
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
#### ルーティング定義
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
ルーティング定義は以下のようになります。
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
```php
|
76
|
+
|
77
|
+
// デフォルト言語
|
78
|
+
|
79
|
+
Route::namespace('App\Http\Controllers')
|
80
|
+
|
81
|
+
->group(base_path('routes/localized.php'));
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
// 各言語
|
86
|
+
|
87
|
+
Route::namespace('App\Http\Controllers')
|
88
|
+
|
89
|
+
->middleware(LocaleMiddleware::class)
|
90
|
+
|
91
|
+
->prefix('{lang}')
|
92
|
+
|
93
|
+
->as('lang.')
|
94
|
+
|
95
|
+
->group(base_path('routes/localized.php'));
|
96
|
+
|
97
|
+
```
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
アプリケーションの実際の定義は `routes/localized.php` に書いてください。
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
#### ヘルパー関数の作成
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
以下のようなヘルパー関数を適当な場所に定義してください。
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
```php
|
114
|
+
|
115
|
+
function route_i18n(string $name, array $params): string
|
116
|
+
|
117
|
+
{
|
118
|
+
|
119
|
+
$lang = $params['lang'] ?? App::getLocale();
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
return route(
|
124
|
+
|
125
|
+
$lang === config('fallback_locale') ? $name : "$lang.$name",
|
126
|
+
|
127
|
+
$params + compact('lang')
|
128
|
+
|
129
|
+
);
|
130
|
+
|
131
|
+
}
|
132
|
+
|
133
|
+
```
|
134
|
+
|
135
|
+
|
136
|
+
|
31
|
-
|
137
|
+
`app/helpers.php` を作って composer.json の `autoload` の `files` に書くのがおすすめです。
|
32
138
|
|
33
139
|
|
34
140
|
|
@@ -48,55 +154,7 @@
|
|
48
154
|
|
49
155
|
|
50
156
|
|
51
|
-
```php
|
52
|
-
|
53
|
-
function route_i18n(string $name, array $params): string
|
54
|
-
|
55
|
-
{
|
56
|
-
|
57
|
-
$lang = $params['lang'] ?? request()->route('lang');
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
return route(
|
62
|
-
|
63
|
-
$lang ? $name : "$lang.$name",
|
64
|
-
|
65
|
-
$lang ? $params + compact('lang') : $params
|
66
|
-
|
67
|
-
);
|
68
|
-
|
69
|
-
}
|
70
|
-
|
71
|
-
|
157
|
+
----
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
ルーティング定義は以下のようになります。アプリケーションの実際の定義は `routes/localized.php` に書いてください。
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
```php
|
80
|
-
|
81
|
-
// デフォルト言語
|
82
|
-
|
83
|
-
Route::namespace('App\Http\Controllers')
|
84
|
-
|
85
|
-
->group(base_path('routes/localized.php'));
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
// 各言語
|
90
|
-
|
91
|
-
Route::prefix('{lang}')
|
92
|
-
|
93
|
-
->as('lang.')
|
94
|
-
|
95
|
-
->namespace('App\Http\Controllers')
|
96
|
-
|
97
|
-
->group(base_path('routes/localized.php'));
|
98
|
-
|
99
|
-
```
|
100
158
|
|
101
159
|
|
102
160
|
|
7
まとめ
test
CHANGED
@@ -1,56 +1,50 @@
|
|
1
|
-
|
1
|
+
# 概要
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
エラーが出る原因は
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
``
|
9
|
+
- ルーティングされるメソッドに `$lang` が定義されていない
|
10
10
|
|
11
|
-
Route::prefix('{lang}')
|
12
11
|
|
13
|
-
->namespace('App\Http\Controllers')
|
14
12
|
|
15
|
-
|
13
|
+
からではなく
|
16
14
|
|
17
|
-
Route::get('example', 'ExampleController@index');
|
18
15
|
|
16
|
+
|
17
|
+
- ルーティングリンク生成時に `{lang}` が含まれるほうを利用している
|
18
|
+
|
19
|
+
- にも関わらず、`["lang" => $lang]` をパラメータに渡していない
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
が原因かと思われます。
|
24
|
+
|
25
|
+
|
26
|
+
|
19
|
-
|
27
|
+
# 対策
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
以下のようなヘルパー関数を適当な場所に定義してください。`app/helpers.php` を作って composer.json の `autoload` の `files` に書くのがおすすめです。
|
32
|
+
|
33
|
+
|
20
34
|
|
21
35
|
```
|
22
36
|
|
23
|
-
|
24
|
-
|
25
|
-
```php
|
26
|
-
|
27
|
-
class ExampleController extends Controller
|
28
|
-
|
29
37
|
{
|
30
38
|
|
31
|
-
|
39
|
+
"autoload": {
|
32
40
|
|
33
|
-
{
|
34
|
-
|
35
|
-
|
41
|
+
"files": ["app/helpers.php"]
|
36
42
|
|
37
43
|
}
|
38
44
|
|
39
45
|
}
|
40
46
|
|
41
47
|
```
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
これで `/en/example` でアクセスして動きました
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
----
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
ヘルパー関数↓
|
54
48
|
|
55
49
|
|
56
50
|
|
@@ -78,7 +72,7 @@
|
|
78
72
|
|
79
73
|
|
80
74
|
|
81
|
-
ルーティング定義
|
75
|
+
ルーティング定義は以下のようになります。アプリケーションの実際の定義は `routes/localized.php` に書いてください。
|
82
76
|
|
83
77
|
|
84
78
|
|
6
訂正
test
CHANGED
@@ -62,11 +62,15 @@
|
|
62
62
|
|
63
63
|
$lang = $params['lang'] ?? request()->route('lang');
|
64
64
|
|
65
|
-
$route = $lang ? $name : "$lang.$name";
|
66
65
|
|
67
66
|
|
67
|
+
return route(
|
68
68
|
|
69
|
+
$lang ? $name : "$lang.$name",
|
70
|
+
|
69
|
-
|
71
|
+
$lang ? $params + compact('lang') : $params
|
72
|
+
|
73
|
+
);
|
70
74
|
|
71
75
|
}
|
72
76
|
|
5
訂正
test
CHANGED
@@ -62,15 +62,11 @@
|
|
62
62
|
|
63
63
|
$lang = $params['lang'] ?? request()->route('lang');
|
64
64
|
|
65
|
-
|
66
|
-
|
67
65
|
$route = $lang ? $name : "$lang.$name";
|
68
|
-
|
69
|
-
$params += $lang ? compact('lang') : [];
|
70
66
|
|
71
67
|
|
72
68
|
|
73
|
-
return route($route, $params);
|
69
|
+
return route($route, $params + compact('lang'));
|
74
70
|
|
75
71
|
}
|
76
72
|
|
4
訂正
test
CHANGED
@@ -60,7 +60,7 @@
|
|
60
60
|
|
61
61
|
{
|
62
62
|
|
63
|
-
$lang = request()->route('lang');
|
63
|
+
$lang = $params['lang'] ?? request()->route('lang');
|
64
64
|
|
65
65
|
|
66
66
|
|
3
修正
test
CHANGED
@@ -106,4 +106,4 @@
|
|
106
106
|
|
107
107
|
|
108
108
|
|
109
|
-
これで `route_i18n` を使って定義するのはどうでしょうか?
|
109
|
+
これで `route_i18n` を使って定義するのはどうでしょうか?現在表示しているページの言語にあったルーティングを暗黙的に書けます。言語を切り替えるときもそれを `$params` に渡せば、引数のほうが優先されるので問題ありません。
|
2
編集
test
CHANGED
@@ -43,3 +43,67 @@
|
|
43
43
|
|
44
44
|
|
45
45
|
これで `/en/example` でアクセスして動きました
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
----
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
ヘルパー関数↓
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
```php
|
58
|
+
|
59
|
+
function route_i18n(string $name, array $params): string
|
60
|
+
|
61
|
+
{
|
62
|
+
|
63
|
+
$lang = request()->route('lang');
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
$route = $lang ? $name : "$lang.$name";
|
68
|
+
|
69
|
+
$params += $lang ? compact('lang') : [];
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
return route($route, $params);
|
74
|
+
|
75
|
+
}
|
76
|
+
|
77
|
+
```
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
ルーティング定義(実際の定義は `routes/localized.php` に書く)↓
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
```php
|
86
|
+
|
87
|
+
// デフォルト言語
|
88
|
+
|
89
|
+
Route::namespace('App\Http\Controllers')
|
90
|
+
|
91
|
+
->group(base_path('routes/localized.php'));
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
// 各言語
|
96
|
+
|
97
|
+
Route::prefix('{lang}')
|
98
|
+
|
99
|
+
->as('lang.')
|
100
|
+
|
101
|
+
->namespace('App\Http\Controllers')
|
102
|
+
|
103
|
+
->group(base_path('routes/localized.php'));
|
104
|
+
|
105
|
+
```
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
これで `route_i18n` を使って定義するのはどうでしょうか?
|
1
例
test
CHANGED
@@ -1 +1,45 @@
|
|
1
1
|
質問文から判断する限りではメソッド引数に何も影響は無いように思います。`$lang` は受け取ることもできますが、受け取らなくてもいいはず。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
```php
|
10
|
+
|
11
|
+
Route::prefix('{lang}')
|
12
|
+
|
13
|
+
->namespace('App\Http\Controllers')
|
14
|
+
|
15
|
+
->group(function () {
|
16
|
+
|
17
|
+
Route::get('example', 'ExampleController@index');
|
18
|
+
|
19
|
+
});
|
20
|
+
|
21
|
+
```
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
```php
|
26
|
+
|
27
|
+
class ExampleController extends Controller
|
28
|
+
|
29
|
+
{
|
30
|
+
|
31
|
+
public function index()
|
32
|
+
|
33
|
+
{
|
34
|
+
|
35
|
+
return 'working fine';
|
36
|
+
|
37
|
+
}
|
38
|
+
|
39
|
+
}
|
40
|
+
|
41
|
+
```
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
これで `/en/example` でアクセスして動きました
|