diff --git a/docs/translations/ja.md b/docs/translations/ja.md index 0f94a6b08..a790d329c 100644 --- a/docs/translations/ja.md +++ b/docs/translations/ja.md @@ -17,7 +17,7 @@ Translation source: abiyeenzo (#913). ## Numbers, units and dates -- Units: km, m, km/h, m/s, kt, ft, mph, hPa, MW, dB, °, % stay as written, with the English spacing (「250 km」, 「{frp} MW」, 「95 kt」). +- Units: km, m, km/h, m/s, kt, ft, mph, hPa, MW, dB, °, % stay as written, with the English spacing (「250 km」, 「{frp} MW」, 「95 kt」). Code-built cockpit distances follow this too (`cockpitUnitCase` skips the HUD upper-casing for ja, as for zh). The cockpit's own speed caption is the HUD code KT, in 対地速度 · KT and under the readout. - Time units are words written straight after the number: 秒, 分, 時間, 日 (「5分前」, 「{count}時間」, 「1時間5分」). `formatQuantity` and `formatRelativeTime` drop the space for Japanese unit words, so code-built values match the catalog. - Counters follow the thing counted: 機 (aircraft), 隻 (ships), 基 (satellites), 台 (cameras, vehicles), 局 (stations), 件 (records, results, events), か所 (sites), 個 (generic). Prefer a counter to a bare number. - Dates come from `Intl` and read year first: 2026年8月26日. Coordinates in prose are 北緯 / 東経; HUD hemisphere letters stay N, S, E, W. @@ -62,12 +62,15 @@ Translation source: abiyeenzo (#913). | track (TRK, direction over the ground) | 対地針路 | | HDG / BRG / CRS / FOV | そのまま(HUDコード) | | squawk | スコーク | +| radio failure / emergency (7600 / 7700) | 通信機故障 / 緊急事態 | | map heading / North up | 方位 / 北を上に | | Street Level / Street View (Google) | ストリートレベル / ストリートビュー | | Recent Imagery | 最近の衛星画像 | | Global Context / Context (panel) | グローバルコンテキスト / コンテキスト | | radio (station) / tune / seek | ラジオ(局)/ 選局・同調 / シーク | +| Public Safety / SAFETY (radio category) | 警察・消防 | | transit / bikeshare | 公共交通 / シェアサイクル | +| occupancy: empty / standing room only / crushed | 乗客なし / 立ち乗りのみ / 非常に混雑 | | traffic flow (TomTom) | 交通流 | | Previous / Next | 前へ / 次へ | | SIG / NEWS / LOCAL (briefing tabs) | シグナル / ニュース / ローカル | @@ -76,7 +79,8 @@ Translation source: abiyeenzo (#913). | weather model / forecast lead hours | モデル / 予報時間 | | valid (forecast time) / issued | 対象時刻 / 発表 | | radar reflectivity / lightning density | レーダー反射強度 / 雷密度 | -| cyclone, storm (NHC/CPHC) / advisory | サイクロン / 情報(第N報) | +| cyclone, storm (NHC/CPHC) / advisory | サイクロン / 情報(第N報); alone: サイクロン情報 | +| potential tropical cyclone (NHC PC) | サイクロン化のおそれがある擾乱 | | forecast uncertainty cone | 予報円 | | tropical storm / tropical depression | 熱帯暴風雨 / 熱帯低気圧 | | scene cloud / mosaic / daily overview | シーン雲量 / モザイク / 日次概観 | @@ -97,3 +101,4 @@ Translation source: abiyeenzo (#913). | roundabout / ramp / exit | ロータリー / ランプ / 出口 | | reduced motion | 動きを減らす | | NOT AN ALL-CLEAR | 安全の保証ではありません | +| … Watch (scene titles: Earth, Orbital) | 監視(地球監視, 軌道監視) | diff --git a/src/i18n/ja-display.test.mjs b/src/i18n/ja-display.test.mjs new file mode 100644 index 000000000..ade04f519 --- /dev/null +++ b/src/i18n/ja-display.test.mjs @@ -0,0 +1,21 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { setLocale } from './index.js'; +import { + cockpitUnitCase, + formatCockpitDistance, +} from '../ui/cockpitPresentation.js'; + +test('Japanese cockpit distances keep the unit in its own case', () => { + try { + setLocale('ja'); + assert.equal(formatCockpitDistance(14000), '14 km'); + assert.equal(formatCockpitDistance(9500), '9.5 km'); + assert.equal(cockpitUnitCase('km'), 'km'); + setLocale('en'); + assert.equal(formatCockpitDistance(14000), '14 KM'); + assert.equal(cockpitUnitCase('km'), 'KM'); + } finally { + setLocale('en'); + } +}); diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index b2f22124b..4020b3874 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -38,9 +38,9 @@ "Fast jet": "高速ジェット機", "Business jet": "ビジネスジェット", "Drone": "ドローン", - "General emergency": "一般緊急事態", + "General emergency": "緊急事態", "Unlawful interference": "不法妨害", - "Radio failure": "無線故障", + "Radio failure": "通信機故障", "Downed aircraft": "墜落機", "Minimum fuel": "ミニマムフューエル", "Lifeguard (medical priority)": "救急飛行(医療優先)", @@ -234,7 +234,7 @@ "Overpass timed out": "Overpassがタイムアウトしました", "Overpass could not complete the query": "Overpassがクエリを完了できませんでした", "Map tiles temporarily unavailable": "地図タイルが一時的に利用できません", - "Mapped names temporarily unavailable": "地名が一時的に利用できません", + "Mapped names temporarily unavailable": "施設名を一時的に取得できません", "Overpass temporarily unavailable": "Overpassが一時的に利用できません", "Retrying mapped sites…": "マップ済み施設を再試行中…", "Fetching mapped sites…": "マップ済み施設を取得中…", @@ -267,7 +267,7 @@ "GEO": "GEO", "Geostationary belt — comms and weather, fixed over the equator": "静止軌道帯:通信と気象、赤道上空に固定", "VISUAL": "可視", - "Brightest naked-eye objects — CelesTrak visual group": "肉眼で見える最も明るい天体(CelesTrak visualグループ)", + "Brightest naked-eye objects — CelesTrak visual group": "肉眼で見える特に明るい衛星(CelesTrak visualグループ)", "COMMS": "通信", "Broadband constellation shell — shown only in DENSE mode": "ブロードバンドコンステレーションのシェル:高密度モードでのみ表示", "FISHING": "漁船", @@ -336,7 +336,7 @@ "Awaiting telemetry...": "テレメトリー待機中…", "REC": "REC", "AIS: --": "AIS: --", - "N/A": "なし", + "N/A": "不明", "{mode} {band} {locality} | {region} | ALT {alt} | WINDOW {window} | SUN {sun}° | ONA {ona}° | {zone}": "{mode} {band} {locality} | {region} | ALT {alt} | 範囲 {window} | SUN {sun}° | ONA {ona}° | {zone}", "NEAR {poi} ({city}) {distance}": "{poi}({city})付近 {distance}", "SECTOR {lat} {lon}": "セクター {lat} {lon}", @@ -502,7 +502,7 @@ "AIS vessels": "AIS船舶", "Mapped installations": "マップ済み施設", "syncing {count} city feeds...": "{count}都市のフィードを同期中…", - "scanning nearby systems...": "周辺のシステムをスキャン中…", + "scanning nearby systems...": "周辺のシェアサイクルを検索中…", "GBFS fetch error": "GBFS取得エラー", "Station {id}": "ステーション {id}", "Station": "ステーション", @@ -519,7 +519,7 @@ "SPEC FOV {span}° (CAPABILITY)": "仕様FOV {span}°(対応画角)", "COVERAGE {value}km²": "カバー範囲 {value}km²", "OVERLAP {count} cams": "重複 {count}台", - "ISOLATED VIEW": "単独ビュー", + "ISOLATED VIEW": "重複なし", "PROJ MONITOR": "投影 モニター", "PROJ OFF": "投影 オフ", "VIEWSHED": "可視域", @@ -530,7 +530,7 @@ "Atlantic and eastern/central North Pacific; not worldwide cyclone coverage.": "大西洋と北太平洋東部・中部のみです。全世界のサイクロンを網羅するものではありません。", "Cyclone advisories unavailable": "サイクロン情報を取得できません", "Cyclone data unavailable": "サイクロンデータを取得できません", - "Potential tropical cyclone": "潜在的熱帯サイクロン", + "Potential tropical cyclone": "サイクロン化のおそれがある擾乱", "Post-tropical cyclone": "熱帯性を失ったサイクロン", "Hurricane": "ハリケーン", "Tropical storm": "熱帯暴風雨", @@ -540,8 +540,8 @@ "Track and cone match this advisory": "進路と予報円はこの情報と一致しています", "Track/cone awaiting advisory {number}": "進路/予報円は第{number}報を待機中", "Track/cone unavailable": "進路/予報円を取得できません", - "Cached advisory · stale source": "キャッシュの情報 · ソース更新遅延", - "Loading advisories…": "情報を読み込み中…", + "Cached advisory · stale source": "キャッシュのサイクロン情報 · ソース更新遅延", + "Loading advisories…": "サイクロン情報を読み込み中…", "{count} active storms": { "other": "発生中のサイクロン {count}個" }, @@ -549,7 +549,7 @@ "Maximum sustained wind: {wind} · Pressure: {pressure}": "最大持続風速:{wind} · 気圧:{pressure}", "{name} · {classification} · Advisory {number} · issued {time}": "{name} · {classification} · 第{number}報 · {time}発表", "No active NHC/CPHC systems": "NHC/CPHCが監視中のサイクロンはありません", - "Advisories unavailable": "情報を取得できません", + "Advisories unavailable": "サイクロン情報を取得できません", "Cyclones · NHC / CPHC": "サイクロン · NHC / CPHC", "Atlantic · E/C Pacific": "大西洋 · 東部/中部太平洋", "{storms} · {name} selected": "{storms} · {name}を選択中", @@ -679,8 +679,8 @@ "{distance} · {duration} · {mode} · first {count} turns": "{distance} · {duration} · {mode} · 最初の{count}件の案内", "{distance} · {duration} · {mode}": "{distance} · {duration} · {mode}", "Click the globe to place {endpoint}": "地球をクリックして{endpoint}を配置", - "SET B, then click the globe": "Bを設定してから地球をクリック", - "SET A, then click the globe": "Aを設定してから地球をクリック", + "SET B, then click the globe": "[Bを設定]を押してから地球をクリック", + "SET A, then click the globe": "[Aを設定]を押してから地球をクリック", "Step {step} of {total} · then {leg}": "ステップ {step}/{total} · 次に{leg}", "Step {step} of {total}": "ステップ {step}/{total}", "Then: {instruction}": "次:{instruction}", @@ -913,13 +913,13 @@ "Under 50% contained": "封じ込め率50%未満", "50–99% contained": "封じ込め率50–99%", "Fully contained": "封じ込め率100%", - "Colour shows reported containment. Perimeters are simplified to about 100 m.": "色は報告された封じ込め率を示します。延焼範囲は約100 mに簡略化されています。", + "Colour shows reported containment. Perimeters are simplified to about 100 m.": "色は報告された封じ込め率を示します。延焼範囲の輪郭は約100 mの精度で簡略化されています。", "Malformed perimeter snapshot": "延焼範囲スナップショットの形式が不正です", "radio tag|All": "すべて", "News": "ニュース", "Talk": "トーク", "Weather / Emergency": "気象 / 緊急", - "Public Safety": "公共安全", + "Public Safety": "警察・消防", "Aviation / Marine": "航空 / 海事", "Traffic / Transit": "交通 / 公共交通", "Music": "音楽", @@ -931,7 +931,7 @@ "radio|NEWS": "ニュース", "radio|TALK": "トーク", "radio|WEATHER": "気象", - "radio|SAFETY": "安全", + "radio|SAFETY": "警察・消防", "radio|AIR / SEA": "航空 / 海事", "radio|TRANSIT": "交通", "radio|MUSIC": "音楽", @@ -989,7 +989,7 @@ "Box edges must be finite": "範囲の端は有限の値である必要があります", "Longitudes must be within ±180°": "経度は±180°以内である必要があります", "Select one side of the dateline": "日付変更線の片側を選択してください", - "Box must enclose an area": "範囲は面積を囲む必要があります", + "Box must enclose an area": "幅と高さのある範囲を選択してください", "Add the full Starlink broadband shell (thousands of extra points)": "Starlinkブロードバンドシェル全体を追加(数千の追加ポイント)", "Loading the Starlink shell…": "Starlinkシェルを読み込み中…", "Starlink {detail} — click to retry": "Starlink {detail}:クリックで再試行", @@ -1094,11 +1094,11 @@ "OpenFreeMap tiles rate-limited": "OpenFreeMapタイルがレート制限中", "OpenFreeMap tiles timed out": "OpenFreeMapタイルがタイムアウトしました", "OpenFreeMap tiles unavailable": "OpenFreeMapタイルを利用できません", - "occupancy|empty": "空車", + "occupancy|empty": "乗客なし", "occupancy|many seats available": "空席多数", "occupancy|few seats available": "空席わずか", - "occupancy|standing room only": "立ち席のみ", - "occupancy|crushed standing room only": "満員に近い立ち席のみ", + "occupancy|standing room only": "立ち乗りのみ", + "occupancy|crushed standing room only": "非常に混雑", "occupancy|full": "満員", "occupancy|not accepting passengers": "乗車不可", "occupancy|not boardable": "乗車できません", @@ -1111,7 +1111,7 @@ "reported {speed} km/h": "報告速度 {speed} km/h", "reported hdg {heading}°": "報告方位 {heading}°", "Last report: stopped at stop {stop}": "最終報告:停留所{stop}に停車中", - "Last report: arriving at stop {stop}": "最終報告:停留所{stop}に到着中", + "Last report: arriving at stop {stop}": "最終報告:停留所{stop}に接近中", "Last report: next stop {stop}": "最終報告:次の停留所{stop}", "Shown at street level · depth not in the feed": "地表の高さで表示 · フィードに深さ情報なし", "Reported {seconds} s ago": "{seconds}秒前に報告", @@ -1379,7 +1379,7 @@ "Bhote Koshi Evidence Sequence": "Bhote Koshi証拠シーケンス", "Nepal Flood Incident": "ネパール洪水インシデント", "Global Flights Radar": "グローバル航空レーダー", - "Orbital Watch": "軌道ウォッチ", + "Orbital Watch": "軌道監視", "Thermal Threat Board": "熱源脅威ボード", "City Overload": "シティオーバーロード", "Omniscience Pullback": "オムニサイエンス・プルバック", @@ -1498,7 +1498,7 @@ "WHOT/BHOT": "WHOT/BHOT", "Ironbow": "Ironbow", "unsaved CCTV calibration": "未保存のCCTVキャリブレーション", - "the open cockpit": "開いているコックピット", + "the open cockpit": "表示中のコックピット", "Switching language reloads the page. This will be lost: {items}. Switch anyway?": "言語を切り替えるとページが再読み込みされます。次の内容は失われます:{items}。切り替えますか?", "VISUAL PRESETS": "ビジュアルプリセット", "LOCATION": "位置", @@ -1653,7 +1653,7 @@ "Noir": "ノワール", "Snow": "雪", "Current cockpit vision style: {style}. Activate for next style.": "現在のコックピットビジョンスタイル:{style}。押すと次のスタイルに切り替わります。", - "Current style: {style} — click for next": "現在のスタイル:{style} — クリックで次へ", + "Current style: {style} — click for next": "現在のスタイル:{style}。クリックで次へ", "Collapse Contact panel": "コンタクトパネルを折りたたむ", "Expand Contact panel": "コンタクトパネルを展開", "Collapse contact panel": "コンタクトパネルを折りたたむ", @@ -1730,10 +1730,10 @@ "Some KML content was left out.": "KMLの一部の内容は読み込まれませんでした。", "Press on the ground, not the sky": "空ではなく地表を押してください", "Drag to size the box": "ドラッグして範囲の大きさを決めてください", - "light {source} to use your {name} key": "{source}をオンにして{name}キーを使用", + "light {source} to use your {name} key": "{source}をオンにして{name}キーを使う", "light {source}": "{source}をオンにする", - ", or ": "、または", - "{requirement}, or {offer}": "{requirement}。または、{offer}", + ", or ": "か、", + "{requirement}, or {offer}": "{requirement}。または{offer}", "Live Flights": "ライブフライト", "Military Flights": "軍用機", "Earthquakes (24h)": "地震(24時間)", @@ -1983,7 +1983,7 @@ "Select a box or use the view": "範囲を選択するか、現在のビューを使用してください", "Searching the last 30 days": "過去30日間を検索中", "No days to show for this box": "この範囲で表示できる日がありません", - "Drag the divider · SWAP trades sides": "境界線をドラッグ · 入れ替えで左右を交換", + "Drag the divider · SWAP trades sides": "境界線をドラッグ · [入れ替え]で左右を交換", "← → preview · A or B pins the focused day": "← → でプレビュー · AまたはBで選択中の日を固定", "← → preview the other side · A or B pins it": "← → で反対側をプレビュー · AまたはBで固定", "S on another day replaces it · × unpins": "別の日でSを押すと置き換え · ×で固定を解除", @@ -2101,7 +2101,7 @@ "OVERPASS TIMED OUT": "Overpassがタイムアウト", "OVERPASS COULD NOT COMPLETE THE QUERY": "Overpassがクエリを完了できません", "MAP TILES TEMPORARILY UNAVAILABLE": "地図タイルが一時的に利用不可", - "MAPPED NAMES TEMPORARILY UNAVAILABLE": "地名が一時的に利用不可", + "MAPPED NAMES TEMPORARILY UNAVAILABLE": "施設名が一時的に利用不可", "TURNING OFF LIVE DATA": "ライブデータをオフにしています", "REFRESHING LIVE DATA": "ライブデータを更新中", "syncing road network": "道路網を同期中", @@ -2314,7 +2314,7 @@ "Automatic stop is unavailable for this voice connection.": "この音声接続では自動停止を利用できません。", "Preview is off.": "プレビューはオフです。", "Your choice applies now, but could not be saved.": "選択は適用されましたが、保存できませんでした。", - "WebRTC microphone support unavailable": "WebRTCマイクに対応していません", + "WebRTC microphone support unavailable": "このブラウザーではWebRTCでマイクを使用できません", "VOICE UNAVAILABLE": "音声利用不可", "VOICE ACTIVE": "音声 オン", "Voice session could not be started.": "音声セッションを開始できませんでした。", @@ -2421,7 +2421,7 @@ "Activate to toggle voice": "押すと音声のオン/オフを切り替え", "Voice active": "音声 オン", "Voice could not be started.": "音声を開始できませんでした。", - "the active voice session": "有効な音声セッション", + "the active voice session": "進行中の音声セッション", "{value} feet": "{value}フィート", "Fire · FRP {frp} MW": "火災 · FRP {frp} MW", "The flights layer is not enabled": "フライトレイヤーが有効になっていません", @@ -2560,7 +2560,7 @@ "DEST ---°": "目的地 ---°", "OPTICAL PLANE · 01": "光学面 · 01", "VISOR LOCK · ACTIVE": "バイザーロック · 有効", - "GROUND SPEED · KTS": "対地速度 · KTS", + "GROUND SPEED · KTS": "対地速度 · KT", "ALTITUDE · FT": "高度 · FT", "FIRST PERSON": "一人称視点", "LIVE TRACK · COURSE ALIGNED": "ライブ追跡 · 針路一致", @@ -2568,7 +2568,7 @@ "Previous cockpit vision style": "前のコックピットビジョンスタイル", "Previous vision style": "前のビジョンスタイル", "Current cockpit vision style: NORMAL. Activate for next style.": "現在のコックピットビジョンスタイル:標準。押すと次のスタイルに切り替わります。", - "Current style: NORMAL — click for next": "現在のスタイル:標準 — クリックで次へ", + "Current style: NORMAL — click for next": "現在のスタイル:標準。クリックで次へ", "CURRENT": "現在", "Next cockpit vision style": "次のコックピットビジョンスタイル", "Next vision style": "次のビジョンスタイル", @@ -2730,7 +2730,7 @@ "Sonar ring count": "ソナーのリング数", "Range": "範囲", "Sonar ring range": "ソナーのリング範囲", - "Power": "強さ", + "Power": "強度", "Sonar intensity": "ソナーの強度", "Opacity": "不透明度", "Cyber contact and label opacity": "サイバーのコンタクトとラベルの不透明度", @@ -2863,5 +2863,5 @@ "Begin with a clean globe": "まっさらな地球儀から始める", "Don't show this again": "今後表示しない", "ESC to dismiss": "ESCで閉じる", - "Tip: the GEV MIC button in the dock lets you talk to the map.": "ヒント:ドックのGEV MICボタンで地図に話しかけられます。" + "Tip: the GEV MIC button in the dock lets you talk to the map.": "ヒント:ドックの[マイク]ボタンで地図に話しかけられます。" } diff --git a/src/layers/cctv/presentation.js b/src/layers/cctv/presentation.js index e47e08194..948317b05 100644 --- a/src/layers/cctv/presentation.js +++ b/src/layers/cctv/presentation.js @@ -8,6 +8,22 @@ import { isDatasheetFov, } from './modelSpecs.js'; +/** The camera's zoom bucket (cctv model) in the HUD's view-band words. */ +function viewBandLabel(band) { + switch (band) { + case 'street': + return t('STREET', { context: 'view band' }); + case 'city': + return t('CITY', { context: 'view band' }); + case 'regional': + return t('REGIONAL', { context: 'view band' }); + case 'global': + return t('GLOBAL', { context: 'view band' }); + default: + return band.toUpperCase(); + } +} + export function createPresentation({ state: layerState, services, @@ -82,7 +98,7 @@ export function createPresentation({ : t('SRC {value}', { value: String(active.camera.feedType || 'image').toUpperCase(), }), - t('{value} CONTEXT', { value: viewBand.toUpperCase() }), + t('{value} CONTEXT', { value: viewBandLabel(viewBand) }), // Identified hardware: append the model's datasheet specs + attribution. active.camera.spec ? t('{spec} · SPECS: CCTV-DATABASE.COM', { diff --git a/src/ui/cockpitContext.js b/src/ui/cockpitContext.js index 2c65d3bf6..792dfdc2e 100644 --- a/src/ui/cockpitContext.js +++ b/src/ui/cockpitContext.js @@ -1,6 +1,6 @@ /** Contact readouts and nearby-signal presentation for the Cockpit controller. */ import * as Cesium from 'cesium'; -import { formatNumber, getLocale, t, tn } from '../i18n/index.js'; +import { formatNumber, t, tn } from '../i18n/index.js'; import { unitLabel } from './unitLabels.js'; import { bearingBetweenCoordinates, @@ -8,14 +8,17 @@ import { relativeBearing, resolveCockpitContextReadout, } from '../cockpitMath.js'; -import { formatCockpitDistance } from './cockpitPresentation.js'; +import { + cockpitUnitCase, + formatCockpitDistance, +} from './cockpitPresentation.js'; /** The Context scope line in the active language (see cockpitMath.js). */ const LOCALIZED_CONTEXT_SCOPE = Object.freeze({ window: ({ label, radiusKm }) => t('{label} · {radius} AIR/SEA WINDOW', { label, - radius: `${radiusKm === null ? '—' : formatNumber(radiusKm)}\u00a0${getLocale().startsWith('zh-') ? unitLabel('km') : unitLabel('km').toUpperCase()}`, + radius: `${radiusKm === null ? '—' : formatNumber(radiusKm)}\u00a0${cockpitUnitCase(unitLabel('km'))}`, }), installations: ({ scope, coverage }) => t('{scope} · INSTALLATIONS {coverage}', { scope, coverage }), diff --git a/src/ui/cockpitPresentation.js b/src/ui/cockpitPresentation.js index 4f3faac9d..40602c7b3 100644 --- a/src/ui/cockpitPresentation.js +++ b/src/ui/cockpitPresentation.js @@ -149,7 +149,15 @@ export function formatCockpitDistance(distanceM) { minimumFractionDigits: digits, maximumFractionDigits: digits, }); - return getLocale().startsWith('zh-') ? distance : distance.toUpperCase(); + return cockpitUnitCase(distance); +} + +/** + * Upper-case a cockpit unit the HUD way (`9.5 KM`), except in Chinese and + * Japanese, which have no case and keep units as the catalog writes them. + */ +export function cockpitUnitCase(text) { + return /^(zh|ja)(-|$)/.test(getLocale()) ? text : text.toUpperCase(); } export function formatCockpitWindDirection(value) { diff --git a/src/ui/styles/cjk.css b/src/ui/styles/cjk.css index 1315a8d23..85e3081b3 100644 --- a/src/ui/styles/cjk.css +++ b/src/ui/styles/cjk.css @@ -69,3 +69,11 @@ html:lang(ja) .recent-imagery-readout .ri-slot-value { word-break: keep-all; overflow-wrap: break-word; } + +/* Japanese layer status lines wrap at their spaces and · separators, so an + age such as 1分以内 stays whole (更新 1 / 分以内); a run too long for the + line still breaks. */ +html:lang(ja) .data-toggle-meta { + word-break: keep-all; + overflow-wrap: break-word; +}