From 41bbaf51bf6aa08c1366194c331a112fc27706a7 Mon Sep 17 00:00:00 2001 From: Dmitrii Khlapov Date: Sun, 11 Oct 2026 17:53:41 +0200 Subject: [PATCH] i18n: add Russian (ru) interface translation (#300) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * I18N.et: add Estonian interface translation * I18N.et: record the verified headless fork push step * i18n: send interface text that skipped translation through the catalog A test-only pseudo-language wraps every catalog lookup in ⟦…⟧ marks; a new audit test lays the app out in it (every tab, File page, dialog and pane, the right-click menu, and a hover and a click on every ribbon control, including the Table and Equation tabs) and fails on any visible text outside the marks. The document is drawn as an image, so only interface text is checked; document text, font and style names, shortcuts, icon lettering, contributor handles and command error messages are allowed. What it found, now translated in every language that has the strings: - Right-click menu items (Cut, Paste, Font…, Paragraph…, Link…, New Comment). - Paragraph dialog: the alignment choices showed code values (`left`); the label now sits before the dropdown. - Table Design › Table Style Options checkboxes. - Table Layout › Alignment tooltips showed code values (`topLeft`). - Design › Fonts: the theme's name is translated, its font names are not. - `pt` units, the Insert › Table grid label, the default watermark text, the font dialog's preview sample, and the untitled document's name. - Contributors and Models dialogs: headings, sort and name choices, summary. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n: add Russian (ru) interface translation - ru.tsv: 1,068 entries covering every interface string, written clean-room from the English labels and reviewed by a native speaker. `ru`, `ru-RU`, `ru_RU.UTF-8` and other regions resolve to it; File > Options picks it by hand. - Built-in style names (Normal, Heading 2, TOC 3, Strong…) show in the interface language in the Styles gallery, the Styles pane and the Style Inspector. Display only: documents, commands and saved files keep the English names, and styles the author made keep theirs. - Rendered previews use the interface language: the Styles gallery samples (`АаБбВвГг`) and the Design tab's style-set tiles. - Catalogs gain a `preview` context for sample text that must fit a small tile (`Title` is «Заголовок» as a style but «Пример» in the tiles); it falls back to the plain entry, and unknown contexts are still rejected. - Tests: locale detection and saved preference, full coverage, Cyrillic glyphs in the bundled interface fonts, style-name display, catalog contexts. Co-Authored-By: Claude Opus 5.5 * i18n(ru): translate everything the interface audit finds Adds 356 Russian entries: the equation gallery (categories, templates and built-in equations), equation options, themes, watermark presets, paper sizes, table styles, greetings, outline levels, the strings #313 routes through the catalog, and the new AutoSave messages. The two rows #305 made obsolete (📂 Browse…, ➕ New comment) are gone. The interface audit now also fails when a string it sees translated has no Russian entry, so Russian stays complete as the interface grows. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * Draw Table and Eraser: draw tables and split or merge cells with a pen (#303) Insert › Tables › Draw Table and Table Layout › Draw › Draw Table / Eraser. table.draw takes a pen stroke in page points: a rectangle outside a table inserts a one-cell table of that size at the paragraph under its start; a straight vertical or horizontal line inside a table splits the cells it crosses (new grid column or row; untouched cells span it). table.eraser merges the two cells beside the border nearest a point. Each stroke is one undo step. In the app the buttons toggle pen and eraser modes with a live preview, a crosshair with the tool's icon, and Esc to stop; canvas clicks don't move the caret while a tool is on. Splitting through part of a vertically merged cell and erasing beside one are refused with a clear error. Catalog 384/430 -> 387/430. Co-Authored-By: Claude Opus 5.5 * Draw tab: pen, pencil and highlighter ink, stroke eraser and Hide Ink (#307) Ink strokes are floating freeform shapes: a new Freeform geometry (paths in shape-local coordinates, opacity, and the pen that drew it) on InlineObject::Shape with ShapeKind::Freeform. draw.stroke inserts one anchored to the paragraph under the first point (one undo step; points capped per stroke, strokes capped per page, NaN dropped); draw.erase / draw.eraser with a point deletes the stroke under it; draw.pen, draw.pencil, draw.highlighter, draw.eraser and draw.select set the Draw tab's tool in the session view state; review.hideInk toggles showing ink on screen. The canvas draws a live stroke while a pen is dragged and commits it on release; the eraser deletes strokes it passes over (one undo step per drag); Esc or Select goes back to selecting. Draw tab buttons show the tool in use, with colour and thickness menus; Review gets an Ink group with Hide Ink. Ink renders with round caps and joins on screen and in PDF; highlighters are translucent and behind the text. DOCX writes freeforms as wps:wsp with a:custGeom (moveTo/lnTo) in a wp:anchor and reads them back, along with simple custom-geometry freeforms from other files. Co-Authored-By: Claude Opus 5.5 * #315 review fixes: eraser undo test, sanitized tap dots, custGeom path cap, ink docs - draw.eraser with a point erases through draw.erase: test that it is one undo step (undo/redo) and marks the document dirty. - Render and PDF: a single-point stroke's dot is drawn at the sanitized point, not the raw first one. - DOCX custGeom reading stops once MAX_PATHS paths (subpaths included) are collected, across a:path elements. - docs/file-format-parity.md: ink is saved as custom geometry, not InkML, so Word shows it as a freeform. - widgets test: theme::apply takes an Appearance (#317). Co-Authored-By: Claude Opus 5.5 * i18n: send interface text that skipped translation through the catalog A test-only pseudo-language wraps every catalog lookup in ⟦…⟧ marks; a new audit test lays the app out in it (every tab, File page, dialog and pane, the right-click menu, and a hover and a click on every ribbon control, including the Table and Equation tabs) and fails on any visible text outside the marks. The document is drawn as an image, so only interface text is checked; document text, font and style names, shortcuts, icon lettering, contributor handles and command error messages are allowed. What it found, now translated in every language that has the strings: - Right-click menu items (Cut, Paste, Font…, Paragraph…, Link…, New Comment). - Paragraph dialog: the alignment choices showed code values (`left`); the label now sits before the dropdown. - Table Design › Table Style Options checkboxes. - Table Layout › Alignment tooltips showed code values (`topLeft`). - Design › Fonts: the theme's name is translated, its font names are not. - `pt` units, the Insert › Table grid label, the default watermark text, the font dialog's preview sample, and the untitled document's name. - Contributors and Models dialogs: headings, sort and name choices, summary. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n audit: start every ribbon click from a fresh app; translate the table style preview The sweep pressed Escape after each click, and in an equation Escape leaves it, so the Equation tab vanished after its first control and the rest of its menus (Convert, Justification, …) were never opened. Each control now gets a fresh app set up the same way. The narrower allowance for short text (only icon lettering and initials) also catches short words. It found the sample table in the Table Style dialog (Mon, Tue, North, Total, …), now translated. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * #313: catalog rows for the newly translated interface text Rows in all eight catalogs for the strings #313 now sends through the catalog (cell alignment tooltips, credits columns and summary, theme names, context-menu items, table picker, pt suffix, Document1, the Font dialog sample) and for the Table Style preview's sample table, which the untranslated-text audit flagged after main's table style editor landed. The audit runs headless (no host services: no file pickers or speech) in about 20 s, so it stays enabled. Co-Authored-By: Claude Opus 5.5 * i18n audit: click the ribbon's bottom row too The sweep only clicked controls centred between y = 52 and 125, which took in the tab row and left out each group's bottom row (Equation › Convert and Justification among them). The band is now taken from the layout: below the tab row and above the document area. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n audit: lay the app out wide enough that no ribbon tab overflows At 1440 pt the Equation tab ran past the window, so its last controls (Justification among them) sat behind the ribbon's scroll arrow and were never clicked. The audit window is now 2560 pt wide. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n: add Russian (ru) interface translation - ru.tsv: 1,068 entries covering every interface string, written clean-room from the English labels and reviewed by a native speaker. `ru`, `ru-RU`, `ru_RU.UTF-8` and other regions resolve to it; File > Options picks it by hand. - Built-in style names (Normal, Heading 2, TOC 3, Strong…) show in the interface language in the Styles gallery, the Styles pane and the Style Inspector. Display only: documents, commands and saved files keep the English names, and styles the author made keep theirs. - Rendered previews use the interface language: the Styles gallery samples (`АаБбВвГг`) and the Design tab's style-set tiles. - Catalogs gain a `preview` context for sample text that must fit a small tile (`Title` is «Заголовок» as a style but «Пример» in the tiles); it falls back to the plain entry, and unknown contexts are still rejected. - Tests: locale detection and saved preference, full coverage, Cyrillic glyphs in the bundled interface fonts, style-name display, catalog contexts. Co-Authored-By: Claude Opus 5.5 * i18n(ru): translate everything the interface audit finds Adds 356 Russian entries: the equation gallery (categories, templates and built-in equations), equation options, themes, watermark presets, paper sizes, table styles, greetings, outline levels, the strings #313 routes through the catalog, and the new AutoSave messages. The two rows #305 made obsolete (📂 Browse…, ➕ New comment) are gone. The interface audit now also fails when a string it sees translated has no Russian entry, so Russian stays complete as the interface grows. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n(ru): native-speaker review corrections Add Note, Move Past Citation, equation display/inline, accents, stacks, operators, Column Selection, Reading Highlight, ASAP and Tools, as reviewed; the Accent gallery button wraps onto two lines. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n(ru): translate what the improved audit and today's main add The audit now opens every ribbon menu (bottom rows and the Equation tab's last controls included), which surfaced Equation › Convert and Justification, and the Table Style dialog's sample table. Also covers password protection, Manage Styles, the clipboard pane, Shape Effects and Asian typography from main. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n: translate the Table Layout 'Draw Table' ribbon label in every catalog #308's two-line ribbon label had no catalog rows; #300's Russian audit (ru covers everything the interface looks up) found it. Rows in all ten catalogs keep et == es and ru covering zh-hans. Co-Authored-By: Claude Opus 5.5 * fmt Co-Authored-By: Claude Opus 5.5 * i18n: Borders and Shading line widths through the catalog ({n} pt) #313's untranslated-text audit flagged main's new dialog (#327). Co-Authored-By: Claude Opus 5.5 * land-294: Estonian rows for main's newer dialogs Define New Multilevel List and Track Changes Options (#342), rotation (#332), Tabs and Borders and Shading (#327), Columns, Symbol and Field (#335): et keys equal es again. Co-Authored-By: Claude Opus 5.5 * i18n audit: run on demand (#[ignore]) until its rare failure under load is understood It failed once in ~46 runs on a heavily loaded machine and passed 35 straight reruns, so CI shouldn't depend on it yet. Run it with --ignored. Co-Authored-By: Claude Opus 5.5 * i18n(ru): restore the review corrections a merge reverted; narrow and hide labels A merge of older copies of this branch's commits put back the pre-review wording of 20 entries (Add Note, Tools, the equation accents and operators, Column Selection, Reading Highlight, ASAP, …) and dropped six that are still in use (Equation › Convert, Centered as Group, the hyphenation menu's ✓ None). They're back as reviewed. Also: 1/4 Em Space → «Узкий пробел», and the Draw tab's Hide Ink button reads «Скрыть». Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po * i18n(ru): restore the reviewed wording a merge rewrote The same merge reworded 24 reviewed entries (password protection, Shape Effects, Asian typography, the clipboard pane, the table style sample); they're back as a native speaker reviewed them. Clipboard Pane keeps «Область буфера обмена», like the other panes. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WtHKQ7wrZm3uBuaG1Ye8po --------- Co-authored-by: Henno Täht Co-authored-by: Dmitrii Khlapov <19991457+dkhlapov@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 Co-authored-by: vangel76 Co-authored-by: Brandon Thomas --- ATTRIBUTION.md | 1 + README.md | 2 +- ROADMAP.md | 2 +- crates/ui-egui/src/i18n/audit.rs | 22 + crates/ui-egui/src/i18n/catalog.rs | 30 +- crates/ui-egui/src/i18n/es.tsv | 3 + crates/ui-egui/src/i18n/et.tsv | 4 +- crates/ui-egui/src/i18n/ja.tsv | 3 + crates/ui-egui/src/i18n/mod.rs | 45 +- crates/ui-egui/src/i18n/pseudo.rs | 10 +- crates/ui-egui/src/i18n/pt-br.tsv | 3 + crates/ui-egui/src/i18n/ru.tsv | 1733 +++++++++++++++++++++++++++ crates/ui-egui/src/i18n/sr-latn.tsv | 3 + crates/ui-egui/src/i18n/sr.tsv | 3 + crates/ui-egui/src/i18n/tests.rs | 119 ++ crates/ui-egui/src/i18n/tr.tsv | 1 + crates/ui-egui/src/i18n/uk.tsv | 3 + crates/ui-egui/src/i18n/zh-hans.tsv | 6 +- crates/ui-egui/src/i18n/zh-hant.tsv | 3 + crates/ui-egui/src/panes.rs | 24 +- crates/ui-egui/src/previews.rs | 16 +- crates/ui-egui/src/ribbon.rs | 2 +- docs/control-protocol.md | 2 +- docs/localization-parity.md | 9 +- 24 files changed, 2017 insertions(+), 32 deletions(-) create mode 100644 crates/ui-egui/src/i18n/ru.tsv diff --git a/ATTRIBUTION.md b/ATTRIBUTION.md index 85b9310..dc34128 100644 --- a/ATTRIBUTION.md +++ b/ATTRIBUTION.md @@ -64,4 +64,5 @@ Generated-in-code art is original and has no file to list: the UI icon set (`cra | `crates/ui-egui/src/i18n/uk.tsv` | @dmatviichuk with Codex | Original translation from the English interface labels in this repository; no other product localisation copied | MIT OR Apache-2.0 | Ukrainian interface catalog; spelling checked with external VESUM and ULIF dictionaries, neither bundled | | `crates/ui-egui/src/i18n/et.tsv` | @henno with Codex | Original translation from the English interface labels in this repository; no other product localisation copied | MIT OR Apache-2.0 | Estonian interface catalog | | `crates/ui-egui/src/i18n/pt-br.tsv` | @edurbs with ZCode | Original translation from the English interface labels in this repository; no other product localisation copied | MIT OR Apache-2.0 | Brazilian Portuguese interface catalog; spelling checked with the external pt_BR Hunspell dictionary, not bundled | +| `crates/ui-egui/src/i18n/ru.tsv` | Dmitrii Khlapov with Claude | Original translation from the English interface labels in this repository; no other product localisation copied | MIT OR Apache-2.0 | Russian interface catalog; reviewed by a native speaker | | `crates/ui-egui/src/i18n/tr.tsv` | @PbyLoyth with Codex and Claude Code | Original translation from the English interface labels in this repository; no other product localisation copied | MIT OR Apache-2.0 | Turkish interface catalog | diff --git a/README.md b/README.md index f0e91f3..3e27187 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ Every screenshot below is WordCraft itself, rendered offscreen by its own UI tes | **References** | Table of contents, footnotes and endnotes, citations and bibliography (APA, MLA, Chicago, IEEE), captions, table of figures, cross-references, index, table of authorities | | **Review** | Spelling and grammar with suggestions, thesaurus, word count, comments in margin balloons or a pane, track changes, accept/reject, compare documents, restrict editing, accessibility checker, document inspector | | **Mailings** | Mail merge from CSV, merge fields, address block, greeting line, rules, preview, finish to a document; envelopes and labels | -| **View** | Print layout, web layout, draft, read mode, focus, zoom, one/multiple pages, page width, Navigation pane, rulers, gridlines, dark mode; interface in English, 简体中文, 繁體中文, 日本語, Português (Brasil), Español, Українська, Српски / Srpski, Eesti or Türkçe (follows the system language by default) | +| **View** | Print layout, web layout, draft, read mode, focus, zoom, one/multiple pages, page width, Navigation pane, rulers, gridlines, dark mode; interface in English, 简体中文, 繁體中文, 日本語, Português (Brasil), Español, Українська, Српски / Srpski, Eesti, Türkçe or Русский (follows the system language by default) | | **Files** | .docx read/write (opens in Word), Word 97-2003 .doc import, PDF export, .odt, .rtf, .html, .md, .tex, .txt import/export, page images | The honest picture, area by area, is in [ROADMAP.md](ROADMAP.md), the diff --git a/ROADMAP.md b/ROADMAP.md index f55f88c..192c0de 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -110,7 +110,7 @@ Weights and evidence per area: [docs/target-app-parity.md](docs/target-app-parit | Korean | ko | none | 0% | | Vietnamese | vi | none | 0% | -Also shipped: Traditional Chinese (`zh-hant`), Ukrainian (`uk`) and Serbian (`sr`, `sr-latn`, #250), all partial (~95%). Estonian (`et`) and Turkish (`tr`) now have complete 1,307-entry interface catalogs with +Also shipped: Traditional Chinese (`zh-hant`), Ukrainian (`uk`) and Serbian (`sr`, `sr-latn`, #250) and Russian (`ru`), all partial (~95%). Estonian (`et`) and Turkish (`tr`) now have complete 1,307-entry interface catalogs with system-locale selection and a saved language choice; Estonian and Turkish proofing are not included. Word ships 30 interface languages and proofing for ~50. Detail: [docs/localization-parity.md](docs/localization-parity.md). diff --git a/crates/ui-egui/src/i18n/audit.rs b/crates/ui-egui/src/i18n/audit.rs index 36e0f12..714c12c 100644 --- a/crates/ui-egui/src/i18n/audit.rs +++ b/crates/ui-egui/src/i18n/audit.rs @@ -263,4 +263,26 @@ fn untranslated_interface_text() { report.push_str(&format!("{:?} [{}]\n", pseudo::unmarked(text), states.join(", "))); } assert!(found.is_empty(), "{} interface texts skip translation (wrap them in tl!):\n{report}", found.len()); + russian_has_every_string_the_interface_looked_up(pseudo::looked_up()); +} + +/// Russian covers everything the audit saw translated, plus the equation gallery's labels (shown +/// in menus the audit doesn't open one by one). Numbered style names go through a template. +fn russian_has_every_string_the_interface_looked_up(mut keys: std::collections::BTreeSet) { + use wordcraft_engine::math_gallery::{BUILT_INS, STRUCTURES, SYMBOL_SETS}; + keys.extend(BUILT_INS.iter().map(|(_, label, _)| label.to_string())); + keys.extend(SYMBOL_SETS.iter().map(|(name, _)| name.to_string())); + for g in STRUCTURES { + keys.insert(g.label.to_string()); + for (section, templates) in g.sections { + keys.insert(section.to_string()); + keys.extend(templates.iter().map(|t| t.label.to_string())); + } + } + let ru = super::Lang::from_code("ru").unwrap_or(super::Lang::EN); + let numbered = |s: &str| ["Heading ", "TOC "].iter().any(|p| s.strip_prefix(p).is_some_and(|n| n.chars().all(|c| c.is_ascii_digit()))); + // Names that read the same in Russian. + let same = |s: &str| matches!(s, "LaTeX" | "LaTeX (*.tex)" | "Unicode" | "I. II. III." | "i. ii. iii."); + let missing: Vec = keys.into_iter().filter(|s| english_words(s) && !super::has(ru, s) && !numbered(s) && !same(s)).collect(); + assert!(missing.is_empty(), "{} strings have no Russian entry:\n{missing:#?}", missing.len()); } diff --git a/crates/ui-egui/src/i18n/catalog.rs b/crates/ui-egui/src/i18n/catalog.rs index 11381dd..ac34d14 100644 --- a/crates/ui-egui/src/i18n/catalog.rs +++ b/crates/ui-egui/src/i18n/catalog.rs @@ -1,5 +1,6 @@ //! Parser and lookup table for translation catalogs (`*.tsv`, format documented in `zh-hans.tsv`). -//! The format is PdfCraft's; WordCraft uses its plain (context-free) entries. +//! The format is PdfCraft's. Most entries are plain (empty context); a few use one of +//! [`CONTEXTS`] where the same English needs different wording in one place. //! //! Validation is strict (unknown escapes, unknown `@` contexts, placeholder, ellipsis and plural //! form mismatches, duplicates), but a bad line is only skipped and reported: the rest of the @@ -16,11 +17,18 @@ pub struct Entry { pub translation: String, } +/// The contexts a catalog entry may name, and where each applies. +/// - `preview`: sample text inside a rendered preview (the Design tab's style-set tiles), which +/// has to fit a small tile; it falls back to the plain entry. +pub const CONTEXTS: &[&str] = &["preview"]; + /// A parsed catalog. Values are owned for the life of the process (catalogs are built once). #[derive(Debug, Default)] pub struct Catalog { /// English source → translation (the hot path, looked up every frame). plain: HashMap, + /// (context, English source) → translation, for the few entries that need one. + contextual: HashMap<(String, String), String>, } fn unescape(text: &str) -> Result { @@ -58,8 +66,8 @@ pub fn placeholders(text: &str) -> Vec<&str> { /// Check one entry against its English source. fn validate(entry: &Entry) -> Result<(), String> { let Entry { context, source, translation } = entry; - if !context.is_empty() { - return Err(format!("contexts aren't used in WordCraft catalogs (found {context:?}); leave the first column empty")); + if !context.is_empty() && !CONTEXTS.contains(&context.as_str()) { + return Err(format!("unknown context {context:?}; use one of {CONTEXTS:?} or leave the first column empty")); } if placeholders(source) != placeholders(translation) { return Err("placeholders differ from the English source".into()); @@ -109,11 +117,23 @@ impl Catalog { /// Build a catalog from its valid entries; the errors of the skipped lines come back too. pub fn parse(text: &str) -> (Catalog, Vec) { let (entries, errors) = parse_entries(text); - let plain = entries.into_iter().map(|e| (e.source, e.translation)).collect(); - (Catalog { plain }, errors) + let mut catalog = Catalog::default(); + for e in entries { + if e.context.is_empty() { + catalog.plain.insert(e.source, e.translation); + } else { + catalog.contextual.insert((e.context, e.source), e.translation); + } + } + (catalog, errors) } pub fn plain(&self, s: &str) -> Option<&str> { self.plain.get(s).map(String::as_str) } + + /// The entry for `s` in `context`, else the plain one. + pub fn in_context(&self, context: &str, s: &str) -> Option<&str> { + self.contextual.get(&(context.to_string(), s.to_string())).map(String::as_str).or_else(|| self.plain(s)) + } } diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 9b31900..f21ee4c 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -1328,6 +1328,9 @@ South Sur West Oeste Total Total + +# Table Layout › Draw (#308) + Draw\nTable Dibujar\ntabla Rotation Giro Rotation: Giro: Rotate Right 90° Girar 90° a la derecha diff --git a/crates/ui-egui/src/i18n/et.tsv b/crates/ui-egui/src/i18n/et.tsv index 20a6bf9..e0c624d 100644 --- a/crates/ui-egui/src/i18n/et.tsv +++ b/crates/ui-egui/src/i18n/et.tsv @@ -1173,6 +1173,8 @@ West Lääs Total Kokku +# Table Layout › Draw (#308) + Draw\nTable Joonista\ntabel # Define New Multilevel List and Track Changes Options (#342) (no style) (stiil puudub) Add tab stop at: Lisa tabelduskoht kohal: @@ -1212,7 +1214,6 @@ Text indent at: Teksti taane: Track Changes Options Muudatuste jälitamise suvandid Track formatting Jälita vormingut - # Rotation and flips (#332) Flip Horizontal Peegelda horisontaalselt Flip Vertical Peegelda vertikaalselt @@ -1220,7 +1221,6 @@ Rotate Right 90° Pööra paremale 90° Rotation Pööramine Rotation: Pööre: - # Tabs, Borders and Shading (#327); Columns, Symbol and Field (#335) Tab stop position: Tabelduskoha asukoht: Default tab stops: Vaikimisi tabelduskohad: diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 76a0121..cf1dc43 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -1312,6 +1312,9 @@ South 南 West 西 Total 合計 + +# Table Layout › Draw (#308) + Draw\nTable 表の\n描画 Rotation 回転角度 Rotation: 回転: Rotate Right 90° 右へ 90 度回転 diff --git a/crates/ui-egui/src/i18n/mod.rs b/crates/ui-egui/src/i18n/mod.rs index 0c08bae..d00e8e7 100644 --- a/crates/ui-egui/src/i18n/mod.rs +++ b/crates/ui-egui/src/i18n/mod.rs @@ -20,6 +20,7 @@ //! //! # Looking strings up //! - [`tl!`](crate::tl) / [`t`]: a string in the current language. [`tr`]: in a given one. +//! - [`tc`] / [`trc`]: worded for a context (`preview`), for text that must fit a tight spot. //! - [`location`]: a ribbon location such as `Home › Font`, segment by segment. //! - [`fmt`]: fill `{name}` placeholders after a lookup; translators may reorder them. @@ -47,7 +48,7 @@ pub struct LangInfo { } /// The registry. English first: it is the fallback and the source language. -pub static LANGUAGES: [LangInfo; 11] = [ +pub static LANGUAGES: [LangInfo; 12] = [ LangInfo { code: "en", name: "English", source: "", prefer_hans: false, catalog: OnceLock::new() }, // Simplified Chinese; `zh`, `zh-CN`, `zh-SG` and `zh-Hans-*` resolve here (see `candidates`). LangInfo { code: "zh-hans", name: "简体中文", source: include_str!("zh-hans.tsv"), prefer_hans: true, catalog: OnceLock::new() }, @@ -67,6 +68,8 @@ pub static LANGUAGES: [LangInfo; 11] = [ // matching — no special-casing needed, unlike Chinese's script-by-region fallback). LangInfo { code: "sr-latn", name: "Srpski (latinica)", source: include_str!("sr-latn.tsv"), prefer_hans: false, catalog: OnceLock::new() }, LangInfo { code: "et", name: "Eesti", source: include_str!("et.tsv"), prefer_hans: false, catalog: OnceLock::new() }, + // Russian; `ru`, `ru-RU`, `ru_RU.UTF-8` and other regions resolve here. + LangInfo { code: "ru", name: "Русский", source: include_str!("ru.tsv"), prefer_hans: false, catalog: OnceLock::new() }, LangInfo { code: "tr", name: "Türkçe", source: include_str!("tr.tsv"), prefer_hans: false, catalog: OnceLock::new() }, ]; @@ -228,6 +231,21 @@ pub fn t(s: &str) -> &str { tr(current(), s) } +/// `s` in the current language as worded for `context` (one of [`catalog::CONTEXTS`]), falling +/// back to the plain translation and then to English. +pub fn tc<'a>(context: &str, s: &'a str) -> &'a str { + trc(current(), context, s) +} + +/// [`tc`] in a given language. +pub fn trc<'a>(lang: Lang, context: &str, s: &'a str) -> &'a str { + #[cfg(test)] + if pseudo::on() { + return pseudo::mark(s); + } + lang.catalog().in_context(context, s).unwrap_or(s) +} + /// Lowercase translated interface labels and UI search queries in the current language. /// Turkish has two distinct I pairs: `İ`/`i` and `I`/`ı`. Unicode's default casing turns `İ` /// into `i` plus a combining dot, which would prevent `italik` from finding `İtalik`. @@ -256,6 +274,31 @@ pub fn tr(lang: Lang, s: &str) -> &str { lang.catalog().plain(s).unwrap_or(s) } +/// A style's name as the interface shows it: built-in styles (`Normal`, `Heading 2`, `TOC 3`) in +/// the current language, styles the author made exactly as named. Display only: the document, +/// commands and saved files keep the English name. +pub fn style_name(style: &wordcraft_doc::Style) -> String { + if style.builtin { builtin_style_name(&style.name) } else { style.name.clone() } +} + +/// A built-in style's English name in the current language; numbered families go through one +/// template each (`Heading {n}`), and names without a translation stay English. +pub fn builtin_style_name(name: &str) -> String { + let direct = t(name); + if direct != name { + return direct.to_string(); + } + for (prefix, template) in [("Heading ", "Heading {n}"), ("TOC ", "TOC {n}"), ("Index ", "Index {n}")] { + if let Some(n) = name.strip_prefix(prefix) + && !n.is_empty() + && n.chars().all(|c| c.is_ascii_digit()) + { + return fmt(t(template), &[("n", n)]); + } + } + name.to_string() +} + /// A ribbon location (`Home › Font`) in the current language, segment by segment. pub fn location(loc: &str) -> String { loc.split(" › ").map(t).collect::>().join(" › ") diff --git a/crates/ui-egui/src/i18n/pseudo.rs b/crates/ui-egui/src/i18n/pseudo.rs index 0121207..63165c5 100644 --- a/crates/ui-egui/src/i18n/pseudo.rs +++ b/crates/ui-egui/src/i18n/pseudo.rs @@ -2,12 +2,19 @@ //! wrapped in `⟦…⟧`, so text drawn without the marks never went through translation. use std::cell::{Cell, RefCell}; -use std::collections::HashMap; +use std::collections::{BTreeSet, HashMap}; thread_local! { static ON: Cell = const { Cell::new(false) }; // Marked strings live for the test process; lookups hand out `&'static str`. static CACHE: RefCell> = RefCell::new(HashMap::new()); + // Every English string looked up while on, to check against a real catalog. + static LOOKED_UP: RefCell> = const { RefCell::new(BTreeSet::new()) }; +} + +/// Every English string looked up while the pseudo-language was on. +pub fn looked_up() -> BTreeSet { + LOOKED_UP.with_borrow(Clone::clone) } pub fn on() -> bool { @@ -19,6 +26,7 @@ pub fn set(on: bool) { } pub fn mark(s: &str) -> &'static str { + LOOKED_UP.with_borrow_mut(|l| l.insert(s.to_string())); CACHE.with_borrow_mut(|c| *c.entry(s.to_string()).or_insert_with(|| Box::leak(format!("⟦{}⟧", s.replace('\n', "⟧\n⟦")).into_boxed_str()))) } diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index d277082..05839a6 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -1324,6 +1324,9 @@ South Sul West Oeste Total Total + +# Table Layout › Draw (#308) + Draw\nTable Desenhar\ntabela Rotation Rotação Rotation: Rotação: Rotate Right 90° Girar 90° para a direita diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv new file mode 100644 index 0000000..5947a8b --- /dev/null +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -0,0 +1,1733 @@ +# Russian (ru) interface catalog. Columns, separated by a TAB: +# context English source translation +# context usually empty. `preview` words sample text inside rendered previews (the Design +# tab's style-set tiles), which must fit a small tile; it falls back to the plain entry. +# source the English text exactly as in the code (tl!(...), ribbon labels, command labels) +# escapes \n \t \\ inside a column. `{name}` placeholders must appear in both columns, and a +# trailing "…" in one needs one in the other. +# Lines starting with # and blank lines are ignored. A missing entry shows in English. +# +# Clean room: every entry was written from the plain meaning of the English label in ordinary +# computing vocabulary. No Microsoft Word (or other product) localisation, string table or +# translated UI was consulted or copied; add entries the same way. +# Product, format and technology names (WordCraft, PDF, Markdown, MCP …) stay in Latin letters. +# Counts use count-neutral wording (`Слов: 21`), so no plural forms are needed. + + (no suggestions) (нет вариантов) + 1.5 Line Spacing Полуторный интервал + A free, open-source word processor written from scratch in Rust.\nPart of the Crafting Apps from the ArtCraft team. Бесплатный текстовый процессор с открытым исходным кодом, написанный с нуля на Rust.\nВходит в Crafting Apps от команды ArtCraft. + AaBbCcDd АаБбВвГг + About О программе + About WordCraft О WordCraft + Accept Принять + Accept All Changes Принять все изменения + Accept This Change Принять это изменение + Accessibility Специальные возможности + Add Добавить + Add a comment Добавить комментарий + Add a Table Добавить таблицу + Add Space Before Paragraph Добавить интервал перед абзацем + Add Text Добавить текст + Add to Dictionary Добавить в словарь + Add to Style Gallery Добавить в коллекцию стилей + Address Block Блок адреса + Address: Адрес: + Address\nBlock Блок\nадреса + Adjust Настройка + Advanced Дополнительно + After: После: + Agents Агенты + Align Выровнять + Align Left По левому краю + Align Right По правому краю + Alignment Выравнивание + All Borders Все границы + All Caps Все прописные + All caps Все прописные + All Markup Все исправления + Alt Text Замещающий текст + Annotation Reference Знак примечания + Annotation Subject Тема примечания + Annotation Text Текст примечания + Apply Character Style Применить стиль знаков + Apply Style Применить стиль + Arrange Упорядочить + Arrange\nAll Упорядочить\nвсе + Arrow Стрелка + Artistic Effects Художественные эффекты + Author Автор + AutoCorrect Options Параметры автозамены + AutoFit Автоподбор + AutoFit Contents Автоподбор по содержимому + AutoFit Window Автоподбор по ширине окна + Automatic Автоматически + Automatic ({language}) Автоматически ({language}) + Automatic follows your system's language. Menus and commands change; your documents don't. «Автоматически» — язык системы. Меняются меню и команды, документы остаются прежними. + Automatic Table 1 (3 levels) Автоматическое оглавление 1 (3 уровня) + Automatic Table 2 (2 levels) Автоматическое оглавление 2 (2 уровня) + AutoSave Автосохранение + AutoSave saves every change to the file (needs a saved document) Автосохранение записывает каждое изменение в файл (документ должен быть уже сохранён) + AutoText Автотекст + Backspace Backspace + Banded Columns Чередующиеся столбцы + Banded Rows Чередующиеся строки + Before: Перед: + Bibliography Список литературы + Binary assets added Добавлены двоичные ресурсы + Binary assets removed Удалены двоичные ресурсы + Blank Пустой + Blank (Three Columns) Пустой (три столбца) + Blank document Новый документ + Blank Page Пустая страница + Block\nAuthors Блокировать\nавторов + Body text in a short paragraph to show spacing. Основной текст в коротком абзаце, чтобы показать интервалы. + Bold Полужирный + Book Title Название книги + Bookmark Закладка + Bookmark name: Имя закладки: + Border Painter Кисть границ + Border\nPainter Кисть\nграниц + Borders Границы + Bottom Border Нижняя граница + Bottom of Page Внизу страницы + Bottom: Снизу: + Box Рамка + Breaks Разрывы + Bring Forward Переместить вперёд + Bullet Library Библиотека маркеров + Bullets Маркеры + Calendar Календарь + Cancel Отмена + Capitalize Each Word Каждое Слово С Прописной + Caption Подпись + Captions Подписи + Category Категория + Cell Margins Поля ячеек + Cell Size Размер ячейки + Cell\nMargins Поля\nячеек + Center По центру + Change Изменить + Change Case Регистр + Change List Level Изменить уровень списка + Change Picture Заменить рисунок + Change Shape Изменить фигуру + Changes Изменения + Character Position Смещение знаков + Character Scale Масштаб знаков + Character Shading Заливка знаков + Character Spacing Межзнаковый интервал + Characters (no spaces) Знаков (без пробелов) + Characters (with spaces) Знаков (с пробелами) + Chart Диаграмма + Check Accessibility Проверить доступность + Check Compatibility Проверить совместимость + Check for Errors Проверить на ошибки + Check Spelling as You Type Проверять орфографию при вводе + Check\nAccessibility Проверить\nдоступность + Citation Style Стиль ссылок + Citations & Bibliography Ссылки и список литературы + Clear Очистить + Clear All Formatting Очистить всё форматирование + Clipboard Буфер обмена + Close Закрыть + Close Header and Footer Закрыть колонтитулы + Collapse Selection Свернуть выделение + Color Цвет + Color: Цвет: + Colors Цвета + Column Столбец + Column Break Разрыв колонки + Columns Колонки + Combine Объединить + Commands Команды + Comment Комментарий + Comments Комментарии + Comments Pane Область комментариев + Community\nDiscord Сообщество\nDiscord + Compact Компактный + Compare Сравнить + Compress Pictures Сжать рисунки + Continuous Непрерывный + Convert Преобразовать + Convert Text to Table Преобразовать текст в таблицу + Convert Text to Table… Преобразовать текст в таблицу… + Convert to Text Преобразовать в текст + Copy Копировать + Copy Formatting Копировать форматирование + Corrections Коррекция + Cover Page Титульная страница + Create Создать + Create a Style Создать стиль + Create an interactive outline of your document.\n\nIt's a great way to keep track of where you are or quickly move your content around.\n\nTo get started, go to the Home tab and apply Heading styles to the headings in your document. Создайте интерактивную структуру документа.\n\nС ней легко понять, где вы находитесь, и быстро переставлять части текста.\n\nЧтобы начать, откройте вкладку «Главная» и примените к заголовкам документа стили заголовков. + Create New Style Создать новый стиль + Crop Обрезать + Cross-reference Перекрёстная ссылка + Current Position Текущая позиция + Current style: {style} Текущий стиль: {style} + Custom Margins… Настраиваемые поля… + Custom Watermark Настраиваемая подложка + Custom Watermark… Настраиваемая подложка… + Customize Quick Access Toolbar Настроить панель быстрого доступа + Cut Вырезать + Dark Mode Тёмный режим + Dashed Штриховой + Data Данные + Date & Time Дата и время + Decrease Font Size Уменьшить размер шрифта + Decrease Indent Уменьшить отступ + Default По умолчанию + Default Paragraph Font Шрифт абзаца по умолчанию + Define New Bullet Определить новый маркер + Define New Number Format Определить новый формат номера + Delete Удалить + Delete Cells Удалить ячейки + Delete Columns Удалить столбцы + Delete Comment Удалить комментарий + Delete Next Word Удалить следующее слово + Delete Previous Word Удалить предыдущее слово + Delete Rows Удалить строки + Delete Style Удалить стиль + Delete Table Удалить таблицу + Design Дизайн + development build сборка для разработки + Diagonal Диагональ + Diamond Ромб + Dictate Диктовка + Different First Page Особая первая страница + Different Odd & Even Pages Разные для чётных и нечётных страниц + Discord Discord + Discord community Сообщество в Discord + Display Отображение + Display for Review Отображение исправлений + Distribute Columns Выровнять ширину столбцов + Distribute Rows Выровнять высоту строк + Distributed Распределённое + Do Not Show in TOC Не показывать в оглавлении + Document End Конец документа + Document Formatting Форматирование документа + Document Property Свойство документа + Document Start Начало документа + Document Text Текст документа + Document Title Название документа + Documents you open will show up here. Здесь появятся документы, которые вы открываете. + Dot-dash Штрихпунктирный + Dotted Точечный + Double Двойной + Double Spacing Двойной интервал + Double Strikethrough Двойное зачёркивание + Double Underline Двойное подчёркивание + Down Вниз + Draft Черновик + Draw Рисование + Drawing Tools Инструменты рисования + Drawing\nCanvas Полотно\nдля рисования + Drop Cap Буквица + Edit Footer Изменить нижний колонтитул + Edit Header Изменить верхний колонтитул + Edit Recipient List Изменить список получателей + Edit\nRecipient List Изменить список\nполучателей + Edited Изменено + Editing Редактирование + Editing header/footer Редактирование колонтитула + Editing — edit the document directly Редактирование — правка документа напрямую + Editor Редактор + Effects Эффекты + Emboss Приподнятый + Emphasis Выделение + Encrypt with Password Зашифровать паролем + Endnote Reference Знак концевой сноски + Endnote Text Текст концевой сноски + English (United States) Английский (США) + Engrave Утопленный + Enter page number: Введите номер страницы: + Envelope Address Адрес на конверте + Envelope Return Обратный адрес + Envelopes Конверты + Equation Уравнение + Eraser Ластик + Even Page Чётная страница + Every command is available to scripts and AI agents: run `wordcraft-cli mcp` for an MCP server, or start the app with `--control ` for the JSON control channel. Любая команда доступна скриптам и ИИ-агентам: запустите `wordcraft-cli mcp`, чтобы получить MCP-сервер, или запустите приложение с `--control `, чтобы открыть управляющий канал JSON. + Export Экспорт + Export a copy to share (PDF, Word document) Экспортировать копию, чтобы поделиться (PDF, документ Word) + Export Page as PNG Экспортировать страницу в PNG + Export PDF Экспорт в PDF + Exported {path} Экспортировано: {path} + Extend Selection Расширить выделение + Field Поле + File Файл + Find Найти + Find and Replace Найти и заменить + Find Next Найти далее + Find Previous Найти предыдущее + Find Recipient Найти получателя + Find what: Найти: + Finish Завершение + Finish & Merge Завершить и объединить + Finish &\nMerge Завершить\nи объединить + First Column Первый столбец + First commit Первый коммит + First line: Первая строка: + Fixed Column Width Фиксированная ширина столбцов + Focus Фокус + Font Шрифт + Font Color Цвет шрифта + Font color: Цвет шрифта: + Font Dialog Окно «Шрифт» + Font Size Размер шрифта + Font: Шрифт: + Fonts Шрифты + Footer Нижний колонтитул + Footnote and Endnote Обычные и концевые сноски + Footnote Reference Знак сноски + Footnote Text Текст сноски + Footnotes Сноски + Format Формат + Format Page Numbers Формат номеров страниц + Format Page Numbers… Формат номеров страниц… + Format Painter Формат по образцу + Formatting at Selection Форматирование выделенного фрагмента + Formula Формула + General Общие + Go To Перейти + Go to Перейти + Go To (⌘⌥G) Перейти (⌘⌥G) + Grab bag Разное + Greeting Line Строка приветствия + Greeting\nLine Строка\nприветствия + Gridlines Сетка + Group Группировать + Grow Font 1 Point Увеличить шрифт на 1 пт + Hanging Indent Выступ + Header Верхний колонтитул + Header & Footer Колонтитулы + Header Row Строка заголовка + Header/Footer Position Положение колонтитулов + Heading 1 Заголовок 1 + Heading 2 Заголовок 2 + Heading 3 Заголовок 3 + Heading {n} Заголовок {n} + Headings Заголовки + Heart Сердце + Help Справка + Hidden Скрытый + Highlight Merge Fields Выделить поля слияния + Highlight\nMerge Fields Выделить\nполя слияния + Highlighter Маркер + Home Главная + Horizontal Горизонтально + Horizontal Line Горизонтальная линия + Hyperlink Гиперссылка + Hyphenation Расстановка переносов + Icons Значки + Ignore All Пропустить все + Illustrations Иллюстрации + Immersive Иммерсивный режим + Immersive Reader Иммерсивное чтение + Immersive\nReader Иммерсивное\nчтение + Increase Font Size Увеличить размер шрифта + Increase Indent Увеличить отступ + Indent Отступ + Indentation Отступы + Indents Отступы + Index Предметный указатель + Index Heading Заголовок указателя + Index {n} Указатель {n} + Info Сведения + Ink to\nMath Рукопись\nв формулу + Ink to\nShape Рукопись\nв фигуру + Ink\nReplay Воспроизвести\nрукопись + Insert Вставка + Insert Above Вставить сверху + Insert Below Вставить снизу + Insert Caption Вставить подпись + Insert Citation Вставить ссылку на источник + Insert Endnote Вставить концевую сноску + Insert Footnote Вставить сноску + Insert Hyperlink Вставить гиперссылку + Insert Index Вставить указатель + Insert Left Вставить слева + Insert Merge Field Вставить поле слияния + Insert Merge\nField Вставить поле\nслияния + Insert Right Вставить справа + Insert Shapes Вставка фигур + Insert Table Вставить таблицу + Insert Table of Authorities Вставить таблицу ссылок + Insert Table of Figures Вставить список иллюстраций + Insert Table… Вставить таблицу… + Insert\nAbove Вставить\nсверху + Insert\nCaption Вставить\nподпись + Insert\nCitation Вставить\nссылку + Insert\nFootnote Вставить\nсноску + Inside Borders Внутренние границы + Inspect Document Проверить документ + Intense Emphasis Сильное выделение + Intense Quote Выделенная цитата + Intense Reference Сильная ссылка + Interface language: Язык интерфейса: + Italic Курсив + Join the ArtCraft community on Discord Присоединяйтесь к сообществу ArtCraft в Discord + Join us on Discord: discord.gg/artcraft Присоединяйтесь к нам в Discord: discord.gg/artcraft + Justify По ширине + Keep Lines Together Не разрывать абзац + Keep lines together Не разрывать абзац + Keep Text Only Вставить без форматирования + Keep with Next Не отрывать от следующего + Keep with next Не отрывать от следующего + Keywords Ключевые слова + Labels Наклейки + Landscape Альбомная + Language Язык + Lasso Лассо + Last Column Последний столбец + Last commit Последний коммит + Layout Макет + Layout Summary Сводка по макету + Left Слева + Left Border Левая граница + Left: Слева: + Letter Письмо + Line Линия + Line and Page Breaks Разрывы строк и страниц + Line and Paragraph Spacing Интервал между строками и абзацами + Line Break Разрыв строки + Line delta Изменение числа строк + Line End Конец строки + Line Number Номер строки + Line Numbers Номера строк + Line Spacing Межстрочный интервал + Line Spacing Options… Параметры межстрочного интервала… + Line spacing: Межстрочный интервал: + Line Start Начало строки + Lines Строки + Lines added Добавлено строк + Lines deleted Удалено строк + Link Ссылка + Link to Previous Как в предыдущем + Links Ссылки + List Paragraph Абзац списка + Location: {path} Расположение: {path} + lowercase все строчные + Macros Макросы + Mailings Рассылки + Manage Sources Управление источниками + Many pages Много страниц + Margins Поля + Mark Citation Пометить ссылку + Mark Entry Пометить элемент + Mark\nCitation Пометить\nссылку + Mark\nEntry Пометить\nэлемент + Markdown (*.md) Markdown (*.md) + Match case С учётом регистра + Match Fields Сопоставить поля + Matrix Матрица + Merge Объединить + Merge Cells Объединить ячейки + Merge Formatting Объединить форматирование + Merged PRs Принятые PR + Mirrored Зеркальные + MIT OR Apache-2.0. Copyright (c) 2026 ArtCraft Team and the WordCraft contributors. MIT OR Apache-2.0. Copyright (c) 2026 ArtCraft Team и участники проекта WordCraft. + Moderate Средние + Modify Style Изменить стиль + Modify… Изменить… + Multilevel List Многоуровневый список + Multiple Pages Несколько страниц + Name (A–Z) Имя (А–Я) + Name: Имя: + Narrow 0.5" all Узкие 0,5" со всех сторон + Navigation Навигация + Navigation Pane Область навигации + New Создать + New Comment Новый комментарий + New from Template Создать из шаблона + New Paragraph Новый абзац + New Style… Новый стиль… + New Window Новое окно + New\nComment Новый\nкомментарий + New\nWindow Новое\nокно + Next Далее + Next Change Следующее изменение + Next Comment Следующий комментарий + Next Footnote Следующая сноска + Next Page Следующая страница + Next Record Следующая запись + Next Section Следующий раздел + No Border Без границы + No Color Без цвета + No contributor data was built into this copy. В эту сборку не включены данные об участниках. + No Markup Без исправлений + No model credits were built into this copy. В эту сборку не включены сведения о моделях. + No Paragraph Space Без интервала между абзацами + No Spacing Без интервала + Nonbreaking Hyphen Неразрывный дефис + Nonbreaking Space Неразрывный пробел + None Нет + Normal Обычный + Normal 1" all Обычные 1" со всех сторон + Normal Indent Обычный отступ + Normal Style Обычный стиль + Normal Table Обычная таблица + Not available right now Сейчас недоступно + Not saved Не сохранено + Not saved yet Ещё не сохранено + Number of columns: Число столбцов: + Number of rows: Число строк: + Numbering Нумерация + Object Объект + Odd Page Нечётная страница + Office 2003 Default Стандартный Office 2003 + OK ОК + One Одна + One Page Одна страница + Open Открыть + OpenDocument Text (*.odt) Текст OpenDocument (*.odt) + Optional Hyphen Мягкий перенос + Options Параметры + Orientation Ориентация + Outline Структура + Outline Level Уровень структуры + Outside Borders Внешние границы + Oval Овал + Page Страница + Page Background Фон страницы + Page Borders Границы страниц + Page Break Разрыв страницы + Page Break Before С новой страницы + Page break before С новой страницы + Page Breaks Разрывы страниц + Page Color Цвет страницы + Page Down Страница вниз + Page image (*.png) Изображение страницы (*.png) + Page Movement Перелистывание страниц + Page Number Номер страницы + Page Setup Параметры страницы + Page Up Страница вверх + Page Width По ширине страницы + Page width По ширине страницы + Page X of Y Страница X из Y + Page {page} Страница {page} + Page {page} of {pages} Страница {page} из {pages} + Page\nBorders Границы\nстраниц + Page\nColor Цвет\nстраницы + Page\nNumber Номер\nстраницы + Pages Страницы + Paragraph Абзац + Paragraph Details Сведения об абзаце + Paragraph Down На абзац вниз + Paragraph Settings Параметры абзаца + Paragraph Spacing Интервал между абзацами + Paragraph Up На абзац вверх + Paragraphs Абзацы + Paste Вставить + Paste (⌘V) Вставить (⌘V) + Paste Formatting Вставить форматирование + Paste: Keep Text Only Вставить без форматирования + Paste: Merge Formatting Вставить: объединить форматирование + PDF document (*.pdf) Документ PDF (*.pdf) + Pen Ручка + Pencil Карандаш + Picture Border Граница рисунка + Picture Format Формат рисунка + Picture Styles Стили рисунков + Pictures Рисунки + Plain text (*.txt) Обычный текст (*.txt) + Portrait Книжная + Position Положение + Preview Results Просмотр результатов + Preview\nResults Просмотр\nрезультатов + Previous Назад + Previous Change Предыдущее изменение + Previous Comment Предыдущий комментарий + Previous Record Предыдущая запись + Previous Section Предыдущий раздел + Print Печать + Print Layout Разметка страницы + Print\nLayout Разметка\nстраницы + Proofing Правописание + Proofing Issues Замечания по правописанию + Properties Свойства + Protect Защита + Protect Document Защитить документ + Quick Access Toolbar Панель быстрого доступа + Quick Parts Готовые блоки + Quick Tables Готовые таблицы + Quote Цитата + Read Aloud Прочитать вслух + Read Mode Режим чтения + Read\nAloud Прочитать\nвслух + Read\nMode Режим\nчтения + Recent Последние + Record Macro Записать макрос + Recover Unsaved Documents Восстановить несохранённые документы + Rectangle Прямоугольник + Redo Вернуть + Reduce Hanging Indent Уменьшить выступ + References Ссылки + Reject Отклонить + Reject All Changes Отклонить все изменения + Reject Change Отклонить изменение + Relaxed Свободный + Remove Background Удалить фон + Remove Footer Удалить нижний колонтитул + Remove Header Удалить верхний колонтитул + Remove Hyperlink Удалить гиперссылку + Remove Space After Paragraph Удалить интервал после абзаца + Remove Table of Contents Удалить оглавление + Remove Watermark Удалить подложку + Repeat Повторить + Repeat Header Rows Повторять строки заголовка + Replace Заменить + Replace All Заменить все + Replace Document Text Заменить текст документа + Replace with: Заменить на: + Replay Воспроизвести + Reply Ответить + Report Отчёт + Research Исследование + Researcher Исследователь + Reset Picture Сбросить рисунок + Resolve Отметить решённым + Resolved Решён + Restart at 1 Начать с 1 + Restart Each Page На каждой странице заново + Restart Each Section В каждом разделе заново + Restrict Editing Ограничить редактирование + Restrict\nEditing Ограничить\nредактирование + Results Результаты + Reverse the order В обратном порядке + Review Рецензирование + Reviewing Рецензирование + Reviewing Pane Область рецензирования + Reviewing — edits become suggestions Рецензирование — правки становятся предложениями + Rich Text Format (*.rtf) Документ RTF (*.rtf) + Right Справа + Right Border Правая граница + Right-to-Left Text Direction Направление текста справа налево + Right: Справа: + Rotate Повернуть + Rounded Rectangle Скруглённый прямоугольник + Rows & Columns Строки и столбцы + Ruler Линейка + Rules Правила + Résumé Резюме + Save Сохранить + Save a copy in another format. Printing goes through a PDF you can print from any viewer. Сохраните копию в другом формате. Печать идёт через PDF, который можно распечатать из любой программы просмотра. + Save As Сохранить как + Save as Template Сохранить как шаблон + Saved Сохранено + Search Commands Поиск команд + Search commands and help Поиск команд и справки + Search document Поиск в документе + Section Breaks Разрывы разделов + Section Properties Свойства раздела + Sections Разделы + Select Выделить + Select All Выделить всё + Select Cell Выделить ячейку + Select Line Выделить строку текста + Select Objects Выбор объектов + Select Paragraph Выделить абзац + Select Range Выделить диапазон + Select Recipients Выбрать получателей + Select Row Выделить строку таблицы + Select Sentence Выделить предложение + Select Table Выделить таблицу + Select Text Выделить текст + Select Text with Similar Formatting Выделить текст с похожим форматированием + Select Word Выделить слово + Select\nRecipients Выбрать\nполучателей + Selection Выделение + Selection Pane Область выделения + Send Backward Переместить назад + Sentence case. Как в предложениях. + Set as Default Использовать по умолчанию + Set Caret Установить курсор + Set Character Formatting Задать формат знаков + Set Numbering Value Задать значение нумерации + Set Paragraph Formatting Задать формат абзаца + Shading Заливка + Shadow Тень + Shape Fill Заливка фигуры + Shape Format Формат фигуры + Shape Outline Контур фигуры + Shape Styles Стили фигур + Shapes Фигуры + Share Поделиться + Shift+Tab Shift+Tab + Show Показать + Show all formatting marks Показывать все знаки форматирования + Show Comments Показать комментарии + Show Markup Показать исправления + Show Notes Показать сноски + Show rulers Показывать линейки + Show the community button in the title bar Показывать кнопку сообщества в заголовке окна + Show/Hide ¶ Показать/скрыть ¶ + Show\nComments Показать\nкомментарии + Shrink Font 1 Point Уменьшить шрифт на 1 пт + Side to Side Рядом + Side\nto Side Рядом + Signature Line Строка подписи + Single Одинарный + Single Spacing Одинарный интервал + Size Размер + Size: Размер: + Small Caps Малые прописные + Small caps Малые прописные + SmartArt SmartArt + Sort Сортировка + Source code: github.com/storytold/wordcraft Исходный код: github.com/storytold/wordcraft + Space before/after: Интервал перед/после: + Spacing Интервал + Spacing (pt): Интервал (пт): + Speech Речь + Spelling & Grammar Орфография и грамматика + Spelling &\nGrammar Орфография\nи грамматика + Spelling Suggestions Варианты написания + Split Разделить + Split Cells Разделить ячейки + Split Table Разделить таблицу + Spreadsheet Table Электронная таблица + Standard Colors Стандартные цвета + Star Звезда + Start Mail Merge Начать слияние + Start Mail\nMerge Начать\nслияние + Statistics Статистика + Status Bar Строка состояния + Strikethrough Зачёркнутый + Strong Строгий + Studio cover Обложка Studio + Studio handbook (sample) Справочник Studio (пример) + Style Стиль + Style based on: Основан на стиле: + Style Set Набор стилей + Style: {style} Стиль: {style} + Styles Стили + Styles Pane Область стилей + Subject Тема + Subscript Подстрочный + Subtitle Подзаголовок + Subtle Emphasis Слабое выделение + Subtle Reference Слабая ссылка + Superscript Надстрочный + Switch Modes Сменить режим + Switch\nModes Сменить\nрежим + Symbol Символ + Symbols Символы + Synonyms Синонимы + Tab Tab + Table Таблица + Table Column Width Ширина столбца таблицы + Table Design Дизайн таблицы + Table Grid Сетка таблицы + Table Layout Макет таблицы + Table of Authorities Таблица ссылок + Table of Contents Оглавление + Table of Figures Список иллюстраций + Table of\nContents Оглавление + Table Properties Свойства таблицы + Table Row Height Высота строки таблицы + Table Style Options Параметры стилей таблиц + Table Styles Стили таблиц + Tables Таблицы + Tabs Табуляция + Tabular List Табличный список + Text Текст + Text Box Текстовое поле + Text Direction Направление текста + Text Effects Текстовые эффекты + Text Effects and Typography Текстовые эффекты и типографика + Text from File Текст из файла + Text Highlight Color Цвет выделения текста + Text to display: Отображаемый текст: + Text Wrapping Обтекание текстом + Text: Текст: + Text\nBox Текстовое\nполе + Text\nDirection Направление\nтекста + The new style takes the formatting of the current paragraph. Новый стиль получит форматирование текущего абзаца. + Theme Colors Цвета темы + Theme Fonts Шрифты темы + Theme List Список тем + Themes Темы + Thesaurus Тезаурус + Thick Толстый + Three Три + Tight Плотный + Title Заголовок +# The style is «Заголовок»; the Design tab's tiles are too narrow for it, so they show a sample word. +preview Title Пример + TOA Heading Заголовок таблицы ссылок + TOC Heading Заголовок оглавления + TOC {n} Оглавление {n} + Top Border Верхняя граница + Top of Page Вверху страницы + Top: Сверху: + Total Row Строка итогов + Track Changes Отслеживать изменения + Track Changes: On Отслеживание изменений: вкл. + Tracking Отслеживание + Translate Перевести + Transparency Прозрачность + Triangle Треугольник + Two Две + Type a command, e.g. "insert table" Введите команду, например «вставить таблицу» + Type Text Ввести текст + Underline Подчёркнутый + Underline Words Only Подчёркивать только слова + Undo Отменить + Undo {action} Отменить: {action} + Up Вверх + Update Field Обновить поле + Update Index Обновить указатель + Update Style to Match Selection Обновить стиль по выделенному фрагменту + Update Table Обновить таблицу + Update Table of Figures Обновить список иллюстраций + Update to Match Обновить по образцу + Update to Match Selection Обновить по выделенному фрагменту + UPPERCASE ВСЕ ПРОПИСНЫЕ + User Name Имя пользователя + User name: Имя пользователя: + Version History Журнал версий + Version {version} ({build}) Версия {version} ({build}) + Vertical Вертикально + Vertical Alignment Вертикальное выравнивание + View Вид + View Gridlines Показать сетку + View State Состояние вида + Views Режимы просмотра + Voice Голос + Watermark Подложка + Wave Волнистый + Web Layout Веб-документ + Web page (*.html) Веб-страница (*.html) + Web\nLayout Веб-\nдокумент + Whole page Страница целиком + Whole words Слово целиком + Wide Широкие + Widow/Orphan Control Запрет висячих строк + Widow/Orphan control Запрет висячих строк + Wildcards (regex) Подстановочные знаки (regex) + Window Окно + Word Count Число слов + Word document (*.docx) Документ Word (*.docx) + Word Left На слово влево + Word Right На слово вправо + WordArt WordArt + WordCraft WordCraft + Words Слова + Words only Только слова + Wrap Text Обтекание текстом + Wrap\nText Обтекание\nтекстом + Write & Insert Fields Составление документа и вставка полей + Zoom Масштаб + Zoom In Увеличить + Zoom Out Уменьшить + {group} settings Параметры: {group} + {key}+Click to follow link {key}+щелчок — перейти по ссылке + {selected} of {words} words Слов: {selected} из {words} + {words} words Слов: {words} + Dark page (white text on black) Тёмная страница (белый текст на чёрном) + Show documents with their colours inverted, like View › Switch Modes. Saving, printing and PDFs are unchanged. Показывать документы с инвертированными цветами, как «Вид › Сменить режим». Сохранение, печать и PDF не меняются. + Only web (http, https) and email (mailto) links can be followed Переходить можно только по веб-ссылкам (http, https) и ссылкам на электронную почту (mailto) + + Apply Styles Применить стили + AutoSave documents you have saved in WordCraft Автосохранение документов, уже сохранённых в WordCraft + AutoSave failed: {error}. Save the document to turn AutoSave back on. Ошибка автосохранения: {error}. Сохраните документ, чтобы снова включить автосохранение. + Bottom Margin Нижнее поле + Edit Comment Изменить комментарий + Left Margin Левое поле + More templates → Другие шаблоны → + No templates match your search. Нет шаблонов, подходящих под запрос. + Reopen Открыть снова + Right Margin Правое поле + Search for templates Поиск шаблонов + Character Border Граница знаков + Count words in text boxes and notes Учитывать текстовые поля и сноски + Couldn't download {name}: {error} Не удалось загрузить {name}: {error} + Do you want to save changes to {name}? Сохранить изменения в {name}? + Don't Save Не сохранять + Move or Resize Переместить или изменить размер + Nudge Сдвинуть + Left-to-Right Text Direction Направление текста слева направо + That format doesn't keep everything, so the document is still open. Save it as a Word document (.docx) to go on. Этот формат сохраняет не всё, поэтому документ остаётся открытым. Чтобы продолжить, сохраните его как документ Word (.docx). + Top Margin Верхнее поле + Write a reply Написать ответ + Direction: Направление: + Right-to-left Справа налево + Left-to-right Слева направо + Zotero Zotero + Citations Ссылки на источники + Document Документ + Add/Edit\nCitation Добавить/изменить\nссылку + Add\nNote Добавить\nзаметку + Add/Edit\nBibliography Добавить/изменить\nсписок литературы + Refresh Обновить + Document\nPreferences Параметры\nдокумента + Unlink\nCitations Отвязать\nссылки + Waiting for Zotero… Ожидание Zotero… + Zotero: done Zotero: готово + Zotero: cancelled Zotero: отменено + Yes Да + No Нет + Move Past Citation Перейти к концу ссылки + Move Past\nCitation Перейти к концу\nссылки + Next Sentence Следующее предложение + Previous Sentence Предыдущее предложение + Next sentence Следующее предложение + Previous sentence Предыдущее предложение + Play/Pause Воспроизведение/пауза + Read Aloud Status Состояние чтения вслух + Reading Speed Скорость чтения + Skip Citations and Bibliography Пропускать ссылки и список литературы + Skip citations & bibliography Пропускать ссылки и список литературы + Stop Reading Остановить чтение + Don't read Zotero, Mendeley or EndNote citations and bibliographies Не читать ссылки и списки литературы Zotero, Mendeley и EndNote + Play Воспроизвести + Pause Пауза + Stop Стоп + Sentence Предложение + Paused Приостановлено + Finished Завершено + Stopped Остановлено + Speed Скорость + Normal speed Обычная скорость + Your changes will be lost if you don't save them. Если не сохранить изменения, они будут потеряны. + Scroll ribbon left Прокрутить ленту влево + Scroll ribbon right Прокрутить ленту вправо + Change Structure Изменить структуру + Change to Display Показать на отдельной строке + Change to Inline Показать в строке + Conversions Преобразования + Delete Back in Equation Удалить назад в уравнении + Delete in Equation Удалить в уравнении + Edit Equation Изменить уравнение + Enter in Equation Новая строка в уравнении + Equation Gallery Коллекция уравнений + Equation Info Сведения об уравнении + Equation Number Номер уравнения + Input Format Формат ввода + Insert Structure Вставить структуру + Insert Symbol Вставить символ + Justification Выравнивание + Leave Equation Выйти из уравнения + Move in Equation Перемещение в уравнении + Normal Text Обычный текст + Set Equation Задать уравнение + Structure Actions Действия со структурой + Structures Структуры + Tools Инструменты + Type in Equation Ввод в уравнение + Inline В строке + Number Номер + Close Equation Закрыть уравнение + Insert New Equation Вставить новое уравнение + Built-In Встроенные + Professional Профессиональный + Linear Линейный + Fraction Дробь + Script Индекс + Radical Радикал + Integral Интеграл + Large\nOperator Крупный\nоператор + Bracket Скобка + Function Функция + Accent Диакритические\nзнаки + Limit and\nLog Предел\nи логарифм + Operator Оператор + Equation Options Параметры уравнений + All symbol sets Все наборы символов + Send the document straight to the system print dialog, or save a copy in another format below. Отправьте документ прямо в системное окно печати или сохраните копию в другом формате ниже. + Or save a copy in another format: Или сохраните копию в другом формате: + Opening print dialog… Открытие окна печати… + Print failed: {error} Ошибка печати: {error} + Couldn't open {path}: {error} Не удалось открыть {path}: {error} + Column Selection Выделить столбец + Style Inspector Инспектор стилей + Inspect Styles at Selection Стили выделенного фрагмента + Clear Formatting Level Очистить уровень форматирования + Characters Знаки + Direct formatting Прямое форматирование + Reset to Normal Вернуть «Обычный» + Clear Paragraph Formatting Очистить форматирование абзаца + Clear Character Style Очистить стиль знаков + Clear Character Formatting Очистить форматирование знаков + Clear All Очистить всё + Paste Special Специальная вставка + Paste Special… Специальная вставка… + Paste as: Вставить как: + The clipboard is empty. Буфер обмена пуст. + Formatted Text Форматированный текст + Rich Text Format (RTF) Текст в формате RTF + HTML Format Формат HTML + Unformatted Text Неформатированный текст + Result Результат + Keeps the fonts and formatting of the copied text. Сохраняет шрифты и форматирование скопированного текста. + Reads the clipboard's rich text and keeps its formatting. Берёт RTF-текст из буфера обмена и сохраняет его форматирование. + Reads the clipboard's web content and keeps its formatting. Берёт веб-содержимое из буфера обмена и сохраняет его форматирование. + Drops all formatting and pastes plain text. Убирает всё форматирование и вставляет обычный текст. + Advanced Find Расширенный поиск + Advanced Find… Расширенный поиск… + Go To… Перейти… + Reading Highlight Выделить совпадения + New Table Style Новый стиль таблицы + Modify Table Style Изменить стиль таблицы + New Table Style… Новый стиль таблицы… + Modify Table Style… Изменить стиль таблицы… + Apply formatting to: Применить форматирование к: + Whole Table Вся таблица + Fill color: Цвет заливки: + {count} items highlighted Выделено совпадений: {count} + {n} pt {n} пт + Not {name} Не {name} + Level {n} Уровень {n} + Body Text Основной текст + {n} lines Множитель {n} + At least {n} Минимум {n} + Exactly {n} Точно {n} + Centered По центру + Character spacing Межзнаковый интервал + Don't add space between paragraphs of the same style Не добавлять интервал между абзацами одного стиля + Don't hyphenate Без переносов + Double strikethrough Двойное зачёркивание + Drop cap Буквица + First line Первая строка + Font color Цвет шрифта + Highlight Выделение цветом + Justified По ширине + Left indent Отступ слева + Line spacing Межстрочный интервал + Outline level Уровень структуры + Raised/lowered Смещение вверх/вниз + Right indent Отступ справа + Scale Масштаб + Space after Интервал после + Space before Интервал перед + Suppress line numbers Без нумерации строк + Underline color Цвет подчёркивания + Letters Письма + E-mail Messages Сообщения электронной почты + Directory Каталог + Normal Word Document Обычный документ Word + If…Then…Else… Если…То…Иначе… + If…Then…Else Если…То…Иначе + Merge Record # Номер записи слияния + Skip Record If… Пропустить запись, если… + Skip Record If Пропустить запись, если + Equals: Равно: + Then insert: Тогда вставить: + Otherwise insert: Иначе вставить: + Courtesy Title Обращение + First Name Имя + Last Name Фамилия + Company Организация + Address Адрес + City Город + State Регион + Postal Code Почтовый индекс + Country Страна + (not matched) (не сопоставлено) + Leave a recipient out of the merge when a field has this value. Не включать получателя в слияние, если поле имеет это значение. + Insert one text or another, depending on a field's value. Вставить один или другой текст в зависимости от значения поля. + Select recipients first to match their fields. Сначала выберите получателей, чтобы сопоставить их поля. + The recipient-list field that fills each part of an address block and greeting line. Поле списка получателей, которое заполняет каждую часть блока адреса и строки приветствия. + No errors found: every merge field is in the recipient list. Ошибок не найдено: все поля слияния есть в списке получателей. + These merge fields aren't in the recipient list: Этих полей слияния нет в списке получателей: + Add at least one field. Добавьте хотя бы одно поле. + Add Field Добавить поле + Every field needs a name. У каждого поля должно быть имя. + Field name Имя поля + Field names must be different. Имена полей не должны повторяться. + Fields: Поля: + Field: Поле: + Find: Найти: + New Entry Новая запись + Recipient List Список получателей + Recipients: {count} Получателей: {count} + Remove field Удалить поле + Remove recipient Удалить получателя + Select recipients first to choose from their fields. Сначала выберите получателей, чтобы выбирать из их полей. + Type a New List… Ввести новый список… + Type at least one recipient. Введите хотя бы одного получателя. + Type the recipients, or load them from a file. Введите получателей или загрузите их из файла. + Use an Existing List… Использовать существующий список… + Interface theme: Тема интерфейса: + Interface\nTheme Тема\nинтерфейса + Interface Theme Тема интерфейса + Light Светлая + Dark Тёмная + Use system setting Как в системе + A file dialog is already open. Окно выбора файла уже открыто. + Height: Высота: + Width: Ширина: + Row Строка + Cell Ячейка + Preferred width: Желаемая ширина: + Alignment: Выравнивание: + Indent from left: Отступ слева: + Specify height: Высота: + Exactly Точно + At least Минимум + Allow row to break across pages Разрешить перенос строки на следующую страницу + Repeat as header row on each page Повторять как заголовок на каждой странице + Vertical alignment: Вертикальное выравнивание: + Top Сверху + Bottom Снизу + Alt text Замещающий текст + Alt: Замещающий текст: + W: Ш: + H: В: + Reset Сбросить + Reset Crop Сбросить обрезку + Insert a new equation (Alt+=) Вставить новое уравнение (Alt+=) + Leave the equation (Esc) Выйти из уравнения (Esc) + Preview Предварительный просмотр + getartcraft.com/apps/wordcraft getartcraft.com/apps/wordcraft + Browse… Обзор… + +# Equation gallery, themes, watermarks, paper sizes, table styles and other strings the +# interface audit (`i18n/audit.rs`) found without a Russian entry. + AaBbYyZz АаБбЮюЯя + Align Top Left По верхнему левому краю + Align Top Center По верхнему краю, по центру + Align Top Right По верхнему правому краю + Align Center Left По центру, по левому краю + Align Center По центру + Align Center Right По центру, по правому краю + Align Bottom Left По нижнему левому краю + Align Bottom Center По нижнему краю, по центру + Align Bottom Right По нижнему правому краю + Commits Коммиты + {contributors} contributors · {commits} commits Участников: {contributors} · коммитов: {commits} + Display name Отображаемое имя + Real name Настоящее имя + Username Имя пользователя + Document1 Документ1 + Font… Шрифт… + Paragraph… Абзац… + Link… Ссылка… + Lines +/− Строки +/− + Model Модель + Version Версия + % of all commits % всех коммитов + pt пт + Save the document to turn on AutoSave Сохраните документ, чтобы включить автосохранение + Contributors Участники + Models Модели + Good evening Добрый вечер + Good morning Доброе утро + Good afternoon Добрый день + Track\nChanges Отслеживать\nизменения + Track\nChanges ✓ Отслеживать\nизменения ✓ + tOGGLE cASE иЗМЕНИТЬ рЕГИСТР + Change to Level 1 Перейти на уровень 1 + Change to Level 2 Перейти на уровень 2 + Change to Level 3 Перейти на уровень 3 + Change to Level 4 Перейти на уровень 4 + Change to Level 5 Перейти на уровень 5 + Level 1 Уровень 1 + Level 2 Уровень 2 + Level 3 Уровень 3 + ASAP КАК МОЖНО СКОРЕЕ + CONFIDENTIAL КОНФИДЕНЦИАЛЬНО + DO NOT COPY НЕ КОПИРОВАТЬ + DRAFT ЧЕРНОВИК + SAMPLE ОБРАЗЕЦ + URGENT СРОЧНО! + Atelier Ателье + Craft Ремесло + Darkroom Фотолаборатория + Gallery Галерея + Sketchbook Скетчбук + Studio Студия + Letter 8.50" × 11.00" Letter 8,50" × 11,00" + Legal 8.50" × 14.00" Legal 8,50" × 14,00" + Executive 7.25" × 10.50" Executive 7,25" × 10,50" + Statement 5.50" × 8.50" Statement 5,50" × 8,50" + Tabloid 11.00" × 17.00" Tabloid 11,00" × 17,00" + B4 (JIS) 10.12" × 14.33" B4 (JIS) 10,12" × 14,33" + B5 (JIS) 7.17" × 10.12" B5 (JIS) 7,17" × 10,12" + Envelope #10 4.12" × 9.50" Конверт №10 4,12" × 9,50" + Envelope DL 4.33" × 8.66" Конверт DL 4,33" × 8,66" + Plain Table 1 Простая таблица 1 + Grid Table 1 Light Таблица-сетка 1, светлая + Grid Table 4 – Blue Таблица-сетка 4 — синяя + Grid Table 4 – Green Таблица-сетка 4 — зелёная + Grid Table 4 – Orange Таблица-сетка 4 — оранжевая + Grid Table 4 – Purple Таблица-сетка 4 — фиолетовая + List Table 3 – Blue Таблица-список 3 — синяя + List Table 3 – Green Таблица-список 3 — зелёная + List Table 3 – Orange Таблица-список 3 — оранжевая + List Table 3 – Purple Таблица-список 3 — фиолетовая + Convert between built-up and linear form Переключить между профессиональным и линейным видом + Justification of a display equation Выравнивание отдельного уравнения + Number the equation; the number sits at the right margin (or type # then the number) Пронумеровать уравнение; номер стоит у правого поля (или введите # и номер) + Show the equation in the line of text Показать уравнение в строке текста + Show the equation on a line of its own Показать уравнение на отдельной строке + Type equations in LaTeX Вводить уравнения в LaTeX + Type equations in the linear format (UnicodeMath) Вводить уравнения в линейном формате (UnicodeMath) + Type normal (non-math) text in the equation Вводить в уравнении обычный (не математический) текст + Sides of a right triangle Стороны прямоугольного треугольника + Circle area from its radius Площадь круга по радиусу + Roots of ax²+bx+c Корни ax²+bx+c + Binomial expansion of (x+a)ⁿ Бином Ньютона для (x+a)ⁿ + Power series of (1+x)ⁿ Степенной ряд (1+x)ⁿ + Euler's identity Тождество Эйлера + Derivative as a limit Производная как предел + Exponential series Ряд для экспоненты + Integral of e^(−x²) Интеграл от e^(−x²) + Sine and cosine series of f(x) Ряд Фурье для f(x) + Sum or difference of sines Сумма или разность синусов + Sum of cosines Сумма косинусов + Normal probability density Плотность нормального распределения + Bayes' rule Формула Байеса + Accents Диакритические знаки + Arrows Стрелки + Basic Math Основные математические + Boxed Formulas Формулы в рамке + Cases and Stacks Системы и столбцы + Common Accent Objects Часто используемые объекты с диакритикой + Common Brackets Часто используемые скобки + Common Fractions Часто используемые дроби + Common Functions Часто используемые функции + Common Large Operators Часто используемые крупные операторы + Common Operator Structures Часто используемые структуры операторов + Common Operators Часто используемые операторы + Common Radicals Часто используемые радикалы + Common Subscripts and Superscripts Часто используемые индексы + Contour Integrals Контурные интегралы + Differentials Дифференциалы + Dots Многоточия + Empty Matrices Пустые матрицы + Functions Функции + Geometry Геометрия + Greek Letters Греческие буквы + Hyperbolic Functions Гиперболические функции + Identity Matrices Единичные матрицы + Integrals Интегралы + Inverse Functions Обратные функции + Inverse Hyperbolic Functions Обратные гиперболические функции + Letter-Like Symbols Буквоподобные символы + Matrices with Brackets Матрицы со скобками + Negated Relations Отрицания отношений + Operator Structures Структуры операторов + Operators Операторы + Other Large Operators Другие крупные операторы + Overbars and Underbars Черта сверху и снизу + Products and Coproducts Произведения и копроизведения + Radicals Радикалы + Scripts Индексы + Single Brackets Одиночные скобки + Sparse Matrices Разреженные матрицы + Subscripts and Superscripts Нижние и верхние индексы + Summations Суммы + Trigonometric Functions Тригонометрические функции + Unions and Intersections Объединения и пересечения + 1×2 Empty Matrix Пустая матрица 1×2 + 1×3 Empty Matrix Пустая матрица 1×3 + 2×1 Empty Matrix Пустая матрица 2×1 + 2×2 Empty Matrix Пустая матрица 2×2 + 2×3 Empty Matrix Пустая матрица 2×3 + 3×1 Empty Matrix Пустая матрица 3×1 + 3×2 Empty Matrix Пустая матрица 3×2 + 3×3 Empty Matrix Пустая матрица 3×3 + 2×2 Determinant Определитель 2×2 + 2×2 Identity Matrix Единичная матрица 2×2 + 2×2 Identity Matrix (sparse) Единичная матрица 2×2 (разреженная) + 3×3 Identity Matrix Единичная матрица 3×3 + 3×3 Identity Matrix (sparse) Единичная матрица 3×3 (разреженная) + 2×2 Matrix in Brackets Матрица 2×2 в квадратных скобках + 2×2 Matrix in Double Bars Матрица 2×2 в двойных вертикальных чертах + 2×2 Matrix in Parentheses Матрица 2×2 в круглых скобках + n×n Identity Matrix Единичная матрица n×n + n×n Matrix Матрица n×n + A xor B A исключающее ИЛИ B + Absolute value cases Уравнение со случаями + Acute Ударение + Angle Brackets Угловые скобки + Angle Brackets with Separator Угловые скобки с разделителем + Angle Brackets with Two Separators Угловые скобки с двумя разделителями + Bar Черта + Baseline Dots Многоточие по базовой линии + Binomial Coefficient Биномиальный коэффициент + Binomial Coefficient (angle) Биномиальный коэффициент (угловые скобки) + Binomial Coefficient with Angle Brackets Биномиальный коэффициент в угловых скобках + Boxed Formula Формула в рамке + Boxed Formula (example) Формула в рамке (пример) + Braces Фигурные скобки + Braces with Separator Фигурные скобки с разделителем + Brackets Квадратные скобки + Brackets with Separators Скобки с разделителями + Breve Бреве + Cases (Three Conditions) Система (три условия) + Cases (Two Conditions) Система (два условия) + Ceiling Округление вверх + Change in y over change in x Приращение y к приращению x + Check Галка + Circled Dot Точка в круге + Circled Plus Плюс в круге + Circled Times Умножение в круге + Colon Equal Двоеточие-равно + Contour Integral Контурный интеграл + Contour Integral with Limits Контурный интеграл с пределами + Contour Integral with Stacked Limits Контурный интеграл с пределами сверху и снизу + Coproduct Копроизведение + Coproduct with Limits Копроизведение с пределами + Coproduct with Lower Limit Копроизведение с нижним пределом + Coproduct with Subscript-Superscript Limits Копроизведение с пределами в индексах + Cosecant Function Косеканс + Cosine 2x Косинус 2x + Cosine Function Косинус + Cotangent Function Котангенс + Cube Root Кубический корень + Delta Equal To Дельта равна + Delta over arrow Дельта над стрелкой + Diagonal Dots Диагональное многоточие + Differential Дифференциал + Differential theta Дифференциал тета + Differential x Дифференциал x + Differential y Дифференциал y + Dot Точка + Double Bar Двойная черта + Double Dot Две точки + Double Integral Двойной интеграл + Double Integral with Limits Двойной интеграл с пределами + Double Integral with Stacked Limits Двойной интеграл с пределами сверху и снизу + Double Left Arrow with Text Above Двойная стрелка влево с текстом сверху + Double Left Arrow with Text Below Двойная стрелка влево с текстом снизу + Double Left Right Arrow with Text Above Двойная двусторонняя стрелка с текстом сверху + Double Left Right Arrow with Text Below Двойная двусторонняя стрелка с текстом снизу + Double Right Arrow with Text Above Двойная стрелка вправо с текстом сверху + Double Right Arrow with Text Below Двойная стрелка вправо с текстом снизу + Double Square Brackets Двойные квадратные скобки + Double Vertical Bars Двойные вертикальные черты + Double summation Двойная сумма + Equal Equal Равно-равно + Equal by Definition Равно по определению + Exponential Экспонента + Floor Округление вниз + Grave Обратное ударение + Grouping Character Above Группирующий знак сверху + Grouping Character Below Группирующий знак снизу + Hat Крышка + Hyperbolic Cosecant Function Гиперболический косеканс + Hyperbolic Cosine Function Гиперболический косинус + Hyperbolic Cotangent Function Гиперболический котангенс + Hyperbolic Secant Function Гиперболический секанс + Hyperbolic Sine Function Гиперболический синус + Hyperbolic Tangent Function Гиперболический тангенс + Hypotenuse Гипотенуза + Integral with Limits Интеграл с пределами + Integral with Stacked Limits Интеграл с пределами сверху и снизу + Intersection Пересечение + Intersection with Limits Пересечение с пределами + Intersection with Lower Limit Пересечение с нижним пределом + Intersection with Subscript-Superscript Limits Пересечение с пределами в индексах + Inverse Cosecant Function Арккосеканс + Inverse Cosine Function Арккосинус + Inverse Cotangent Function Арккотангенс + Inverse Hyperbolic Cosecant Function Обратный гиперболический косеканс + Inverse Hyperbolic Cosine Function Обратный гиперболический косинус + Inverse Hyperbolic Cotangent Function Обратный гиперболический котангенс + Inverse Hyperbolic Secant Function Обратный гиперболический секанс + Inverse Hyperbolic Sine Function Обратный гиперболический синус + Inverse Hyperbolic Tangent Function Обратный гиперболический тангенс + Inverse Secant Function Арксеканс + Inverse Sine Function Арксинус + Inverse Tangent Function Арктангенс + Left Arrow with Text Above Стрелка влево с текстом сверху + Left Arrow with Text Below Стрелка влево с текстом снизу + Left Bracket Twice Две левые квадратные скобки + Left Right Arrow Above Двусторонняя стрелка сверху + Left Right Arrow with Text Above Двусторонняя стрелка с текстом сверху + Left Right Arrow with Text Below Двусторонняя стрелка с текстом снизу + Left Subscript-Superscript Левые нижний и верхний индексы + Leftwards Arrow Above Стрелка влево сверху + Leftwards Harpoon Above Гарпун влево сверху + Limit Предел + Limit Example Пример предела + Linear Fraction Линейная дробь + Logarithm Логарифм + Logarithm with Base Логарифм по основанию + Logical AND Логическое И + Logical AND with Limits Логическое И с пределами + Logical OR Логическое ИЛИ + Logical OR with Limits Логическое ИЛИ с пределами + Maximum Максимум + Maximum Example Пример максимума + Measured By Единица измерения + Midline Dots Многоточие по средней линии + Minimum Минимум + Minus Equal Минус-равно + Natural Logarithm Натуральный логарифм + One half Одна вторая + Outward Brackets Внешние квадратные скобки + Overbar Черта сверху + Overbrace Фигурная скобка сверху + Parentheses Круглые скобки + Parentheses with Separator Круглые скобки с разделителем + Partial Differential Частный дифференциал + Pi Over 2 Пи на 2 + Plus Equal Плюс-равно + Product Произведение + Product of A Произведение A + Product with Limits Произведение с пределами + Product with Lower Limit Произведение с нижним пределом + Product with Subscript-Superscript Limits Произведение с пределами в индексах + Quadratic Root Корень квадратного уравнения + Radical with Degree Радикал со степенью + Right Arrow with Text Above Стрелка вправо с текстом сверху + Right Arrow with Text Below Стрелка вправо с текстом снизу + Right Bracket Twice Две правые квадратные скобки + Rightwards Arrow Above Стрелка вправо сверху + Rightwards Harpoon Above Гарпун вправо сверху + Secant Function Секанс + Sine Function Синус + Sine theta Синус тета + Single Left Angle Одиночная левая угловая скобка + Single Left Bar Одиночная левая черта + Single Left Brace Одиночная левая фигурная скобка + Single Left Bracket Одиночная левая квадратная скобка + Single Left Parenthesis Одиночная левая круглая скобка + Single Right Brace Одиночная правая фигурная скобка + Single Right Bracket Одиночная правая квадратная скобка + Single Right Parenthesis Одиночная правая круглая скобка + Skewed Fraction Наклонная дробь + Small change Малое приращение + Square Квадрат + Square Root Квадратный корень + Square Root with Degree Квадратный корень со степенью + Square Union Квадратное объединение + Stack Object Стопка + Stack Object (Three) Стопка (три элемента) + Stacked Fraction Вертикальная дробь + Stacked, no bar Друг над другом, без черты + Subscript-Superscript Нижний и верхний индексы + Summation Сумма + Summation from 0 to n Сумма от 0 до n + Summation over binomials Сумма биномиальных коэффициентов + Summation with Limits Сумма с пределами + Summation with Lower Limit Сумма с нижним пределом + Summation with Subscript Limit Сумма с пределом в индексе + Summation with Subscript-Superscript Limits Сумма с пределами в индексах + Surface Integral Поверхностный интеграл + Surface Integral with Limits Поверхностный интеграл с пределами + Surface Integral with Stacked Limits Поверхностный интеграл с пределами сверху и снизу + Tangent Function Тангенс + Tangent formula Формула тангенса + Text over Colon Equal Текст над двоеточием-равно + Text over Equal Текст над знаком равенства + Tilde Тильда + Triple Dot Три точки + Triple Integral Тройной интеграл + Triple Integral with Limits Тройной интеграл с пределами + Triple Integral with Stacked Limits Тройной интеграл с пределами сверху и снизу + Underbar Черта снизу + Underbrace Фигурная скобка снизу + Union Объединение + Union of intersections Объединение пересечений + Union with Limits Объединение с пределами + Union with Lower Limit Объединение с нижним пределом + Union with Plus Объединение с плюсом + Union with Subscript-Superscript Limits Объединение с пределами в индексах + Up Diagonal Dots Диагональное многоточие вверх + Vector A Вектор A + Vector AB Вектор AB + Vertical Bars Вертикальные черты + Vertical Dots Вертикальное многоточие + Volume Integral Объёмный интеграл + Volume Integral with Limits Объёмный интеграл с пределами + Volume Integral with Stacked Limits Объёмный интеграл с пределами сверху и снизу + Yields Выход + x bar x с чертой + AutoSave isn't available in the browser: it can't write to your files. Save downloads a copy. В браузере автосохранение недоступно: оно не может записывать ваши файлы. «Сохранить» скачивает копию. + AutoSave only keeps .docx, .odt and .rtf files; {name} can't keep all formatting. Save as .docx to turn on AutoSave. Автосохранение работает только с файлами .docx, .odt и .rtf; {name} не сохраняет всё форматирование. Сохраните файл как .docx, чтобы включить автосохранение. + Save the document to turn on AutoSave (a file you have only opened isn't rewritten until you save it) Сохраните документ, чтобы включить автосохранение (открытый файл не перезаписывается, пока вы его не сохраните) + +# Labels added on main and in this stack after the first Russian catalog (#300 integration) + Add Object to Selection Добавить объект к выделению + Add space between Asian and Latin text Добавлять пробел между азиатским и латинским текстом + Add space between Asian text and numbers Добавлять пробел между азиатским текстом и числами + Allow hanging punctuation Разрешить висячую пунктуацию + Allow Latin text to wrap in the middle of a word Разрешить перенос латинского текста посреди слова + Apply Asian line-breaking rules (kinsoku) Применять азиатские правила переноса строк (кинсоку) + Asian Typography Азиатская типографика + Click a border between two cells to merge them. Esc stops. Щёлкните границу между двумя ячейками, чтобы объединить их. Esc — завершить. + Compress punctuation at the start of a line Сжимать пунктуацию в начале строки + Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. Нарисуйте прямоугольник, чтобы создать таблицу, или линию поперёк ячеек, чтобы разделить их. Esc — завершить. + Draw Table Нарисовать таблицу + Indents and Spacing Отступы и интервалы + Line breaking Перенос строк + Clipboard Pane Область буфера обмена + Clipboard Items Элементы буфера обмена + Paste Clipboard Item Вставить элемент буфера обмена + Paste All Вставить всё + Delete Clipboard Item Удалить элемент буфера обмена + Click an item to paste it. Щёлкните элемент, чтобы вставить его. + Nothing collected yet. Items you copy or cut appear here. Пока пусто. Здесь появятся элементы, которые вы копируете или вырезаете. + (picture or object) (рисунок или объект) + Ungroup Разгруппировать + Draw Ink Рисовать от руки + Erase Ink Стереть рукописный ввод + Hide Ink Скрыть рукописный ввод + Hide\nInk Скрыть + Pens Перья + Ink Рукописный ввод + Thickness Толщина + Shape Effects Эффекты фигуры + Glow Свечение + Soft Edges Сглаживание + No Shadow Без тени + No Glow Без свечения + No Soft Edges Без сглаживания + Glow Colors Цвета свечения + Weight Толщина + Shadow, glow and soft edges Тень, свечение и сглаживание + Offset: Bottom Right Смещение: вниз вправо + Offset: Bottom Смещение: вниз + Offset: Bottom Left Смещение: вниз влево + Offset: Right Смещение: вправо + Offset: Center Смещение: по центру + Offset: Left Смещение: влево + Offset: Top Right Смещение: вверх вправо + Offset: Top Смещение: вверх + Offset: Top Left Смещение: вверх влево + Manage Styles Управление стилями + Show or Hide Style Показать или скрыть стиль + Manage Styles… Управление стилями… + Sort order: Порядок сортировки: + As Recommended По рекомендации + Alphabetical По алфавиту + Font: {font} Шрифт: {font} + {size} pt {size} пт + Color: {color} Цвет: {color} + Space before: {pt} pt Интервал перед: {pt} пт + Space after: {pt} pt Интервал после: {pt} пт + Based on: {style} Основан на: {style} + Paragraph style Стиль абзаца + Character style Стиль знаков + Linked style (paragraph and character) Связанный стиль (абзаца и знаков) + Table style Стиль таблицы + Built-in style Встроенный стиль + Show in the Styles gallery Показывать в коллекции стилей + Hide from style lists Скрывать в списках стилей + Built-in styles can't be deleted. Встроенные стили нельзя удалить. + Delete Table Style Удалить стиль таблицы + Password Пароль + Password: Пароль: + Confirm password: Подтвердите пароль: + Encrypt with Password… Зашифровать паролем… + Change Password… Изменить пароль… + Remove Password Убрать пароль + A password is required to open this document. Для открытия этого документа нужен пароль. + Anyone can open this document. Encrypt it with a password to keep it private. Этот документ может открыть любой. Зашифруйте его паролем, чтобы защитить. + Anyone who opens the document will need this password. Для открытия документа понадобится этот пароль. + {name} is protected with a password. {name} защищён паролем. + That password isn't right. Check it (passwords are case-sensitive) and try again. Неверный пароль. Проверьте его (регистр букв важен) и попробуйте снова. + The document will be saved with a password. Save it to protect it. Документ будет сохранён с паролем. Сохраните его, чтобы защитить. + The password is removed. Save the document to keep the change. Пароль убран. Сохраните документ, чтобы изменение осталось. + The passwords don't match. Пароли не совпадают. + Keep the password somewhere safe: without it nobody, WordCraft included, can open the document. Leave both boxes empty to remove the password. Храните пароль в надёжном месте: без него никто, включая WordCraft, не сможет открыть документ. Оставьте оба поля пустыми, чтобы убрать пароль. + {cols}×{rows} Table Таблица {cols}×{rows} + Name Имя + PRs PR + First Первый + Last Последний + Change Picture… Заменить рисунок… + Size and Crop… Размер и обрезка… + Insert Columns to the Left Вставить столбцы слева + Insert Columns to the Right Вставить столбцы справа + Insert Rows Above Вставить строки сверху + Insert Rows Below Вставить строки снизу + Mon Пн + Tue Вт + Wed Ср + Sum Итог + North Север + South Юг + West Запад + Total Всего + +# Table Layout › Draw (#308) + Draw\nTable Нарисовать\nтаблицу + +# Define New Multilevel List and Track Changes Options (#342) + (no style) (нет стиля) + Add tab stop at: Добавить позицию табуляции: + Aligned at: Выравнивание на: + Balloons Выноски + Bullet Маркер + By author По автору + Changed lines: Изменённые строки: + Click level to modify: Выберите уровень для изменения: + Color only Только цвет + Define New Multilevel List Определение нового многоуровневого списка + Define New Multilevel List… Определить новый многоуровневый список… + Deletions: Удаления: + Enter formatting for number: Формат номера: + Follow number with: Символ после номера: + Formatting Форматирование + Include level number from: Включить номер уровня: + Insertions and Deletions Вставки и удаления + Insertions: Вставки: + Left border Левая граница + Legal style numbering Нумерация в юридическом стиле + Link level to style: Связать уровень со стилем: + List Definition Определение списка + Nothing Ничего + Number alignment: Выравнивание номера: + Number format Формат номера + Number style for this level: Вид нумерации для этого уровня: + Outside border Внешняя граница + Restart list after: Начать список заново после: + Right border Правая граница + Show all revisions inline Показывать все изменения в тексте + Show only comments and formatting in balloons Показывать в выносках только комментарии и форматирование + Show revisions in balloons Показывать изменения в выносках + Space Пробел + Start at: Начать с: + Tab character Знак табуляции + Text indent at: Отступ текста: + Track Changes Options Параметры отслеживания изменений + Track formatting Отслеживать форматирование + +# Rotation and flips (#332) + Flip Horizontal Отразить слева направо + Flip Vertical Отразить сверху вниз + Rotate Left 90° Повернуть влево на 90° + Rotate Right 90° Повернуть вправо на 90° + Rotation Поворот + Rotation: Поворот: + +# Tabs, Borders and Shading (#327); Columns, Symbol and Field (#335) + Tab stop position: Позиция табуляции: + Default tab stops: Табуляция по умолчанию: + Tab stops to be cleared: Удаляемые позиции табуляции: + All Все + Decimal По разделителю + Leader Заполнитель + Set Установить + Page Border Граница страницы + Apply to: Применить к: + Whole document Ко всему документу + This section К этому разделу + Fill Заливка + Setting: Тип: + 3-D Объёмная + Custom Другая + Style: Тип линии: + Dot dash Штрихпунктир + Triple Тройная + Between Между абзацами + Borders and Shading Границы и заливка + Tabs… Табуляция… + Borders and Shading… Границы и заливка… + (All) (Все) + (none) (нет) + (normal text) (обычный текст) + 1/4 Em Space Узкий пробел + A mail merge field Поле слияния + A numbered sequence (figures, tables…) Нумерованная последовательность (рисунки, таблицы…) + A table of contents Оглавление + Categories: Категории: + Character Знак + Character code: Код знака: + Col #: Колонка №: + Copyright Знак авторского права + Date and Time Дата и время + Date formats: Форматы даты: + Description: Описание: + Document Information Сведения о документе + Double Closing Quote Закрывающая двойная кавычка + Double Opening Quote Открывающая двойная кавычка + Ellipsis Многоточие + Em Dash Длинное тире + En Dash Короткое тире + Em Space Длинный пробел + En Space Короткий пробел + Equal column width Колонки одинаковой ширины + Field Codes Коды полей + Field code: Код поля: + Field codes: Коды полей: + Field name: Имя поля: + Field names: Имена полей: + Field properties Свойства поля + Field… Поле… + Format: Формат: + Hide Codes Скрыть коды + Index and Tables Указатели и таблицы + Line between Разделитель + Links and References Ссылки + Mail Merge Слияние + More Columns… Другие колонки… + More Symbols… Другие символы… + No-Width Non Break Неразрывный знак нулевой ширины + No-Width Optional Break Необязательный разрыв нулевой ширины + Paragraph Mark Знак абзаца + Pick a field from the list Выберите поле в списке + Preserve formatting during updates Сохранять формат при обновлении + Presets Образцы + Recently used symbols: Недавно использованные символы: + Registered Зарегистрированный товарный знак + Section Mark Знак параграфа + Sequence name: Имя последовательности: + Shortcut key: Сочетание клавиш: + Single Closing Quote Закрывающая одинарная кавычка + Single Opening Quote Открывающая одинарная кавычка + Spacing: Промежуток: + Special Characters Специальные знаки + Subset: Набор: + The time right now Текущее время + When this document was first created Когда документ был создан + When this document was most recently printed Когда документ последний раз печатался + When this document was most recently saved Когда документ последний раз сохранялся + The document has no bookmarks yet. В документе пока нет закладок. + Who the document properties name as author Автор, указанный в свойствах документа + Name of the file this document is saved as Имя файла, под которым сохранён документ + Title from the document properties Название из свойств документа + How many pages the whole document has Сколько страниц во всём документе + How many pages this section has Сколько страниц в этом разделе + Number of the page the field sits on Номер страницы, на которой стоит поле + Number of the section the field sits in Номер раздела, в котором стоит поле + How many words the document holds Сколько слов в документе + Page on which a bookmarked passage falls Страница, на которой находится закладка + Copy of the text a bookmark marks Копия текста закладки + This field has no options. У этого поля нет параметров. + This font has no characters to show. В этом шрифте нет знаков для показа. + This point forward До конца документа + The date it is today Сегодняшняя дата + Trademark Товарный знак + Type the field's name and its switches, for example PAGE \\* roman. Введите имя поля и его ключи, например PAGE \\* roman. + Width and spacing Ширина и промежуток + from Unicode (hex) Юникод (шестн.) + +# Equation › Convert and Justification, and the hyphenation menu's checked None. + All - Linear Все — линейный вид + All - Professional Все — профессиональный вид + Current - Linear Текущее — линейный вид + Current - Professional Текущее — профессиональный вид + Centered as Group По центру как группа + ✓ None ✓ Нет + Formatted Отформатировано + Interface size: Размер интерфейса: + Makes the ribbon, menus and dialogs larger or smaller, on top of your system's display scaling. Document zoom is separate. Увеличивает или уменьшает ленту, меню и диалоговые окна поверх системного масштабирования экрана. Масштаб документа настраивается отдельно. + Copyright Sign Знак авторского права + Demote Понизить уровень + Edit Field Code Изменить код поля + Edit Field… Изменить поле… + Go Back Вернуться + Insert Date Field Вставить поле даты + Insert Page Field Вставить поле номера страницы + Insert Time Field Вставить поле времени + Lock Fields Заблокировать поля + Move Paragraph Down Переместить абзац вниз + Move Paragraph Up Переместить абзац вверх + Next Field Следующее поле + Previous Field Предыдущее поле + Promote Повысить уровень + Registered Sign Знак зарегистрированного товарного знака + Reset Character Formatting Сбросить форматирование символов + Reset Paragraph Formatting Сбросить форматирование абзаца + Selected Fields Выделенные поля + Toggle Field Codes Коды/значения полей + Toggle Unicode Character Преобразовать знак Юникода + Trademark Sign Знак товарного знака + Unlink Fields Разорвать связь с полями + Unlock Fields Разблокировать поля diff --git a/crates/ui-egui/src/i18n/sr-latn.tsv b/crates/ui-egui/src/i18n/sr-latn.tsv index e685adf..b90ae39 100644 --- a/crates/ui-egui/src/i18n/sr-latn.tsv +++ b/crates/ui-egui/src/i18n/sr-latn.tsv @@ -1245,6 +1245,9 @@ South Jug West Zapad Total Ukupno + +# Table Layout › Draw (#308) + Draw\nTable Nacrtaj\ntabelu # Columns, Symbol and Field dialogs (#321). (All) (Sve) (none) (nema) diff --git a/crates/ui-egui/src/i18n/sr.tsv b/crates/ui-egui/src/i18n/sr.tsv index 51227b7..77b206f 100644 --- a/crates/ui-egui/src/i18n/sr.tsv +++ b/crates/ui-egui/src/i18n/sr.tsv @@ -1249,6 +1249,9 @@ South Југ West Запад Total Укупно + +# Table Layout › Draw (#308) + Draw\nTable Нацртај\nтабелу # Columns, Symbol and Field dialogs (#321). (All) (Све) (none) (нема) diff --git a/crates/ui-egui/src/i18n/tests.rs b/crates/ui-egui/src/i18n/tests.rs index 6deecaa..9ba3396 100644 --- a/crates/ui-egui/src/i18n/tests.rs +++ b/crates/ui-egui/src/i18n/tests.rs @@ -362,6 +362,125 @@ fn only_cjk_languages_ask_for_an_installed_cjk_font() { assert_eq!(cjk, ["zh-hans", "zh-hant", "ja"]); } +#[test] +fn russian_locales_and_saved_preference_work_without_changing_the_document() { + let ru = lang("ru"); + for tag in ["ru", "ru-RU", "ru_RU.UTF-8", "RU-ru", "ru_UA.UTF-8", "ru-Cyrl-RU"] { + assert_eq!(lang_from_tag(tag), Some(ru), "{tag}"); + } + assert_eq!(first_supported(["fr-FR", "ru-RU", "en-US"]), Some(ru)); + let mut app = crate::WordApp::new(wordcraft_engine::Session::new(wordcraft_doc::Document::new()), Default::default()); + let before = serde_json::to_value(&app.session.doc).unwrap(); + let result = app.run("ui.language", serde_json::json!({"value": "RU"})).unwrap(); + assert_eq!(result["effective"], "ru"); + assert_eq!(app.ui.language, "ru"); + assert_eq!(serde_json::to_value(&app.session.doc).unwrap(), before); + let saved = serde_json::to_string(&app.ui).unwrap(); + let restored: crate::UiState = serde_json::from_str(&saved).unwrap(); + assert_eq!(Lang::from_pref(&restored.language), ru); + assert_eq!(ru.name(), "Русский"); +} + +#[test] +fn russian_covers_the_entire_existing_interface_catalog() { + use std::collections::HashSet; + let keys = |source| parse_entries(source).0.into_iter().map(|e| e.source).collect::>(); + // Everything the other catalogs translate, plus the preview samples below. + assert!(keys(lang("ru").0.source).is_superset(&keys(lang("zh-hans").0.source))); + assert!(parse_entries(lang("ru").0.source).1.is_empty()); + let ru = lang("ru"); + // Style gallery and Design tab previews show Cyrillic sample text. + assert_eq!(tr(ru, "AaBbCcDd"), "АаБбВвГг"); + assert_eq!(tr(ru, "Title"), "Заголовок"); + assert_eq!(tr(ru, "Heading 1"), "Заголовок 1"); + assert!(tr(ru, "Body text in a short paragraph to show spacing.").starts_with("Основной текст")); + assert_eq!(tr(ru, "Home"), "Главная"); + assert_eq!(tr(ru, "Font"), "Шрифт"); + assert_eq!(tr(ru, "Review"), "Рецензирование"); + assert_eq!(tr(ru, "Save"), "Сохранить"); + assert_eq!(tr(ru, "unknown future label"), "unknown future label"); + // The search hint's example must find the command it names. + assert_eq!(tr(ru, "Insert Table"), "Вставить таблицу"); + assert!(tr(ru, "Type a command, e.g. \"insert table\"").contains("вставить таблицу")); + // Count-neutral wording is grammatical for every count: `Слов: 21`, `Слов: 1 из 21`. + for count in [0, 1, 2, 5, 21, 100, 1000] { + let words = count.to_string(); + assert_eq!(fmt(tr(ru, "{words} words"), &[("words", &words)]), format!("Слов: {count}")); + assert_eq!(fmt(tr(ru, "{selected} of {words} words"), &[("selected", "1"), ("words", &words)]), format!("Слов: 1 из {count}")); + } +} + +#[test] +fn bundled_interface_fonts_cover_russian_without_system_fallbacks() { + let db = wordcraft_fonts::FontDb::with_font_dirs(Vec::new()); + let (entries, errors) = parse_entries(lang("ru").0.source); + assert!(errors.is_empty()); + let chars: std::collections::HashSet = entries + .iter() + .flat_map(|e| e.translation.chars()) + // Cyrillic letters plus the Russian quotes and dash; symbols such as ¶, ⌘ or 📂 come from + // the English sources and render as they already do. + .filter(|c| ('\u{0400}'..='\u{04FF}').contains(c) || matches!(c, '«' | '»' | '—')) + .chain("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя".chars()) + .collect(); + for (family, style) in [("Inter", "Regular"), ("Inter", "Medium"), ("Inter", "SemiBold"), ("JetBrains Mono", "Regular")] { + let face = db.face(family, style); + assert_eq!(face.family, family, "must use the bundled interface face"); + for ch in &chars { + assert_ne!(face.glyph_for(*ch), 0, "{family} {style} lacks {ch}"); + } + } +} + +#[test] +fn built_in_style_names_are_translated_for_display_and_user_styles_are_not() { + let sheet = wordcraft_doc::StyleSheet::builtin(); + let name = |id: &str| style_name(sheet.get(id).unwrap()); + set_current(lang("ru")); + assert_eq!(name("Normal"), "Обычный"); + assert_eq!(name("Title"), "Заголовок"); + assert_eq!(name("Heading1"), "Заголовок 1"); + // Numbered families beyond the catalog's explicit entries go through one template. + assert_eq!(name("Heading7"), "Заголовок 7"); + assert_eq!(name("TOC9"), "Оглавление 9"); + // A style the author made keeps its name, even when it matches a built-in one. + let mine = wordcraft_doc::Style { name: "Normal".into(), builtin: false, ..Default::default() }; + assert_eq!(style_name(&mine), "Normal"); + // A built-in name without a translation stays English. + assert_eq!(builtin_style_name("Some Future Style"), "Some Future Style"); + assert_eq!(builtin_style_name("Heading x"), "Heading x"); + // Every built-in paragraph and character style shows in Russian. Table styles (`Grid Table 4 – + // Blue`) appear only as tooltips under Table Design and stay English for now. + let untranslated: Vec<&str> = sheet + .styles + .iter() + .filter(|s| s.kind != wordcraft_doc::StyleKind::Table && style_name(s) == s.name && s.name.chars().any(char::is_alphabetic)) + .map(|s| s.name.as_str()) + .collect(); + assert!(untranslated.is_empty(), "built-in styles without a Russian name: {untranslated:?}"); + set_current(Lang::EN); + assert_eq!(name("Heading7"), "Heading 7"); + // The document itself never changes. + assert_eq!(sheet.get("Normal").unwrap().name, "Normal"); +} + +#[test] +fn context_entries_override_only_their_context_and_unknown_contexts_are_rejected() { + let (c, errors) = Catalog::parse("\tTitle\tЗаголовок\npreview\tTitle\tТитул\n\tFont\tШрифт\nnope\tFont\tX\n"); + assert_eq!(errors.len(), 1, "{errors:?}"); + assert!(errors[0].contains("unknown context")); + assert_eq!(c.plain("Title"), Some("Заголовок")); + assert_eq!(c.in_context("preview", "Title"), Some("Титул")); + // Without a context entry, a context lookup uses the plain one. + assert_eq!(c.in_context("preview", "Font"), Some("Шрифт")); + assert_eq!(c.in_context("preview", "Missing"), None); + let ru = lang("ru"); + assert_eq!(tr(ru, "Title"), "Заголовок"); + assert_eq!(trc(ru, "preview", "Title"), "Пример"); + assert_eq!(trc(Lang::EN, "preview", "Title"), "Title"); + assert_eq!(trc(lang("ja"), "preview", "Unknown"), "Unknown"); +} + #[test] fn estonian_locales_and_saved_preference_keep_document_content() { let et = lang("et"); diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index feddc95..dbef79c 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -1347,3 +1347,4 @@ Trademark Sign Ticari Marka İşareti Unlink Fields Alan Bağlantılarını Kaldır Unlock Fields Alanların Kilidini Aç + Draw\nTable Tablo\nÇiz diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index 95c5ec8..8097f9c 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -1324,6 +1324,9 @@ South Південь West Захід Total Разом + +# Table Layout › Draw (#308) + Draw\nTable Намалювати\nтаблицю Rotation Поворот Rotation: Поворот: Rotate Right 90° Повернути праворуч на 90° diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index b314c44..ac9806d 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -1,6 +1,7 @@ # Simplified Chinese (zh-hans) interface catalog. Columns, separated by a TAB: # context English source translation -# context empty (WordCraft uses no contexts yet) +# context usually empty. `preview` words sample text inside rendered previews (the Design +# tab's style-set tiles), which must fit a small tile; it falls back to the plain entry. # source the English text exactly as in the code (tl!(...), ribbon labels, command labels) # escapes \n \t \\ inside a column. `{name}` placeholders must appear in both columns, and a # trailing "…" in one needs one in the other. @@ -1323,6 +1324,9 @@ South 南区 West 西区 Total 总计 + +# Table Layout › Draw (#308) + Draw\nTable 绘制\n表格 Rotation 旋转角度 Rotation: 旋转: Rotate Right 90° 向右旋转 90° diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index ab6016f..924a220 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -1313,6 +1313,9 @@ South 南區 West 西區 Total 總計 + +# Table Layout › Draw (#308) + Draw\nTable 繪製\n表格 Rotation 旋轉角度 Rotation: 旋轉: Rotate Right 90° 向右旋轉 90° diff --git a/crates/ui-egui/src/panes.rs b/crates/ui-egui/src/panes.rs index df88068..2c8eff2 100644 --- a/crates/ui-egui/src/panes.rs +++ b/crates/ui-egui/src/panes.rs @@ -205,10 +205,14 @@ fn styles(app: &mut WordApp, ui: &mut Ui) { } let st = app.session.run("format.state", &json!({})).unwrap_or_default(); let cur = st.get("style").and_then(Value::as_str).unwrap_or("Normal").to_string(); - ui.label( - egui::RichText::new(crate::i18n::fmt(tl!("Current style: {style}"), &[("style", st.get("styleName").and_then(Value::as_str).unwrap_or(""))])) - .small(), - ); + let current_name = app + .session + .doc + .styles + .get(&cur) + .map(crate::i18n::style_name) + .unwrap_or_else(|| st.get("styleName").and_then(Value::as_str).unwrap_or("").to_string()); + ui.label(egui::RichText::new(crate::i18n::fmt(tl!("Current style: {style}"), &[("style", ¤t_name)])).small()); ui.horizontal(|ui| { if ui.button(tl!("New Style…")).clicked() { app.dialog = crate::dialogs::Dialog::open("newStyle", app); @@ -234,7 +238,7 @@ fn styles(app: &mut WordApp, ui: &mut Ui) { .styles .iter() .filter(|s| !s.hidden && s.kind != wordcraft_doc::StyleKind::Table) - .map(|s| (s.id.clone(), s.name.clone(), s.kind == wordcraft_doc::StyleKind::Character)) + .map(|s| (s.id.clone(), crate::i18n::style_name(s), s.kind == wordcraft_doc::StyleKind::Character)) .collect(); list.sort_by_key(|s| s.1.to_lowercase()); egui::ScrollArea::vertical().show(ui, |ui| { @@ -425,12 +429,18 @@ fn inspector(app: &mut WordApp, ui: &mut Ui) { let chr = &r["character"]; let pstyle = para["styleName"].as_str().unwrap_or("Normal").to_string(); let cstyle = chr["styleName"].as_str().map(str::to_string); + // Built-in style names show in the interface language; the document keeps the English ones. + let shown = |id: &Value, name: &str| { + id.as_str().and_then(|id| app.session.doc.styles.get(id)).map(crate::i18n::style_name).unwrap_or_else(|| name.to_string()) + }; + let pstyle_shown = shown(¶["style"], &pstyle); + let cstyle_shown = cstyle.as_deref().map(|n| shown(&chr["style"], n)); let pdirect = direct_list(¶["direct"]); let cdirect = direct_list(&chr["direct"]); let mut clear: Option<&str> = None; egui::ScrollArea::vertical().show(ui, |ui| { section(ui, &t, "Paragraph", |ui| { - if level_row(ui, &t, "Style", &pstyle, false, "Reset to Normal", pstyle == "Normal" && para["style"] == "Normal") { + if level_row(ui, &t, "Style", &pstyle_shown, false, "Reset to Normal", pstyle == "Normal" && para["style"] == "Normal") { clear = Some("paragraphStyle"); } let (txt, empty) = if pdirect.is_empty() { (none.clone(), true) } else { (pdirect.join(", "), false) }; @@ -440,7 +450,7 @@ fn inspector(app: &mut WordApp, ui: &mut Ui) { }); ui.add_space(8.0); section(ui, &t, "Characters", |ui| { - let (txt, empty) = match &cstyle { + let (txt, empty) = match &cstyle_shown { Some(n) => (n.clone(), false), None => (none.clone(), true), }; diff --git a/crates/ui-egui/src/previews.rs b/crates/ui-egui/src/previews.rs index fce5f36..ffe5d81 100644 --- a/crates/ui-egui/src/previews.rs +++ b/crates/ui-egui/src/previews.rs @@ -271,7 +271,7 @@ pub fn style_preview(app: &mut WordApp, ui: &mut Ui, id: &str, ty: &str, size: e pub fn style_gallery(app: &mut WordApp, ui: &mut Ui, state: &Value) { let t = Tokens::get(ui.ctx()); let current = state.get("style").and_then(Value::as_str).unwrap_or("Normal").to_string(); - let styles: Vec<(String, String)> = app.session.doc.styles.gallery().iter().map(|s| (s.id.clone(), s.name.clone())).collect(); + let styles: Vec<(String, String)> = app.session.doc.styles.gallery().iter().map(|s| (s.id.clone(), crate::i18n::style_name(s))).collect(); let rev = app.session.rev(); let skey = app.previews.styles_key(&app.session.doc, rev); let ppp = ui.ctx().pixels_per_point(); @@ -288,10 +288,12 @@ pub fn style_gallery(app: &mut WordApp, ui: &mut Ui, state: &Value) { } else if resp.hovered() { ui.painter().rect_filled(r, 3.0, t.hover); } - let key = format!("style:{id}:{skey}:{ppp}"); + let lang = crate::i18n::current().code(); + let key = format!("style:{id}:{skey}:{ppp}:{lang}"); let doc = &app.session.doc; let tex = app.previews.get_or(ui.ctx(), &key, || { - let mut p = Paragraph::with_text("AaBbCcDd", CharProps::default()).styled(id); + // Sample letters in the interface's script (`АаБбВвГг` in Russian). + let mut p = Paragraph::with_text(tl!("AaBbCcDd"), CharProps::default()).styled(id); p.props.space_before = Some(0.0); p.props.align = Some(wordcraft_doc::Align::Left); // Keep hanging indents (bullets) but start the first line at the tile's left edge. @@ -346,14 +348,14 @@ pub fn style_set_gallery(app: &mut WordApp, ui: &mut Ui) { if resp.hovered() { ui.painter().rect_filled(r, 3.0, t.hover); } - let key = format!("set:{name}:{ppp}"); + let key = format!("set:{name}:{ppp}:{}", crate::i18n::current().code()); let tex = app.previews.get_or(ui.ctx(), &key, || { let mut s = wordcraft_engine::Session::new(Document::new()); let _ = s.run("design.styleSet", &json!({"name": name})); let blocks = vec![ - Block::Para(Paragraph::with_text("Title", CharProps::default()).styled("Title")), - Block::Para(Paragraph::with_text("Heading 1", CharProps::default()).styled("Heading1")), - Block::Para(Paragraph::with_text("Body text in a short paragraph to show spacing.", CharProps::default())), + Block::Para(Paragraph::with_text(crate::i18n::tc("preview", "Title"), CharProps::default()).styled("Title")), + Block::Para(Paragraph::with_text(tl!("Heading 1"), CharProps::default()).styled("Heading1")), + Block::Para(Paragraph::with_text(tl!("Body text in a short paragraph to show spacing."), CharProps::default())), ]; snippet_blocks(&s.doc, blocks, 120.0, 110.0, ppp * 0.42, 6.0, None) }); diff --git a/crates/ui-egui/src/ribbon.rs b/crates/ui-egui/src/ribbon.rs index 8682f8d..4812ed9 100644 --- a/crates/ui-egui/src/ribbon.rs +++ b/crates/ui-egui/src/ribbon.rs @@ -1472,7 +1472,7 @@ fn table_design(app: &mut WordApp, ui: &mut Ui) { .styles .iter() .filter(|s| s.kind == wordcraft_doc::StyleKind::Table && !s.hidden) - .map(|s| (s.builtin, s.id.clone(), s.name.clone())) + .map(|s| (s.builtin, s.id.clone(), crate::i18n::style_name(s))) .collect(); styles.sort_by_key(|(builtin, _, _)| *builtin); egui::ScrollArea::horizontal().max_width(420.0).show(ui, |ui| { diff --git a/docs/control-protocol.md b/docs/control-protocol.md index ebb00b9..ff88f14 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -50,7 +50,7 @@ and set `WORDCRAFT_CONTROL_KEY` to that app's key. | Method | Params | Result | |---|---|---| -| `engine.execute` | `command`, `params` | the command's result (any id from `engine.commands`, including UI commands `ui.tab`, `ui.dialog`, `ui.backstage`, `ui.zotero.*` (see `docs/zotero.md`), `ui.language` (`{"value": "auto"|"en"|"zh-hans"|"zh-hant"|"ja"|"pt-br"|"es"|"uk"|"sr"|"sr-latn"|"et"|"tr"}`), `ui.theme` (`{"value": "system"|"light"|"dark"}`; `system` follows the OS appearance, light when it reports none), `ui.interfaceSize` (`{"percent": 80–200}`, clamped; no value reads it; scales the interface on top of the system display scale, document zoom stays `view.zoom`)…) | +| `engine.execute` | `command`, `params` | the command's result (any id from `engine.commands`, including UI commands `ui.tab`, `ui.dialog`, `ui.backstage`, `ui.zotero.*` (see `docs/zotero.md`), `ui.language` (`{"value": "auto"|"en"|"zh-hans"|"zh-hant"|"ja"|"pt-br"|"es"|"uk"|"sr"|"sr-latn"|"et"|"tr"|"ru"}`), `ui.theme` (`{"value": "system"|"light"|"dark"}`; `system` follows the OS appearance, light when it reports none), `ui.interfaceSize` (`{"percent": 80–200}`, clamped; no value reads it; scales the interface on top of the system display scale, document zoom stays `view.zoom`)…) | | `engine.commands` | — | every command: id, label, location, shortcut, params, enabled | | `document.inspect` | `text?` | blocks (text, style, runs, lists, tables), parts, sections, selection, pages | | `ui.inspect` | — | UI state, view, dialog, window size, page rects on screen, caret, comment balloons (`balloons`: id + screen rect; `balloon`: the selected one), perf | diff --git a/docs/localization-parity.md b/docs/localization-parity.md index b8c20f3..04ed71c 100644 --- a/docs/localization-parity.md +++ b/docs/localization-parity.md @@ -18,8 +18,8 @@ other ~18 languages Word ships, plus native-speaker review (human). ## What WordCraft ships (measured) -- **11 interface languages**: English plus `zh-hans`, `zh-hant`, `ja`, `uk`, `es`, `pt-br`, - Serbian `sr`/`sr-latn` (#250), Estonian `et` and Turkish `tr`. Catalogs have 1,305–1,307 entries +- **12 interface languages**: English plus `zh-hans`, `zh-hant`, `ja`, `uk`, `es`, `pt-br`, + Serbian `sr`/`sr-latn` (#250), Estonian `et`, Turkish `tr` and Russian `ru`. Catalogs have 1,305–1,450 entries each. A test (`every_tab_and_command_is_translated`) enforces that every ribbon tab, command label and ribbon location is translated in every language. - Of the 675 English strings a scan extracts from `tl!(…)` calls and command labels/locations, each @@ -52,8 +52,8 @@ shared items below. | Korean | ko | 0 | ❌ | Hangul ✅; macOS Korean IME fixes pending (#163, #164) | no | none | 3–5 | | Vietnamese | vi | 0 | ❌ | Latin with stacked diacritics, untested | no | none | 3–4 | -Other shipped languages: **6** — Traditional Chinese (`zh-hant`), Ukrainian (`uk`), Serbian -Cyrillic and Latin (`sr`, `sr-latn`, #250), Estonian (`et`) and Turkish (`tr`), all partial. +Other shipped languages: **7** — Traditional Chinese (`zh-hant`), Ukrainian (`uk`), Serbian +Cyrillic and Latin (`sr`, `sr-latn`, #250), Estonian (`et`), Turkish (`tr`) and Russian (`ru`), all partial. Estonian uses the existing fonts, follows `et-EE` system locales, and is available in Options or through `ui.language` with `{"value":"et"}`. Its 1,307 entries cover the existing interface catalog. Estonian spelling, grammar, dates and document templates are not added by the interface catalog. @@ -76,6 +76,7 @@ proofing is not included; terminology and checks: [`localization-tr.md`](localiz | Date | Change | Summary | |---|---|---| +| 2026-10-10 | minor | Russian interface (#300; 1,524 entries, built-in style names shown translated; covers everything the interface audit finds) | | 2026-10-11 | minor | Turkish interface catalog (1,307 entries), locale selection, saved preference, Turkish casing in command search and font coverage checks; catalog sizes re-counted | | 2026-10-11 | trivial | English spelling (#520): our supplement `assets/spelling/en-extra.txt` adds ~220 common modern words the Moby list lacks ("desktop", "download", "email"…) | | 2026-10-10 | minor | Estonian interface catalog, locale selection, saved preference and font coverage checks |