Xamarin.forms: يتم عرض الجداول الزمنية المقيدة بتنسيق en-US وليس بالتنسيق المحلي

تم إنشاؤها على ٨ مارس ٢٠١٨  ·  18تعليقات  ·  مصدر: xamarin/Xamarin.Forms

وصف

عند عرض DateTime منضم على عنصر تحكم مثل Label ، فإنه سيعرض دائمًا DateTime بتنسيق en-US. بالنسبة للمستخدمين خارج الولايات المتحدة ، فهذه مشكلة.

تقرير الخطأ الأصلي:
https://bugzilla.xamarin.com/show_bug.cgi؟id=58635

ملاحظات حول المنصات الأخرى
في Silverlight و UWP و WPF ، ترث جميع عناصر التحكم من FrameworkElement و FrameworkElement ، لها خاصية "اللغة". هذا هو ما يدفع تنسيق DateTime على هذه الأنظمة الأساسية. في Silverlight و WPF ، يوجد خطأ حيث لا تكون خاصية اللغة افتراضيًا على اللغة المحلية. لذلك ، بشكل افتراضي ، WPF و Silverlight لهما نفس الخطأ مثل Xamarin Forms. ولكن ، يمكن حل هذا بسطر واحد من التعليمات البرمجية:

        Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);

إليك نموذج تطبيق WPF يوضح هذا:
https://www.dropbox.com/s/2qcacomtsjweb1o/DateTimeWPF.7z؟dl=0

ولكن ، في UWP ، يتم تعيين خاصية اللغة بشكل افتراضي على اللغة المحلية للجهاز. لذلك ، يظهر تحويل DateTime بشكل صحيح في UWP افتراضيًا.

لذلك ، ربما تحتاج نماذج Xamarin إلى خاصية Language ، ويجب أن تكون خاصية Language هذه في الوضع الافتراضي من الإعدادات الإقليمية للجهاز.

خطوات التكاثر

  1. قم بتبديل ثقافة جهازك وتنسيق التاريخ إلى en-AU (يوم / شهر / سنة)
  2. استنساخ هذا الريبو: https: //[email protected]/MelbourneDeveloper/xamarin-forms-scratch.git
  3. قم بتشغيل نموذج UWP أو Android ، وانقر فوق "عرض التاريخ"
  4. لاحظ أنه يتم عرض التاريخ الأول كـ "31/1/2000 12:00:00 ص" (يتم تحويل هذا يدويًا من DateTime إلى سلسلة باستخدام ToString ().
  5. لاحظ أن جميع التواريخ المعروضة الأخرى التي تم تحويلها باستخدام رمز التحويل الأساسي الخاص بـ XF يتم عرضها بتنسيق en-US كـ "01/31/2000 00:00:00"
  6. يعطي Ie ToString () قيمة مختلفة للربط المعروض. الخطأ هو أن الربط لا يستدعي ToString () للتحويل من DateTime إلى سلسلة. إنه يفعل شيئًا مختلفًا وبالتالي لا ينسق التاريخ بشكل صحيح

سلوك متوقع

عندما يتم تحويل DateTime إلى سلسلة ملزمة ، يجب تحويلها باستخدام Vanilla ToString () والتي ستستخدم إعدادات اللغة المحلية للجهاز.

السلوك الفعلي

يتم تحويل DateTimes إلى سلاسل تنسيق USA بغض النظر عن الإعدادات الإقليمية.

معلومات اساسية

  • الإصدار الذي يحتوي على الإصدار: 2.5.0.280555
  • الأطر المستهدفة للمنصة:

    • UWP: 16299

  • إصدار مكتبة دعم Android:
  • حزم نوجيت:
  • الأجهزة المتأثرة:

رابط الاستنساخ

https: //[email protected]/MelbourneDeveloper/xamarin-forms-scratch.git

l10n 9 high in-progress high impact bug

التعليق الأكثر فائدة

يبدو أن هذا الخطأ موجود منذ فترة طويلة. أعتقد أن دعم لغات متعددة هو وظيفة أساسية للعديد من التطبيقات. تحتاج حاليًا إلى بعض الحلول لإنجاز هذا. أحب استخدام Xamarin.Forms وسيكون رائعًا إذا تم إصلاح هذا الخطأ قريبًا.

شكرًا لك فريق Xamarin على عملك الرائع!

تحياتي الحارة

ال 18 كومينتر

أنا سعيد لأن هذا أخيرًا يتم النظر فيه. تم تسجيله في 8 سبتمبر 2017. تم إعادة إنتاجه في الأصل بواسطة شخص Xamarin في اليوم التالي. يؤثر هذا على جميع مستخدمي Xamarin Forms خارج الولايات المتحدة ، ومستخدمي Xamarin Forms الذين ليس لديهم عملاء من الولايات المتحدة الأمريكية.

rmarinho # 2434 قد يكون خداعًا لهذا ، وقد لا يكون كذلك. في كلتا الحالتين ، نحتاج إلى إصلاح هذه المشكلة لأنها مشكلة واسعة الانتشار. يسعدني تقديم PR إذا كان بإمكان شخص ما إعطاء القليل من التوجيه حول مكان معالجته.

فقط قرع الجرس مرة أخرى بشأن هذه المشكلة ، إنه شيء نتقاتل معه يوميًا في تطبيق متعدد اللغات. إنه جاهز للعمل ، وهناك أشخاص على استعداد للمساعدة وتقديم العلاقات العامة ولكننا ما زلنا ننتظر التوجيه حول الطريقة التي ترغب في حلها.

أرى مشكلة مماثلة عند تطبيق StringFormat على إدخال - انظر وصفي التفصيلي في منتدى Xamarin.Forms هنا . لا يتعلق الأمر بالثقافات ، ولكنه _ يرتبط بكيفية تعامل الإدخال مع التنسيق.

أعتقد أن مشكلتي مختلفة بمهارة عن المشكلة الموضحة في هذه المشكلة - ولكنها مرتبطة. هل يستحق إضافة عدد جديد أو إضافة المزيد من التفاصيل هنا؟

يبدو أن هذا الخطأ موجود منذ فترة طويلة. أعتقد أن دعم لغات متعددة هو وظيفة أساسية للعديد من التطبيقات. تحتاج حاليًا إلى بعض الحلول لإنجاز هذا. أحب استخدام Xamarin.Forms وسيكون رائعًا إذا تم إصلاح هذا الخطأ قريبًا.

شكرًا لك فريق Xamarin على عملك الرائع!

تحياتي الحارة

لقد قمت بتحديث عنوان الريبو في حال واجه أي شخص مشكلة في إعادة إنشاء المشكلة.

أعتقد أن دعم لغات متعددة هو وظيفة أساسية للعديد من التطبيقات.

متفق عليه! إذا نظرت إلى العلاقات العامة التي فتحناها لتحسين هذا (# 3700) ، فسترى أننا نكافح من أجل القيام بذلك بأفضل طريقة ممكنة بحيث تتجنب كسر عدد كبير من التطبيقات. نحن منفتحون على الاقتراحات! شكر!

تضمين التغريدة

ستخصص أموالي لتنفيذ خاصية Language حتى أتمكن من الاشتراك في لغة معينة. بعد ذلك ، سيعتمد الربط على خاصية اللغة إذا تم تعيينها. وهذا يعني أن سطرًا واحدًا من التعليمات البرمجية يمكنه تحويل التطبيق إلى الإعدادات الإقليمية الحالية للمستخدم ، ولكن ليس بالضرورة تغيير أي وظائف موجودة في التطبيقات الحالية. هذه هي الطريقة التي يتم بها ذلك على منصات XAML الأخرى. أعتقد أن هذه المنصات لديها مشكلة مماثلة للتعامل معها واستخدام هذا النمط سيجعل Xamarin.Forms أكثر توافقًا مع هذه التقنيات.

أعتقد أن دعم لغات متعددة هو وظيفة أساسية للعديد من التطبيقات.

متفق عليه! إذا نظرت إلى العلاقات العامة التي فتحناها لتحسين هذا (# 3700) ، فسترى أننا نكافح من أجل القيام بذلك بأفضل طريقة ممكنة بحيث تتجنب كسر عدد كبير من التطبيقات. نحن منفتحون على الاقتراحات! شكر!

بلدي 0.2 دولار هو أن هناك بالفعل في .NET وظيفة مصممة للتعامل مع التنسيق والتحليل: CultureInfo.CurrentCulture

إذا قمت من تنسيق رمز DateTime إلى سلسلة باستخدام DateTime.Now.ToString () ، فسيتم تلقائيًا استخدام CultureInfo.CurrentCulture لتنسيقه. نفس الشيء مع تحليل سلسلة في DateTime باستخدام DateTime. يتم استخدام CurrentCulture.
لماذا لا يجب أن ينتج عن تحويل Binding (التنسيق) لـ DateTime -> سلسلة نفس النتيجة عندما تفعل ذلك في ViewModel الخاص بك؟ يفاجأ المطور العادي ويحير عندما يعرض نتائج مختلفة. وقم بإجراء بحث بسيط على google لمعرفة عدد الاختلافات والحلول الموجودة كحلول لهذا السلوك ، والتي يمكن التعامل معها بسهولة بواسطة إطار العمل.

في الوقت الحالي ، هناك فوضى حيث تستخدم لوحات المفاتيح التي تظهر على الشاشة إعداد الجهاز للمنطقة ، ولكن سلاسل تحليل / تنسيق الكود .NET تستخدم لغة / ثقافة العرض. في حالة واجهة المستخدم الإنجليزية والمنطقة السويدية ، فأنت تكتب الأرقام باستخدام "،" (فاصلة) كفاصل عشري ، ويحاول .NET تحليلها باستخدام "." (نقطة) كفاصل عشري.

لربط الأطراف السائبة ، يجب على نماذج Xamarin إنشاء CultureInfo مخصصة بناءً على الإعدادات على كل منصة / جهاز (على سبيل المثال على نظام iOS باستخدام إعدادات المنطقة) ، وتعيينها افتراضيًا لـ CultureInfo.CurrentCulture ، لذلك نحن ، كل مطور ، لا ' ر مضطر لمحاولة القيام بذلك.

بصفتك مطور WPF ، شعرت بالحيرة عندما لا يلتزم الربط بما وصفته أعلاه (وأنا أعتبره خطأ) ولكن من السهل حله مع WPF باستخدام
this.Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag); .

لا تدعوني أبدأ بـ UWP ، حيث يبدو أنهم نسوا أن الناس يريدون فعلاً أن تكون لهم منطقة / تنسيق مختلف عن لغة العرض (مثلما يريد جزء كبير من العالم) .

لقد صادفت نفس المشكلة عند ربط إدخال بخاصية رقمية. بل والأسوأ من ذلك أن السلوك يختلف بين الأنواع:

CurrentCulture = دي دي

الربط من النموذج إلى واجهة المستخدم:
ينتج عن ربط الخاصية العشرية "10.41" (الثقافة الحالية لم يتم احترامها)
ينتج عن ربط خاصية الطفو "10.41"
ينتج عن ربط الخاصية المزدوجة "10.41" (الثقافة الحالية غير محترمة)

، على سبيل المثال ، يتم ربط الخصائص الطافية فقط بالثقافة الصحيحة

الربط من واجهة المستخدم إلى النموذج:
فقط "." يتم التعرف عليه كفاصل صالح بغض النظر عن نوع البيانات والثقافة.

كخطوة أولى ، يرجى على الأقل توحيد السلوك لجميع أنواع البيانات.
كخطوة ثانية ، يرجى إضافة حل عملي للمطورين لربط القيم الرقمية بشكل صحيح وفقًا للثقافة الحالية وجعل لوحات المفاتيح الرقمية على الشاشة متوافقة مع الثقافة الحالية ...

كيف يمكن أن يصل إطار العمل إلى هذه النقطة ، الإصدار 4.4 ، مع استمرار عمل الكسور العشرية في الولايات المتحدة فقط؟
أواجه هذه المشكلة أيضًا ويجب أن أعمل مع سلسلة إلى عشري ومن عشري إلى سلسلة مع جميع خصائصي العشرية .....

أي أخبار عن هذا؟

لا تزال المشكلة قابلة للتكرار في أحدث إصدار Xamarin.Forms.
حتى الآن الحل هو إنشاء محول IValueConverter للتعامل مع هذا.

أي معلومات متى سيتم إصلاح هذا؟

يجب أن يكون ربط التاريخ والوقت بالتسمية التي تتوقع سلسلة نصية خطأ نوع ، ما لم يقدم المستخدم صراحةً وظيفة.

ظهرت هذه المشكلة عند الترحيل من Xamarin.Forms 3.6.0.344457 إلى 4.4.0.991757.

في حالتنا ، لدينا إدخال مخصص ، حيث نستبدل الفاصلة بنقطة ، بحيث عندما ينقر المستخدم على فاصلة على لوحة المفاتيح الناعمة ، يتم استبدالها بنقطة.

أعلم أن حلًا غريبًا ، لكنه كان يعمل في 3.6.0.344457 ، لكنه لا يعمل في 4.4.0.99175. ما الذي تغير؟ بالنظر إلى محفوظات المشكلات ، يمكنني رؤية بعض الأعمال التي تم إجراؤها في الإصدار 3.6.0. يبدو أنه خطأ انحدار.

لا يبدو أن هذه المشكلة قد شهدت أي نشاط منذ وقت طويل. نحن نعمل على تحديد أولويات المشكلات وحلها بأسرع ما يمكن. لمساعدتنا في الوصول إلى القائمة ، نقدر الحصول على تحديث منك لإعلامنا إذا كان هذا لا يزال يؤثر عليك في أحدث إصدار من Xamarin. النماذج ، نظرًا لأنه من الممكن أن نكون قد حللنا هذا كجزء من آخر ذي صلة أو مكرر القضية. إذا لم نشاهد أي نشاط جديد بشأن هذه المشكلة خلال الثلاثين يومًا القادمة ، فسنقوم بتقييم ما إذا كان يجب إغلاق هذه المشكلة. شكرا لك!

نعم ، لا يزال يؤثر على أحدث إصدار 4.8.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات