自分のアプリで特定の言語でのみ起動できないバグがあった
自分のアプリで特定の言語でのみ起動できないバグがあった。
具体的にはタイ語の人だった。
最初自分の手元では再現せず全然原因が分からなかったが、自分のスマホの言語設定をタイ語にして試してみたら再現した。
2021/09/08 10:51:10.871 13160 13341 Error Unity ArgumentOutOfRangeException: Not a valid calendar for the given culture. 2021/09/08 10:51:10.871 13160 13341 Error Unity Parameter name: value 2021/09/08 10:51:10.871 13160 13341 Error Unity at System.Globalization.DateTimeFormatInfo.set_Calendar (System.Globalization.Calendar value) [0x00000] in <00000000000000000000000000000000>:0 2021/09/08 10:51:10.871 13160 13341 Error Unity at System.Globalization.CultureInfo.get_DateTimeFormat () [0x00000] in <00000000000000000000000000000000>:0 2021/09/08 10:51:10.871 13160 13341 Error Unity at System.Globalization.CultureInfo.GetFormat (System.Type formatType) [0x00000] in <00000000000000000000000000000000>:0 2021/09/08 10:51:10.871 13160 13341 Error Unity at System.Globalization.DateTimeFormatInfo.get_CurrentInfo () [0x00000] in <00000000000000000000000000000000>:0 2021/09/08 10:51:10.871 13160 13341 Error Unity at System.DateTime.ToString () [0x00000] in <00000000000000000000000000000000>:0
というようなエラー。DateTimeをToString()するときに出ていたようだ。
今までもTryParseで死ぬことはあったが、ToString()でもあかんとは知らなかった。
とりあえずテキトーなCultureInfoを作ってToString()の引数に渡すことで回避できました。
static public readonly System.Globalization.CultureInfo StandardCulture = new System.Globalization.CultureInfo("en-US");
Data.SaveDateTimeString = DateTime.UtcNow.ToString(@"yyyy/MM/dd HH:mm:ss ddd", StandardCulture);
P.S
以下のような解決方法もあるらしい。ライブラリの中身で死ぬこともあるから、こちらのほうが対応としては良さそう。バイナリサイズもほとんど増えなかった。
issuetracker.unity3d.com
link.xmlに以下を記述して、Assets以下に置いておくだけ。
<linker> <assembly fullname="mscorlib"> <namespace fullname="System.Globalization" preserve="all"/> </assembly> </linker>