This is an undocumented API used by some programs to fetch the user's selected languages.
Example is Fusion360 (during its login process).
Signature currently taken from here: https://stackoverflow.com/questions/63877075/what-is-the-right-way-to-get-th... (Maybe that stackoverflow answer is also why Fusion has implemented this...) And I haven't found a way yet to retrieve a result that is not static.
-- v5: bcp47langs: Implement GetUserLanguages
From: Marius Schiffer marius@mschiffer.de
Implement an undocumented API used by some programs to fetch the user's selected languages. Returns only english as the language.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=56915 --- configure.ac | 1 + dlls/bcp47langs/Makefile.in | 4 ++++ dlls/bcp47langs/bcp47langs.spec | 2 +- dlls/bcp47langs/main.c | 13 +++++++++++ dlls/bcp47langs/tests/Makefile.in | 6 +++++ dlls/bcp47langs/tests/bcp47langs.c | 17 +++++++++++++++ include/Makefile.in | 1 + include/bcp47langs.h | 35 ++++++++++++++++++++++++++++++ 8 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 dlls/bcp47langs/main.c create mode 100644 dlls/bcp47langs/tests/Makefile.in create mode 100644 dlls/bcp47langs/tests/bcp47langs.c create mode 100644 include/bcp47langs.h
diff --git a/configure.ac b/configure.ac index 23d3f8fbc49..70b607c7427 100644 --- a/configure.ac +++ b/configure.ac @@ -2461,6 +2461,7 @@ WINE_CONFIG_MAKEFILE(dlls/avifil32/tests) WINE_CONFIG_MAKEFILE(dlls/avifile.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/avrt) WINE_CONFIG_MAKEFILE(dlls/bcp47langs) +WINE_CONFIG_MAKEFILE(dlls/bcp47langs/tests) WINE_CONFIG_MAKEFILE(dlls/bcrypt) WINE_CONFIG_MAKEFILE(dlls/bcrypt/tests) WINE_CONFIG_MAKEFILE(dlls/bcryptprimitives) diff --git a/dlls/bcp47langs/Makefile.in b/dlls/bcp47langs/Makefile.in index 5eb4caaf0e7..dfe10916951 100644 --- a/dlls/bcp47langs/Makefile.in +++ b/dlls/bcp47langs/Makefile.in @@ -1,2 +1,6 @@ MODULE = bcp47langs.dll IMPORTLIB = bcp47langs +IMPORTS = combase + +SOURCES = \ + main.c diff --git a/dlls/bcp47langs/bcp47langs.spec b/dlls/bcp47langs/bcp47langs.spec index a054c1486a9..969f77b56b8 100644 --- a/dlls/bcp47langs/bcp47langs.spec +++ b/dlls/bcp47langs/bcp47langs.spec @@ -48,7 +48,7 @@ @ stub GetUserDisplayLanguageOverride @ stub GetUserLanguageInputMethods @ stub GetUserLanguageInputMethodsForUser -@ stub GetUserLanguages +@ stdcall GetUserLanguages(long ptr) @ stub GetUserLanguagesForAllUsers @ stub GetUserLanguagesForUser @ stub GetUserLocaleFromLanguageProfileOptOut diff --git a/dlls/bcp47langs/main.c b/dlls/bcp47langs/main.c new file mode 100644 index 00000000000..73c5af72f4e --- /dev/null +++ b/dlls/bcp47langs/main.c @@ -0,0 +1,13 @@ +#include <hstring.h> +#include <winstring.h> + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(bcp47langs); + +DWORD WINAPI GetUserLanguages(char delimiter, HSTRING* user_languages) { + static const WCHAR *languages = L"en-us"; + FIXME("stub, only returning en-us\n"); + WindowsCreateString(languages, wcslen(languages), user_languages); + return 0; +} diff --git a/dlls/bcp47langs/tests/Makefile.in b/dlls/bcp47langs/tests/Makefile.in new file mode 100644 index 00000000000..0d8861089f7 --- /dev/null +++ b/dlls/bcp47langs/tests/Makefile.in @@ -0,0 +1,6 @@ +TESTDLL = bcp47langs.dll +IMPORTS = bcp47langs msvcrt + +SOURCES = \ + bcp47langs.c + diff --git a/dlls/bcp47langs/tests/bcp47langs.c b/dlls/bcp47langs/tests/bcp47langs.c new file mode 100644 index 00000000000..0fad763cfc1 --- /dev/null +++ b/dlls/bcp47langs/tests/bcp47langs.c @@ -0,0 +1,17 @@ +#include <wine/test.h> +#include <winbase.h> + +#include "winstring.h" +#include "msvcrt/locale.h" +#include "bcp47langs.h" + +START_TEST(paths) +{ + HSTRING result; + const WCHAR *user_languages; + + setlocale(LC_ALL, "enu"); + ok( GetUserLanguages(',', &result) == 0, "unknown return code\n" ); + user_languages = WindowsGetStringRawBuffer(result, NULL); + ok( !lstrcmpW(user_languages, L"en-us"), "Language is not set to english\n" ); +} diff --git a/include/Makefile.in b/include/Makefile.in index bbf28cfc87e..09259692949 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -45,6 +45,7 @@ SOURCES = \ axextendenums.h \ basetsd.h \ basetyps.h \ + bcp47langs.h \ bcrypt.h \ bdaiface.idl \ bdaiface_enums.h \ diff --git a/include/bcp47langs.h b/include/bcp47langs.h new file mode 100644 index 00000000000..86867c4f73a --- /dev/null +++ b/include/bcp47langs.h @@ -0,0 +1,35 @@ +/* + * bcp47langs definitions + * + * Copyright 2024 Marius Schiffer + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#ifndef _BCP47LANGS_ +#define _BCP47LANGS_ + +#ifdef __cplusplus +extern "C" { +#endif + +DWORD WINAPI GetUserLanguages(char delimiter, HSTRING* user_languages); + +#ifdef __cplusplus +} +#endif + +#endif /*_BCP47LANGS__*/
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=147281
Your paranoid android.
=== build (build log) ===
/home/winetest/tools/testbot/var/wine-exe32/../wine/dlls/bcp47langs/tests/bcp47langs.c:15: undefined reference to `WindowsGetStringRawBuffer@8' /home/winetest/tools/testbot/var/wine-exe32/../wine/include/wine/test.h:765: undefined reference to `func_bcp47langs' /usr/bin/i686-w64-mingw32-ld: dlls/bcp47langs/tests/i386-windows/testlist.o:testlist.c:(.rdata+0x3fc): undefined reference to `func_bcp47langs' collect2: error: ld returned 1 exit status Task: The exe32 Wine build failed
=== debian11 (build log) ===
/home/winetest/tools/testbot/var/wine-win32/../wine/dlls/bcp47langs/tests/bcp47langs.c:15: undefined reference to `WindowsGetStringRawBuffer@8' /home/winetest/tools/testbot/var/wine-win32/../wine/include/wine/test.h:765: undefined reference to `func_bcp47langs' /usr/bin/i686-w64-mingw32-ld: dlls/bcp47langs/tests/i386-windows/testlist.o:testlist.c:(.rdata+0x3fc): undefined reference to `func_bcp47langs' collect2: error: ld returned 1 exit status Task: The win32 Wine build failed
=== debian11b (build log) ===
/home/winetest/tools/testbot/var/wine-wow64/../wine/dlls/bcp47langs/tests/bcp47langs.c:15: undefined reference to `WindowsGetStringRawBuffer' /home/winetest/tools/testbot/var/wine-wow64/../wine/include/wine/test.h:765: undefined reference to `func_bcp47langs' /usr/bin/x86_64-w64-mingw32-ld: dlls/bcp47langs/tests/x86_64-windows/testlist.o:testlist.c:(.rdata+0x428): undefined reference to `func_bcp47langs' collect2: error: ld returned 1 exit status Task: The wow64 Wine build failed