# CLAUDE.md OrcaSlicer — open-source C++17 3D slicer. wxWidgets GUI, CMake build system. ## Build Commands ```bash # macOS cmake --build build/arm64 --config RelWithDebInfo --target all -- # Linux cmake --build build --config RelWithDebInfo --target all -- # Windows (replace %build_type% with Debug/Release/RelWithDebInfo) cmake --build . --config %build_type% --target ALL_BUILD -- -m ``` ## Testing Catch2 framework. Tests in `tests/`; see [tests/AGENTS.md](tests/AGENTS.md) for where a new test belongs and the conventions to follow. ```bash cd build && ctest --output-on-failure # all tests ctest --test-dir ./tests/libslic3r # individual suite ctest --test-dir ./tests/fff_print ``` ## Code Style - C++17, selective C++20. PascalCase classes, snake_case functions/variables - `#pragma once` for headers. Smart pointers and RAII preferred - Parallelization via TBB — be mindful of shared state ## Key Entry Points - App startup: `src/OrcaSlicer.cpp` - Slicing pipeline: `src/libslic3r/Print.cpp` - All print/printer/material settings: `src/libslic3r/PrintConfig.cpp` - GUI: `src/slic3r/GUI/` - Core algorithms: `src/libslic3r/` (GCode/, Fill/, Support/, Geometry/, Format/, Arachne/) - Printer profiles: `resources/profiles/[manufacturer].json` ## Critical Constraints - **Backward compatibility required** for .3mf project files and printer profiles - **Cross-platform** — all changes must work on Windows, macOS, and Linux - Profile/format changes need version migration handling - Dependencies built separately in `deps/build/`, then linked to main app ## Code review focus areas - Changes must not cause regressions in existing functionality, defaults, profiles, or project compatibility. - Features gated by options must not affect existing behavior when those options are disabled. - Changes should follow the existing code style and architecture. Architectural changes should be justified in code comments and the PR description. - Add helper functions or utilities only when existing code cannot reasonably be reused. Avoid duplication. - Keep code concise and clear. Manually simplify AI generated bloated codes before review. - Include targeted tests or documented verification for behavior changes, especially in slicing logic, profiles, formats, and GUI defaults. - For translation changes (`localization/i18n/**/*.po`), check that recurring terms match the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) for that language. ## Localization & translations Catalogs live in `localization/i18n//OrcaSlicer_.po`; the template is `OrcaSlicer.pot`. See the [Localization guide](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_guide.md) for the human-facing version of these principles. ### Terminology - Use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language, and terms that must stay in English (brand/product names, acronyms, materials, file formats, G-code tokens, macros/variables/identifiers) are not translated. - If a term's established translation changes, update both the affected `.po` files and the glossary (`localization_glossary.tsv`, then regenerate) so they stay in sync. - Translate the *meaning*, not the words. Check what the string actually controls before translating it — English reuses one word for different things. `Flow ratio` (multiplier), `Flow Rate` (throughput) and `Flow Dynamics` (pressure compensation) are three different terms; `extruder` may mean the toolhead, the feeder motor, or the nozzle depending on the string. - Reuse one template per recurring message shape (`Failed to connect to …`, `Are you sure you want to …?`), even where the English wording varies. ### Editing rules - Only edit `msgstr` — **never** change `msgid`, and never "fix" wrong English in the translation alone. Report the source string instead. - Preserve exactly: placeholders (`%s`, `%d`, `%1%`, `%zu`, `%%`), every `\n` (count *and* position, including leading/trailing), leading/trailing spaces, HTML tags, `℃`, and the file's encoding and line endings. - **Never reorder positional arguments** in a `c-format` string. If the msgid is `%d` then `%s`, that order must hold — swapping them breaks at runtime. - `msgctxt` separates homonyms — always read it. `Back`/`Camera View` is the rear view of the 3D navigator, while `Back`/`Navigation` is the go-back button; `Top` exists in the *Alignment*, *Layers* and *Camera View* senses. - When a string needs disambiguating, add context in the source (`_L_CONTEXT`/`_u8L_CONTEXT`), don't work around it in the translation. - A literal `%` inside a string xgettext flagged `possible-c-format` will fail `msgfmt`. Fix it with a `// xgettext:no-c-format, no-boost-format` comment above the string in the source — do not mangle the translation or use `%%` in text that is never passed through printf. - Plural entries: read `nplurals` from the catalog's `Plural-Forms` header (it is **not** always 2 — ja/ko/zh/th/vi use 1, ru/cs/pl/lt use 3, uk uses 4). Each form must be genuinely inflected for its quantity; repeating one sentence across all forms is a bug in Slavic/Baltic languages, though it is correct for Turkish and Hungarian. - An entry whose `msgstr` equals its `msgid` is untranslated even though it is not empty; a plural entry with any empty form is likewise incomplete. - Mark machine-produced translations with an `# AI Translated` translator comment. Don't add it to a human translation you didn't actually rewrite. - Don't reflow or re-wrap unrelated entries — keep the diff limited to the strings you changed. ### Verifying - `scripts/run_gettext.bat --full` (Windows) regenerates the template, merges every catalog and compiles the `.mo` files. It must exit 0. - Or check a single catalog with `msgfmt --check-format -o .mo localization/i18n//OrcaSlicer_.po`. - Fuzzy entries are not shown to users. If you correct one, clear its `fuzzy` flag, otherwise the fix never ships.