Ich habe heute Abend ein kleines Programm geschrieben, und vielleicht ist es ja auch für andere nützlich. Da es wirklich nur klein ist, gibt es auch keine ausführliche Erklärung. Da es sich um ein Java-Programm handelt, braucht man dafür Java. Die meisten dürften es bereits installiert haben.
Zielsetzung: Fehler (Rechtschreibung, Grammatik) in Dialogen finden.
DiaText liest die OU.CSL (kann man sich z.B. von Redefix erstellen lassen) aus und speichert die Dialogtexte in einer .txt Datei. Den Inhalt der Datei darf sich der Benutzer dann von Hand nach Word (o.ä.) kopieren, um dort automatisch nach Fehlern suchen zu lassen. Ist ein Fehler gefunden, kann man seine Dialoge nach dem alten (fehlerhaften) Text durchsuchen und den Fehler ausbessern.
Achtung: Descriptions werden von DiaText nicht gespeichert. Die stehen meines Wissens nach auch nicht in der OU.CSL.
Das Programm ist (hoffentlich) denkbar simpel aufgebaut. Die schnellste Methode ist es, die DiaText.jar in den Cutscene-Ordner zu kopieren, dann muss man den Pfad dorthin nicht mehr auswählen. Ist das Programm fertig, so erscheint eine Meldung und im selben Verzeichnis wurde eine Datei DiaText.txt mit dem gewünschten Inhalt erstellt.
Ich denke nicht, dass DiaText besonders fehleranfällig ist. Man sollte allerdings wirklich die OU.CSL auswählen und keine andere Datei^^
Das Programm ist in Java geschrieben. Nachdem ich seit etwa 2 Jahren nichts mehr in Java programmiert habe, ist das hier sicher kein Meisterwerk. Wer sich den Code trotzdem ansehen möchte, findet ihn im Spoiler.
Spoiler:(zum lesen bitte Text markieren)
Code:
import java.io.*;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class DiaText {/**
* @param args
*/
public static void main(String[] args) throws IOException{// path to OU.CSL
String path = "";
int opt_dialog = JOptionPane.showOptionDialog(null, "Befindet sich die OU.CSL im selben Verzeichnis?","Verzeichnis",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null,
new String[]{"Ja.", "Nein, Datei suchen...", "Beenden."}, "Ja.");
// OU.CSL in same directory
if (opt_dialog == JOptionPane.YES_OPTION){
path = "OU.CSL";
}// OU.CSL not in the same directory
else if (opt_dialog == JOptionPane.NO_OPTION){
JFileChooser chooser = new JFileChooser();
// show open-dialog
int return_chooser = chooser.showOpenDialog(null);
if (return_chooser == JFileChooser.APPROVE_OPTION){// path to OU.CSL
path = chooser.getSelectedFile().getName();
}
else {
System.exit(0);
}} else {
System.exit(0);
}// to read the OU.CLS
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
// to write the new file
FileWriter fw = new FileWriter("DiaText.txt");
BufferedWriter bw = new BufferedWriter(fw);
// line in OU.CLS that is currently being processed
String line = "";
// dialog text
String diaText = "";
// iterating through all lines of the OU.CLS
while((line= br.readLine()) != null ){// line is a (dialog) text and non-empty
if ((line.startsWith("text=string:"))
&& (!line.equals("text=string:"))){// cut "text=string:"
diaText = line.substring(12);
// insert a line break
bw.newLine();
// write the dialog text
bw.write(diaText);
}}// close reader and writer
br.close();
bw.close();
// message for user
JOptionPane.showMessageDialog(null, "Das Programm ist fertig. Hoffentlich war es erfolgreich!", "Fertig.", JOptionPane.INFORMATION_MESSAGE);
// exit program
System.exit(0);
}}
Für jegliche Anregungen, Kritik oder Hinweise bin ich offen und dankbar. Gerade wenn ihr eine andere (bessere) Methode habt, dasselbe zu erreichen, wüsste ich gerne davon
Auch Vorschläge, wie man DiaText verbessern könnte, nehme ich gerne an.
PS: die angehängte Datei muss natürlich entpackt werden
EDIT 15.07.2014 - Version 2
Ich habe die Vorschläge / den Code von Christopher25 leicht angepasst für eine neue Version, die nun auch im Anhang zu finden ist.
Hier der Code:
Spoiler:(zum lesen bitte Text markieren)
Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DiaText {
private final String outputFilename = "DiaText.txt";
private final String inputFilename = "OU.CSL";
/**
* @param args
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
} catch (InstantiationException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
} catch (IllegalAccessException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
} catch (UnsupportedLookAndFeelException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
// Hauptobjekt anlegen
DiaText diaText = new DiaText();
// Datei auslesen und diaText schreiben
diaText.writeDiaText(diaText.getFile());
// Programm beenden
System.exit(0);
}
public void writeDiaText(File file) {
// to read the OU.CLS
FileReader fr = null;
try {
fr = new FileReader(file);
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
BufferedReader br = new BufferedReader(fr);
// to write the new file
FileWriter fw = null;
try {
fw = new FileWriter(outputFilename);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
BufferedWriter bw = new BufferedWriter(fw);
// line in OU.CLS that is currently being processed
String line = "";
// dialog text
String diaText = "";
// iterating through all lines of the OU.CLS
try {
while ((line = br.readLine()) != null) {
// line is a (dialog) text and non-empty
// skip whitespaces at start and end
line = line.trim();
// if the line is a dialogue text
if ((line.startsWith("text=string:"))
&& (!line.equals("text=string:"))) {
// cut "text=string:"
diaText = line.substring(12);
// insert a line break
bw.newLine();
// write the dialog text
bw.write(diaText);
}
}
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
} finally {
if(br != null) try { br.close(); } catch(Exception e2) {
JOptionPane.showMessageDialog(null, e2.getMessage());
}
if(bw != null) try { bw.close(); } catch(Exception e3) {
JOptionPane.showMessageDialog(null, e3.getMessage());
}
}
// message for user
JOptionPane.showMessageDialog(null,
"Das Programm ist fertig. Hoffentlich war es erfolgreich!",
"Fertig.", JOptionPane.INFORMATION_MESSAGE);
}
public File getFile() {
// path to OU.CSL
String path = "";
File myFile = null;
int opt_dialog = JOptionPane.showOptionDialog(null,
"Befindet sich die OU.CSL im selben Verzeichnis?",
"Verzeichnis", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, new String[] { "Ja.",
"Nein, Datei suchen...", "Beenden." }, "Ja.");
// OU.CSL in same directory
if (opt_dialog == JOptionPane.YES_OPTION) {
path = inputFilename;
return new File(path);
}
// OU.CSL not in the same directory
else if (opt_dialog == JOptionPane.NO_OPTION) {
JFileChooser chooser = new JFileChooser();
// show open-dialog
int return_chooser = chooser.showOpenDialog(null);
if (return_chooser == JFileChooser.APPROVE_OPTION) {
// path to OU.CSL
myFile = chooser.getSelectedFile();
} else {
System.exit(0);
}
} else {
System.exit(0);
}
return myFile;
}
}
Du solltest die Writer in einem Try-Catch block laufen lassen.
Wenn die mal auf die Schnute fliegen, musst du diese im finally block closen.
Wenn die jetzt hinfliegen, wird der Programmcode einfach beendet, ohne dass die
Writer-Dienste geschlossen werden!
PS:
Versuch das ganze doch mal mit LookAndFeel ein bisschen zu verschönern,
der Dialog mit der Dateiauswahl ist in Swing nicht besonders toll ^^
Danke, ich habe den Code größtenteils übernommen für eine neue Version, die im ersten Beitrag zu finden ist.
Zwei kleine Probleme damit habe ich noch behoben:
Code:
path = chooser.getSelectedFile().getName();
lieferte nur den Dateinamen, nicht den kompletten Pfad, wodurch das Auswählen, wenn die Datei nicht im selben Ordner ist, nicht funktionierte. Stattdessen nehme ich jetzt gleich die Datei.
Code:
if ((line.startsWith("text=string:"))
war nicht mehr erfüllt. Vielleicht haben ältere Java Versionen whitespaces bei startsWith ignoriert - ich weiß es nicht. Jetzt benutze ich trim(), um diese führenden und anhängenden whitespaces auszulassen.