diff --git a/README.md b/README.md
index 1fb4e0b95..5b96a65d8 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
    
diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css
index 653eca57f..02e6af9cf 100644
--- a/apps/client/src/stylesheets/style.css
+++ b/apps/client/src/stylesheets/style.css
@@ -1979,6 +1979,10 @@ body.electron.platform-darwin:not(.native-titlebar) .tab-row-container {
     -webkit-app-region: drag;
 }
 
+body.electron.platform-darwin:not(.native-titlebar) #tab-row-left-spacer {
+    width: 80px;
+}
+
 .tab-row-widget {
     padding-inline-end: calc(100vw - env(titlebar-area-width, 100vw));
 }
diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css
index 7797e3a80..8e2f8a9a7 100644
--- a/apps/client/src/stylesheets/theme-next/shell.css
+++ b/apps/client/src/stylesheets/theme-next/shell.css
@@ -100,7 +100,7 @@ body.layout-horizontal > .horizontal {
     align-items: center;
 }
 
-#launcher-container {
+body[dir=ltr] #launcher-container {
     scrollbar-gutter: stable both-edges;
 }
 
diff --git a/apps/client/src/translations/sv/translation.json b/apps/client/src/translations/sv/translation.json
index 0967ef424..c5ec9a096 100644
--- a/apps/client/src/translations/sv/translation.json
+++ b/apps/client/src/translations/sv/translation.json
@@ -1 +1,8 @@
-{}
+{
+  "about": {
+    "title": "Om Trilium Notes",
+    "homepage": "Hemsida:",
+    "app_version": "App version:",
+    "db_version": "DB version:"
+  }
+}
diff --git a/apps/client/src/widgets/react/Dropdown.tsx b/apps/client/src/widgets/react/Dropdown.tsx
index e35584422..866a138b8 100644
--- a/apps/client/src/widgets/react/Dropdown.tsx
+++ b/apps/client/src/widgets/react/Dropdown.tsx
@@ -1,11 +1,10 @@
 import { Dropdown as BootstrapDropdown } from "bootstrap";
 import { ComponentChildren } from "preact";
-import { CSSProperties } from "preact/compat";
+import { CSSProperties, HTMLProps } from "preact/compat";
 import { useCallback, useEffect, useRef, useState } from "preact/hooks";
 import { useUniqueName } from "./hooks";
 
-export interface DropdownProps {
-    className?: string;
+export interface DropdownProps extends Pick, "id" | "className"> {
     buttonClassName?: string;
     isStatic?: boolean;
     children: ComponentChildren;
@@ -22,7 +21,7 @@ export interface DropdownProps {
     forceShown?: boolean;
 }
 
-export default function Dropdown({ className, buttonClassName, isStatic, children, title, text, dropdownContainerStyle, dropdownContainerClassName, hideToggleArrow, iconAction, disabled, noSelectButtonStyle, noDropdownListStyle, forceShown }: DropdownProps) {
+export default function Dropdown({ id, className, buttonClassName, isStatic, children, title, text, dropdownContainerStyle, dropdownContainerClassName, hideToggleArrow, iconAction, disabled, noSelectButtonStyle, noDropdownListStyle, forceShown }: DropdownProps) {
     const dropdownRef = useRef(null);
     const triggerRef = useRef(null);
 
@@ -74,7 +73,7 @@ export default function Dropdown({ className, buttonClassName, isStatic, childre
                 aria-haspopup="true"
                 aria-expanded="false"
                 title={title}
-                id={ariaId}
+                id={id ?? ariaId}
                 disabled={disabled}
             >
                 {text}
diff --git a/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx b/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx
index b7ef4fa0e..11a843233 100644
--- a/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx
+++ b/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx
@@ -5,7 +5,7 @@ import { FormDropdownDivider, FormListBadge, FormListItem } from "../react/FormL
 import { getAvailableLocales, t } from "../../services/i18n";
 import { useNoteLabel, useNoteLabelBoolean, useNoteProperty, useTriliumEvent, useTriliumOption } from "../react/hooks";
 import mime_types from "../../services/mime_types";
-import { Locale, NoteType, ToggleInParentResponse } from "@triliumnext/commons";
+import { Locale, LOCALES, NoteType, ToggleInParentResponse } from "@triliumnext/commons";
 import server from "../../services/server";
 import dialog from "../../services/dialog";
 import FormToggle from "../react/FormToggle";
@@ -20,6 +20,7 @@ import { TabContext } from "./ribbon-interface";
 import Modal from "../react/Modal";
 import { CodeMimeTypesList } from "../type_widgets/options/code_notes";
 import { ContentLanguagesList } from "../type_widgets/options/i18n";
+import { LocaleSelector } from "../type_widgets/options/components/LocaleSelector";
 
 export default function BasicPropertiesTab({ note }: TabContext) {
     return (
@@ -290,68 +291,31 @@ function NoteLanguageSwitch({ note }: { note?: FNote | null }) {
         id: "",
         name: t("note_language.not_set")
     };
-
     const [ currentNoteLanguage, setCurrentNoteLanguage ] = useNoteLabel(note, "language");
     const [ modalShown, setModalShown ] = useState(false);
-
     const locales = useMemo(() => {
         const enabledLanguages = JSON.parse(languages ?? "[]") as string[];
         const filteredLanguages = getAvailableLocales().filter((l) => typeof l !== "object" || enabledLanguages.includes(l.id));
-        const leftToRightLanguages = filteredLanguages.filter((l) => !l.rtl);
-        const rightToLeftLanguages = filteredLanguages.filter((l) => l.rtl);
-
-        let locales: ("---" | Locale)[] = [
-            DEFAULT_LOCALE
-        ];
-
-        if (leftToRightLanguages.length > 0) {
-            locales = [
-                ...locales,
-                "---",
-                ...leftToRightLanguages
-            ];
-        }
-
-        if (rightToLeftLanguages.length > 0) {
-            locales = [
-                ...locales,
-                "---",
-                ...rightToLeftLanguages
-            ];
-        }
-
-        // This will separate the list of languages from the "Configure languages" button.
-        // If there is at least one language.
-        locales.push("---");
-        return locales;
+        return filteredLanguages;
     }, [ languages ]);
 
-    const currentLocale = useMemo(() => {
-        return locales.find(locale => typeof locale === "object" && locale.id === currentNoteLanguage) as Locale | undefined;
-    }, [ currentNoteLanguage ]);
-
     return (
         
             {t("basic_properties.language")}:
              
-            
-                {locales.map(locale => {
-                    if (typeof locale === "object") {
-                        const checked = locale.id === (currentNoteLanguage ?? "");
-                        return  setCurrentNoteLanguage(locale.id || null)}
-                        >{locale.name}
-                    } else {
-                        return 
-                    }
-                })}
+             setModalShown(true)}
+                        icon="bx bx-cog"
+                    >{t("note_language.configure-languages")}
+                )}
+            >
 
-                 setModalShown(true)}
-                >{t("note_language.configure-languages")}
-            
+            
 
             
 
@@ -364,7 +328,7 @@ function NoteLanguageSwitch({ note }: { note?: FNote | null }) {
                 
             
         
-    )
+    );
 }
 
 function findTypeTitle(type?: NoteType, mime?: string | null) {
diff --git a/apps/client/src/widgets/type_widgets/options/components/LocaleSelector.tsx b/apps/client/src/widgets/type_widgets/options/components/LocaleSelector.tsx
new file mode 100644
index 000000000..0161ae6a8
--- /dev/null
+++ b/apps/client/src/widgets/type_widgets/options/components/LocaleSelector.tsx
@@ -0,0 +1,63 @@
+import { Locale } from "@triliumnext/commons";
+import Dropdown from "../../../react/Dropdown";
+import { FormDropdownDivider, FormListItem } from "../../../react/FormList";
+import { ComponentChildren } from "preact";
+import { useMemo, useState } from "preact/hooks";
+
+export function LocaleSelector({ id, locales, currentValue, onChange, defaultLocale, extraChildren }: {
+    id?: string;
+    locales: Locale[],
+    currentValue: string,
+    onChange: (newLocale: string) => void,
+    defaultLocale?: Locale,
+    extraChildren?: ComponentChildren
+}) {
+    const [ activeLocale, setActiveLocale ] = useState(defaultLocale?.id === currentValue ? defaultLocale : locales.find(l => l.id === currentValue));
+    console.log("defaultLocale ", defaultLocale, currentValue, activeLocale)
+
+    const processedLocales = useMemo(() => {
+        const leftToRightLanguages = locales.filter((l) => !l.rtl);
+        const rightToLeftLanguages = locales.filter((l) => l.rtl);
+
+        let items: ("---" | Locale)[] = [];
+        if (defaultLocale) items.push(defaultLocale);
+
+        if (leftToRightLanguages.length > 0) {
+            if (items.length > 0) items.push("---");
+            items = [ ...items, ...leftToRightLanguages ];
+        }
+
+        if (rightToLeftLanguages.length > 0) {
+            items = [
+                ...items,
+                "---",
+                ...rightToLeftLanguages
+            ];
+        }
+
+        if (extraChildren) {
+            items.push("---");
+        }
+        return items;
+    }, [ locales ]);
+
+    return (
+        
+            {processedLocales.map(locale => {
+                if (typeof locale === "object") {
+                    return  {
+                            setActiveLocale(locale);
+                            onChange(locale.id);
+                        }}
+                    >{locale.name}
+                } else {
+                    return 
+                }
+            })}
+            {extraChildren}
+        
+    )
+}
diff --git a/apps/client/src/widgets/type_widgets/options/components/OptionsRow.css b/apps/client/src/widgets/type_widgets/options/components/OptionsRow.css
index 98778b96e..6eeaa1074 100644
--- a/apps/client/src/widgets/type_widgets/options/components/OptionsRow.css
+++ b/apps/client/src/widgets/type_widgets/options/components/OptionsRow.css
@@ -10,10 +10,16 @@
     margin-bottom: 0 !important;
 }
 
-.option-row > select {
+.option-row > select,
+.option-row > .dropdown {
     width: 60%;
 }
 
+.option-row > .dropdown button {
+    width: 100%;
+    text-align: start;
+}
+
 .option-row:last-of-type {
     border-bottom: unset;
 }
diff --git a/apps/client/src/widgets/type_widgets/options/i18n.tsx b/apps/client/src/widgets/type_widgets/options/i18n.tsx
index 4e6ec61e8..36a0a1100 100644
--- a/apps/client/src/widgets/type_widgets/options/i18n.tsx
+++ b/apps/client/src/widgets/type_widgets/options/i18n.tsx
@@ -5,13 +5,14 @@ import OptionsRow from "./components/OptionsRow";
 import OptionsSection from "./components/OptionsSection";
 import { useTriliumOption, useTriliumOptionJson } from "../../react/hooks";
 import type { Locale } from "@triliumnext/commons";
-import { isElectron, restartDesktopApp } from "../../../services/utils";
-import FormRadioGroup, { FormInlineRadioGroup } from "../../react/FormRadioGroup";
+import { restartDesktopApp } from "../../../services/utils";
+import FormRadioGroup from "../../react/FormRadioGroup";
 import FormText from "../../react/FormText";
 import RawHtml from "../../react/RawHtml";
 import Admonition from "../../react/Admonition";
 import Button from "../../react/Button";
 import CheckboxList from "./components/CheckboxList";
+import { LocaleSelector } from "./components/LocaleSelector";
 
 export default function InternationalizationOptions() {
     return (
@@ -32,7 +33,6 @@ function LocalizationOptions() {
                 return true;
             }),
             formattingLocales: [
-                { id: "", name: t("i18n.formatting-locale-auto") },
                 ...allLocales.filter(locale => locale.electronLocale)
             ]
         }
@@ -48,7 +48,7 @@ function LocalizationOptions() {
             
 
             {
-                
+                
             }
 
             
@@ -56,15 +56,6 @@ function LocalizationOptions() {
     )
 }
 
-function LocaleSelector({ id, locales, currentValue, onChange }: { id?: string; locales: Locale[], currentValue: string, onChange: (newLocale: string) => void }) {
-    return ;
-}
-
 function DateSettings() {
     const [ firstDayOfWeek, setFirstDayOfWeek ] = useTriliumOption("firstDayOfWeek");
     const [ firstWeekOfYear, setFirstWeekOfYear ] = useTriliumOption("firstWeekOfYear");
diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts
index 52ebe458b..a94709107 100644
--- a/apps/desktop/src/main.ts
+++ b/apps/desktop/src/main.ts
@@ -12,6 +12,7 @@ import { deferred } from "@triliumnext/server/src/services/utils.js";
 import { PRODUCT_NAME } from "./app-info";
 import port from "@triliumnext/server/src/services/port.js";
 import { join } from "path";
+import { LOCALES } from "../../../packages/commons/src";
 
 async function main() {
     const userDataPath = getUserData();
@@ -30,7 +31,7 @@ async function main() {
 
     // needed for excalidraw export https://github.com/zadam/trilium/issues/4271
     app.commandLine.appendSwitch("enable-experimental-web-platform-features");
-    app.commandLine.appendSwitch("lang", options.getOptionOrNull("formattingLocale") || options.getOptionOrNull("locale") || "en");
+    app.commandLine.appendSwitch("lang", getElectronLocale());
 
     // Disable smooth scroll if the option is set
     const smoothScrollEnabled = options.getOptionOrNull("smoothScrollEnabled");
@@ -128,4 +129,15 @@ async function onReady() {
     await windowService.registerGlobalShortcuts();
 }
 
+function getElectronLocale() {
+    const uiLocale = options.getOptionOrNull("locale");
+    const formattingLocale = options.getOptionOrNull("formattingLocale");
+    const correspondingLocale = LOCALES.find(l => l.id === uiLocale);
+
+    // For RTL, we have to force the UI locale to align the window buttons properly.
+    if (formattingLocale && !correspondingLocale?.rtl) return formattingLocale;
+
+    return uiLocale || "en"
+}
+
 main();
diff --git a/apps/server/src/assets/translations/sv/server.json b/apps/server/src/assets/translations/sv/server.json
index 0967ef424..0fc334731 100644
--- a/apps/server/src/assets/translations/sv/server.json
+++ b/apps/server/src/assets/translations/sv/server.json
@@ -1 +1,7 @@
-{}
+{
+  "keyboard_actions": {
+    "back-in-note-history": "Gå till föregående anteckning i historiken",
+    "forward-in-note-history": "Gå till nästa anteckning i historiken",
+    "open-jump-to-note-dialog": "Öppna \"Hoppa till anteckning\" dialog"
+  }
+}
diff --git a/apps/website/public/translations/sv/translation.json b/apps/website/public/translations/sv/translation.json
index 0967ef424..46df51fba 100644
--- a/apps/website/public/translations/sv/translation.json
+++ b/apps/website/public/translations/sv/translation.json
@@ -1 +1,7 @@
-{}
+{
+    "get-started": {
+        "title": "Kom igång",
+        "desktop_title": "Ladda ner skrivbordsprogrammet (v{{version}})",
+        "architecture": "Arkitektur:"
+    }
+}
diff --git a/docs/README-ZH_CN.md b/docs/README-ZH_CN.md
index 2efbd4f83..ea0609311 100644
--- a/docs/README-ZH_CN.md
+++ b/docs/README-ZH_CN.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-ZH_TW.md b/docs/README-ZH_TW.md
index 4c1a21e3b..510945e78 100644
--- a/docs/README-ZH_TW.md
+++ b/docs/README-ZH_TW.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-ar.md b/docs/README-ar.md
index 88d7e3616..788884f36 100644
--- a/docs/README-ar.md
+++ b/docs/README-ar.md
@@ -1,3 +1,14 @@
+
+
+
+
 # ملاحظات تريليوم
 
 
diff --git a/docs/README-ca.md b/docs/README-ca.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-ca.md
+++ b/docs/README-ca.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-cs.md b/docs/README-cs.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-cs.md
+++ b/docs/README-cs.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-de.md b/docs/README-de.md
index eb510193f..fc4e6714b 100644
--- a/docs/README-de.md
+++ b/docs/README-de.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-el.md b/docs/README-el.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-el.md
+++ b/docs/README-el.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-es.md b/docs/README-es.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-es.md
+++ b/docs/README-es.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-fa.md b/docs/README-fa.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-fa.md
+++ b/docs/README-fa.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-fi.md b/docs/README-fi.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-fi.md
+++ b/docs/README-fi.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-fr.md b/docs/README-fr.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-fr.md
+++ b/docs/README-fr.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-hr.md b/docs/README-hr.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-hr.md
+++ b/docs/README-hr.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-hu.md b/docs/README-hu.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-hu.md
+++ b/docs/README-hu.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-id.md b/docs/README-id.md
index fd392b472..77a947acf 100644
--- a/docs/README-id.md
+++ b/docs/README-id.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-it.md b/docs/README-it.md
index c24005f3e..260cd3a72 100644
--- a/docs/README-it.md
+++ b/docs/README-it.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-ja.md b/docs/README-ja.md
index e6d048523..f5caa13c0 100644
--- a/docs/README-ja.md
+++ b/docs/README-ja.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-ko.md b/docs/README-ko.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-ko.md
+++ b/docs/README-ko.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-md.md b/docs/README-md.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-md.md
+++ b/docs/README-md.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-nb_NO.md b/docs/README-nb_NO.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-nb_NO.md
+++ b/docs/README-nb_NO.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-nl.md b/docs/README-nl.md
index 1f2141a28..933374ee3 100644
--- a/docs/README-nl.md
+++ b/docs/README-nl.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-pl.md b/docs/README-pl.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-pl.md
+++ b/docs/README-pl.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-pt.md b/docs/README-pt.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-pt.md
+++ b/docs/README-pt.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-pt_BR.md b/docs/README-pt_BR.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-pt_BR.md
+++ b/docs/README-pt_BR.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-ro.md b/docs/README-ro.md
index 37a4f5683..b46d9447a 100644
--- a/docs/README-ro.md
+++ b/docs/README-ro.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-ru.md b/docs/README-ru.md
index 40e79d56a..5796e023b 100644
--- a/docs/README-ru.md
+++ b/docs/README-ru.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-sl.md b/docs/README-sl.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-sl.md
+++ b/docs/README-sl.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-sr.md b/docs/README-sr.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-sr.md
+++ b/docs/README-sr.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-sv.md b/docs/README-sv.md
index b9195eb18..daf23eb4b 100644
--- a/docs/README-sv.md
+++ b/docs/README-sv.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-tr.md b/docs/README-tr.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-tr.md
+++ b/docs/README-tr.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-uk.md b/docs/README-uk.md
index 348eb9d3e..586045a29 100644
--- a/docs/README-uk.md
+++ b/docs/README-uk.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/docs/README-vi.md b/docs/README-vi.md
index 67a70c0bf..0c3f5a796 100644
--- a/docs/README-vi.md
+++ b/docs/README-vi.md
@@ -1,3 +1,14 @@
+
+
+
+
 # Trilium Notes
 
 
diff --git a/packages/commons/src/lib/i18n.ts b/packages/commons/src/lib/i18n.ts
index 8e408f2e6..f6a205d34 100644
--- a/packages/commons/src/lib/i18n.ts
+++ b/packages/commons/src/lib/i18n.ts
@@ -47,7 +47,6 @@ const UNSORTED_LOCALES = [
         id: "ar",
         name: "اَلْعَرَبِيَّةُ",
         rtl: true,
-        devOnly: true,
         electronLocale: "ar"
     },
     { // Hebrew