DateTimeFormatInfo.DayNames возвращает дополнительное пустое название дня на Android - PullRequest
1 голос
/ 19 сентября 2019

Я получил следующий список культур, для которых я хочу получить названия дней, на их соответствующем языке

CultureInfo[] newCultures = {new CultureInfo("de-DE"),
                             new CultureInfo("en-US"),
                             new CultureInfo("en-GB"),
                             new CultureInfo("es-ES"),
                             new CultureInfo("fr-FR"),
                             new CultureInfo("nl-NL")};

Я перебираю все их DateTimeFormat.DayNames и распечатываю их

foreach (CultureInfo culture in newCultures)
{
   foreach (string day in culture.DateTimeFormat.DayNames)
   {
       Debug.Log(culture.Name + ": " + day);
   }
   Debug.Log("----------------");
}

При запуске в редакторе в Windows 10 с Unity 2019.1.8f1, эквивалентом среды выполнения Mono .NET 4.x, со сценарием IL2CPP он работает как положено и печатает все названия дней от sun -> sat (включительно)) в консоли.

При сборке под Android все становится запутанным.

При запуске одного и того же кода на Android (протестировано как на Android 7.0, так и на Android 9.0) результаты отличаютсяхотя.

Вместо того, чтобы просто печатать дни солнца -> сб (включительно), он имеет восьмую запись для каждого языка.Это пусто.

en-GB: Sunday
en-GB: Monday
en-GB: Tuesday
en-GB: Wednesday
en-GB: Thursday
en-GB: Friday
en-GB: Saturday
en-GB: <blank>

Я попробовал это на нескольких языках (de-DE, en-US, en-EN, es-ES, fr-FR, nl-NL), и все они произвеливосьмой пустой день.

Однако на этом он не заканчивается.Когда я перебираю CultureInfo.CurrentCulture вместо этого, восьмидневного дня там нет.

foreach (string day in CultureInfo.CurrentCulture.DateTimeFormat.DayNames)
{
   Debug.Log(CultureInfo.CurrentCulture.Name + ": " + day);
}
//Results
//en-GB: Sunday
//en-GB: Monday
//en-GB: Tuesday
//en-GB: Wednesday
//en-GB: Thursday
//en-GB: Friday
//en-GB: Saturday

В качестве альтернативы использованию new CultureInfo Я пробовал использовать CultureInfo.CreateSpecificCulture, но это дало те же результаты, что идополнительный 8-й, пустой день.

CultureInfo[] createCultures = {CultureInfo.CreateSpecificCulture("de-DE"),
                                CultureInfo.CreateSpecificCulture("en-US"),
                                CultureInfo.CreateSpecificCulture("en-GB"),
                                CultureInfo.CreateSpecificCulture("es-ES"),
                                CultureInfo.CreateSpecificCulture("fr-FR"),
                                CultureInfo.CreateSpecificCulture("nl-NL")};

foreach (CultureInfo culture in createCultures)
{
    foreach (string day in culture.DateTimeFormat.DayNames)
    {
        Debug.Log(culture.Name + ": " + day);
    }
    Debug.Log("----------------");
}

это ожидаемое поведение?если так, то почему этот восьмой пустой день?и есть ли способ не включать этот день, не удаляя его потом?

Кажется, это проблема, которая возникает только с Unity в сочетании с Android (или конкретной версией Mono Unity, но яне могу определить, какую именно версию они используют, и думаю, что это измененная версия).


Я создаю новое пустое приложение Xamarin для Android в Visual Studio, у которого не было проблемы (mono version: --version Mono JIT compiler version 5.18.0 (Visual Studio built mono))

MainActivity.cs:

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
    CultureInfo[] newCultures = {new CultureInfo("de-DE"),
                                 new CultureInfo("en-US"),
                                 new CultureInfo("en-GB"),
                                 new CultureInfo("es-ES"),
                                 new CultureInfo("fr-FR"),
                                 new CultureInfo("nl-NL")};

    List<string> results = new List<string>();

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.activity_main);

        TextView text;

        text = FindViewById<TextView>(Resource.Id.textView1);

        foreach (CultureInfo culture in newCultures)
        {
            foreach (string day in culture.DateTimeFormat.DayNames)
            {
                results.Add(culture.Name + ": " + day + "\n");
                text.Text += culture.Name + ": " + day + "\n";
            }
            text.Text += "--------\n";
        }

        //text.Text = results.;

    }
}

Activity_main.axml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:text="Text"
        android:textSize="5sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="25px"
        android:minHeight="25px"
        android:id="@+id/textView1" />
</LinearLayout>

1 Ответ

0 голосов
/ 19 сентября 2019

Похоже, что это ошибка в скриптовой серверной части IL2CPP Unity 2019.x (протестировано на 2019.1.8 и 2019.2.5).Установка сценария backend обратно в Mono устраняет проблему.Я буду делать из этого отчет об ошибке.

Ошибка не ограничивается только Android и буднями.При попытке получить названия месяцев это также будет включать пустую запись в конце, в результате чего год будет иметь 13 месяцев.При использовании месяцев сборки Windows также влияют, как и на CurrentCulture.

Достаточно странно, что в будние дни это не проявляется в Windows или при использовании CurrentCulture.

Сокращенные версии ведут себя так же, как и их не сокращенные версии.

Сделанорепозиторий для витрины здесь

...