Saya pikir ini adalah bug yang menarik dan halus perilaku yang tidak hanya sulit untuk dilacak tetapi juga sulit untuk dijabarkan. Saya tidak yakin 'salah siapa.'
Berikut ceritanya. Jangan ragu untuk mengikuti dan melihat apa yang Anda dapatkan.
Saya menjalankan Ubuntu 18.04 di bawah WSL.
Saya membuat aplikasi konsol menggunakan .NET Core 3.0. Anda dapat menginstal .NET Core di sini http://dot.net/get-core3
Saya melakukan ini:
dotnet new console
dotnet add package Humanizer --version 2.6.2
Kemudian buat Program.cs menjadi seperti ini. Humanizer adalah .NET Standard library yang hebat yang akan Anda pelajari dan pikirkan "mengapa .NET tidak selalu memiliki ini!?"
using System;
using Humanizer;
namespace dotnetlocaletest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(3501.ToWords());
}
}
}
Anda dapat melihat bahwa saya ingin aplikasi mencetak angka 3051 sebagai kata-kata. Agaknya dalam bahasa Inggris, karena itu bahasa utama saya, tetapi Anda akan perhatikan bahwa saya belum menunjukkannya di sini. Mari kita jalankan.
Perhatikan bahwa aplikasi ini berfungsi dengan baik dan seperti yang diharapkan di Windows.
scott@IRONHEART:~/dotnetlocaletest$ dotnet run
3501
Hah. Itu bahkan tidak mencoba. Itu aneh.
Mesin Windows saya adalah en-us (Bahasa Inggris di AS) tetapi apa mesin Ubuntu saya?
scott@IRONHEART:~/dotnetlocaletest$ locale
LANG=C.UTF-8
LANGUAGE=
Sepertinya tidak apa-apa. Ini "C.UTF-8" dan bukan apa-apa. C dalam konteks ini berarti lokasi default POSIX. Itu yang paling dasar. C.UTF-8 jelas TIDAK sama dengan en_US.utf8. Ini semacam lokasi, tapi itu bukan tempat.
Bagaimana jika saya memberi tahu .NET secara eksplisit di mana saya berada?
static void Main(string[] args)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
Console.WriteLine(3501.ToWords());
}
Dan menjalankannya.
scott@IRONHEART:~/dotnetlocaletest$ dotnet run
three thousand five hundred and one
Oke, jadi semuanya berfungsi dengan baik jika aplikasi menyatakan "hei saya en-US!" dan Humanizer bekerja dengan baik.
Apa yang salah? Sepertinya "C.UTF-8" Ubuntu tidak cukup "invarian" untuk menyebabkan Humanizer kembali ke default bahasa Inggris?
Sepertinya orang lain telah melihat masalah yang tidak biasa atau halus dengan penginstalan Ubuntu yang menggunakan C.UTF-8 versus lokal yang lebih spesifik seperti en-US.UTF8.
Saya bisa memperbaiki ini dalam beberapa cara. Saya dapat mengatur lokal secara khusus di Ubuntu:
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8
Untungnya Humanizer 2.7.2 dan di atasnya telah memperbaiki masalah ini dan kembali dengan benar. "Bug" siapa itu? Yang sulit tetapi dalam kasus ini, Humanizer memiliki beberapa logika mundur yang cacat. Saya memperbarui ke 2.7.2 dan sekarang C.UTF-8 kembali ke bahasa Inggris yang netral.
Yang mengatakan, saya pikir dapat dikatakan bahwa WSL/Canonical/Ubuntu harus mendeteksi bahasa lokal saya dan/atau menyetel lokal ke sana saat instalasi.
Pelajarannya di sini adalah bahwa aplikasi Anda - terutama yang diharapkan bekerja di banyak lokal dalam berbagai bahasa - mengambil "input" dari banyak tempat berbeda. Dengan frasa yang berbeda, tidak semua masukan berasal dari pengguna.
Lokal dan bahasa sistem, waktu, zona waktu, tanggal, semuanya dimasukkan sebagai konteks sekitar untuk aplikasi Anda. Pastikan Anda menegaskan asumsi Anda tentang apa itu "default". Dalam hal ini, aplikasi kecil saya bekerja dengan baik di en-US tetapi tidak pada "C.UTF-8." Saya dapat menjelajahi perilaku dan mengetahui bahwa ada solusi lokal (saya dapat mendeteksi dan menyetel lokal default jika diperlukan) dan juga ada perbaikan pustaka yang tersedia.
Tegaskan asumsi Anda!
Sponsor: Menderita karena kurangnya kejelasan seputar bug perangkat lunak? Berikan pelanggan Anda pengalaman yang pantas dan diharapkan dengan pemantauan kesalahan dari Raygun.com. Instal dalam hitungan menit, coba hari ini!