Conversation
JabRef keeps several backup versions, so the plural fits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Summary by QodoRename backup preference to “Create backups”
AI Description
High-Level Assessment
Files changed (2)
|
Code Review by Qodo
1.
|
| .checkbox(Localization.lang("Autosave local libraries"), viewModel.autosaveLocalLibrariesProperty(), | ||
| autosave -> autosave.help(HelpFile.AUTOSAVE)) | ||
| .checkWithField(Localization.lang("Create backup"), viewModel.createBackupProperty(), | ||
| .checkWithField(Localization.lang("Create backups"), viewModel.createBackupProperty(), |
There was a problem hiding this comment.
2. Translated settings lose their label 🐞 Bug ≡ Correctness
GeneralTab.buildView() now requests the Create backups localization key, while the non-English bundles still define only Create backup. When a non-English locale is active, the missing lookup falls back to the English key text instead of the translated label, affecting the General preferences checkbox.
Agent Prompt
## Issue description
The preferences UI now looks up `Create backups`, but the localized property files still contain the old `Create backup` key. Non-English users therefore receive the untranslated fallback text instead of their localized backup label.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/preferences/general/GeneralTab.java[126-126]
- jablib/src/main/resources/l10n/JabRef_*.properties[1-9999]
## Recommended Fix
Rename the corresponding `Create backup` entry to `Create backups` in every localization bundle, preserving each existing translation and ensuring the new key is available for all supported locales.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
There was a problem hiding this comment.
🤖 Generated with Claude Code
Not done: only JabRef_en.properties lives here; other bundles come from Crowdin, English fallback intended.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
The preferences checkbox now reads "Create backups", because JabRef keeps multiple backup versions per library.
Steps to test
Related issues and pull requests
None.
AI usage
Claude Code (model claude-opus-5-5), AIL3.
AI CHECKLIST.md walkthrough
1. Code self-review
Nullability and control flow
== null/!= nullchecks — JSpecify annotations (@NullMarked,@Nullable,@NonNull) used instead.Objects.requireNonNull(...)— nullability expressed via JSpecify annotations.@NullMarked(org.jspecify.annotations.NullMarked).Optionalconsumed withifPresent/ifPresentOrElse/map/orElseThrow— neverorElse(unusedValue)nor anisPresent()+get()block.StringUtil.isBlank(...)used instead ofs == null || s.isBlank().Exceptions
catch (Exception e)— only specific exceptions are caught.throw new RuntimeException(...)/IllegalStateException(...)— these tear down the whole application.LOGGER.info("...", e)), not concatenated into the message string.Style and idioms
BibEntryobjects built with withers (withField, notsetField).List.of()/Map.of()/Set.of(),Path.of(),SequencedCollection/SequencedSet, text blocks.Pattern.compile(...)constant, notString.matches(...).org.jabref.logic.util.BackgroundTask, notnew Thread().///) uses Markdown syntax, not JavaDoc inline tags:`code`instead of{@code},[ClassName]instead of{@link}.User-facing text
Localization.langin Java,%prefix in FXML).!; labels do not end with:."...: %0"), not string concatenation.Security
text/htmlresponse — including exception/error messages, not just the success body (XSS).Tests
org.jabref.model/org.jabref.logichave added or updated tests.assertEquals), use plain JUnit asserts (not AssertJ), have no@DisplayName, do not catch exceptions (let them propagate so JUnit reports setup/teardown failures directly), and use@TempDirinstead of manual temp directories.2. Verification commands
./gradlew :jablib:check(or./gradlew checkfor all modules)../gradlew checkstyleMain checkstyleTest checkstyleJmh../gradlew modernizer../gradlew --no-configuration-cache :rewriteDryRunreports no changes (run./gradlew rewriteRunto fix)../gradlew javadoc.npx markdownlint-cli2 "docs/**/*.md" "*.md"(only if Markdown changed).npm ci && npm run textlintreports no misspellings (only if Markdown changed).rewriteRun:docker run -v $(pwd):/github/workspace ghcr.io/leventebajczi/intellij-format:master "*.java" "" ".idea/codeStyles/Project.xml".3. Documentation
CHANGELOG.mdentry added if the change is visible to the user (end-user wording, no extra blank lines, sorted in next to existing entries about the same component/feature). Link the issue if one exists; link the PR only when no issue exists. UseTODOas the placeholder when neither is known yet — never a fake number. No entry for fixes to changes that were themselves introduced after the last release (feature only in## [Unreleased]) — update the existing unreleased entry instead if needed.TODO(nocloses/fixesfor merely-similar issues).docs/requirements/<area>.mdif the change is a new feature or significant bug fix (skip for refactors, minor fixes, and internal changes).docs/updated if behavior or architecture changed.4. Pull request
.github/PULL_REQUEST_TEMPLATE.md, every section filled.[x],[ ], or[/].gh pr create --body-file <file>(not--body).CHANGELOG.mdused aTODOplaceholder (no issue confidently identified yet — an existing issue link always stays), the PR was opened as draft, the placeholder was replaced with the real PR-number link after PR creation, committed and pushed, and only then was the PR marked ready for review. If an issue is identified or created later, the link is switched to the issue.Checklist
CHANGELOG.mddescribing the change from the user's point of view (if the change is visible to the user)🤖 Generated with Claude Code