Initial commit
This commit is contained in:
commit
2fd0d0034e
|
|
@ -0,0 +1,195 @@
|
||||||
|
# xmake-related files
|
||||||
|
.xmake/*
|
||||||
|
.vs/*
|
||||||
|
.vscode/*
|
||||||
|
CMakeLists.txt
|
||||||
|
Makefile
|
||||||
|
vs*/*
|
||||||
|
vsxmake*/*
|
||||||
|
|
||||||
|
# Ignore assets (except shaders)
|
||||||
|
assets/*
|
||||||
|
!assets/examples_version.txt
|
||||||
|
!assets/readme.md
|
||||||
|
!assets/tests_version.txt
|
||||||
|
!assets/shaders
|
||||||
|
|
||||||
|
# Coverage
|
||||||
|
coverage.out
|
||||||
|
|
||||||
|
# Embed resources
|
||||||
|
src/Nazara/*/Resources/**/*.h
|
||||||
|
|
||||||
|
# Nazara binaries
|
||||||
|
bin/*
|
||||||
|
!bin/resources
|
||||||
|
!bin/resources/*
|
||||||
|
|
||||||
|
# Build files
|
||||||
|
build/*
|
||||||
|
|
||||||
|
# Nazara libraries
|
||||||
|
lib/*
|
||||||
|
|
||||||
|
# Self-hosted thirdparty libraries binaries
|
||||||
|
thirdparty/genlib/*
|
||||||
|
|
||||||
|
# Nazara plugin libraries
|
||||||
|
plugins/lib/*
|
||||||
|
|
||||||
|
# Nazara package
|
||||||
|
package/*
|
||||||
|
|
||||||
|
# Example files
|
||||||
|
examples/bin/*.exe
|
||||||
|
examples/bin/*.pdb
|
||||||
|
examples/bin/*.dll
|
||||||
|
examples/bin/*.so
|
||||||
|
examples/bin/Demo*
|
||||||
|
|
||||||
|
# Unit tests
|
||||||
|
tests/*.exe
|
||||||
|
tests/*.pdb
|
||||||
|
tests/*.dll
|
||||||
|
tests/*.so
|
||||||
|
tests/NazaraUnitTests*
|
||||||
|
|
||||||
|
# Example generated files
|
||||||
|
examples/bin/HardwareInfo.txt
|
||||||
|
|
||||||
|
# Example generated files
|
||||||
|
examples/bin/HardwareInfo.txt
|
||||||
|
|
||||||
|
# Feature page
|
||||||
|
build/scripts/features/index.html
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
doc
|
||||||
|
|
||||||
|
# Codeblocks
|
||||||
|
*.save-failed
|
||||||
|
build/**/*.cbp
|
||||||
|
build/**/*.cbp
|
||||||
|
build/**/*.cbTemp
|
||||||
|
build/**/*.cscope_file_list
|
||||||
|
build/**/*.depend
|
||||||
|
build/**/*.layout
|
||||||
|
build/**/*.workspace
|
||||||
|
|
||||||
|
# CodeLite
|
||||||
|
build/**/*.project
|
||||||
|
|
||||||
|
# GMake
|
||||||
|
build/**/*.make
|
||||||
|
build/**/*.d
|
||||||
|
|
||||||
|
# Visual Studio
|
||||||
|
build/**/*.pdb
|
||||||
|
build/**/*.filters
|
||||||
|
build/**/*.vcxproj
|
||||||
|
build/**/*.tlog
|
||||||
|
build/**/*.sln
|
||||||
|
build/**/*.vcxprojResolveAssemblyReference.cache
|
||||||
|
build/**/*.nativecodeanalysis.all.xml
|
||||||
|
build/**/*.nativecodeanalysis.xml
|
||||||
|
build/**/*.VC.opendb
|
||||||
|
build/**/*.VC.db*
|
||||||
|
build/**/*.json
|
||||||
|
build/**/*.sqlite
|
||||||
|
build/**/*.FileListAbsolute.txt
|
||||||
|
build/**/*.recipe
|
||||||
|
|
||||||
|
# Compiled Object files
|
||||||
|
build/**/*.slo
|
||||||
|
build/**/*.lo
|
||||||
|
build/**/*.o
|
||||||
|
build/**/*.obj
|
||||||
|
build/**/*.obj.enc
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
build/**/*.so
|
||||||
|
|
||||||
|
# Compiled Static libraries
|
||||||
|
build/**/*.lai
|
||||||
|
build/**/*.la
|
||||||
|
|
||||||
|
# Object files
|
||||||
|
build/**/*.o
|
||||||
|
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
[Tt]est[Rr]esult
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*.idb
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.pch
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
|
||||||
|
*.pidb
|
||||||
|
|
||||||
|
*.log
|
||||||
|
*.scc
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
*.ncrunch*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (C) 2023
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Nazara Localization
|
||||||
|
|
||||||
|
Nazara Localization is a [Nazara Engine](https://github.com/NazaraEngine/NazaraEngine) module that allows you to add localized text to your project.
|
||||||
|
|
||||||
|
You can use it in any kind of commercial and non-commercial applications without any restriction ([MIT license](http://opensource.org/licenses/MIT)).
|
||||||
|
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
Sid - main developper
|
||||||
|
|
||||||
|
## How to Use
|
||||||
|
|
||||||
|
```
|
||||||
|
// Add NazaraImgui.hpp to your includes
|
||||||
|
#include <NazaraLocalization/NazaraLocalization.hpp>
|
||||||
|
|
||||||
|
// main.cpp
|
||||||
|
{
|
||||||
|
// Add Nz::Localization to the modules list
|
||||||
|
Nz::Modules<Nz::Graphics, Nz::Localization,...> nazara;
|
||||||
|
|
||||||
|
Nz::LocalizedText hello = "LOC_HELLO_WORLD";
|
||||||
|
printf("text: %s\n", hello.c_str());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Contribute
|
||||||
|
|
||||||
|
##### Don't hesitate to contribute to Nazara Engine by:
|
||||||
|
- Extending the [wiki](https://github.com/NazaraEngine/NazaraEngine/wiki)
|
||||||
|
- Submitting a patch to GitHub
|
||||||
|
- Post suggestions/bugs on the forum or the [GitHub tracker](https://github.com/NazaraEngine/NazaraEngine/issues)
|
||||||
|
- [Fork the project](https://github.com/NazaraEngine/NazaraEngine/fork) on GitHub and [push your changes](https://github.com/NazaraEngine/NazaraEngine/pulls)
|
||||||
|
- Talking about Nazara Engine to other people, spread the word!
|
||||||
|
- Doing anything else that might help us
|
||||||
|
|
||||||
|
## Links
|
||||||
|
|
||||||
|
[Discord](https://discord.gg/MvwNx73)
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
;fr-FR;en-US;pt-BR
|
||||||
|
LOC_HELLO_WORLD;Bonjour le monde!;Hello World!;Olá Mundo!
|
||||||
|
LOC_TEXT_ARG;{1:.2f} est la valeur de {0}!;{pi} is the value of {}!;O valor de {} é {}!
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
|
||||||
|
#include <Nazara/Core/Application.hpp>
|
||||||
|
|
||||||
|
#include <NazaraLocalization/Localization.hpp>
|
||||||
|
#include <NazaraLocalization/LocalizedText.hpp>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
NazaraUnused(argc);
|
||||||
|
NazaraUnused(argv);
|
||||||
|
|
||||||
|
Nz::Application<Nz::Localization> nazara;
|
||||||
|
|
||||||
|
Nz::LocalizedText helloWorld("LOC_HELLO_WORLD");
|
||||||
|
Nz::LocalizedText textWithArguments = Nz::LocalizedText("LOC_TEXT_ARG").Arg("PI").Arg("pi", Nz::Pi<float>);
|
||||||
|
|
||||||
|
// Works with printf as if you were printing a string
|
||||||
|
// There is no localization data loaded so it will just print the key
|
||||||
|
printf("%s\n%s\n", helloWorld.c_str(), textWithArguments.c_str());
|
||||||
|
|
||||||
|
// We load the CSV containing our data
|
||||||
|
Nz::Localization::Instance()->LoadLocalizationFile("localization.csv");
|
||||||
|
|
||||||
|
Nz::Localization::Instance()->SetLocale("fr-FR");
|
||||||
|
std::cout << helloWorld << std::endl << textWithArguments << std::endl;
|
||||||
|
Nz::Localization::Instance()->SetLocale("en-US");
|
||||||
|
std::cout << helloWorld << std::endl << textWithArguments << std::endl;
|
||||||
|
Nz::Localization::Instance()->SetLocale("pt-BR");
|
||||||
|
std::cout << helloWorld << std::endl << textWithArguments << std::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
target("NzLocalization-demo")
|
||||||
|
set_group("Examples")
|
||||||
|
add_files("main.cpp")
|
||||||
|
add_packages("nazara")
|
||||||
|
add_deps("NazaraLocalization")
|
||||||
|
set_rundir(".")
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
option("examples")
|
||||||
|
set_default(false)
|
||||||
|
set_showmenu(true)
|
||||||
|
set_description("Build examples")
|
||||||
|
option_end()
|
||||||
|
|
||||||
|
if has_config("examples") then
|
||||||
|
includes("*/xmake.lua")
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <NazaraUtils/Prerequisites.hpp>
|
||||||
|
|
||||||
|
#if defined(NAZARA_LOCALIZATION_STATIC)
|
||||||
|
#define NAZARA_LOCALIZATION_API
|
||||||
|
#else
|
||||||
|
#ifdef NAZARA_LOCALIZATION_BUILD
|
||||||
|
#define NAZARA_LOCALIZATION_API NAZARA_EXPORT
|
||||||
|
#else
|
||||||
|
#define NAZARA_LOCALIZATION_API NAZARA_IMPORT
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Nazara/Core/Core.hpp>
|
||||||
|
#include <NazaraLocalization/Config.hpp>
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
class NAZARA_LOCALIZATION_API Localization : public Nz::ModuleBase<Localization>
|
||||||
|
{
|
||||||
|
friend ModuleBase;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using Dependencies = TypeList<Core>;
|
||||||
|
struct Config {};
|
||||||
|
|
||||||
|
Localization(Config config);
|
||||||
|
~Localization();
|
||||||
|
|
||||||
|
// Loads a CSV containing the localization strings
|
||||||
|
bool LoadLocalizationFile(const std::filesystem::path& filepath);
|
||||||
|
|
||||||
|
// Changes the locale
|
||||||
|
bool SetLocale(const std::string& locale);
|
||||||
|
|
||||||
|
bool FindIndexForKey(std::string_view key, size_t& index) const;
|
||||||
|
const std::string& GetStringAtIndex(size_t index) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct Locale
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
std::vector<std::string> localizedStrings;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Locale> m_locales;
|
||||||
|
std::unordered_map<std::string, size_t> m_lookupTable;
|
||||||
|
|
||||||
|
Locale* m_currentLocale;
|
||||||
|
|
||||||
|
static Localization* s_instance;
|
||||||
|
|
||||||
|
friend class LocalizedText;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <NazaraLocalization/Config.hpp>
|
||||||
|
#include <NazaraLocalization/Localization.hpp>
|
||||||
|
|
||||||
|
#include <variant>
|
||||||
|
#include <optional>
|
||||||
|
#include <ostream>
|
||||||
|
#include <string_view>
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
class NAZARA_LOCALIZATION_API LocalizedText
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LocalizedText();
|
||||||
|
LocalizedText(std::string_view str);
|
||||||
|
|
||||||
|
template <typename T> LocalizedText& Arg(T&& v)
|
||||||
|
{
|
||||||
|
NamedParameter p;
|
||||||
|
p.first = v;
|
||||||
|
m_parameters.push_back(std::move(p));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
template <> LocalizedText& Arg(const char*&& v) { return Arg(std::string(v)); }
|
||||||
|
|
||||||
|
template <typename T> LocalizedText& Arg(std::string_view name, T&& v)
|
||||||
|
{
|
||||||
|
NamedParameter p;
|
||||||
|
p.first = v;
|
||||||
|
p.second = name;
|
||||||
|
m_parameters.push_back(std::move(p));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
template <> LocalizedText& Arg(std::string_view name, const char*&& v) { return Arg(name, std::string(v)); }
|
||||||
|
|
||||||
|
|
||||||
|
const char* c_str() const;
|
||||||
|
const char* data() const;
|
||||||
|
size_t length() const;
|
||||||
|
size_t size() const;
|
||||||
|
|
||||||
|
const std::string& ToString() const;
|
||||||
|
|
||||||
|
friend std::ostream& operator<<(std::ostream& out, const Nz::LocalizedText& dt)
|
||||||
|
{
|
||||||
|
return out << dt.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Update() const;
|
||||||
|
std::string BuildFormattedString() const;
|
||||||
|
|
||||||
|
// Cache for localization
|
||||||
|
mutable std::optional<size_t> m_index; // index in the lookup array
|
||||||
|
mutable Localization::Locale* m_locale; // current locale to avoid fetching pointer every time
|
||||||
|
mutable std::optional<std::string> m_cachedStr; // computed string (loca + parameters formatting)
|
||||||
|
|
||||||
|
std::string m_str;
|
||||||
|
|
||||||
|
using Parameter = std::variant<
|
||||||
|
Int8, Int16, Int32, Int64,
|
||||||
|
UInt8, UInt16, UInt32, UInt64,
|
||||||
|
float, double,
|
||||||
|
std::string
|
||||||
|
>;
|
||||||
|
using NamedParameter = std::pair<Parameter, std::optional<std::string>>;
|
||||||
|
std::vector<NamedParameter> m_parameters;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
#include <NazaraLocalization/Localization.hpp>
|
||||||
|
|
||||||
|
#include <Nazara/Core/StringExt.hpp>
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
Localization* Localization::s_instance = nullptr;
|
||||||
|
|
||||||
|
Localization::Localization(Config /*config*/)
|
||||||
|
: ModuleBase("Localization", this)
|
||||||
|
, m_currentLocale(nullptr)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
Localization::~Localization()
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool Localization::LoadLocalizationFile(const std::filesystem::path& filepath)
|
||||||
|
{
|
||||||
|
std::ifstream file(filepath);
|
||||||
|
if (!file)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// read header
|
||||||
|
std::string line;
|
||||||
|
std::getline(file, line);
|
||||||
|
|
||||||
|
m_locales.clear();
|
||||||
|
SplitString(line, ";", [this](std::string_view str) {
|
||||||
|
if (!str.empty())
|
||||||
|
m_locales.push_back({ std::string(str) });
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
size_t index = 0;
|
||||||
|
while (std::getline(file, line))
|
||||||
|
{
|
||||||
|
std::vector<std::string_view> values;
|
||||||
|
SplitString(line, ";", [&values](std::string_view str) {
|
||||||
|
values.push_back(str);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
m_lookupTable[std::string(values[0])] = index++;
|
||||||
|
for (size_t i = 0; i < m_locales.size() && i < values.size() - 1; ++i)
|
||||||
|
{
|
||||||
|
m_locales[i].localizedStrings.push_back(std::string(values[i + 1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Localization::SetLocale(const std::string& locale)
|
||||||
|
{
|
||||||
|
auto it = std::find_if(m_locales.begin(), m_locales.end(), [locale](auto&& loc) { return loc.name == locale; });
|
||||||
|
if (it == m_locales.end())
|
||||||
|
{
|
||||||
|
m_currentLocale = nullptr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_currentLocale = &(*it);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Localization::FindIndexForKey(std::string_view key, size_t& index) const
|
||||||
|
{
|
||||||
|
auto it = m_lookupTable.find(std::string(key));
|
||||||
|
if (it == m_lookupTable.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
index = it->second;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& Localization::GetStringAtIndex(size_t index) const
|
||||||
|
{
|
||||||
|
static std::string empty = "";
|
||||||
|
if (m_currentLocale == nullptr)
|
||||||
|
return empty;
|
||||||
|
|
||||||
|
return m_currentLocale->localizedStrings.at(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // end of namespace Nz
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
#include <NazaraLocalization/LocalizedText.hpp>
|
||||||
|
#include <NazaraLocalization/Localization.hpp>
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <fmt/args.h>
|
||||||
|
|
||||||
|
namespace Nz
|
||||||
|
{
|
||||||
|
|
||||||
|
LocalizedText::LocalizedText()
|
||||||
|
: LocalizedText("")
|
||||||
|
{ }
|
||||||
|
|
||||||
|
LocalizedText::LocalizedText(std::string_view str)
|
||||||
|
: m_str(str)
|
||||||
|
, m_locale(nullptr)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void LocalizedText::Update() const
|
||||||
|
{
|
||||||
|
if (m_locale != Nz::Localization::Instance()->m_currentLocale)
|
||||||
|
{
|
||||||
|
m_cachedStr = {};
|
||||||
|
m_locale = Nz::Localization::Instance()->m_currentLocale;
|
||||||
|
|
||||||
|
if (!m_index.has_value())
|
||||||
|
{
|
||||||
|
size_t index;
|
||||||
|
if (Nz::Localization::Instance()->FindIndexForKey(m_str, index))
|
||||||
|
m_index = index;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_index.has_value())
|
||||||
|
{
|
||||||
|
m_cachedStr = BuildFormattedString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string LocalizedText::BuildFormattedString() const
|
||||||
|
{
|
||||||
|
if (m_parameters.empty()) // No parameters, no formatting
|
||||||
|
return m_locale->localizedStrings[m_index.value()];
|
||||||
|
|
||||||
|
fmt::dynamic_format_arg_store<fmt::format_context> store;
|
||||||
|
for (auto& p : m_parameters)
|
||||||
|
{
|
||||||
|
if (p.second)
|
||||||
|
{
|
||||||
|
std::visit(Overloaded{
|
||||||
|
[&](auto&& value) {
|
||||||
|
store.push_back(fmt::arg(p.second->c_str(), value));
|
||||||
|
}
|
||||||
|
}, p.first);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::visit(Overloaded{
|
||||||
|
[&](auto&& value) {
|
||||||
|
store.push_back(value);
|
||||||
|
}
|
||||||
|
}, p.first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fmt::vformat(m_locale->localizedStrings[m_index.value()], store);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* LocalizedText::c_str() const
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return (m_cachedStr) ? m_cachedStr->c_str() : m_str.c_str();
|
||||||
|
}
|
||||||
|
const char* LocalizedText::data() const
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return (m_cachedStr) ? m_cachedStr->data() : m_str.data();
|
||||||
|
}
|
||||||
|
size_t LocalizedText::length() const
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return (m_cachedStr) ? m_cachedStr->length() : m_str.length();
|
||||||
|
}
|
||||||
|
size_t LocalizedText::size() const
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return (m_cachedStr) ? m_cachedStr->size() : m_str.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& LocalizedText::ToString() const
|
||||||
|
{
|
||||||
|
Update();
|
||||||
|
return (m_cachedStr) ? m_cachedStr.value() : m_str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
set_project("NazaraLocalization")
|
||||||
|
|
||||||
|
add_rules("mode.asan", "mode.tsan", "mode.coverage", "mode.debug", "mode.releasedbg", "mode.release")
|
||||||
|
add_rules("plugin.vsxmake.autoupdate")
|
||||||
|
|
||||||
|
add_repositories("nazara-engine-repo https://github.com/NazaraEngine/xmake-repo")
|
||||||
|
add_requires("nazaraengine", { alias = "nazara", debug = is_mode("debug") })
|
||||||
|
add_requires("fmt")
|
||||||
|
|
||||||
|
add_includedirs("include", "src")
|
||||||
|
set_languages("c89", "c++20")
|
||||||
|
set_rundir("./bin/$(plat)_$(arch)_$(mode)")
|
||||||
|
set_targetdir("./bin/$(plat)_$(arch)_$(mode)")
|
||||||
|
|
||||||
|
if has_config("erronwarn") then
|
||||||
|
set_warnings("allextra", "error")
|
||||||
|
else
|
||||||
|
set_warnings("allextra")
|
||||||
|
end
|
||||||
|
|
||||||
|
if is_plat("mingw", "linux") then
|
||||||
|
add_cxflags("-Wno-subobject-linkage")
|
||||||
|
end
|
||||||
|
|
||||||
|
if is_plat("windows") then
|
||||||
|
add_defines("_CRT_SECURE_NO_WARNINGS")
|
||||||
|
add_cxxflags("/bigobj", "/permissive-", "/Zc:__cplusplus", "/Zc:externConstexpr", "/Zc:inline", "/Zc:lambda", "/Zc:preprocessor", "/Zc:referenceBinding", "/Zc:strictStrings", "/Zc:throwingNew")
|
||||||
|
add_cxflags("/w44062") -- Enable warning: switch case not handled
|
||||||
|
add_cxflags("/wd4251") -- Disable warning: class needs to have dll-interface to be used by clients of class blah blah blah
|
||||||
|
add_cxflags("/wd4275") -- Disable warning: DLL-interface class 'class_1' used as base for DLL-interface blah
|
||||||
|
elseif is_plat("mingw") then
|
||||||
|
add_cxflags("-Og", "-Wa,-mbig-obj")
|
||||||
|
add_ldflags("-Wa,-mbig-obj")
|
||||||
|
end
|
||||||
|
|
||||||
|
set_runtimes(is_mode("debug") and "MDd" or "MD")
|
||||||
|
|
||||||
|
if is_mode("asan", "tsan", "ubsan") then
|
||||||
|
set_optimize("none") -- by default xmake will optimize asan builds
|
||||||
|
elseif is_mode("coverage") then
|
||||||
|
if not is_plat("windows") then
|
||||||
|
add_links("gcov")
|
||||||
|
end
|
||||||
|
elseif is_mode("releasedbg") then
|
||||||
|
set_fpmodels("fast")
|
||||||
|
add_vectorexts("sse", "sse2", "sse3", "ssse3")
|
||||||
|
end
|
||||||
|
|
||||||
|
target("NazaraLocalization")
|
||||||
|
add_packages("nazara", {public = true})
|
||||||
|
add_packages("fmt", {public = false})
|
||||||
|
set_kind("$(kind)")
|
||||||
|
set_group("Libraries")
|
||||||
|
add_headerfiles("include/(NazaraLocalization/**.hpp)")
|
||||||
|
add_headerfiles("include/(NazaraLocalization/**.inl)")
|
||||||
|
add_headerfiles("src/NazaraLocalization/**.h", { prefixdir = "private", install = false })
|
||||||
|
add_headerfiles("src/NazaraLocalization/**.hpp", { prefixdir = "private", install = false })
|
||||||
|
add_headerfiles("src/NazaraLocalization/**.inl", { prefixdir = "private", install = false })
|
||||||
|
add_files("src/NazaraLocalization/**.cpp")
|
||||||
|
|
||||||
|
-- for now only shared compilation is supported (except on platforms like wasm)
|
||||||
|
if not is_plat("wasm") then
|
||||||
|
set_kind("shared")
|
||||||
|
else
|
||||||
|
set_kind("static")
|
||||||
|
add_defines("NAZARA_LOCALIZATION_STATIC", { public = true })
|
||||||
|
end
|
||||||
|
|
||||||
|
add_defines("NAZARA_LOCALIZATION_BUILD")
|
||||||
|
if is_mode("debug") then
|
||||||
|
add_defines("NAZARA_LOCALIZATION_DEBUG")
|
||||||
|
end
|
||||||
|
|
||||||
|
includes("examples/xmake.lua")
|
||||||
Loading…
Reference in New Issue