概要
useTTSText のいくつかのテーマ・状態で「次の駅が終点である」旨のアナウンス (JA: 「終点」 / EN: "terminal" or "the last stop") が欠落している。EN 側で漏れているケースが多いが、JA 側にも欠落・不整合がある。
過去 issue #3252 (TY ARRIVING) では限定的に修正済みだが、他テーマ・状態が残存している。
棚卸し
| テーマ |
状態 |
言語 |
終点アナウンス |
該当ロジック |
| TOKYO_METRO |
NEXT (firstSpeech=true) |
JA |
❌ 欠落 |
次は、{ne}です。 のみで「終点」の言及なし |
| TOKYO_METRO |
NEXT (firstSpeech=false) |
JA |
✅ あり |
${isNextStopTerminus ? '、終点' : ''} |
| TOKYO_METRO |
NEXT |
EN |
❌ 欠落 |
isNextStopTerminus 参照なし。両 firstSpeech 共通で漏れ |
| TOKYO_METRO |
ARRIVING |
JA / EN |
✅ あり |
|
| TY |
NEXT / ARRIVING |
JA / EN |
✅ あり |
(#3252 で修正済み) |
| YAMANOTE |
NEXT |
JA |
✅ あり |
${isNextStopTerminus ? '、終点です' : ''} |
| YAMANOTE |
NEXT |
EN |
❌ 欠落 |
isNextStopTerminus 参照なし |
| YAMANOTE |
ARRIVING |
JA / EN |
✅ あり (※1) |
|
| SAIKYO |
NEXT / ARRIVING |
JA / EN |
✅ あり (※1) |
|
| JR_WEST |
NEXT |
JA / EN |
✅ あり |
nextStationIsBound (= selectedBound) で判定 |
| JR_WEST |
ARRIVING |
JA |
△ 部分的 |
「ご乗車ありがとうございました」のみ。「終点、」 prefix なし |
| JR_WEST |
ARRIVING |
EN |
❌ 欠落 |
isNextStopTerminus も nextStationIsBound も参照なし |
| TOEI |
NEXT |
JA |
❌ 欠落 |
次は、X、X。 のみ |
| TOEI |
NEXT |
EN |
❌ 欠落 |
|
| TOEI |
ARRIVING |
JA |
△ 部分的 |
thanks のみ。「終点」 prefix なし |
| TOEI |
ARRIVING |
EN |
△ 部分的 |
thanks のみ。"the last stop" / "terminal" なし |
| JR_KYUSHU |
NEXT / ARRIVING |
JA / EN |
✅ あり (※1) |
nextStationIsBound で判定 |
(※1) YAMANOTE / SAIKYO / JR_KYUSHU の ARRIVING は transferLines.length が真のときだけ thanks メッセージを出す副次バグあり。本 issue とは別軸だが、修正時に併せて検討推奨。
期待動作
「次の駅が終点 (= train が終着する駅)」かつ NEXT/ARRIVING のとき、JA/EN ともに何らかの形で「終点」を明示する。具体的なフレーズはテーマの既存スタイルに合わせる:
- TOKYO_METRO NEXT EN:
The next stop is X, the last stop.
- TOKYO_METRO NEXT JA (firstSpeech=true):
次は、X、終点です。
- YAMANOTE NEXT EN:
The next station is X, terminal.
- TOEI NEXT JA / EN: 「終点」表記を追加
- TOEI ARRIVING: thanks の前に「終点」表記を追加
- JR_WEST ARRIVING EN: terminal mention を追加
- JR_WEST ARRIVING JA: 「ご乗車ありがとうございました」の前に「終点、X です」相当を追加
判定ロジックの選択
現状 2 種類の boolean が混在している:
isNextStopTerminus (= useIsTerminus): stations[0] または stations[stations.length-1] と同一かどうか (= 路線・直通系統の物理的な終点)
nextStationIsBound: nextStation.groupId === selectedBound.groupId && !isLoopLine (= ユーザーが選択した行先と一致するか)
両者は通常一致するが、ユーザーが中間駅を行先指定したときに乖離する。テーマごとに使い分けが分かれているのは現状そのままで OK だが、新規追加箇所は既存テーマの方針に合わせる:
- TOKYO_METRO / TY / YAMANOTE / SAIKYO / TOEI:
isNextStopTerminus
- JR_WEST / JR_KYUSHU:
nextStationIsBound
該当ファイル
リファクタ後のファイル: src/hooks/tts/templates.ts の各テーマ NEXT/ARRIVING テンプレート
テスト
既存の src/hooks/useTTSText.test.tsx は setupMockUseNextStation(TOEI_SHINJUKU_LINE_STATIONS[1]) で固定しているため終点ケースを一切踏まない。修正時は次のテストを追加:
- 各テーマで
nextStation = stations[stations.length - 1] の状態で NEXT / ARRIVING を呼び、JA/EN いずれにも「終点」/「terminal」/「last stop」相当の文字列が含まれることを検証
- JR_WEST / JR_KYUSHU は
selectedBound を中間駅にしたケースでも検証
概要
useTTSTextのいくつかのテーマ・状態で「次の駅が終点である」旨のアナウンス (JA: 「終点」 / EN: "terminal" or "the last stop") が欠落している。EN 側で漏れているケースが多いが、JA 側にも欠落・不整合がある。過去 issue #3252 (TY ARRIVING) では限定的に修正済みだが、他テーマ・状態が残存している。
棚卸し
次は、{ne}です。のみで「終点」の言及なし${isNextStopTerminus ? '、終点' : ''}isNextStopTerminus参照なし。両 firstSpeech 共通で漏れ${isNextStopTerminus ? '、終点です' : ''}isNextStopTerminus参照なしnextStationIsBound(= selectedBound) で判定isNextStopTerminusもnextStationIsBoundも参照なし次は、X、X。のみnextStationIsBoundで判定(※1) YAMANOTE / SAIKYO / JR_KYUSHU の ARRIVING は
transferLines.lengthが真のときだけ thanks メッセージを出す副次バグあり。本 issue とは別軸だが、修正時に併せて検討推奨。期待動作
「次の駅が終点 (= train が終着する駅)」かつ NEXT/ARRIVING のとき、JA/EN ともに何らかの形で「終点」を明示する。具体的なフレーズはテーマの既存スタイルに合わせる:
The next stop is X, the last stop.次は、X、終点です。The next station is X, terminal.判定ロジックの選択
現状 2 種類の boolean が混在している:
isNextStopTerminus(=useIsTerminus):stations[0]またはstations[stations.length-1]と同一かどうか (= 路線・直通系統の物理的な終点)nextStationIsBound:nextStation.groupId === selectedBound.groupId && !isLoopLine(= ユーザーが選択した行先と一致するか)両者は通常一致するが、ユーザーが中間駅を行先指定したときに乖離する。テーマごとに使い分けが分かれているのは現状そのままで OK だが、新規追加箇所は既存テーマの方針に合わせる:
isNextStopTerminusnextStationIsBound該当ファイル
リファクタ後のファイル:
src/hooks/tts/templates.tsの各テーマ NEXT/ARRIVING テンプレートテスト
既存の
src/hooks/useTTSText.test.tsxはsetupMockUseNextStation(TOEI_SHINJUKU_LINE_STATIONS[1])で固定しているため終点ケースを一切踏まない。修正時は次のテストを追加:nextStation = stations[stations.length - 1]の状態で NEXT / ARRIVING を呼び、JA/EN いずれにも「終点」/「terminal」/「last stop」相当の文字列が含まれることを検証selectedBoundを中間駅にしたケースでも検証