diff --git a/README.md b/README.md index 9c534db..27ea678 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,23 @@ [![Technical Debt][technical_debt_badge]][technical_debt_link] [![Lines of Code][lines_of_code_badge]][lines_of_code_link] -Программа для удаления строк-дубликатов в файлах .lang сабмодов LOTR. В таких файлах все строки являются строками -вида `key=value`. Программа считает дубликатами строки, у которых совпадает `key`. Таким образом, если в начале файла с -переводами вставить полный актуальный перевод мода "Властелин колец", а затем использовать эту программу, то перевод -стандартных лотровских вещей в сабмоде будет восполнен (если чего-то не хватало) и актуализирован. +Программа для актуализации и удаления строк-дубликатов в файлах .lang сабмодов LOTR. + +В переводах мода LOTR все строки являются строками вида `key=value`. И часто при разработке сабмода бывает так, что +перевод нового контента пишется хаотично, его строки набрасываются прямо внутри перевода основного мода, а основной мод +ещё и обновляется, так что перевод ванильного лотра в сабмоде стремительно теряет актуальность — какие-то строки не +имеют перевода вовсе, а какие-то переводы остаются старыми. Это фиксится добавлением актуального перевода мода LOTR в +начало или в конец файла сабмода, из-за чего он распухает в два раза, зато все строки переведены. + +Эта программа позволяет актуализировать перевод, удалить дубликаты и разделить отдельно строчки сабмода и отдельно +строчки LOTR, которые будут идти отдельными цельными блоками. Программа считает дубликатами строки, у которых совпадает +`key`, так что проблема с устаревшим и неодинаковым `value` исчезает. + +Если есть необходимость, чтобы изменённые или устаревшие строчки перевода ванильного лотра остались в сабмоде (то есть +имели приоритет над актуальным переводом оригинала), нужно снять галочку в третьей строке окна. В таком +случае, в начале файла будет идти перевод сабмода, в конце — перевод лотра, который будет содержать лишь недостающие +строки. Если же галочку оставить, перевод основы будет сверху, а перевод сабмода снизу, и перевод сабмода будет +содержать лишь строки, касающиеся нового контента. diff --git a/src/main/kotlin/com/github/hummel/lotrlang/Main.kt b/src/main/kotlin/com/github/hummel/lotrlang/Main.kt index 3d3db8f..df46190 100644 --- a/src/main/kotlin/com/github/hummel/lotrlang/Main.kt +++ b/src/main/kotlin/com/github/hummel/lotrlang/Main.kt @@ -32,20 +32,24 @@ class GUI : JFrame() { } } - private fun process(inputField: JTextField, outputField: JTextField) { - if (inputField.text.isEmpty() || outputField.text.isEmpty()) { + private fun process(vanillaField: JTextField, submodField: JTextField, vanillaPriority: Boolean) { + if (vanillaField.text.isEmpty() || submodField.text.isEmpty()) { JOptionPane.showMessageDialog(this, "Fill the fields", "Error", JOptionPane.ERROR_MESSAGE) return } - val firstFile = File(inputField.text) - val secondFile = File(outputField.text) - if (!firstFile.exists() || !firstFile.isFile) { + val firstFile = File(vanillaField.text) + val secondFile = File(submodField.text) + if (!firstFile.exists() || !firstFile.isFile || !secondFile.exists() || !secondFile.isFile) { JOptionPane.showMessageDialog(this, "Corrupted file", "Error", JOptionPane.ERROR_MESSAGE) return } - val lines = firstFile.readLines() - val uniqueLines = lines.map { + val firstLines = firstFile.readLines() + val secondLines = secondFile.readLines() + + val allLines = if (vanillaPriority) firstLines + secondLines else secondLines + firstLines + + val uniqueLines = allLines.map { it.split('=', limit = 2) }.distinctBy { it[0] @@ -71,35 +75,40 @@ class GUI : JFrame() { contentPanel.layout = GridLayout(0, 1, 0, 0) contentPane = contentPanel - val inputPanel = JPanel() - val inputLabel = JLabel("Target lang path:") - inputLabel.preferredSize = Dimension(120, inputLabel.preferredSize.height) - val inputField = JTextField(24) - val inputButton = JButton("Select path") - inputButton.addActionListener { selectPath(inputField) } - inputPanel.add(inputLabel) - inputPanel.add(inputField) - inputPanel.add(inputButton) - - val outputPanel = JPanel() - val outputLabel = JLabel("Output lang path:") - outputLabel.preferredSize = Dimension(120, outputLabel.preferredSize.height) - val outputField = JTextField(24) - val outputButton = JButton("Select path") - outputButton.addActionListener { selectPath(outputField) } - outputPanel.add(outputLabel) - outputPanel.add(outputField) - outputPanel.add(outputButton) + val vanillaPanel = JPanel() + val vanillaLabel = JLabel("Vanilla LOTR lang path:") + vanillaLabel.preferredSize = Dimension(140, vanillaLabel.preferredSize.height) + val vanillaField = JTextField(24) + val vanillaButton = JButton("Select path") + vanillaButton.addActionListener { selectPath(vanillaField) } + vanillaPanel.add(vanillaLabel) + vanillaPanel.add(vanillaField) + vanillaPanel.add(vanillaButton) + + val submodPanel = JPanel() + val submodLabel = JLabel("Submod LOTR lang path:") + submodLabel.preferredSize = Dimension(140, submodLabel.preferredSize.height) + val submodField = JTextField(24) + val submodButton = JButton("Select path") + submodButton.addActionListener { selectPath(submodField) } + submodPanel.add(submodLabel) + submodPanel.add(submodField) + submodPanel.add(submodButton) + + val checkboxPanel = JPanel() + val processCheckbox = JCheckBox("Vanilla LOTR translation is a priority", true) + checkboxPanel.add(processCheckbox) val processPanel = JPanel() val processButton = JButton("Process") processButton.addActionListener { - process(inputField, outputField) + process(vanillaField, submodField, processCheckbox.isSelected) } processPanel.add(processButton) - contentPanel.add(inputPanel) - contentPanel.add(outputPanel) + contentPanel.add(vanillaPanel) + contentPanel.add(submodPanel) + contentPanel.add(checkboxPanel) contentPanel.add(processPanel) setLocationRelativeTo(null)