diff --git a/services/web/app/views/layout/language-picker.pug b/services/web/app/views/layout/language-picker.pug index 217fb02a9f..50486ef0bc 100644 --- a/services/web/app/views/layout/language-picker.pug +++ b/services/web/app/views/layout/language-picker.pug @@ -17,6 +17,7 @@ li.language-picker li(role='none') a.dropdown-item( role='menuitem' + href='/set-language?lng=' + encodeURIComponent(lngCode) + '&return_to=/' data-lng=lngCode class=lngCode === currentLngCode ? 'active' : '' )= settings.translatedLanguages[lngCode] diff --git a/services/web/frontend/js/shared/context/layout-context.tsx b/services/web/frontend/js/shared/context/layout-context.tsx index 32eae290ab..7441e158ad 100644 --- a/services/web/frontend/js/shared/context/layout-context.tsx +++ b/services/web/frontend/js/shared/context/layout-context.tsx @@ -85,6 +85,17 @@ function setLayoutInLocalStorage(pdfLayout: IdeLayout) { ) } +const MOBILE_MQ = '(max-width: 767px)' + +function getInitialLayout(): IdeLayout { + const stored = localStorage.getItem('pdf.layout') + if (stored === 'vertical') return 'verticalSplit' + if (stored === 'flat') return 'flat' + if (stored === 'split') return 'sideBySide' + // No stored preference — default to vertical split on mobile + return window.matchMedia(MOBILE_MQ).matches ? 'verticalSplit' : 'sideBySide' +} + const reviewPanelStorageKey = `ui.reviewPanelOpen.${getMeta('ol-project_id')}` export const LayoutProvider: FC = ({ children }) => { @@ -196,7 +207,7 @@ export const LayoutProvider: FC = ({ children }) => { ) // whether to display the editor and preview side-by-side or full-width ("flat") - const [pdfLayout, setPdfLayout] = useState('sideBySide') + const [pdfLayout, setPdfLayout] = useState(getInitialLayout) // whether stylesheet on theme is loading const [loadingStyleSheet, setLoadingStyleSheet] = useState(false) diff --git a/services/web/frontend/stylesheets/components/footer.scss b/services/web/frontend/stylesheets/components/footer.scss index 8a61d8748a..126f143bb0 100644 --- a/services/web/frontend/stylesheets/components/footer.scss +++ b/services/web/frontend/stylesheets/components/footer.scss @@ -246,9 +246,12 @@ footer.site-footer { } .language-picker .dropdown-menu { - // Open upward — Popper.js isn't available on all page layouts + // Open upward, anchored to the right edge so it doesn't overflow off-screen + // when the picker is near the right side of the footer top: auto; bottom: 100%; + left: auto; + right: 0; margin-bottom: var(--spacing-02); .dropdown-item { diff --git a/services/web/locales/__pycache__/fix_translations.cpython-311.pyc b/services/web/locales/__pycache__/fix_translations.cpython-311.pyc new file mode 100644 index 0000000000..997420a4d3 Binary files /dev/null and b/services/web/locales/__pycache__/fix_translations.cpython-311.pyc differ diff --git a/services/web/locales/cs.json b/services/web/locales/cs.json index a5b77213d9..c801e21b49 100644 --- a/services/web/locales/cs.json +++ b/services/web/locales/cs.json @@ -337,5 +337,6 @@ "your_plan": "Váš tarif", "your_projects": "Vaše projekty", "your_subscription_has_expired": "Vaše předplatné vypršelo.", + "top_bottom_split_view": "Horní/dolní rozdělené zobrazení", "your_subscriptions": "Vaše předplatná" } diff --git a/services/web/locales/da.json b/services/web/locales/da.json index 591e726a7b..b047ed6110 100644 --- a/services/web/locales/da.json +++ b/services/web/locales/da.json @@ -2165,5 +2165,6 @@ "zotero_reference_loading_error": "Fejl, kunne ikke indlæse referencer fra Zotero", "zotero_reference_loading_error_expired": "Zotero nøgle udløbet, genforbind venligst din konto", "zotero_reference_loading_error_forbidden": "Kunne ikke indlæse referencer fra Zotero, genforbind venligst din konto og prøv igen", + "top_bottom_split_view": "Øverste/nedre delt visning", "zotero_sync_description": "Via Zotero-integrationen kan du importere dine referencer fra Zotero ind i dine __appName__-projekter." } diff --git a/services/web/locales/de.json b/services/web/locales/de.json index 2e760c2cf8..e048197014 100644 --- a/services/web/locales/de.json +++ b/services/web/locales/de.json @@ -2506,6 +2506,7 @@ "spellcheck_language": "Sprache der Rechtschreibprüfung", "spelling_and_language": "Rechtschreibung und Sprache", "split_view": "Geteilte Ansicht", + "top_bottom_split_view": "Oben/unten teilen", "sso": "SSO", "sso_account_already_linked": "Das Konto ist bereits mit einem anderen __appName__-Nutzer verknüpft", "sso_active": "SSO aktiv", diff --git a/services/web/locales/es.json b/services/web/locales/es.json index c6c50f9295..941a217cdb 100644 --- a/services/web/locales/es.json +++ b/services/web/locales/es.json @@ -2486,6 +2486,7 @@ "spellcheck_language": "Idioma del corrector ortográfico", "spelling_and_language": "Ortografía y lenguaje", "split_view": "Vista dividida", + "top_bottom_split_view": "Vista dividida arriba/abajo", "sso": "SSO", "sso_account_already_linked": "Cuenta ya vinculada a otro usuario __appName__", "sso_active": "SSO activo", diff --git a/services/web/locales/fi.json b/services/web/locales/fi.json index 8a5b7cf9da..f188bf55d7 100644 --- a/services/web/locales/fi.json +++ b/services/web/locales/fi.json @@ -343,5 +343,6 @@ "your_projects": "Sinun projektisi", "your_subscription_has_expired": "Tilauksesi on umpeutunut.", "your_subscriptions": "Tilauksesi tilaukset", + "top_bottom_split_view": "Ylä/alakerros jaettu näkymä", "zh-CN": "Kiina" } diff --git a/services/web/locales/it.json b/services/web/locales/it.json index 3d07391b2a..7ea3907d4e 100644 --- a/services/web/locales/it.json +++ b/services/web/locales/it.json @@ -2485,6 +2485,7 @@ "spellcheck_language": "Lingua del controllo ortografico", "spelling_and_language": "Ortografia e lingua", "split_view": "Visualizzazione divisa", + "top_bottom_split_view": "Vista divisa in alto/basso", "sso": "SSO", "sso_account_already_linked": "Account già collegato a un altro utente __appName__", "sso_active": "SSO attivo", diff --git a/services/web/locales/ja.json b/services/web/locales/ja.json index 9f833c15be..8098507948 100644 --- a/services/web/locales/ja.json +++ b/services/web/locales/ja.json @@ -487,5 +487,6 @@ "zotero_reference_loading_error": "エラー。Zoteroからリファレンスを読み込むことができませんでした", "zotero_reference_loading_error_expired": "Zoteroトークンの期限が切れました。アカウントを再リンクしてください", "zotero_reference_loading_error_forbidden": "Zoteroのリファレンスを読み込むことができませんでした。アカウントを再リンクして、再度お試しください", + "top_bottom_split_view": "上下分割ビュー", "zotero_sync_description": "Zoteroを統合すると、Zoteroから__appName__プロジェクトにリファレンスをインポートすることができます。" } diff --git a/services/web/locales/ko.json b/services/web/locales/ko.json index f1fa363ed6..078b51c80b 100644 --- a/services/web/locales/ko.json +++ b/services/web/locales/ko.json @@ -548,5 +548,6 @@ "your_sessions": "나의 세션", "your_subscription_has_expired": "구독이 만료되었습니다.", "your_subscriptions": "나의 구독 목록", + "top_bottom_split_view": "상하 분할 보기", "zh-CN": "中國語" } diff --git a/services/web/locales/nl.json b/services/web/locales/nl.json index 8242939708..313b95ecba 100644 --- a/services/web/locales/nl.json +++ b/services/web/locales/nl.json @@ -558,5 +558,6 @@ "zotero_is_premium": "Zotero Integratie is een premium functie", "zotero_reference_loading_error": "Error, kan referenties niet laden vanaf Mendeley", "zotero_reference_loading_error_expired": "Zotero token verlopen, gelieve je account opnieuw te koppelen", + "top_bottom_split_view": "Boven/onder gesplitst", "zotero_reference_loading_error_forbidden": "Kon referenties niet laden vanaf Zotero, gelieve je account opnieuw te koppelen en nogmaals te proberen" } diff --git a/services/web/locales/no.json b/services/web/locales/no.json index e5c2148f32..1283857f5d 100644 --- a/services/web/locales/no.json +++ b/services/web/locales/no.json @@ -389,5 +389,6 @@ "your_projects": "Dine prosjekter", "your_subscription_has_expired": "Dit abonnement har utgått.", "your_subscriptions": "Dine abonnementer", + "top_bottom_split_view": "Øvre/nedre delt visning", "zh-CN": "Kinesisk" } diff --git a/services/web/locales/pl.json b/services/web/locales/pl.json index f15de3aa75..9a10f49bad 100644 --- a/services/web/locales/pl.json +++ b/services/web/locales/pl.json @@ -228,5 +228,6 @@ "year": "rok", "your_plan": "Twój plan", "your_projects": "Twoje projekty", + "top_bottom_split_view": "Widok podzielony góra/dół", "your_subscriptions": "Twoje subskrypcje" } diff --git a/services/web/locales/pt.json b/services/web/locales/pt.json index 5402506228..2daf435949 100644 --- a/services/web/locales/pt.json +++ b/services/web/locales/pt.json @@ -658,5 +658,6 @@ "zotero_reference_loading_error": "Erro, não foi possível carregar as referências do Zotero", "zotero_reference_loading_error_expired": "O token do Zotero expirou, por favor, revincule sua conta", "zotero_reference_loading_error_forbidden": "Não foi possível carregar as referências do Zotero, por favor, revincule sua conta e tente novamente", + "top_bottom_split_view": "Divisão superior/inferior", "zotero_sync_description": "A integração Zotero permite você importar as referências do zotero para seus projetos no __appName__." } diff --git a/services/web/locales/ru.json b/services/web/locales/ru.json index 7ce5b15e70..88247e1425 100644 --- a/services/web/locales/ru.json +++ b/services/web/locales/ru.json @@ -463,5 +463,6 @@ "your_sessions": "Ваши сессии", "your_subscription_has_expired": "Срок Вашей подписки истёк.", "your_subscriptions": "Ваши подписки", + "top_bottom_split_view": "Разделить сверху/снизу", "zh-CN": "Китайский" } diff --git a/services/web/locales/sv.json b/services/web/locales/sv.json index a4f25cc1cc..d2cd26c60e 100644 --- a/services/web/locales/sv.json +++ b/services/web/locales/sv.json @@ -935,5 +935,6 @@ "zotero_reference_loading_error": "Fel, kunde inte ladda referenser från Zotero", "zotero_reference_loading_error_expired": "Zotero token har utgått, vänligen återkoppla ditt konto", "zotero_reference_loading_error_forbidden": "Kunde inte ladda referenser från Zotero, vänligen återkoppla ditt konto och försök igen", + "top_bottom_split_view": "Övre/nedre delad vy", "zotero_sync_description": "Med Zotero integrering kan du importera dina referenser direkt från Zotero till ditt __appName__ projekt." } diff --git a/services/web/locales/tr.json b/services/web/locales/tr.json index 62582ffce2..1076acf8a5 100644 --- a/services/web/locales/tr.json +++ b/services/web/locales/tr.json @@ -375,5 +375,6 @@ "your_projects": "Sizin Projeleriniz", "your_subscription_has_expired": "Aboneliğinizin süresi doldu.", "your_subscriptions": "Abonelikleriniz", + "top_bottom_split_view": "Yukarı/aşağı bölünmüş görünüm", "zh-CN": "Çince" } diff --git a/services/web/locales/zh-CN.json b/services/web/locales/zh-CN.json index 8441c9726b..1048c6b863 100644 --- a/services/web/locales/zh-CN.json +++ b/services/web/locales/zh-CN.json @@ -1911,6 +1911,7 @@ "spellcheck": "拼写检查", "spellcheck_language": "拼写检查语言", "split_view": "拆分视图", + "top_bottom_split_view": "上下分割视图", "sso": "单点登录(SSO)", "sso_account_already_linked": "帐户已链接到另一个__appName__用户", "sso_active": "SSO 激活",