diff --git a/frontend/common/lang.js b/frontend/common/lang.js
index 0bacbc9b0d..bafc1afb13 100644
--- a/frontend/common/lang.js
+++ b/frontend/common/lang.js
@@ -8,6 +8,7 @@ import {
deutsch,
ellinika,
english,
+ farsi,
french,
nederlands,
norsk_bokmål,
@@ -31,6 +32,9 @@ i18next.use(LanguageDetector).init({
en: {
translation: without_empty_keys(english),
},
+ fa: {
+ translation: without_empty_keys(farsi),
+ },
fi: {
translation: without_empty_keys(suomi),
},
@@ -90,6 +94,10 @@ export const getCurrentLanguage = () => {
return i18next.language
}
+export const getWritingDirection = () => {
+ return t("t_language_direction") === "rtl" ? "rtl" : "ltr"
+}
+
/**
* Like t, but you can interpolate Preact elements.
* @param {string} key
diff --git a/frontend/common/lang_imports.js b/frontend/common/lang_imports.js
index aa6be6cad1..bfd19e205a 100644
--- a/frontend/common/lang_imports.js
+++ b/frontend/common/lang_imports.js
@@ -8,6 +8,7 @@
export { default as deutsch } from "../lang/deutsch.json" with { type: "json" }
export { default as ellinika } from "../lang/ellinika.json" with { type: "json" }
export { default as english } from "../lang/english.json" with { type: "json" }
+export { default as farsi } from "../lang/farsi.json" with { type: "json" }
export { default as french } from "../lang/french.json" with { type: "json" }
export { default as nederlands } from "../lang/nederlands.json" with { type: "json" }
export { default as norsk_bokmål } from "../lang/norsk_bokmål.json" with { type: "json" }
diff --git a/frontend/components/CellInput.js b/frontend/components/CellInput.js
index 3c38d55e51..e43fc1c7bd 100644
--- a/frontend/components/CellInput.js
+++ b/frontend/components/CellInput.js
@@ -1024,7 +1024,13 @@ const InputContextMenu = ({
>
${open
? html`
- <${InputContextMenuItem} tag="delete" contents=${t("t_delete_cell_action")} title=${t("t_delete_cell_action")} onClick=${on_delete} setOpen=${setOpen} />
+ <${InputContextMenuItem}
+ tag="delete"
+ contents=${t("t_delete_cell_action")}
+ title=${t("t_delete_cell_action")}
+ onClick=${on_delete}
+ setOpen=${setOpen}
+ />
<${InputContextMenuItem}
title=${running_disabled ? t("t_enable_and_run_cell") : t("t_disable_this_cell_and_all_cells_that_depend_on_it")}
diff --git a/frontend/components/CellOutput.js b/frontend/components/CellOutput.js
index 40d7733034..f6e7ba288e 100644
--- a/frontend/components/CellOutput.js
+++ b/frontend/components/CellOutput.js
@@ -610,7 +610,7 @@ export let RawHTMLContainer = ({ body, className = "", persist_js_state = false,
}
}, [body, last_run_timestamp, pluto_actions, sanitize_html])
- return html``
+ return html``
}
// https://github.com/fonsp/Pluto.jl/issues/1692
diff --git a/frontend/components/Editor.js b/frontend/components/Editor.js
index 1a091b5f9e..9bf6a8bca7 100644
--- a/frontend/components/Editor.js
+++ b/frontend/components/Editor.js
@@ -47,7 +47,7 @@ import { SafePreviewUI } from "./SafePreviewUI.js"
import { open_pluto_popup } from "../common/open_pluto_popup.js"
import { get_included_external_source } from "../common/external_source.js"
import { LanguagePicker } from "./LanguagePicker.js"
-import { getCurrentLanguage, t, th } from "../common/lang.js"
+import { getCurrentLanguage, getWritingDirection, t, th } from "../common/lang.js"
// This is imported asynchronously - uncomment for development
// import environment from "../common/Environment.js"
@@ -1469,7 +1469,8 @@ ${t("t_key_autosave_description")}`
updateLang() {
const lang = this.state.notebook.metadata?.frontmatter?.language
document.documentElement.lang = lang ?? getCurrentLanguage()
- console.error("Updated lang to", document.documentElement.lang)
+ document.documentElement.dir = getWritingDirection()
+ console.error("Updated lang to", document.documentElement.lang, document.documentElement.dir)
}
componentDidMount() {
diff --git a/frontend/components/Logs.js b/frontend/components/Logs.js
index 60c4d75368..523cf7cb1c 100644
--- a/frontend/components/Logs.js
+++ b/frontend/components/Logs.js
@@ -178,5 +178,5 @@ const LogViewAnsiUp = (/** @type {{value: string}} */ { value }) => {
node_ref.current.innerHTML = ansi_to_html(value)
}, [node_ref.current, value])
- return html`
`
+ return html``
}
diff --git a/frontend/components/PkgTerminalView.js b/frontend/components/PkgTerminalView.js
index 2744bf1ccb..6292692c1d 100644
--- a/frontend/components/PkgTerminalView.js
+++ b/frontend/components/PkgTerminalView.js
@@ -17,7 +17,7 @@ const TerminalViewAnsiUp = ({ value }) => {
}, [node_ref.current, value])
return !!value
- ? html``
: null
diff --git a/frontend/components/welcome/Open.js b/frontend/components/welcome/Open.js
index 7067d4c589..06579b70f7 100644
--- a/frontend/components/welcome/Open.js
+++ b/frontend/components/welcome/Open.js
@@ -37,7 +37,7 @@ export const Open = ({ client, connected, CustomPicker, show_samples, on_start_n
return html`<${PasteHandler} on_start_navigation=${on_start_navigation} />
${picker.text}
-
+
<${FilePicker}
key=${picker.placeholder}
client=${client}
diff --git a/frontend/components/welcome/Welcome.js b/frontend/components/welcome/Welcome.js
index 1f0e44e246..95ad9f74f7 100644
--- a/frontend/components/welcome/Welcome.js
+++ b/frontend/components/welcome/Welcome.js
@@ -164,7 +164,7 @@ export const Welcome = ({ launch_params }) => {
/>
-
+
<${Featured} sources=${featured_sources} direct_html_links=${launch_params.featured_direct_html_links} />
diff --git a/frontend/editor.css b/frontend/editor.css
index 4b9f413b58..84be9a457c 100644
--- a/frontend/editor.css
+++ b/frontend/editor.css
@@ -74,6 +74,7 @@ pluto-editor {
min-width: 0;
container-type: inline-size;
container-name: editor;
+ overflow-x: clip;
}
main {
@@ -104,6 +105,7 @@ pluto-editor main {
/* Second part: push away from the right to take up all free space */ min((100% - (700px + 25px + 6px)), /* but don't do this more than */ 500px)
);
position: relative;
+ margin-left: auto;
}
pluto-notebook {
@@ -626,7 +628,7 @@ dialog#export div#container {
flex-direction: row;
display: flex;
max-width: 1000px;
- padding-right: 10em;
+ padding-inline-end: 10em;
margin: 0 auto;
position: relative;
height: var(--header-height);
@@ -684,7 +686,7 @@ dialog#export .export_small_btns {
padding: 0.9em;
border-radius: 0.9em;
position: absolute;
- right: 0.8em;
+ inset-inline-end: 0.8em;
top: 0em;
background: var(--export-bg-color);
}
@@ -789,9 +791,9 @@ nav#at_the_top > div.desktop_picker span {
color: var(--nav-filepicker-color);
border: 2px solid var(--footer-input-border-color);
border-radius: 3px;
- border-right: none;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
+ border-inline-end: none;
+ border-end-end-radius: 0;
+ border-start-end-radius: 0;
}
pluto-filepicker .cm-scroller {
@@ -924,7 +926,7 @@ nav#at_the_top:after {
nav#at_the_top > pluto-filepicker .cm-editor,
nav#at_the_top > div.desktop_picker span {
border: 2px solid transparent;
- border-right: none;
+ border-inline-end: none;
transition: border 0.15s ease-in-out;
}
nav#at_the_top > pluto-filepicker button,
@@ -937,7 +939,7 @@ nav#at_the_top:after {
header:hover > nav#at_the_top > div.desktop_picker span,
header:focus-within > nav#at_the_top > div.desktop_picker span {
border: 2px solid var(--footer-input-border-color);
- border-right: none;
+ border-inline-end: none;
}
header:hover > nav#at_the_top > pluto-filepicker button,
header:focus-within > nav#at_the_top > pluto-filepicker button,
@@ -1474,6 +1476,7 @@ pluto-input .cm-editor {
/* Make sure that scrolling an editor into view gives some breathing room */
scroll-margin-block: 20vh;
min-height: 25px;
+ direction: ltr;
}
pluto-input:focus-within .cm-editor {
/* z-index increased by 1 to make sure that the autocomplete window shows above all other editors, see https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context */
@@ -1539,7 +1542,6 @@ pluto-shoulder {
--invisible-border: calc(0.5 * var(--pluto-cell-spacing));
--shoulder-width: calc(28px + var(--invisible-border));
--border-radius: calc(5px + var(--invisible-border));
-
left: calc(0px - var(--shoulder-width));
width: var(--shoulder-width);
border-radius: var(--border-radius) 0px 0px var(--border-radius);
@@ -1553,6 +1555,7 @@ pluto-shoulder {
bottom: calc(0px - var(--invisible-border));
border: var(--invisible-border) solid rgba(0, 0, 0, 0);
border-right: none;
+ direction: ltr;
}
pluto-editor.fullscreen pluto-shoulder {
--shoulder-width: 2000px;
@@ -1934,9 +1937,8 @@ pluto-input > .input_context_menu li button {
margin-top: 1px;
background-size: var(--size) var(--size);
background-position: center;
- margin-right: calc(var(--size) / 3);
+ margin-inline-end: calc(var(--size) / 3);
}
-
.ctx_icon {
filter: var(--image-filters);
}
@@ -2533,7 +2535,7 @@ pluto-helpbox > header > button.helpbox-tab-key > .tabicon {
background-size: var(--size);
margin-bottom: calc(-0.15 * var(--size));
filter: var(--image-filters);
- margin-right: 0.6em;
+ margin-inline-end: 0.6em;
display: inline-block;
}
pluto-helpbox > header > button.helpbox-docs > .tabicon {
@@ -2686,7 +2688,7 @@ button.helpbox-tab-key {
}
button.helpbox-tab-key.helpbox-process {
- margin-right: auto;
+ margin-inline-end: auto;
}
button.helpbox-process.busy {
@@ -3094,7 +3096,7 @@ footer form > label {
}
footer form > label {
- margin-right: 1em;
+ margin-inline-end: 1em;
flex: 0 1 auto;
overflow: hidden;
text-overflow: ellipsis;
@@ -3124,16 +3126,20 @@ footer input {
background: var(--white);
font-family: inherit;
font-size: inherit;
- border-radius: 3px 0 0 3px;
+ border-radius: 3px;
+ border-end-end-radius: 0;
+ border-start-end-radius: 0;
padding: 3px;
- border-right: none;
+ border-inline-end: none;
}
header#pluto-nav pluto-filepicker button,
footer button {
margin: 0px;
background: var(--footer-filepicker-focus-color);
- border-radius: 0 3px 3px 0;
+ border-radius: 3px;
+ border-start-start-radius: 0;
+ border-end-start-radius: 0;
border: 3px solid var(--footer-filepicker-focus-color);
color: var(--footer-filepicker-button-color);
/* border: none; */
@@ -3161,7 +3167,7 @@ footer #info {
display: flex;
align-items: center;
gap: 0.5rem;
- margin-right: 1rem;
+ margin-inline-end: 1rem;
font-size: 0.75rem;
flex: 0 0 auto;
}
diff --git a/frontend/index.css b/frontend/index.css
index a6a426f393..ee43f85124 100644
--- a/frontend/index.css
+++ b/frontend/index.css
@@ -53,7 +53,7 @@ p {
}
ul {
- padding-left: 0;
+ padding-inline-start: 0;
list-style: none;
}
@@ -105,9 +105,9 @@ pluto-filepicker .cm-editor {
color: var(--nav-filepicker-color);
border: 2px solid var(--footer-filepicker-focus-color);
border-radius: 3px;
- border-right: none;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
+ border-inline-end: none;
+ border-end-end-radius: 0;
+ border-start-end-radius: 0;
flex: 1 1 auto;
width: 0px;
/* min-width: 0px; */
@@ -151,8 +151,8 @@ pluto-filepicker button,
pluto-filepicker button {
cursor: pointer;
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
+ border-start-start-radius: 0;
+ border-end-start-radius: 0;
flex: 0 1 auto;
}
@@ -257,7 +257,7 @@ body.nosessions ul#new ~ * {
#recent button {
margin: 0px;
- margin-right: 0.2em;
+ margin-inline-end: 0.2em;
padding: 1px;
opacity: 0.6;
border: none;
diff --git a/frontend/index.js b/frontend/index.js
index fc485b3e05..75f1308035 100644
--- a/frontend/index.js
+++ b/frontend/index.js
@@ -2,6 +2,7 @@ import { html, render } from "./imports/Preact.js"
import "./common/NodejsCompatibilityPolyfill.js"
import { Welcome } from "./components/welcome/Welcome.js"
+import { getCurrentLanguage, getWritingDirection } from "./common/lang.js"
const url_params = new URLSearchParams(window.location.search)
@@ -29,5 +30,8 @@ const launch_params = {
console.log("Launch parameters: ", launch_params)
+document.documentElement.lang = getCurrentLanguage()
+document.documentElement.dir = getWritingDirection()
+
// @ts-ignore
render(html`<${Welcome} launch_params=${launch_params} />`, document.querySelector("#app"))
diff --git a/frontend/lang/english.json b/frontend/lang/english.json
index 176bd948ab..4cfa453470 100644
--- a/frontend/lang/english.json
+++ b/frontend/lang/english.json
@@ -1,5 +1,6 @@
{
"t_language_name": "English",
+ "t_language_direction": "ltr",
"t_my_work": "My work",
"t_newnotebook": "Create a new notebook",
"t_welcome_to_pluto": "welcome to {{pluto}}",
diff --git a/frontend/lang/farsi.json b/frontend/lang/farsi.json
new file mode 100644
index 0000000000..e95f3727fd
--- /dev/null
+++ b/frontend/lang/farsi.json
@@ -0,0 +1,258 @@
+{
+ "t_language_name": "فارسی",
+ "t_language_direction": "rtl",
+ "t_my_work": "",
+ "t_newnotebook": "",
+ "t_welcome_to_pluto": "",
+ "t_confirmdeletencells": "",
+ "t_FORGET": "",
+ "t_live_docs_search_placeholder": "",
+ "t_live_docs_body": "",
+ "t_panel_status": "",
+ "t_panel_status_short": "",
+ "t_panel_docs": "",
+ "t_panel_docs_description": "",
+ "t_panel_status_progress": "",
+ "t_panel_status_progress_inner": "",
+ "t_panel_close": "",
+ "t_panel_popout": "",
+ "t_stop_notebook_session": "",
+ "t_shut_down_notebook": "",
+ "t_start_notebook_in_background": "",
+ "t_remove_from_recent_notebooks": "",
+ "t_loading_something": "",
+ "t_loading_something_notebook_from_clipboard": "",
+ "t_loading_something_new_notebook": "",
+ "t_open_a_notebook_action": "",
+ "t_enter_path_or_url": "",
+ "t_open_file_action": "",
+ "t_open_action": "",
+ "t_open_from_url_action": "",
+ "t_close_notebook_session": "",
+ "t_shut_down_notebook_process": "",
+ "t_loading_ellipses": "",
+ "t_notebooks": "",
+ "t_cell_input_placeholder": "",
+ "t_add_cell": "",
+ "t_drag_to_move_cell": "",
+ "t_show_hide_code": "",
+ "t_cell_disabled_in_file_tooltip": "",
+ "t_cell_indirectly_disabled_in_file_tooltip": "",
+ "t_cell_disabled_in_file_explanation": "",
+ "t_cell_indirectly_disabled_in_file_explanation": "",
+ "t_language_picker_description": "",
+ "t_refresh_to_see_language_change_confirm": "",
+ "t_anonymous_function_abbr": "",
+ "t_display_complete_type_information_of_this_function_call": "",
+ "t_multiple_expressions_in_one_cell": "",
+ "t_how_would_you_like_to_fix_it": "",
+ "t_split_this_cell_into_cells": "",
+ "t_wrap_all_code_in_a_begin_end_block": "",
+ "t_error_message_from_package": "",
+ "t_multiple_definitions_for": "",
+ "t_cyclic_references_among": "",
+ "t_combine_cells_begin_block": "",
+ "t_another_cell_defining_xs_contains_errors": "",
+ "t_error_message": "",
+ "t_stack_trace": "",
+ "t_header_list_of_syntax_errors": "",
+ "t_here_is_what_happened_the_most_recent_locations_are_first": "",
+ "t_show_stack_trace": "",
+ "t_stack_frame_location": "",
+ "t_stack_frame_this_cell": "",
+ "t_stack_frame_other_cell": "",
+ "t_stack_frame_line": "",
+ "t_show_more": "",
+ "t_motivational_words_be_creative_and_write_as_many_as_you_want": "",
+ "t_package_could_not_load": "",
+ "t_package_could_not_load_things_you_could_try": "",
+ "t_might_find_info_in_pkg_log": "",
+ "t_edit_frontmatter": "",
+ "t_start_presentation": "",
+ "t_close": "",
+ "t_export_action_ellipsis": "",
+ "t_export_category_export": "",
+ "t_export_category_record": "",
+ "t_export_card_notebook_file": "",
+ "t_export_card_notebook_file_description": "",
+ "t_export_card_static_html": "",
+ "t_export_card_static_html_description": "",
+ "t_export_card_pdf": "",
+ "t_export_card_pdf_description": "",
+ "t_export_card_record": "",
+ "t_export_card_record_description": "",
+ "t_export_card_pride_month_message": "",
+ "t_save_notebook_ellipsis": "",
+ "t_save_notebook_button_label_when_currently_not_saved": "",
+ "t_save_notebook_button_label_when_currently_saved": "",
+ "t_process_status_loading_binder": "",
+ "t_process_status_reconnecting": "",
+ "t_process_status_loading": "",
+ "t_process_restart_action": "",
+ "t_process_restart_action_required": "",
+ "t_process_restart_action_recommended": "",
+ "t_process_restarting": "",
+ "t_process_exited_restart_action": "",
+ "t_process_restart_action_short": "",
+ "t_process_give_permission_to_run_code": "",
+ "t_process_running_cells": "",
+ "t_safe_preview": "",
+ "t_safe_preview_not_executed": "",
+ "t_safe_preview_not_rendered": "",
+ "t_safe_preview_confirm_warning": "",
+ "t_safe_preview_confirm_before": "",
+ "t_safe_preview_confirm_before_danger": "",
+ "t_safe_preview_confirm_after": "",
+ "t_safe_preview_body": "",
+ "t_safe_preview_run_this_notebook": "",
+ "t_safe_preview_run_this_notebook_link": "",
+ "t_instant_feedback_ellipsis": "",
+ "t_instant_feedback_send": "",
+ "t_how_can_we_improve": "",
+ "t_FAQ": "",
+ "t_loading_cells": "",
+ "t_reading_hidden_code": "",
+ "t_enable_and_run_cell": "",
+ "t_disable_this_cell_and_all_cells_that_depend_on_it": "",
+ "t_enable_cell_action": "",
+ "t_disable_cell_action": "",
+ "t_delete_cell_action": "",
+ "t_show_logs_action": "",
+ "t_hide_logs_action": "",
+ "t_show_logs_action_description": "",
+ "t_hide_logs_action_description": "",
+ "t_copy_output_action": "",
+ "t_copy_output_action_description": "",
+ "t_enable_in_file_action": "",
+ "t_enable_in_file_action_description": "",
+ "t_disable_in_file_action": "",
+ "t_disable_in_file_action_description": "",
+ "t_interrupt_cell": "",
+ "t_save_cell": "",
+ "t_jump_cell": "",
+ "t_run_cell": "",
+ "t_help_about_tab_navigation_inside_cell": "",
+ "t_cell_is_disabled": "",
+ "t_cell_is_disabled_link": "",
+ "t_ask_ai_action": "",
+ "t_ask_ai_action_description": "",
+ "t_ai_prompt_generator_title": "",
+ "t_ai_prompt_generator_intro": "",
+ "t_ai_prompt_generator_question_input_placeholder": "",
+ "t_ai_prompt_generator_default_question_errored": "",
+ "t_copy_action": "",
+ "t_copy_action_description": "",
+ "t_copy_action_complete": "",
+ "t_copy_header_id_action_description": "",
+ "t_ai_permission_prompt_title": "",
+ "t_ai_permission_prompt_body": "",
+ "t_ai_permission_prompt_body_2": "",
+ "t_dont_ask_again": "",
+ "t_no": "",
+ "t_yes": "",
+ "t_ai_accept_and_close": "",
+ "t_ai_decline_and_close": "",
+ "t_ai_accept_and_run": "",
+ "t_ai_accept_and_run_description": "",
+ "t_ai_reject_and_revert": "",
+ "t_ai_reject": "",
+ "t_ai_loading": "",
+ "t_ai_syntax_fix_failed": "",
+ "t_ai_fix_syntax_with_ai": "",
+ "t_ai_fix_syntax_with_ai_description": "",
+ "t_confirm_delete_multiple_cells": "",
+ "t_confirm_delete_multiple_interrupt_notebook": "",
+ "t_confirm_move_file": "",
+ "t_oopsie_pls_refresh": "",
+ "t_key_run": "",
+ "t_key_run_add": "",
+ "t_key_submit_all_changes": "",
+ "t_key_delete_or_backspace": "",
+ "t_key_page_up": "",
+ "t_key_page_down": "",
+ "t_key_ctrl_click": "",
+ "t_key_alt_up": "",
+ "t_key_alt_down": "",
+ "t_key_ctrl_slash": "",
+ "t_key_ctrl_m": "",
+ "t_key_ctrl_q": "",
+ "t_key_ctrl_c": "",
+ "t_key_ctrl_x": "",
+ "t_key_ctrl_v": "",
+ "t_key_autosave_description": "",
+ "t_key_selection_description": "",
+ "t_key_or": "",
+ "t_navigate_to_previous_page": "",
+ "t_bonds_static_warning": "",
+ "t_bonds_static_warning_inner": "",
+ "t_edit_or_run_this_notebook": "",
+ "t_edit_or_run_view_code": "",
+ "t_edit_or_run_view_code_cancel": "",
+ "t_edit_or_run_description_1": "",
+ "t_edit_or_run_description_2": "",
+ "t_binder_help_text_title": "",
+ "t_binder_help_text": "",
+ "t_edit_or_run_runtime": "",
+ "t_edit_or_run_local": "",
+ "t_edit_or_run_local_description": "",
+ "t_edit_or_run_download_notebook": "",
+ "t_edit_or_run_copy_notebook_url": "",
+ "t_edit_or_run_run_pluto": "",
+ "t_edit_or_run_run_pluto_description": "",
+ "t_edit_or_run_open_the_notebook_file": "",
+ "t_edit_or_run_open_the_notebook_file_description": "",
+ "t_edit_or_run_paste_url_in_the_open_box": "",
+ "t_time_minutes_one": "",
+ "t_time_minutes_other": "",
+ "t_time_seconds_one": "",
+ "t_time_seconds_other": "",
+ "t_frontmatter_title": "",
+ "t_frontmatter_description": "",
+ "t_frontmatter_synchronized": "",
+ "t_frontmatter_delete_field": "",
+ "t_frontmatter_add_field": "",
+ "t_frontmatter_add_author": "",
+ "t_frontmatter_cancel": "",
+ "t_frontmatter_save": "",
+ "t_frontmatter_preview": "",
+ "t_frontmatter_language_placeholder": "",
+ "t_logs_truncated": "",
+ "t_logs_stdout": "",
+ "t_logs_click_for_more_info": "",
+ "t_ready_notif_title": "",
+ "t_ready_notif_body": "",
+ "t_ready_notif": "",
+ "t_ready_notif_permission": "",
+ "t_pkg_disables_str": "",
+ "t_pkg_stdlib": "",
+ "t_pkg_will_be_installed": "",
+ "t_pkg_is_installing": "",
+ "t_pkg_is_installed": "",
+ "t_pkg_not_found": "",
+ "t_pkg_will_be_installed_in_notebook": "",
+ "t_pkg_installation_can_take": "",
+ "t_pkg_update_packages": "",
+ "t_pkg_update_packages_description": "",
+ "t_pkg_currently_busy": "",
+ "t_pkg_toggle_terminal": "",
+ "t_pkg_go_to_help": "",
+ "t_save_all_changes": "",
+ "t_save_all_changes_description": "",
+ "t_file_change_detected": "",
+ "t_file_saved": "",
+ "t_recording_ui_start_recording": "",
+ "t_recording_ui_start_recording_muted": "",
+ "t_recording_ui_stop_recording": "",
+ "t_recording_ui_back_to_recording": "",
+ "t_presentation_previous_slide": "",
+ "t_presentation_next_slide": "",
+ "t_status_names": "",
+ "t_tree_show_more_items": "",
+ "t_table_no_columns": "",
+ "t_table_no_rows": "",
+ "t_undo_delete_one": "",
+ "t_undo_delete_other": "",
+ "t_undo_delete_link": "",
+ "t_auto_disabled": "",
+ "t_auto_disabled_link": ""
+}
\ No newline at end of file
diff --git a/frontend/treeview.css b/frontend/treeview.css
index 68bd6bba95..0d5a714093 100644
--- a/frontend/treeview.css
+++ b/frontend/treeview.css
@@ -24,6 +24,7 @@ pluto-tree-items {
display: inline-flex;
flex-direction: column;
align-items: flex-start;
+ direction: ltr;
}
pluto-tree.collapsed,
pluto-tree.collapsed pluto-tree,