Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

System.Globalization.RegionInfo.CurrentRegion returns blank values on Maui #110704

Open
mmiller-d8 opened this issue Dec 13, 2024 · 11 comments
Open
Assignees
Milestone

Comments

@mmiller-d8
Copy link

mmiller-d8 commented Dec 13, 2024

Description

System.Globalization.RegionInfo.CurrentRegion returns a default RegionInfo object. This worked before upgrading to .net 9.

Currently, I've only tested this on iOS.

Another thing that is broken with .net 9 is my ability to compile for Android at all. There is a discrepancy with the SDK version, but that's a different issue.

This is kind of a big deal. I would assume it breaks globalization? It does certainly break the ability to show the correct currency symbol in my app. It also makes it impossible for me to get the correct pricing to display to the user.

Steps to Reproduce

  1. Create a new iOS app. Or use an existing one.
  2. Assign System.Globalization.RegionInfo.CurrentRegion to a variable.
  3. Set a breakpoint
  4. Look at the value. It's all blanks and the currency symbol is something I don't recognize.

Link to public reproduction project repository

No response

Version with bug

9.0.0 GA

Is this a regression from previous behavior?

Yes, this used to work in .NET MAUI

Last version that worked well

8.0.100 SR10

Affected platforms

I was not able test on other platforms

Affected platform versions

iOS 17.2 is the only one I've tested it on.

Did you find any workaround?

I did not.

Relevant log output

@PureWeen PureWeen transferred this issue from dotnet/maui Dec 13, 2024
@dotnet-policy-service dotnet-policy-service bot added the untriaged New issue has not been triaged by the area owner label Dec 13, 2024
Copy link
Contributor

Tagging subscribers to this area: @dotnet/area-system-globalization
See info in area-owners.md if you want to be subscribed.

@tarekgh tarekgh added the os-ios Apple iOS label Dec 13, 2024
Copy link
Contributor

Tagging subscribers to 'os-ios': @vitek-karas, @kotlarmilos, @ivanpovazan, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@tarekgh
Copy link
Member

tarekgh commented Dec 13, 2024

@matouskozak could you please have a look at this one too? Thanks!

This is most likely related to the issue that the CurrentCulture is returning en no region is associated to it.

@matouskozak
Copy link
Member

matouskozak commented Dec 14, 2024

@matouskozak could you please have a look at this one too? Thanks!

This is most likely related to the issue that the CurrentCulture is returning en no region is associated to it.

I think you're right.

@mmiller-d8 Thank you for reporting the issue, a temporary workaround for you could be to set the CurrentCulture for your app using NSLocale (note: this only works on iOS). I'll try to fix this issue soon, but it will take some time until the fix makes it into servicing releases.

@mmiller-d8
Copy link
Author

@matouskozak I'm seeing that it also doesn't work to create a CultureInfo object with the name. It creates it, but it doesn't have the correct information - so trying to use that to write a formatted currency string doesn't work. You get the same weird currency symbol no matter what.

@matouskozak
Copy link
Member

@matouskozak I'm seeing that it also doesn't work to create a CultureInfo object with the name. It creates it, but it doesn't have the correct information - so trying to use that to write a formatted currency string doesn't work. You get the same weird currency symbol no matter what.

Could you please share what code did you use and what results are you expecting? Thank you.

@mmiller-d8
Copy link
Author

mmiller-d8 commented Feb 20, 2025

@matouskozak

Well, I know there are some things I'm fundamentally misunderstanding. What I want to do is request a price from the server in the user's currency. Then I need to display that currency based on the culture settings. The trouble is that neither of these work:

var formattedAmount = amount.ToString("C");

or

var culture = CultureInfo.CurrentCulture;
var formattedAmount = amount.ToString("C", culture);

Neither of these produce the correct currency symbol ($123.45). Both of them use a currency symbol that I don't recognize. Interestingly, there is nothing that I can see in CurrentCulture that makes it look invalid. However, this does work:

var culture = new CultureInfo("en-US");
var formattedAmount = amount.ToString("C", culture);

This one uses the correct symbol.

And, of course, this still does not work:

var region = RegionInfo.CurrentRegion;

So... As I was messing with this, I did find an imperfect workaround. I think.

public static RegionInfo GetCurrentRegionOrDefault()
{
    var systemRegion = RegionInfo.CurrentRegion;
    if (systemRegion != null && !string.IsNullOrEmpty(systemRegion.ThreeLetterISORegionName))
        return systemRegion;

    return new RegionInfo(TwoLetterISORegionNames.UnitedStates);
}

public static string GetFormattedCurrencyString(decimal amount)
{
    var region = GetCurrentRegionOrDefault();
    var culture = CultureInfo.CurrentCulture;

    var cultureString = $"{culture.TwoLetterISOLanguageName.ToLower()}-{region.TwoLetterISORegionName.ToUpper()}";
    var cultureInfo = new CultureInfo(cultureString);

    return amount.ToString("C", cultureInfo);
}

What I'm really not sure about is if RegionInfo.CurrentRegion returns the physical location of the device or if it is based on system settings. I assume it's based on system settings, but I don't actually know that.

@matouskozak
Copy link
Member

matouskozak commented Feb 20, 2025

RegionInfo.CurrentRegion

It should be based on the system settings.

I think that for iOS, you could use NSLocale.CountryCode https://learn.microsoft.com/en-us/dotnet/api/foundation.nslocale.countrycode?view=xamarin-ios-sdk-12 that would get you the device country code which you could use instead of GetCurrentRegionOrDefault.

Note, the issue should be fixed in next servicing .NET 9.0.3 release (should get release in ~ March).

@mmiller-d8
Copy link
Author

mmiller-d8 commented Feb 21, 2025

Thank you for the update and the tip, @matouskozak

@stephenquan
Copy link

stephenquan commented Feb 26, 2025

I am observing a variation to this issue where this bug appears on .NET MAUI 9 (tested 9.0.40) and Mac Catalyst and iOS implementations of CultureInfo whereby the country/region is dropped from CultureInfo.InstalledUICulture, CultureInfo.CurrentUICulture and CultureInfo.CurrentCulture

Language Windows/Android Mac/iOS (.NET 8) Mac/iOS (.NET 9)
English (United States) en-US en-US en
English (United Kingdom) en-GB en-GB en
Chinese (Simplified, China) zh-CN zh-Hans-CN zh
Chinese (Traditional, Taiwan) zh-TW zh-Hant-TW zh

The impact is already noticeable in severe localization regression:

  • We are no longer able to differentiate between the Chinese variants
  • We no longer have access to currency, numeric and date/time formats
  • We aren't loading appropriate localization files for different countries (i.e. China and Taiwan need to use different translation resources)

I totally agree with@mmiller-d8 assessment:

This is kind of a big deal.

Link to public reproduction project repository
https://github.com/stephenquan/MauiCultureInfoTest

@matouskozak
Copy link
Member

matouskozak commented Feb 26, 2025

Thank you @stephenquan for the feedback. As mentioned in #110704 (comment), the fix will be part of the next 9.0.3 .NET runtime servicing release. In the meantime, if you need, you can use the workaround with NSLocale APIs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants