diff --git a/accessibility/keyboardui.js b/accessibility/keyboardui.js index e5b4e467..0543ad65 100644 --- a/accessibility/keyboardui.js +++ b/accessibility/keyboardui.js @@ -1009,9 +1009,7 @@ const ShortcutsPanel = { this.panel.addEventListener('keydown', (e) => { // Modal mode reparents the panel to
and makes it the scroll // container itself; #info-panel-body only scrolls in docked mode. - const scroller = this._modalActive - ? this.panel - : document.getElementById('info-panel-body'); + const scroller = this._modalActive ? this.panel : document.getElementById('info-panel-body'); if (e.key === 'ArrowUp') { e.preventDefault(); scroller?.scrollBy({ top: -100, behavior: 'instant' }); @@ -1055,7 +1053,6 @@ function getPlayerControls() { return [ { section: 'player_section_onscreen', - hideHeader: true, entries: [ { action: 'player_action_move', @@ -1066,21 +1063,25 @@ function getPlayerControls() { { action: 'player_action_camera_up', marks: [svgRingedChar(1)], + keys: 'R', label: translate('player_control_button').replace('%1', 1), }, - { - action: 'player_action_camera_down', - marks: [svgRingedChar(3)], - label: translate('player_control_button').replace('%1', 3), - }, { action: 'player_action_interact', marks: [svgRingedChar(2)], + keys: 'E', label: translate('player_control_button').replace('%1', 2), }, + { + action: 'player_action_camera_down', + marks: [svgRingedChar(3)], + keys: 'F', + label: translate('player_control_button').replace('%1', 3), + }, { action: 'player_action_spare', marks: [svgRingedChar(4)], + keys: 'Space', label: translate('player_control_button').replace('%1', 4), }, ], @@ -1157,7 +1158,7 @@ const PlayerPanel = { }, createPanel() { - const panel = InfoPanel.register('player', translate('player_section_onscreen'), this); + const panel = InfoPanel.register('player', translate('player_panel_title'), this); const btn = document.getElementById('info-tab-btn-player'); btn.innerHTML = ``; panel.innerHTML = ` @@ -1195,7 +1196,7 @@ const PlayerPanel = { }, renderContent() { - const title = translate('player_section_onscreen'); + const title = translate('player_panel_title'); const btn = document.getElementById('info-tab-btn-player'); btn.setAttribute('aria-label', title); btn.setAttribute('title', title); @@ -1203,9 +1204,11 @@ const PlayerPanel = { const renderControl = (entry) => { if (entry.marks) { + const keys = entry.keys ? ` / ${formatKeys(entry.keys)}` : ''; + const srText = entry.keys ? `${entry.label} ${formatKeys(entry.keys)}` : entry.label; return `${entry.label}`; + .join('')}${keys}${srText}`; } return formatKeys(entry.keys); }; @@ -1262,9 +1265,7 @@ const PlayerPanel = { this.panel.addEventListener('keydown', (e) => { // Modal mode reparents the panel to and makes it the scroll // container itself; #info-panel-body only scrolls in docked mode. - const scroller = this._modalActive - ? this.panel - : document.getElementById('info-panel-body'); + const scroller = this._modalActive ? this.panel : document.getElementById('info-panel-body'); if (e.key === 'ArrowUp') { e.preventDefault(); scroller?.scrollBy({ top: -100, behavior: 'instant' }); diff --git a/locale/de.js b/locale/de.js index 7987ebb5..37e4794b 100644 --- a/locale/de.js +++ b/locale/de.js @@ -1154,13 +1154,14 @@ export default { error_design_mode_offline: 'Der Design-Modus benötigt bei der ersten Nutzung eine Internetverbindung. Stelle eine Verbindung her und versuche es erneut.', // ai xr_mode_message: 'XR-Modus!', - fly_camera_instructions: 'ℹ️ Flugkamera, nutze Pfeiltasten und Bild auf/ab', + fly_camera_instructions: 'ℹ️ Schau dich um mit Pfeiltasten und Bild auf/ab oder Fn + ↑ ↓', fly_camera_instructions_touch: 'ℹ️ Flugkamera, nutze die Bildschirmsteuerung und ziehe zum Umsehen', select_mesh_delete_prompt: 'ℹ️ Klicke auf ein Objekt, um es zu löschen.', select_mesh_duplicate_prompt: 'ℹ️ Wähle ein Objekt zum Duplizieren aus.', place_duplicate_prompt: 'ℹ️ Klicke, um eine Kopie zu platzieren.', // AI-generated; needs validation select_mesh_eye_prompt: 'ℹ️ Klicke auf ein Objekt, um es zu umkreisen.', + orbit_mesh_info: 'ℹ️ Ziehe, um die Kamera um das Objekt zu bewegen', place_object_prompt: 'ℹ️ Klicke auf eine Fläche, um das Objekt zu platzieren.', position_readout: 'Position: {position}', eyedropper_not_supported_alert: 'Die Farbauswahl ist in Chrome/Edge auf dem Desktop verfügbar.', // ai @@ -1220,6 +1221,41 @@ export default { toolbar_redo_ui: 'Wiederholen', toolbar_zoom_out_ui: 'Verkleinern', toolbar_zoom_in_ui: 'Vergrößern', + // Player controls panel — title, sections and control names + player_panel_title: 'Spielersteuerung', + player_section_onscreen: 'Bildschirmsteuerung', + player_section_gamepad: 'Gamecontroller', + player_section_sr: 'Screenreader mit Gamecontroller', + player_action_move: 'Bewegen', + player_action_look: 'Umsehen', + player_action_turn: 'Links / rechts drehen', + player_action_camera_up: 'Kamera hoch / Taste 1', + player_action_interact: 'Interagieren / Taste 2', + player_action_camera_down: 'Kamera runter / Taste 3', + player_action_spare: 'Allgemeine Aktion / Taste 4', + player_control_arrows: 'Pfeiltasten', + player_control_button: 'Taste %1', + player_control_dpad_note: 'Bei Controllern ohne linken Stick bewegt stattdessen das Steuerkreuz.', + player_control_dpad_up: 'Szenenübersicht', + player_control_dpad_down: 'Objekt voraus', + player_control_dpad_left: 'Nächstes Objekt', + + // Player panel controls + player_decrease_font_size: 'Textgröße verringern', + player_increase_font_size: 'Textgröße erhöhen', + + // Player control key labels + gamepad_left_stick: 'Linker Stick', + gamepad_right_stick: 'Rechter Stick', + gamepad_l1_r1: 'L1 / R1', + gamepad_triangle_y: 'Dreieck / Y', + gamepad_square_x: 'Quadrat / X', + gamepad_circle_b: 'Kreis / B', + gamepad_cross_a: 'Kreuz / A', + dpad_up: 'Oben', + dpad_down: 'Unten', + dpad_left: 'Links', + // Keyboard shortcuts panel — title and close button shortcut_panel_title: 'Tastatursteuerung', shortcut_panel_close: 'Tastaturkürzel schließen', diff --git a/locale/en.js b/locale/en.js index 876def3d..fe4b98b5 100644 --- a/locale/en.js +++ b/locale/en.js @@ -1237,13 +1237,14 @@ export default { banner_reload: 'Reload', banner_dismiss: 'Dismiss', xr_mode_message: 'XR Mode!', - fly_camera_instructions: 'ℹ️ Fly camera, use arrow keys and page up/down', + fly_camera_instructions: 'ℹ️ Look around with arrow keys and Pg Up/Pg Down or Fn + ↑ ↓', fly_camera_instructions_touch: 'ℹ️ Fly camera, use the on-screen controls and drag to look around', select_mesh_delete_prompt: 'ℹ️ Click an object to delete it.', select_mesh_duplicate_prompt: 'ℹ️ Select an object to duplicate.', place_duplicate_prompt: 'ℹ️ Click to place a copy.', select_mesh_eye_prompt: 'ℹ️ Click an object to orbit around it.', + orbit_mesh_info: 'ℹ️ Drag to move the camera around the object', place_object_prompt: 'ℹ️ Click on a surface to place the object.', position_readout: 'Position: {position}', eyedropper_not_supported_alert: 'Color picking is available in Chrome/Edge on desktop.', @@ -1352,10 +1353,10 @@ export default { player_action_move: 'Move', player_action_look: 'Look around', player_action_turn: 'Turn left / right', - player_action_camera_up: 'Camera up', - player_action_interact: 'Interact', - player_action_camera_down: 'Camera down', - player_action_spare: 'General action', + player_action_camera_up: 'Camera up / Button 1', + player_action_interact: 'Interact / Button 2', + player_action_camera_down: 'Camera down / Button 3', + player_action_spare: 'General action / Button 4', player_control_arrows: 'Arrows', player_control_button: 'Button %1', player_control_dpad_note: 'On controllers without a left stick, the D-pad moves instead.', diff --git a/locale/es.js b/locale/es.js index d6faceb9..f7d750ea 100644 --- a/locale/es.js +++ b/locale/es.js @@ -1228,13 +1228,14 @@ export default { banner_reload: 'Recargar', // human banner_dismiss: 'Cerrar', // human xr_mode_message: '¡Modo XR!', // human - fly_camera_instructions: 'ℹ️ Cámara en vuelo, usa las flechas y Page Up/Down', // human + fly_camera_instructions: 'ℹ️ Mira alrededor con las flechas y Page Up/Down o Fn + ↑ ↓', // human fly_camera_instructions_touch: 'ℹ️ Cámara en vuelo, usa los controles en pantalla y arrastra para mirar alrededor', select_mesh_delete_prompt: 'ℹ️ Haz clic en un objeto para eliminarlo.', // Google translate select_mesh_duplicate_prompt: 'ℹ️ Selecciona un objeto para duplicar.', // Google (had to update it) place_duplicate_prompt: 'ℹ️ Haz clic para colocar una copia.', // AI-generated; needs validation select_mesh_eye_prompt: 'ℹ️ Haz clic en un objeto para orbitar alrededor de él.', + orbit_mesh_info: 'ℹ️ Arrastra para mover la cámara alrededor del objeto', place_object_prompt: 'ℹ️ Haz clic en una superficie para colocar el objeto.', // ai position_readout: 'Posición: {position}', // human eyedropper_not_supported_alert: @@ -1301,10 +1302,10 @@ export default { player_action_move: 'Mover', player_action_look: 'Mirar alrededor', player_action_turn: 'Girar izquierda / derecha', - player_action_camera_up: 'Cámara arriba', - player_action_interact: 'Interactuar', - player_action_camera_down: 'Cámara abajo', - player_action_spare: 'Acción general', + player_action_camera_up: 'Cámara arriba / Botón 1', + player_action_interact: 'Interactuar / Botón 2', + player_action_camera_down: 'Cámara abajo / Botón 3', + player_action_spare: 'Acción general / Botón 4', player_control_arrows: 'Flechas', player_control_button: 'Botón %1', player_control_dpad_note: 'En controles sin palanca izquierda, el D-pad se mueve en su lugar.', diff --git a/locale/fr.js b/locale/fr.js index 0da02cda..4a17281f 100644 --- a/locale/fr.js +++ b/locale/fr.js @@ -1165,13 +1165,14 @@ export default { error_design_mode_offline: 'Le mode conception nécessite une connexion Internet lors de la première utilisation. Connectez-vous à Internet et réessayez.', // ai xr_mode_message: 'Mode XR !', - fly_camera_instructions: 'ℹ️ Caméra en vol, utilisez les flèches et Page haut/bas', + fly_camera_instructions: 'ℹ️ Regardez autour avec les flèches et Page haut/bas ou Fn + ↑ ↓', fly_camera_instructions_touch: "ℹ️ Caméra en vol, utilisez les commandes à l'écran et faites glisser pour regarder autour", select_mesh_delete_prompt: 'ℹ️ Cliquez sur un objet pour le supprimer.', select_mesh_duplicate_prompt: 'ℹ️ Sélectionnez un objet à dupliquer.', place_duplicate_prompt: 'ℹ️ Cliquez pour placer une copie.', // AI-generated; needs validation select_mesh_eye_prompt: 'ℹ️ Cliquez sur un objet pour orbiter autour de lui.', + orbit_mesh_info: 'ℹ️ Glissez pour déplacer la caméra autour de l\'objet', place_object_prompt: "ℹ️ Cliquez sur une surface pour placer l'objet.", position_readout: 'Position: {position}', eyedropper_not_supported_alert: @@ -1227,6 +1228,42 @@ export default { toolbar_redo_ui: 'Rétablir', toolbar_zoom_out_ui: 'Dézoomer', toolbar_zoom_in_ui: 'Zoomer', + // Player controls panel — title, sections and control names + player_panel_title: 'Commandes du joueur', + player_section_onscreen: "Commandes à l'écran", + player_section_gamepad: 'Manette de jeu', + player_section_sr: "Lecteur d'écran avec manette de jeu", + player_action_move: 'Se déplacer', + player_action_look: 'Regarder autour', + player_action_turn: 'Tourner à gauche / droite', + player_action_camera_up: 'Caméra vers le haut / Bouton 1', + player_action_interact: 'Interagir / Bouton 2', + player_action_camera_down: 'Caméra vers le bas / Bouton 3', + player_action_spare: 'Action générale / Bouton 4', + player_control_arrows: 'Flèches', + player_control_button: 'Bouton %1', + player_control_dpad_note: + 'Sur les manettes sans joystick gauche, la croix directionnelle permet de se déplacer à la place.', + player_control_dpad_up: 'Résumé de la scène', + player_control_dpad_down: 'Objet devant', + player_control_dpad_left: 'Objet le plus proche', + + // Player panel controls + player_decrease_font_size: 'Réduire la taille du texte', + player_increase_font_size: 'Augmenter la taille du texte', + + // Player control key labels + gamepad_left_stick: 'Joystick gauche', + gamepad_right_stick: 'Joystick droit', + gamepad_l1_r1: 'L1 / R1', + gamepad_triangle_y: 'Triangle / Y', + gamepad_square_x: 'Carré / X', + gamepad_circle_b: 'Cercle / B', + gamepad_cross_a: 'Croix / A', + dpad_up: 'Haut', + dpad_down: 'Bas', + dpad_left: 'Gauche', + // Keyboard shortcuts panel — title and close button shortcut_panel_title: 'Commandes clavier', shortcut_panel_close: 'Fermer les raccourcis clavier', diff --git a/locale/it.js b/locale/it.js index 077afae8..4569233f 100644 --- a/locale/it.js +++ b/locale/it.js @@ -1175,13 +1175,14 @@ export default { error_design_mode_offline: 'La modalità progettazione richiede una connessione a internet la prima volta che la usi. Connettiti e riprova.', // ai xr_mode_message: 'Modalità XR!', - fly_camera_instructions: 'ℹ️ Telecamera volante, usa le frecce e Pag su/giù', + fly_camera_instructions: 'ℹ️ Guarda intorno con le frecce e Pag su/giù o Fn + ↑ ↓', fly_camera_instructions_touch: 'ℹ️ Telecamera volante, usa i controlli a schermo e trascina per guardarti intorno', select_mesh_delete_prompt: 'ℹ️ Clicca su un oggetto per eliminarlo.', select_mesh_duplicate_prompt: 'ℹ️ Seleziona un oggetto da duplicare.', place_duplicate_prompt: 'ℹ️ Fai clic per posizionare una copia.', // AI-generated; needs validation select_mesh_eye_prompt: 'ℹ️ Clicca su un oggetto per orbitargli attorno.', + orbit_mesh_info: 'ℹ️ Trascina per muovere la telecamera intorno all\'oggetto', place_object_prompt: "ℹ️ Fai clic su una superficie per posizionare l'oggetto.", position_readout: 'Posizione: {position}', eyedropper_not_supported_alert: @@ -1229,6 +1230,42 @@ export default { toolbar_redo_ui: 'Ripeti', toolbar_zoom_out_ui: 'Riduci zoom', toolbar_zoom_in_ui: 'Aumenta zoom', + // Player controls panel — title, sections and control names + player_panel_title: 'Controlli del giocatore', + player_section_onscreen: 'Controlli su schermo', + player_section_gamepad: 'Controller di gioco', + player_section_sr: 'Screen reader con controller di gioco', + player_action_move: 'Muovi', + player_action_look: 'Guarda intorno', + player_action_turn: 'Gira a sinistra / destra', + player_action_camera_up: 'Camera su / Pulsante 1', + player_action_interact: 'Interagisci / Pulsante 2', + player_action_camera_down: 'Camera giù / Pulsante 3', + player_action_spare: 'Azione generale / Pulsante 4', + player_control_arrows: 'Frecce', + player_control_button: 'Pulsante %1', + player_control_dpad_note: + 'Sui controller senza levetta sinistra, il D-pad si muove al suo posto.', + player_control_dpad_up: 'Riepilogo scena', + player_control_dpad_down: 'Oggetto davanti', + player_control_dpad_left: 'Oggetto più vicino', + + // Player panel controls + player_decrease_font_size: 'Riduci dimensione testo', + player_increase_font_size: 'Aumenta dimensione testo', + + // Player control key labels + gamepad_left_stick: 'Levetta sinistra', + gamepad_right_stick: 'Levetta destra', + gamepad_l1_r1: 'L1 / R1', + gamepad_triangle_y: 'Triangolo / Y', + gamepad_square_x: 'Quadrato / X', + gamepad_circle_b: 'Cerchio / B', + gamepad_cross_a: 'Croce / A', + dpad_up: 'Su', + dpad_down: 'Giù', + dpad_left: 'Sinistra', + // Keyboard shortcuts panel — title and close button shortcut_panel_title: 'Controlli da tastiera', shortcut_panel_close: 'Chiudi le scorciatoie da tastiera', diff --git a/locale/pl.js b/locale/pl.js index cb4b4d42..f9e479f4 100644 --- a/locale/pl.js +++ b/locale/pl.js @@ -1162,13 +1162,14 @@ export default { error_design_mode_offline: 'Tryb projektowania wymaga połączenia z internetem przy pierwszym użyciu. Połącz się z internetem i spróbuj ponownie.', // ai xr_mode_message: 'Tryb XR!', - fly_camera_instructions: 'ℹ️ Kamera lotu, użyj klawiszy strzałek i Page Up/Down', + fly_camera_instructions: 'ℹ️ Rozglądaj się za pomocą klawiszy strzałek i Page Up/Down lub Fn + ↑ ↓', fly_camera_instructions_touch: 'ℹ️ Kamera lotu, użyj sterowania na ekranie i przeciągnij, aby się rozejrzeć', select_mesh_delete_prompt: 'ℹ️ Kliknij obiekt, aby go usunąć.', select_mesh_duplicate_prompt: 'ℹ️ Wybierz obiekt do powielenia.', place_duplicate_prompt: 'ℹ️ Kliknij, aby umieścić kopię.', // AI-generated; needs validation select_mesh_eye_prompt: 'ℹ️ Kliknij obiekt, aby go okrążyć.', + orbit_mesh_info: 'ℹ️ Przeciągnij, aby przesunąć kamerę wokół obiektu', place_object_prompt: 'ℹ️ Kliknij na powierzchnię, aby umieścić obiekt.', position_readout: 'Pozycja: {position}', eyedropper_not_supported_alert: 'Wybieranie koloru jest dostępne w Chrome/Edge na komputerze.', // ai @@ -1221,6 +1222,42 @@ export default { toolbar_redo_ui: 'Ponów', toolbar_zoom_out_ui: 'Oddal', toolbar_zoom_in_ui: 'Przybliż', + // Player controls panel — title, sections and control names + player_panel_title: 'Sterowanie gracza', + player_section_onscreen: 'Sterowanie ekranowe', + player_section_gamepad: 'Kontroler do gier', + player_section_sr: 'Czytnik ekranu z kontrolerem do gier', + player_action_move: 'Ruch', + player_action_look: 'Rozglądanie się', + player_action_turn: 'Obrót w lewo / prawo', + player_action_camera_up: 'Kamera w górę / Przycisk 1', + player_action_interact: 'Interakcja / Przycisk 2', + player_action_camera_down: 'Kamera w dół / Przycisk 3', + player_action_spare: 'Akcja ogólna / Przycisk 4', + player_control_arrows: 'Strzałki', + player_control_button: 'Przycisk %1', + player_control_dpad_note: + 'W kontrolerach bez lewej gałki, zamiast tego ruch obsługuje krzyżak (D-pad).', + player_control_dpad_up: 'Podsumowanie sceny', + player_control_dpad_down: 'Obiekt z przodu', + player_control_dpad_left: 'Najbliższy obiekt', + + // Player panel controls + player_decrease_font_size: 'Zmniejsz rozmiar tekstu', + player_increase_font_size: 'Zwiększ rozmiar tekstu', + + // Player control key labels + gamepad_left_stick: 'Lewa gałka', + gamepad_right_stick: 'Prawa gałka', + gamepad_l1_r1: 'L1 / R1', + gamepad_triangle_y: 'Trójkąt / Y', + gamepad_square_x: 'Kwadrat / X', + gamepad_circle_b: 'Koło / B', + gamepad_cross_a: 'Krzyż / A', + dpad_up: 'W górę', + dpad_down: 'W dół', + dpad_left: 'W lewo', + // Keyboard shortcuts panel — title and close button shortcut_panel_title: 'Sterowanie klawiaturą', shortcut_panel_close: 'Zamknij skróty klawiaturowe', diff --git a/locale/pt.js b/locale/pt.js index 98b45336..3550c4ea 100644 --- a/locale/pt.js +++ b/locale/pt.js @@ -1172,13 +1172,14 @@ export default { error_design_mode_offline: 'O modo de design precisa de uma ligação à internet na primeira utilização. Ligue-se à internet e tente novamente.', // ai xr_mode_message: 'Modo XR!', - fly_camera_instructions: 'ℹ️ Câmera de voo, use as setas e Page Up/Down', + fly_camera_instructions: 'ℹ️ Olhe ao redor com as setas e Page Up/Down ou Fn + ↑ ↓', fly_camera_instructions_touch: 'ℹ️ Câmera de voo, use os controles na tela e arraste para olhar em volta', select_mesh_delete_prompt: 'ℹ️ Clique em um objeto para excluí-lo.', select_mesh_duplicate_prompt: 'ℹ️ Selecione um objeto para duplicar.', place_duplicate_prompt: 'ℹ️ Clique para posicionar uma cópia.', // AI-generated; needs validation select_mesh_eye_prompt: 'ℹ️ Clique em um objeto para orbitar ao redor dele.', + orbit_mesh_info: 'ℹ️ Arraste para mover a câmera ao redor do objeto', place_object_prompt: 'ℹ️ Clique em uma superfície para posicionar o objeto.', position_readout: 'Posição: {position}', eyedropper_not_supported_alert: @@ -1232,6 +1233,41 @@ export default { toolbar_redo_ui: 'Refazer', toolbar_zoom_out_ui: 'Reduzir zoom', toolbar_zoom_in_ui: 'Aumentar zoom', + // Player controls panel — title, sections and control names + player_panel_title: 'Controlos do jogador', + player_section_onscreen: 'Controlos no ecrã', + player_section_gamepad: 'Comando de jogo', + player_section_sr: 'Leitor de ecrã com comando de jogo', + player_action_move: 'Mover', + player_action_look: 'Olhar em redor', + player_action_turn: 'Virar à esquerda / direita', + player_action_camera_up: 'Câmara para cima / Botão 1', + player_action_interact: 'Interagir / Botão 2', + player_action_camera_down: 'Câmara para baixo / Botão 3', + player_action_spare: 'Ação geral / Botão 4', + player_control_arrows: 'Setas', + player_control_button: 'Botão %1', + player_control_dpad_note: 'Em comandos sem manípulo esquerdo, a cruzeta move-se em vez disso.', + player_control_dpad_up: 'Resumo da cena', + player_control_dpad_down: 'Objeto à frente', + player_control_dpad_left: 'Objeto mais próximo', + + // Player panel controls + player_decrease_font_size: 'Reduzir tamanho do texto', + player_increase_font_size: 'Aumentar tamanho do texto', + + // Player control key labels + gamepad_left_stick: 'Manípulo esquerdo', + gamepad_right_stick: 'Manípulo direito', + gamepad_l1_r1: 'L1 / R1', + gamepad_triangle_y: 'Triângulo / Y', + gamepad_square_x: 'Quadrado / X', + gamepad_circle_b: 'Círculo / B', + gamepad_cross_a: 'Cruz / A', + dpad_up: 'Cima', + dpad_down: 'Baixo', + dpad_left: 'Esquerda', + // Keyboard shortcuts panel — title and close button shortcut_panel_title: 'Controlos de teclado', shortcut_panel_close: 'Fechar atalhos de teclado', diff --git a/locale/sv.js b/locale/sv.js index a2420911..9bc391f0 100644 --- a/locale/sv.js +++ b/locale/sv.js @@ -1148,13 +1148,14 @@ export default { error_design_mode_offline: 'Designläget behöver en internetanslutning första gången du använder det. Anslut till internet och försök igen.', // ai xr_mode_message: 'XR-läge!', - fly_camera_instructions: 'ℹ️ Flygkamera, använd piltangenterna och Page Up/Down', + fly_camera_instructions: 'ℹ️ Titta omkring med piltangenterna och Page Up/Down eller Fn + ↑ ↓', fly_camera_instructions_touch: 'ℹ️ Flygkamera, använd skärmkontrollerna och dra för att se dig omkring', select_mesh_delete_prompt: 'ℹ️ Klicka på ett objekt för att ta bort det.', select_mesh_duplicate_prompt: 'ℹ️ Välj ett objekt att duplicera.', place_duplicate_prompt: 'ℹ️ Klicka för att placera en kopia.', // AI-generated; needs validation select_mesh_eye_prompt: 'ℹ️ Klicka på ett objekt för att kretsa runt det.', + orbit_mesh_info: 'ℹ️ Dra för att flytta kameran runt objektet', place_object_prompt: 'ℹ️ Klicka på en yta för att placera objektet.', position_readout: 'Position: {position}', eyedropper_not_supported_alert: 'Färgval är tillgängligt i Chrome/Edge på dator.', // ai @@ -1207,6 +1208,41 @@ export default { toolbar_redo_ui: 'Gör om', toolbar_zoom_out_ui: 'Zooma ut', toolbar_zoom_in_ui: 'Zooma in', + // Player controls panel — title, sections and control names + player_panel_title: 'Spelarkontroller', + player_section_onscreen: 'Skärmkontroller', + player_section_gamepad: 'Handkontroll', + player_section_sr: 'Skärmläsare med handkontroll', + player_action_move: 'Flytta', + player_action_look: 'Se dig omkring', + player_action_turn: 'Sväng vänster / höger', + player_action_camera_up: 'Kamera upp / Knapp 1', + player_action_interact: 'Interagera / Knapp 2', + player_action_camera_down: 'Kamera ner / Knapp 3', + player_action_spare: 'Allmän åtgärd / Knapp 4', + player_control_arrows: 'Pilar', + player_control_button: 'Knapp %1', + player_control_dpad_note: 'På handkontroller utan vänster spak används styrkorset istället.', + player_control_dpad_up: 'Scensammanfattning', + player_control_dpad_down: 'Objekt framför', + player_control_dpad_left: 'Närmaste objekt', + + // Player panel controls + player_decrease_font_size: 'Minska textstorlek', + player_increase_font_size: 'Öka textstorlek', + + // Player control key labels + gamepad_left_stick: 'Vänster spak', + gamepad_right_stick: 'Höger spak', + gamepad_l1_r1: 'L1 / R1', + gamepad_triangle_y: 'Triangel / Y', + gamepad_square_x: 'Kvadrat / X', + gamepad_circle_b: 'Cirkel / B', + gamepad_cross_a: 'Kryss / A', + dpad_up: 'Up', + dpad_down: 'Ner', + dpad_left: 'Vänster', + // Keyboard shortcuts panel — title and close button shortcut_panel_title: 'Tangentbordskontroller', shortcut_panel_close: 'Stäng tangentbordsgenvägar', diff --git a/style.css b/style.css index 79ee11ea..61e581aa 100644 --- a/style.css +++ b/style.css @@ -2430,6 +2430,7 @@ kbd { .pc-keys { display: flex; + align-items: center; gap: 3px; } @@ -2473,6 +2474,16 @@ kbd { height: 1.1em; } +.pc-keys kbd { + display: inline-flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + height: calc(1.4em + 2px); + padding: 0 5px; + font-size: 1em; +} + .player-controls-note { margin: 1em 0 0; font-size: 0.85em; diff --git a/ui/gizmos.js b/ui/gizmos.js index 9a8ee5fd..5888f9ab 100644 --- a/ui/gizmos.js +++ b/ui/gizmos.js @@ -962,6 +962,7 @@ export function exitGizmoState() { stopAxisKeyboard = null; clearStatus('axis'); clearStatus('camera'); + clearStatus('eye-gizmo'); // The readout belongs to the tool that took it; the next tool doesn't move it. clearStatus('position-readout'); @@ -2540,6 +2541,7 @@ function handleEyeGizmo() { const mesh = gizmoManager.attachedMesh; if (mesh && mesh.name !== 'ground') { attachOrbitView(mesh); + showStatus(translate('orbit_mesh_info'), { owner: 'eye-gizmo' }); return; } @@ -2551,6 +2553,7 @@ function handleEyeGizmo() { } attachMeshForActiveTool(pickedMesh); attachOrbitView(pickedMesh); + showStatus(translate('orbit_mesh_info'), { owner: 'eye-gizmo' }); }, false, translate('select_mesh_eye_prompt')