summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2025-02-23 20:23:47 -0500
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2025-02-23 20:36:03 -0500
commit9c358d708ba4988648d7b19ccb842f076ec4c354 (patch)
tree92609c64a7c96fcdd0f20b63bca9c6effe8dd97d
parent4436b29053a0b757562ecc1d0a78e22902e6e5ae (diff)
Allow internationalization of about.txt
This works with custom locales (by placing the text in [config_dir]/about/[name].txt), but if such a file does not exist, it will default to the default locale (en)'s about text.
-rw-r--r--src/main/java/sevenUnitsGUI/Presenter.java43
-rw-r--r--src/main/java/sevenUnitsGUI/TabbedView.java13
-rw-r--r--src/main/resources/about/en.txt (renamed from src/main/resources/about.txt)2
-rw-r--r--src/main/resources/about/fr.txt24
-rw-r--r--src/main/resources/locales/en.txt1
-rw-r--r--src/main/resources/locales/fr.txt1
6 files changed, 66 insertions, 18 deletions
diff --git a/src/main/java/sevenUnitsGUI/Presenter.java b/src/main/java/sevenUnitsGUI/Presenter.java
index ba600e3..3a039a7 100644
--- a/src/main/java/sevenUnitsGUI/Presenter.java
+++ b/src/main/java/sevenUnitsGUI/Presenter.java
@@ -780,7 +780,27 @@ public final class Presenter {
* @since 2022-02-19
*/
public String getAboutText() {
- return Presenter.getLinesFromResource("/about.txt").stream()
+ final Path customFilepath = Presenter.pathFromConfig(
+ "about/" + this.userLocale + ".txt");
+ if (Files.exists(customFilepath)) {
+ try {
+ return formatAboutText(Files.lines(customFilepath));
+ } catch (IOException e) {
+ final String filename = String.format("/about/%s.txt", this.userLocale);
+ return formatAboutText(Presenter.getLinesFromResource(filename).stream());
+ }
+ } else if (LOCAL_LOCALES.contains(this.userLocale)) {
+ final String filename = String.format("/about/%s.txt", this.userLocale);
+ return formatAboutText(Presenter.getLinesFromResource(filename).stream());
+ } else {
+ final String filename = String.format("/about/%s.txt", DEFAULT_LOCALE);
+ return formatAboutText(Presenter.getLinesFromResource(filename).stream());
+ }
+
+ }
+
+ private String formatAboutText(Stream<String> rawLines) {
+ return rawLines
.map(Presenter::withoutComments).collect(Collectors.joining("\n"))
.replaceAll("\\[VERSION\\]", ProgramInfo.VERSION.toString())
.replaceAll("\\[LOADSTATS\\]", wrapString(this.loadStatMsg(), 72));
@@ -1057,16 +1077,17 @@ public final class Presenter {
* @since 2024-08-22
*/
private String loadStatMsg() {
- return String.format(
- "Successfully loaded %d unique units with %d names (%d base units), %d unique prefixes with %d names, %d unit sets, and %d named dimensions.",
- this.database.unitMapPrefixless(false).size(),
- this.database.unitMapPrefixless(true).size(),
- this.database.unitMapPrefixless(false).values().stream()
- .filter(IS_FULL_BASE).count(),
- this.database.prefixMap(false).size(),
- this.database.prefixMap(true).size(),
- this.database.unitSetMap().size(),
- this.database.dimensionMap().size());
+ return this.getLocalizedText("load_stat_msg")
+ .replace("[u]", Integer.toString(
+ this.database.unitMapPrefixless(false).size()))
+ .replace("[un]", Integer.toString(
+ this.database.unitMapPrefixless(true).size()))
+ .replace("[b]", Long.toString(this.database.unitMapPrefixless(false)
+ .values().stream().filter(IS_FULL_BASE).count()))
+ .replace("[p]", Integer.toString(this.database.prefixMap(false).size()))
+ .replace("[pn]", Integer.toString(this.database.prefixMap(true).size()))
+ .replace("[s]", Integer.toString(this.database.unitSetMap().size()))
+ .replace("[d]", Integer.toString(this.database.dimensionMap().size()));
}
/**
diff --git a/src/main/java/sevenUnitsGUI/TabbedView.java b/src/main/java/sevenUnitsGUI/TabbedView.java
index 40ed0a7..9850aac 100644
--- a/src/main/java/sevenUnitsGUI/TabbedView.java
+++ b/src/main/java/sevenUnitsGUI/TabbedView.java
@@ -198,7 +198,8 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
/** The text box for prefix data in the prefix viewer */
private final JTextArea prefixTextBox;
- // SETTINGS STUFF
+ // INFO & SETTINGS STUFF
+ final JTextArea infoTextArea;
private final JComboBox<String> localeSelector;
private StandardRoundingType roundingType;
private int precision;
@@ -377,11 +378,10 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
this.masterPane.addTab("\uD83D\uDEC8", // info (i) character
new JScrollPane(infoPanel));
- final JTextArea infoTextArea = new JTextArea();
- infoTextArea.setEditable(false);
- infoTextArea.setOpaque(false);
- infoPanel.add(infoTextArea);
- infoTextArea.setText(this.presenter.getAboutText());
+ this.infoTextArea = new JTextArea();
+ this.infoTextArea.setEditable(false);
+ this.infoTextArea.setOpaque(false);
+ infoPanel.add(this.infoTextArea);
// ============ SETTINGS PANEL ============
this.localeSelector = new JComboBox<>();
@@ -907,6 +907,7 @@ final class TabbedView implements ExpressionConversionView, UnitConversionView {
public void updateText() {
this.frame.setTitle(this.presenter.getLocalizedText("tv.title")
.replace("[v]", ProgramInfo.VERSION.toString()));
+ this.infoTextArea.setText(this.presenter.getAboutText());
this.localizedTextSetters.forEach((id, action) ->
action.accept(this.presenter.getLocalizedText(id)));
}
diff --git a/src/main/resources/about.txt b/src/main/resources/about/en.txt
index 4c33f8c..068f922 100644
--- a/src/main/resources/about.txt
+++ b/src/main/resources/about/en.txt
@@ -15,7 +15,7 @@ Unit/Prefix/Dimension Statistics:
Copyright Notice:
-Unit Converter Copyright (C) 2018-2024 Adrien Hopkins
+Unit Converter Copyright (C) 2018-2025 Adrien Hopkins
This program comes with ABSOLUTELY NO WARRANTY;
for details read the LICENSE file, section 15
diff --git a/src/main/resources/about/fr.txt b/src/main/resources/about/fr.txt
new file mode 100644
index 0000000..d8d82aa
--- /dev/null
+++ b/src/main/resources/about/fr.txt
@@ -0,0 +1,24 @@
+À propos de 7Unités version [VERSION]
+
+7Unités est une programme pour convertir les unités avec plusieurs fonctions,
+inspiré par GNU Units (https://www.gnu.org/software/units/).
+Vous pouvez l’utiliser pour convertir des unités, mais vous pouvez aussi
+l’utiliser comme calculatrice, computer et convertir des expressions
+comme "10 m/s + (25^2 - 5^2) mi/hr".
+
+Ce logiciel est par Adrien Hopkins <adrien.p.hopkins@gmail.com>.
+
+Statistiques d’unités, préfixes et dimensions:
+
+[LOADSTATS]
+
+Copyright Notice:
+
+Unit Converter Copyright (C) 2018-2025 Adrien Hopkins
+This program comes with ABSOLUTELY NO WARRANTY;
+for details read the LICENSE file, section 15
+
+This is free software, and you are welcome to redistribute
+it under certain conditions; for details go to
+<https://www.gnu.org/licenses/quick-guide-gplv3.html>
+or read the LICENSE file.
diff --git a/src/main/resources/locales/en.txt b/src/main/resources/locales/en.txt
index 5173cf3..666e363 100644
--- a/src/main/resources/locales/en.txt
+++ b/src/main/resources/locales/en.txt
@@ -28,3 +28,4 @@ tv.settings.show_duplicate=Show Duplicate Units & Prefixes
tv.settings.use_default_files=Use Default Datafiles
tv.settings.locale=🌐 Locale:
tv.settings.unitfiles.button=Manage Unit Data Files
+load_stat_msg=Successfully loaded [u] unique units with [un] names ([b] base units), [p] unique prefixes with [pn] names, [s] unit sets, and [d] named dimensions.
diff --git a/src/main/resources/locales/fr.txt b/src/main/resources/locales/fr.txt
index e8b7138..3fef030 100644
--- a/src/main/resources/locales/fr.txt
+++ b/src/main/resources/locales/fr.txt
@@ -28,3 +28,4 @@ tv.settings.show_duplicate=Montrer unités et préfixes doubles
tv.settings.use_default_files=Utilise donées par défaut
tv.settings.locale=🌐 Locale:
tv.settings.unitfiles.button=Gérer donées d’unités
+load_stat_msg=Chargé [u] unités uniques avec [un] noms ([b] unités bases), [p] préfixes uniques avec [pn] noms, [s] collections d’unités, et [d] dimensions nomées.