{"record":{"id":"b3e71673adc37dc1","repo":"quarkusio/quarkus","slug":"missing-key-value-separator-file-localizedfil","errorCode":null,"errorMessage":"Missing key/value separator\n\t- file: {localizedFile}\n\t- line {index}","messagePattern":"Missing key/value separator\n\t- file: (.+?)\n\t- line (.+?)","errorType":"exception","errorClass":"MessageBundleException","httpStatus":null,"severity":"error","filePath":"extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/MessageBundleProcessor.java","lineNumber":888,"sourceCode":"\n    private Map<String, String> parseKeyToTemplateFromLocalizedFiles(ClassInfo bundleInterface,\n            List<MessageFile> localizedFile, IndexView index) throws IOException {\n        Map<String, String> keyToTemplate = new HashMap<>();\n        for (MessageFile messageFile : localizedFile) {\n            for (ListIterator<String> it = Files.readAllLines(messageFile.path()).listIterator(); it.hasNext();) {\n                String line = it.next();\n                if (line.isBlank()) {\n                    // Blank lines are skipped\n                    continue;\n                }\n                line = line.strip();\n                if (line.startsWith(\"#\")) {\n                    // Comments are skipped\n                    continue;\n                }\n                int eqIdx = line.indexOf('=');\n                if (eqIdx == -1) {\n                    throw new MessageBundleException(\n                            \"Missing key/value separator\\n\\t- file: \" + localizedFile + \"\\n\\t- line \" + it.previousIndex());\n                }\n                String key = line.substring(0, eqIdx).strip();\n                if (keyToTemplate.containsKey(key)) {\n                    // Message template with higher priority takes precedence\n                    continue;\n                }\n                if (!hasMessageBundleMethod(bundleInterface, key) && !isEnumConstantMessageKey(key, index, bundleInterface)) {\n                    throw new MessageBundleException(\n                            \"Message bundle method \" + key + \"() not found on: \" + bundleInterface + \"\\n\\t- file: \"\n                                    + localizedFile + \"\\n\\t- line \" + it.previousIndex());\n                }\n                String value = adaptLine(line.substring(eqIdx + 1, line.length()));\n                if (value.endsWith(\"\\\\\")) {\n                    // The logical line is spread out across several normal lines\n                    StringBuilder builder = new StringBuilder(value.substring(0, value.length() - 1));\n                    constructLine(builder, it);\n                    keyToTemplate.put(key, builder.toString());","sourceCodeStart":870,"sourceCodeEnd":906,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/MessageBundleProcessor.java#L870-L906","documentation":"When reading localized message bundle .properties files (or merge candidates) at build time, each non-comment logical line must contain a key/value separator '='. A line without '=' cannot be parsed into a message template, so MessageBundleProcessor fails the build naming the offending file and line number.","triggerScenarios":"A line in a bundle properties file such as `hello_message` or a wrapped continuation line that lost its '='; values containing newlines mis-split by the logical-line reader.","commonSituations":"Hand-editing .properties files and accidentally deleting '='; diff-merge conflicts dropping characters; non-ASCII editors mangling lines; accidental paste of prose into the file.","solutions":["Open the file named in the message at the reported line and add the missing '=' between key and value: `hello=Hello {name}`.","Check the preceding line for a trailing backslash ('\\') continuation that incorrectly swallows the next line's '='.","If the line is not a message, delete it or comment it out with '#'."],"exampleFix":"// before (messages_de.properties)\nhello_message\n\n// after\nhello=Hallo {name}","handlingStrategy":"validation","validationCode":"// Pre-validate bundle properties files for key=value separators\njava.nio.file.Files.lines(Path.of(\"messages_de.properties\"))\n    .filter(l -> !l.isBlank() && !l.startsWith(\"#\"))\n    .filter(l -> l.indexOf('=') == -1)\n    .findFirst()\n    .ifPresent(l -> { throw new IllegalStateException(\"Missing '=' in line: \" + l); });","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run a properties-file linter on i18n resources in CI","Beware trailing backslash continuations swallowing the next line's '='","Comment out non-message lines with '#'"],"tags":["quarkus","qute","properties-file","localization"],"backgroundTag":"malformed-properties-file","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}