When NSLocalizedString or String(localized:) returns the key itself, the lookup failed somewhere between your source file and the running app. Go through this list in order; the first three cover most cases.
<language>.lproj/Localizable.strings (for example fr.lproj), and the file must be a member of the app target. Open the built product (Products > Show in Finder) and check that the .lproj folder and the file are inside the app.plutil -lint fr.lproj/Localizable.strings; it prints the line of the first error. Each entry must look like "key" = "value";, with inner quotes written as \".plutil -lint does not report duplicates.Localizable.strings; NSLocalizedString("title", tableName: "Settings", comment: "") reads Settings.strings.Localizable.xcstrings, Xcode compiles the catalog into the .strings files of the built app, so edits belong in the catalog; remove leftover .strings files for the same table from the target.For debugging, add the launch argument -NSShowNonLocalizedStrings YES to the scheme: keys that cannot be found are logged and shown in capitals, which makes them easy to spot on screen.
The file format itself (comments, escapes, encoding) is described at Apple .strings.
Published Oct 9, 2026 · Markdown version