diff --git a/src/modules/system/System.h b/src/modules/system/System.h index 7b2e6c7b5..8a40f59e9 100644 --- a/src/modules/system/System.h +++ b/src/modules/system/System.h @@ -114,6 +114,19 @@ public: **/ bool hasBackgroundMusic() const; + /** + * Gets the list of locales in order of user preference. + * + * The returned string from this function has format of + * xx_YY where 'xx' is ISO-639 language code and 'YY' is + * the ISO-3166 country code if available. If country + * code is unavailable, then it simply returns the language. + * + * @return List user preferred locales or empty if the current + * platform does not support this function. + */ + virtual std::vector getPreferredLocales() const = 0; + static bool getConstant(const char *in, PowerState &out); static bool getConstant(PowerState in, const char *&out); diff --git a/src/modules/system/sdl/System.cpp b/src/modules/system/sdl/System.cpp index acfaf316b..623289c04 100644 --- a/src/modules/system/sdl/System.cpp +++ b/src/modules/system/sdl/System.cpp @@ -25,6 +25,8 @@ // SDL #include #include +#include +#include namespace love { @@ -88,6 +90,30 @@ love::system::System::PowerState System::getPowerInfo(int &seconds, int &percent powerStates.find(sdlstate, state); return state; +} + +std::vector System::getPreferredLocales() const +{ + std::vector result; + +#if SDL_VERSION_ATLEAST(2, 0, 14) + SDL_Locale *locales = SDL_GetPreferredLocales(); + + if (locales) + { + for (SDL_Locale* locale = locales; locale->language != nullptr; locale++) + { + if (locale->country) + result.push_back(std::string(locale->language) + "_" + std::string(locale->country)); + else + result.push_back(locale->language); + } + + SDL_free(locales); + } +#endif + + return result; } EnumMap::Entry System::powerEntries[] = diff --git a/src/modules/system/sdl/System.h b/src/modules/system/sdl/System.h index 3f74b085c..0f0258dd4 100644 --- a/src/modules/system/sdl/System.h +++ b/src/modules/system/sdl/System.h @@ -51,6 +51,7 @@ public: std::string getClipboardText() const; PowerState getPowerInfo(int &seconds, int &percent) const; + std::vector getPreferredLocales() const override; private: diff --git a/src/modules/system/wrap_System.cpp b/src/modules/system/wrap_System.cpp index ac4df081b..d7d3209bd 100644 --- a/src/modules/system/wrap_System.cpp +++ b/src/modules/system/wrap_System.cpp @@ -101,6 +101,22 @@ int w_hasBackgroundMusic(lua_State *L) return 1; } +int w_getPreferredLocales(lua_State* L) +{ + int i = 1; + std::vector locales = instance()->getPreferredLocales(); + + lua_createtable(L, locales.size(), 0); + + for (const std::string& str: locales) + { + luax_pushstring(L, str); + lua_rawseti(L, -2, i++); + } + + return 1; +} + static const luaL_Reg functions[] = { { "getOS", w_getOS }, @@ -111,6 +127,7 @@ static const luaL_Reg functions[] = { "openURL", w_openURL }, { "vibrate", w_vibrate }, { "hasBackgroundMusic", w_hasBackgroundMusic }, + { "getPreferredLocales", w_getPreferredLocales }, { 0, 0 } };