From 5b1c0de0aefac465b446ed80ecb3ee622d1241ba Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Thu, 22 Jan 2015 15:48:01 +0300 Subject: [PATCH] embedded resources in examples; embedded i18n resources support --- examples/example1/dub.json | 2 +- examples/example1/example1.visualdproj | 2 +- examples/example1/src/example1.d | 32 +++++----- .../{ => views}/res/hdpi/document-close.png | Bin .../res/hdpi/document-open-recent.png | Bin .../{ => views}/res/hdpi/document-open.png | Bin .../{ => views}/res/hdpi/document-save-as.png | Bin .../{ => views}/res/hdpi/document-save.png | Bin .../{ => views}/res/hdpi/edit-clear.png | Bin .../{ => views}/res/hdpi/edit-copy.png | Bin .../{ => views}/res/hdpi/edit-cut.png | Bin .../{ => views}/res/hdpi/edit-delete.png | Bin .../{ => views}/res/hdpi/edit-paste.png | Bin .../{ => views}/res/hdpi/edit-redo.png | Bin .../{ => views}/res/hdpi/edit-undo.png | Bin examples/example1/{ => views}/res/i18n/en.ini | 0 examples/example1/{ => views}/res/i18n/ru.ini | 0 .../{ => views}/res/mdpi/cr3_logo.png | Bin .../{ => views}/res/mdpi/document-close.png | Bin .../res/mdpi/document-open-recent.png | Bin .../{ => views}/res/mdpi/document-open.png | Bin .../res/mdpi/document-properties.png | Bin .../{ => views}/res/mdpi/document-save-as.png | Bin .../{ => views}/res/mdpi/document-save.png | Bin .../{ => views}/res/mdpi/edit-copy.png | Bin .../{ => views}/res/mdpi/edit-cut.png | Bin .../{ => views}/res/mdpi/edit-paste.png | Bin .../{ => views}/res/mdpi/edit-redo.png | Bin .../{ => views}/res/mdpi/edit-undo.png | Bin .../{ => views}/res/mdpi/tx_fabric.jpg | Bin .../{ => views}/res/theme_custom1.xml | 0 examples/example1/views/resources.list | 16 +++++ examples/tetris/src/tetris.d | 17 +----- examples/tetris/tetris.visualdproj | 6 +- .../tetris/{ => views}/res/arrow-down.png | Bin .../tetris/{ => views}/res/arrow-left.png | Bin .../tetris/{ => views}/res/arrow-right.png | Bin .../tetris/{ => views}/res/dtetris-logo1.png | Bin examples/tetris/{ => views}/res/levelup.png | Bin examples/tetris/{ => views}/res/pause.png | Bin .../{ => views}/res/popup_background.9.png | Bin examples/tetris/{ => views}/res/rotate.png | Bin .../{ => views}/res/tetris_logo_big.png | Bin examples/tetris/{ => views}/res/tx_fabric.jpg | Bin examples/tetris/views/resources.list | 10 ++++ src/dlangui/core/i18n.d | 55 ++++++++++++------ views/res/i18n/{en.ini => std_en.ini} | 0 views/res/i18n/{ru.ini => std_ru.ini} | 0 views/standard_resources.list | 4 +- 49 files changed, 90 insertions(+), 54 deletions(-) rename examples/example1/{ => views}/res/hdpi/document-close.png (100%) rename examples/example1/{ => views}/res/hdpi/document-open-recent.png (100%) rename examples/example1/{ => views}/res/hdpi/document-open.png (100%) rename examples/example1/{ => views}/res/hdpi/document-save-as.png (100%) rename examples/example1/{ => views}/res/hdpi/document-save.png (100%) rename examples/example1/{ => views}/res/hdpi/edit-clear.png (100%) rename examples/example1/{ => views}/res/hdpi/edit-copy.png (100%) rename examples/example1/{ => views}/res/hdpi/edit-cut.png (100%) rename examples/example1/{ => views}/res/hdpi/edit-delete.png (100%) rename examples/example1/{ => views}/res/hdpi/edit-paste.png (100%) rename examples/example1/{ => views}/res/hdpi/edit-redo.png (100%) rename examples/example1/{ => views}/res/hdpi/edit-undo.png (100%) rename examples/example1/{ => views}/res/i18n/en.ini (100%) rename examples/example1/{ => views}/res/i18n/ru.ini (100%) rename examples/example1/{ => views}/res/mdpi/cr3_logo.png (100%) rename examples/example1/{ => views}/res/mdpi/document-close.png (100%) rename examples/example1/{ => views}/res/mdpi/document-open-recent.png (100%) rename examples/example1/{ => views}/res/mdpi/document-open.png (100%) rename examples/example1/{ => views}/res/mdpi/document-properties.png (100%) rename examples/example1/{ => views}/res/mdpi/document-save-as.png (100%) rename examples/example1/{ => views}/res/mdpi/document-save.png (100%) rename examples/example1/{ => views}/res/mdpi/edit-copy.png (100%) rename examples/example1/{ => views}/res/mdpi/edit-cut.png (100%) rename examples/example1/{ => views}/res/mdpi/edit-paste.png (100%) rename examples/example1/{ => views}/res/mdpi/edit-redo.png (100%) rename examples/example1/{ => views}/res/mdpi/edit-undo.png (100%) rename examples/example1/{ => views}/res/mdpi/tx_fabric.jpg (100%) rename examples/example1/{ => views}/res/theme_custom1.xml (100%) create mode 100644 examples/example1/views/resources.list rename examples/tetris/{ => views}/res/arrow-down.png (100%) rename examples/tetris/{ => views}/res/arrow-left.png (100%) rename examples/tetris/{ => views}/res/arrow-right.png (100%) rename examples/tetris/{ => views}/res/dtetris-logo1.png (100%) rename examples/tetris/{ => views}/res/levelup.png (100%) rename examples/tetris/{ => views}/res/pause.png (100%) rename examples/tetris/{ => views}/res/popup_background.9.png (100%) rename examples/tetris/{ => views}/res/rotate.png (100%) rename examples/tetris/{ => views}/res/tetris_logo_big.png (100%) rename examples/tetris/{ => views}/res/tx_fabric.jpg (100%) create mode 100644 examples/tetris/views/resources.list rename views/res/i18n/{en.ini => std_en.ini} (100%) rename views/res/i18n/{ru.ini => std_ru.ini} (100%) diff --git a/examples/example1/dub.json b/examples/example1/dub.json index aa590aa6..9f9b6495 100644 --- a/examples/example1/dub.json +++ b/examples/example1/dub.json @@ -9,7 +9,7 @@ "targetType": "executable", "targetName": "example1", - "copyFiles": ["res"], + "stringImportPaths": ["views", "views/res", "views/res/i18n", "views/res/mdpi"], "dependencies": { "dlangui:dlanguilib": "*" diff --git a/examples/example1/example1.visualdproj b/examples/example1/example1.visualdproj index 88c93a22..5d641638 100644 --- a/examples/example1/example1.visualdproj +++ b/examples/example1/example1.visualdproj @@ -48,7 +48,7 @@ 0 $(DMDInstallDir)windows\bin\dmd.exe $(SolutionDir)/src $(SolutionDir)/3rdparty $(SolutionDir)/3rdparty/libpng/source $(SolutionDir)/../DerelictGL3/source $(SolutionDir)/../DerelictUtil/source $(SolutionDir)/../DerelictFT/source $(SolutionDir)/../DerelictSDL2/source $(SolutionDir)/../de_image/source/interfaces $(SolutionDir)/../de_image/source/png $(SolutionDir)/../dlib - + views views/res views/res/i18n views/res/mdpi $(ConfigurationName) $(OutDir) diff --git a/examples/example1/src/example1.d b/examples/example1/src/example1.d index 38f62ada..1b1db13a 100644 --- a/examples/example1/src/example1.d +++ b/examples/example1/src/example1.d @@ -169,21 +169,25 @@ enum : int { /// entry point for dlangui based application extern (C) int UIAppMain(string[] args) { // resource directory search paths - string[] resourceDirs = [ - appendPath(exePath, "../../../res/"), // for Visual D and DUB builds - appendPath(exePath, "../../../res/mdpi/"), // for Visual D and DUB builds - appendPath(exePath, "../../../../res/"),// for Mono-D builds - appendPath(exePath, "../../../../res/mdpi/"),// for Mono-D builds - appendPath(exePath, "res/"), // when res dir is located at the same directory as executable - appendPath(exePath, "../res/"), // when res dir is located at project directory - appendPath(exePath, "../../res/"), // when res dir is located at the same directory as executable - appendPath(exePath, "res/mdpi/"), // when res dir is located at the same directory as executable - appendPath(exePath, "../res/mdpi/"), // when res dir is located at project directory - appendPath(exePath, "../../res/mdpi/") // when res dir is located at the same directory as executable - ]; - + // not required if only embedded resources are used + //string[] resourceDirs = [ + // appendPath(exePath, "../../../res/"), // for Visual D and DUB builds + // appendPath(exePath, "../../../res/mdpi/"), // for Visual D and DUB builds + // appendPath(exePath, "../../../../res/"),// for Mono-D builds + // appendPath(exePath, "../../../../res/mdpi/"),// for Mono-D builds + // appendPath(exePath, "res/"), // when res dir is located at the same directory as executable + // appendPath(exePath, "../res/"), // when res dir is located at project directory + // appendPath(exePath, "../../res/"), // when res dir is located at the same directory as executable + // appendPath(exePath, "res/mdpi/"), // when res dir is located at the same directory as executable + // appendPath(exePath, "../res/mdpi/"), // when res dir is located at project directory + // appendPath(exePath, "../../res/mdpi/") // when res dir is located at the same directory as executable + //]; // setup resource directories - will use only existing directories - Platform.instance.resourceDirs = resourceDirs; + //Platform.instance.resourceDirs = resourceDirs; + + // embed resources listed in views/resources.list into executable + embeddedResourceList.addResources(embedResourcesFromList!("resources.list")()); + // select translation file - for english language Platform.instance.uiLanguage = "en"; // load theme from file "theme_default.xml" diff --git a/examples/example1/res/hdpi/document-close.png b/examples/example1/views/res/hdpi/document-close.png similarity index 100% rename from examples/example1/res/hdpi/document-close.png rename to examples/example1/views/res/hdpi/document-close.png diff --git a/examples/example1/res/hdpi/document-open-recent.png b/examples/example1/views/res/hdpi/document-open-recent.png similarity index 100% rename from examples/example1/res/hdpi/document-open-recent.png rename to examples/example1/views/res/hdpi/document-open-recent.png diff --git a/examples/example1/res/hdpi/document-open.png b/examples/example1/views/res/hdpi/document-open.png similarity index 100% rename from examples/example1/res/hdpi/document-open.png rename to examples/example1/views/res/hdpi/document-open.png diff --git a/examples/example1/res/hdpi/document-save-as.png b/examples/example1/views/res/hdpi/document-save-as.png similarity index 100% rename from examples/example1/res/hdpi/document-save-as.png rename to examples/example1/views/res/hdpi/document-save-as.png diff --git a/examples/example1/res/hdpi/document-save.png b/examples/example1/views/res/hdpi/document-save.png similarity index 100% rename from examples/example1/res/hdpi/document-save.png rename to examples/example1/views/res/hdpi/document-save.png diff --git a/examples/example1/res/hdpi/edit-clear.png b/examples/example1/views/res/hdpi/edit-clear.png similarity index 100% rename from examples/example1/res/hdpi/edit-clear.png rename to examples/example1/views/res/hdpi/edit-clear.png diff --git a/examples/example1/res/hdpi/edit-copy.png b/examples/example1/views/res/hdpi/edit-copy.png similarity index 100% rename from examples/example1/res/hdpi/edit-copy.png rename to examples/example1/views/res/hdpi/edit-copy.png diff --git a/examples/example1/res/hdpi/edit-cut.png b/examples/example1/views/res/hdpi/edit-cut.png similarity index 100% rename from examples/example1/res/hdpi/edit-cut.png rename to examples/example1/views/res/hdpi/edit-cut.png diff --git a/examples/example1/res/hdpi/edit-delete.png b/examples/example1/views/res/hdpi/edit-delete.png similarity index 100% rename from examples/example1/res/hdpi/edit-delete.png rename to examples/example1/views/res/hdpi/edit-delete.png diff --git a/examples/example1/res/hdpi/edit-paste.png b/examples/example1/views/res/hdpi/edit-paste.png similarity index 100% rename from examples/example1/res/hdpi/edit-paste.png rename to examples/example1/views/res/hdpi/edit-paste.png diff --git a/examples/example1/res/hdpi/edit-redo.png b/examples/example1/views/res/hdpi/edit-redo.png similarity index 100% rename from examples/example1/res/hdpi/edit-redo.png rename to examples/example1/views/res/hdpi/edit-redo.png diff --git a/examples/example1/res/hdpi/edit-undo.png b/examples/example1/views/res/hdpi/edit-undo.png similarity index 100% rename from examples/example1/res/hdpi/edit-undo.png rename to examples/example1/views/res/hdpi/edit-undo.png diff --git a/examples/example1/res/i18n/en.ini b/examples/example1/views/res/i18n/en.ini similarity index 100% rename from examples/example1/res/i18n/en.ini rename to examples/example1/views/res/i18n/en.ini diff --git a/examples/example1/res/i18n/ru.ini b/examples/example1/views/res/i18n/ru.ini similarity index 100% rename from examples/example1/res/i18n/ru.ini rename to examples/example1/views/res/i18n/ru.ini diff --git a/examples/example1/res/mdpi/cr3_logo.png b/examples/example1/views/res/mdpi/cr3_logo.png similarity index 100% rename from examples/example1/res/mdpi/cr3_logo.png rename to examples/example1/views/res/mdpi/cr3_logo.png diff --git a/examples/example1/res/mdpi/document-close.png b/examples/example1/views/res/mdpi/document-close.png similarity index 100% rename from examples/example1/res/mdpi/document-close.png rename to examples/example1/views/res/mdpi/document-close.png diff --git a/examples/example1/res/mdpi/document-open-recent.png b/examples/example1/views/res/mdpi/document-open-recent.png similarity index 100% rename from examples/example1/res/mdpi/document-open-recent.png rename to examples/example1/views/res/mdpi/document-open-recent.png diff --git a/examples/example1/res/mdpi/document-open.png b/examples/example1/views/res/mdpi/document-open.png similarity index 100% rename from examples/example1/res/mdpi/document-open.png rename to examples/example1/views/res/mdpi/document-open.png diff --git a/examples/example1/res/mdpi/document-properties.png b/examples/example1/views/res/mdpi/document-properties.png similarity index 100% rename from examples/example1/res/mdpi/document-properties.png rename to examples/example1/views/res/mdpi/document-properties.png diff --git a/examples/example1/res/mdpi/document-save-as.png b/examples/example1/views/res/mdpi/document-save-as.png similarity index 100% rename from examples/example1/res/mdpi/document-save-as.png rename to examples/example1/views/res/mdpi/document-save-as.png diff --git a/examples/example1/res/mdpi/document-save.png b/examples/example1/views/res/mdpi/document-save.png similarity index 100% rename from examples/example1/res/mdpi/document-save.png rename to examples/example1/views/res/mdpi/document-save.png diff --git a/examples/example1/res/mdpi/edit-copy.png b/examples/example1/views/res/mdpi/edit-copy.png similarity index 100% rename from examples/example1/res/mdpi/edit-copy.png rename to examples/example1/views/res/mdpi/edit-copy.png diff --git a/examples/example1/res/mdpi/edit-cut.png b/examples/example1/views/res/mdpi/edit-cut.png similarity index 100% rename from examples/example1/res/mdpi/edit-cut.png rename to examples/example1/views/res/mdpi/edit-cut.png diff --git a/examples/example1/res/mdpi/edit-paste.png b/examples/example1/views/res/mdpi/edit-paste.png similarity index 100% rename from examples/example1/res/mdpi/edit-paste.png rename to examples/example1/views/res/mdpi/edit-paste.png diff --git a/examples/example1/res/mdpi/edit-redo.png b/examples/example1/views/res/mdpi/edit-redo.png similarity index 100% rename from examples/example1/res/mdpi/edit-redo.png rename to examples/example1/views/res/mdpi/edit-redo.png diff --git a/examples/example1/res/mdpi/edit-undo.png b/examples/example1/views/res/mdpi/edit-undo.png similarity index 100% rename from examples/example1/res/mdpi/edit-undo.png rename to examples/example1/views/res/mdpi/edit-undo.png diff --git a/examples/example1/res/mdpi/tx_fabric.jpg b/examples/example1/views/res/mdpi/tx_fabric.jpg similarity index 100% rename from examples/example1/res/mdpi/tx_fabric.jpg rename to examples/example1/views/res/mdpi/tx_fabric.jpg diff --git a/examples/example1/res/theme_custom1.xml b/examples/example1/views/res/theme_custom1.xml similarity index 100% rename from examples/example1/res/theme_custom1.xml rename to examples/example1/views/res/theme_custom1.xml diff --git a/examples/example1/views/resources.list b/examples/example1/views/resources.list new file mode 100644 index 00000000..a1ea75c8 --- /dev/null +++ b/examples/example1/views/resources.list @@ -0,0 +1,16 @@ +res/i18n/en.ini +res/i18n/ru.ini +res/mdpi/cr3_logo.png +res/mdpi/document-close.png +res/mdpi/document-open-recent.png +res/mdpi/document-open.png +res/mdpi/document-properties.png +res/mdpi/document-save-as.png +res/mdpi/document-save.png +res/mdpi/edit-copy.png +res/mdpi/edit-cut.png +res/mdpi/edit-paste.png +res/mdpi/edit-redo.png +res/mdpi/edit-undo.png +res/mdpi/tx_fabric.jpg +res/theme_custom1.xml diff --git a/examples/tetris/src/tetris.d b/examples/tetris/src/tetris.d index 1a0a1ce7..564fc27a 100644 --- a/examples/tetris/src/tetris.d +++ b/examples/tetris/src/tetris.d @@ -28,22 +28,9 @@ extern (C) int UIAppMain(string[] args) { //auto power2 = delegate(int X) { return X * X; }; auto power2 = (int X) => X * X; - // resource directory search paths - string[] resourceDirs = [ - appendPath(exePath, "../../../res/"), // for Visual D and DUB builds - appendPath(exePath, "../../../res/mdpi/"), // for Visual D and DUB builds - appendPath(exePath, "../../../../res/"),// for Mono-D builds - appendPath(exePath, "../../../../res/mdpi/"),// for Mono-D builds - appendPath(exePath, "res/"), // when res dir is located at the same directory as executable - appendPath(exePath, "../res/"), // when res dir is located at project directory - appendPath(exePath, "../../res/"), // when res dir is located at the same directory as executable - appendPath(exePath, "res/mdpi/"), // when res dir is located at the same directory as executable - appendPath(exePath, "../res/mdpi/"), // when res dir is located at project directory - appendPath(exePath, "../../res/mdpi/") // when res dir is located at the same directory as executable - ]; + // embed resources listed in views/resources.list into executable + embeddedResourceList.addResources(embedResourcesFromList!("resources.list")()); - // setup resource directories - will use only existing directories - Platform.instance.resourceDirs = resourceDirs; // select translation file - for english language Platform.instance.uiLanguage = "en"; // load theme from file "theme_default.xml" diff --git a/examples/tetris/tetris.visualdproj b/examples/tetris/tetris.visualdproj index 2f140968..924f10f9 100644 --- a/examples/tetris/tetris.visualdproj +++ b/examples/tetris/tetris.visualdproj @@ -48,7 +48,7 @@ 0 $(DMDInstallDir)windows\bin\dmd.exe $(SolutionDir)/src $(SolutionDir)/3rdparty $(SolutionDir)/3rdparty/libpng/source $(SolutionDir)/../DerelictGL3/source $(SolutionDir)/../DerelictUtil/source $(SolutionDir)/../DerelictFT/source $(SolutionDir)/../DerelictSDL2/source $(SolutionDir)/../de_image/source/interfaces $(SolutionDir)/../de_image/source/png $(SolutionDir)/../dlib - + views views/res views/mdpi views/i18n $(ConfigurationName) $(OutDir) @@ -89,7 +89,6 @@ $(OutDir)\$(ProjectName).exe 1 - 2 -profile @@ -184,7 +183,6 @@ $(OutDir)\$(ProjectName).exe 1 - 1 @@ -192,7 +190,7 @@ - + diff --git a/examples/tetris/res/arrow-down.png b/examples/tetris/views/res/arrow-down.png similarity index 100% rename from examples/tetris/res/arrow-down.png rename to examples/tetris/views/res/arrow-down.png diff --git a/examples/tetris/res/arrow-left.png b/examples/tetris/views/res/arrow-left.png similarity index 100% rename from examples/tetris/res/arrow-left.png rename to examples/tetris/views/res/arrow-left.png diff --git a/examples/tetris/res/arrow-right.png b/examples/tetris/views/res/arrow-right.png similarity index 100% rename from examples/tetris/res/arrow-right.png rename to examples/tetris/views/res/arrow-right.png diff --git a/examples/tetris/res/dtetris-logo1.png b/examples/tetris/views/res/dtetris-logo1.png similarity index 100% rename from examples/tetris/res/dtetris-logo1.png rename to examples/tetris/views/res/dtetris-logo1.png diff --git a/examples/tetris/res/levelup.png b/examples/tetris/views/res/levelup.png similarity index 100% rename from examples/tetris/res/levelup.png rename to examples/tetris/views/res/levelup.png diff --git a/examples/tetris/res/pause.png b/examples/tetris/views/res/pause.png similarity index 100% rename from examples/tetris/res/pause.png rename to examples/tetris/views/res/pause.png diff --git a/examples/tetris/res/popup_background.9.png b/examples/tetris/views/res/popup_background.9.png similarity index 100% rename from examples/tetris/res/popup_background.9.png rename to examples/tetris/views/res/popup_background.9.png diff --git a/examples/tetris/res/rotate.png b/examples/tetris/views/res/rotate.png similarity index 100% rename from examples/tetris/res/rotate.png rename to examples/tetris/views/res/rotate.png diff --git a/examples/tetris/res/tetris_logo_big.png b/examples/tetris/views/res/tetris_logo_big.png similarity index 100% rename from examples/tetris/res/tetris_logo_big.png rename to examples/tetris/views/res/tetris_logo_big.png diff --git a/examples/tetris/res/tx_fabric.jpg b/examples/tetris/views/res/tx_fabric.jpg similarity index 100% rename from examples/tetris/res/tx_fabric.jpg rename to examples/tetris/views/res/tx_fabric.jpg diff --git a/examples/tetris/views/resources.list b/examples/tetris/views/resources.list new file mode 100644 index 00000000..03c36c37 --- /dev/null +++ b/examples/tetris/views/resources.list @@ -0,0 +1,10 @@ +res/arrow-down.png +res/arrow-left.png +res/arrow-right.png +res/dtetris-logo1.png +res/levelup.png +res/pause.png +res/popup_background.9.png +res/rotate.png +res/tetris_logo_big.png +res/tx_fabric.jpg diff --git a/src/dlangui/core/i18n.d b/src/dlangui/core/i18n.d index 239bbf0e..1ee09d57 100644 --- a/src/dlangui/core/i18n.d +++ b/src/dlangui/core/i18n.d @@ -63,9 +63,12 @@ module dlangui.core.i18n; import dlangui.core.types; import dlangui.core.logger; import dlangui.core.files; +import dlangui.graphics.resources; private import dlangui.core.linestream; private import std.utf; private import std.algorithm; +private import std.string; +private import std.file; /** Container for UI string - either raw value or string resource ID @@ -290,10 +293,22 @@ synchronized class UIStringTranslator { if (ch == '/' || ch == '\\') hasPathDelimiters = true; string[] res; - if (!hasPathDelimiters && _resourceDirs.length) { - foreach (dir; _resourceDirs) - res ~= dir ~ filename; + if (!hasPathDelimiters) { + string fn = EMBEDDED_RESOURCE_PREFIX ~ "std_" ~ filename; + string s = cast(string)loadResourceBytes(fn); + if (s) + res ~= fn; + fn = EMBEDDED_RESOURCE_PREFIX ~ filename; + s = cast(string)loadResourceBytes(fn); + if (s) + res ~= fn; + foreach (dir; _resourceDirs) { + fn = dir ~ filename; + if (exists(fn) && isFile(fn)) + res ~= fn; + } } else { + // full path res ~= filename; } return res; @@ -350,13 +365,9 @@ private shared class UIStringList { return null; } /// load strings from stream - bool load(std.stream.InputStream stream) { - dlangui.core.linestream.LineStream lines = dlangui.core.linestream.LineStream.create(stream, ""); + bool load(dstring[] lines) { int count = 0; - for (;;) { - dchar[] s = lines.readLine(); - if (s is null) - break; + foreach (s; lines) { int eqpos = -1; int firstNonspace = -1; int lastNonspace = -1; @@ -379,23 +390,33 @@ private shared class UIStringList { return count > 0; } + /// convert to utf32 and split by lines (detecting line endings) + static dstring[] splitLines(string src) { + dstring dsrc = toUTF32(src); + dstring[] split1 = split(dsrc, "\r\n"); + dstring[] split2 = split(dsrc, "\r"); + dstring[] split3 = split(dsrc, "\n"); + if (split1.length >= split2.length && split1.length >= split3.length) + return split1; + if (split2.length > split3.length) + return split2; + return split3; + } + /// load strings from file (utf8, id=value lines) bool load(string[] filenames) { clear(); bool res = false; foreach(filename; filenames) { - import std.stream; - import std.file; try { debug Log.d("Loading string resources from file ", filename); - if (!exists(filename) || !isFile(filename)) { - Log.e("File does not exist: ", filename); + string s = cast(string)loadResourceBytes(filename); + if (!s) { + Log.e("Cannot load i18n resource from file ", filename); continue; } - std.stream.File f = new std.stream.File(filename); - scope(exit) { f.close(); } - res = load(f) || res; - } catch (StreamFileException e) { + res = load(splitLines(s)) || res; + } catch (Exception e) { Log.e("Cannot read string resources from file ", filename); } } diff --git a/views/res/i18n/en.ini b/views/res/i18n/std_en.ini similarity index 100% rename from views/res/i18n/en.ini rename to views/res/i18n/std_en.ini diff --git a/views/res/i18n/ru.ini b/views/res/i18n/std_ru.ini similarity index 100% rename from views/res/i18n/ru.ini rename to views/res/i18n/std_ru.ini diff --git a/views/standard_resources.list b/views/standard_resources.list index ca61059a..55abed7a 100644 --- a/views/standard_resources.list +++ b/views/standard_resources.list @@ -15,8 +15,8 @@ res/exit.png res/fileclose.png res/fileopen.png res/frame_blue.9.png -res/i18n/en.ini -res/i18n/ru.ini +res/i18n/std_en.ini +res/i18n/std_ru.ini res/list_item_background.xml res/list_item_background_solid.xml res/main_menu_item_background.xml