تتحمّل ملفات خريطة أحرف المفاتيح (ملفات .kcm
) مسؤولية ربط مجموعات
رموز مفاتيح Android بالمعدِّلات مع أحرف Unicode.
تكون ملفات تخطيط المفاتيح الخاصة بالجهاز مطلوبة لجميع devices أجهزة الإدخال الداخلية (المضمّنة) التي تحتوي على مفاتيح، وذلك فقط لإعلام النظام بأنّ الجهاز مخصّص لأغراض خاصة فقط (وليس لوحة مفاتيح كاملة).
إنّ ملفات تخطيط المفاتيح الخاصة بالجهاز اختيارية للوحات المفاتيح الخارجية، وغالباً ما لا تكون مطلوبة على الإطلاق. يقدّم النظام خريطة عامة لشخصيات المفاتيح التي تتوافق مع العديد من لوحات المفاتيح الخارجية.
إذا لم يتوفّر ملف تنسيق مفاتيح خاص بالجهاز، سيختار النظام إعدادًا تلقائيًا بدلاً من ذلك.
الموقع الجغرافي
يتم العثور على ملفات خريطة أحرف المفاتيح حسب معرّف مورد USB أو المنتج (والإصدار اختياريًا) أو حسب اسم جهاز الإدخال.
يتم الرجوع إلى المسارات التالية بالترتيب.
/odm/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/vendor/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/data/system/devices/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm
/odm/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
/vendor/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
/system/usr/keychars/Vendor_XXXX_Product_XXXX.kcm
/data/system/devices/keychars/Vendor_XXXX_Product_XXXX.kcm
/odm/usr/keychars/DEVICE_NAME.kcm
/vendor/usr/keychars/DEVICE_NAME.kcm
/system/usr/keychars/DEVICE_NAME.kcm
/data/system/devices/keychars/DEVICE_NAME.kcm
/odm/usr/keychars/Generic.kcm
/vendor/usr/keychars/Generic.kcm
/system/usr/keychars/Generic.kcm
/data/system/devices/keychars/Generic.kcm
/odm/usr/keychars/Virtual.kcm
/vendor/usr/keychars/Virtual.kcm
/system/usr/keychars/Virtual.kcm
/data/system/devices/keychars/Virtual.kcm
عند إنشاء مسار ملف يحتوي على اسم الجهاز، يتم استبدال جميع الأحرف في اسم الجهاز بحرف "_" باستثناء الأحرف من "0" إلى "9" أو من "a" إلى "z" أو من "A" إلى "Z" أو "-" أو "_".
ملف خريطة أحرف المفاتيح العامة
يقدّم النظام ملفًا خاصًا مضمّنًا لخريطة أحرف المفاتيح يُسمى Generic.kcm
.
تم تصميم خريطة أحرف المفاتيح هذه لتتوافق مع مجموعة متنوعة من لوحات المفاتيح الخارجية
المعيارية.
لا تعدِّل خريطة أحرف المفاتيح العامة.
ملف خريطة أحرف المفاتيح الافتراضية
يقدّم النظام ملفًا خاصًا مضمّنًا لخريطة أحرف المفاتيح يُسمى Virtual.kcm
ويستخدمه أجهزة لوحة المفاتيح الافتراضية.
جهاز لوحة المفاتيح الافتراضية هو جهاز إدخال اصطناعي بمعرّف -1
(راجِع KeyCharacterMap.VIRTUAL_KEYBOARD
). وهو متوفّر على جميع أجهزة Android
بدءًا من Android Honeycomb 3.0. الغرض من جهاز لوحة المفاتيح الافتراضية هو
توفير جهاز إدخال مدمج معروف يمكن استخدامه لإدخال
ضغطات المفاتيح في التطبيقات من خلال واجهة برمجة التطبيقات للكتابة (IME) أو من خلال أدوات الاختبار، حتى بالنسبة إلى
الأجهزة التي لا تحتوي على لوحات مفاتيح مدمجة.
من المفترض أن تتضمّن لوحة المفاتيح الافتراضية تخطيط QWERTY كاملاً وهو نفسه على جميع الأجهزة. يتيح ذلك للتطبيقات إدخال ضغطات المفاتيح باستخدام جهاز لوحة المفاتيح الافتراضية والحصول على النتائج نفسها دائمًا.
لا تعدِّل خريطة أحرف المفاتيح الافتراضية.
بناء الجملة
ملف خريطة أحرف المفاتيح هو ملف نص عادي يتألف من بيان نوع لوحة المفاتيح ومجموعة من بيانات مفاتيح البيان.
بيان نوع لوحة المفاتيح
يصف بيان نوع لوحة المفاتيح السلوك العام للوحة المفاتيح. يجب أن يحتوي ملف خريطة الأحرف على تعريف لنوع لوحة المفاتيح. وللوضوح، غالبًا ما يتم وضعها في أعلى الملف.
type FULL
يتم التعرّف على أنواع لوحات المفاتيح التالية:
-
NUMERIC
: لوحة مفاتيح رقمية (12 مفتاحًا)تتيح لوحة المفاتيح الرقمية إدخال النص باستخدام أسلوب النقر المتعدّد. قد يكون من الضروري النقر على مفتاح عدة مرات لإنشاء الحرف أو الرمز المطلوب.
تم تصميم هذا النوع من لوحات المفاتيح بشكل عام للكتابة باستخدام الإبهام.
يتوافق مع
KeyCharacterMap.NUMERIC
. -
PREDICTIVE
: لوحة مفاتيح تحتوي على جميع الأحرف، ولكن مع أكثر من حرف واحد لكل مفتاحتم تصميم هذا النوع من لوحات المفاتيح بشكل عام للكتابة باستخدام الإبهام.
يتوافق مع
KeyCharacterMap.PREDICTIVE
. -
ALPHA
: لوحة مفاتيح تحتوي على جميع الأحرف وربما بعض الأرقامتتيح لوحة المفاتيح الأبجدية إدخال النص مباشرةً، ولكن قد يكون لها تنسيق كثيف بتصميم صغير الحجم. على عكس لوحة مفاتيح
FULL
، قد لا يكون بالإمكان الوصول إلى بعض الرموز إلا باستخدام أدوات اختيار أحرف خاصة على الشاشة. بالإضافة إلى ذلك، لتحسين سرعة الكتابة ودقتها، يوفّر الإطار المرجعي ميزات خاصة للوحات المفاتيح الأبجدية، مثل الكتابة بالأحرف اللاتينية الكبيرة تلقائيًا ومفتاحَي SHIFT وALT المُبدَّلَين أو المُقفَلَين.تم تصميم هذا النوع من لوحات المفاتيح بشكل عام للكتابة باستخدام الإبهام.
-
FULL
: لوحة مفاتيح كاملة على غرار لوحة مفاتيح الكمبيوتر الشخصيتعمل لوحة المفاتيح الكاملة مثل لوحة مفاتيح الكمبيوتر الشخصي. يمكن الوصول إلى جميع الرموز مباشرةً من خلال الضغط على مفاتيح لوحة المفاتيح بدون استخدام ميزات أو عناصر مساعدة على الشاشة، مثل التكبير التلقائي للأحرف.
تم تصميم هذا النوع من لوحات المفاتيح بشكل عام للكتابة باستخدام كلتا اليدين.
-
SPECIAL_FUNCTION
: لوحة مفاتيح تُستخدَم فقط لتنفيذ وظائف التحكّم في النظام بدلاً من الكتابةتتألف لوحة المفاتيح الخاصة بالوظائف من مفاتيح غير قابلة للطباعة فقط، مثل HOME وPOWER، والتي لا تُستخدَم في الواقع للكتابة.
إنّ خريطتَي أحرف مفتاحَي Generic.kcm
وVirtual.kcm
هما لوحتا مفاتيح FULL
.
بيانات المفاتيح
تتألف كلّ من بيانات المفاتيح من الكلمة الرئيسية key
متبوعة برمز مفتاح Android
اسم، وقوسين معقوفين مفتوحَين، ومجموعة من السمات والسلوكيات، وقوسين معقوفين مغلقَين.
key A { label: 'A' base: 'a' shift, capslock: 'A' ctrl, alt, meta: none }
الخصائص
تُنشئ كلّ خاصيّة مفتاح ربطًا من مفتاح إلى سلوك. لجعل ملفات خريطة أحرف المفاتيح أكثر كثافة، يمكن ربط عدة خصائص بال السلوك نفسه عن طريق فصلها بفواصل.
في المثال أعلاه، تمّ إسناد السلوك 'A'
إلى السمة label
.
وبالمثل، يتمّ منح السمات ctrl
وalt
وmeta
none
سلوكًا في الوقت نفسه.
يتم التعرّف على السمات التالية:
-
label
: لتحديد التصنيف الذي يتم طباعته على المفتاح عندما يتكون من حرف واحد. هذه هي القيمة التي تعرضها الطريقةKeyCharacterMap.getDisplayLabel
. -
number
: لتحديد السلوك (الحرف الذي يجب كتابته) عندما يكون عرض النص الرقمي في المقدّمة، مثل عندما يكتب المستخدم رقم هاتف.غالبًا ما تجمع لوحات المفاتيح المدمجة رموزًا متعددة في مفتاح واحد، بحيث يمكن استخدام المفتاح نفسه لكتابة
'1'
و'a'
أو'#'
و'q'
. بالنسبة إلى مفاتيح الأرقام هذه، يجب ضبط السمةnumber
للإشارة إلى الرمز الذي يجب كتابته في سياق رقمي، إن توفّر.تشمل بعض الرموز "العددية" الشائعة الأرقام من
'0'
إلى'9'
و'#'
و'+'
'('
و')'
و','
و'.'
. -
base
: لتحديد السلوك (الحرف الذي يجب كتابته) في حال عدم الضغط على أي مفاتيح تعديل -
<modifier> أو <modifier1>
+
<modifier2>+
...: لتحديد السلوك (الحرف الذي يجب كتابته) عند الضغط على المفتاح وجميع عوامل تعديل المُحدَّدة نشطةعلى سبيل المثال، تحدّد خاصية المُعدِّل
shift
سلوكًا يتم تطبيقه عند الضغط على مُعدِّل LEFT SHIFT أو RIGHT SHIFT.وبالمثل، تحدّد سمة المُعدِّل
rshift+ralt
سلوكًا يتم تطبيقه عند الضغط على مُعدِّلَي SHIFT الأيمن وALT الأيمن معًا.
يتم التعرّف على المُعدِّلات التالية في سمات المُعدِّلات:
shift
: ينطبق عند الضغط على مفتاح LEFT SHIFT أو RIGHT SHIFT.lshift
: ينطبق عند الضغط على مُعدِّل LEFT SHIFT.rshift
: ينطبق عند الضغط على مفتاح SHIFT الأيمن.alt
: ينطبق عند الضغط على مفتاح التعديل LEFT ALT أو RIGHT ALT.lalt
: ينطبق عند الضغط على مفتاح التعديل LEFT ALT.ralt
: ينطبق عند الضغط على مفتاح التعديل ALT الأيمن.ctrl
: ينطبق عند الضغط على مفتاح التعديل LEFT CONTROL أو RIGHT CONTROL.lctrl
: ينطبق عند الضغط على مفتاح التحويل LEFT CONTROL.rctrl
: ينطبق عند الضغط على مُعدِّل "التحكّم الأيمن".meta
: ينطبق عند الضغط على مُعدِّل LEFT META أو RIGHT META.lmeta
: يتم تطبيقه عند الضغط على مُعدِّل LEFT META.rmeta
: ينطبق عند الضغط على مُعدِّل RIGHT META.sym
: ينطبق عند الضغط على مُعدِّل SYMBOL.fn
: ينطبق عند الضغط على المُعدِّل FUNCTION.capslock
: ينطبق هذا الرمز عندما يكون مفتاح التعديل CAPS LOCK مُقفَلاً.numlock
: ينطبق هذا الرمز عندما يكون مفتاح NUM LOCK معدَّلاً.scrolllock
: ينطبق هذا الخيار عندما يكون مُعدِّل SCROLL LOCK مُقفَلاً.
إنّ الترتيب الذي يتم إدراج المواقع الإلكترونية به مهم. عند ربط مفتاح بأحد السلوكيات، يفحص النظام جميع المواقع ذات الصلة بالترتيب ويعرض آخر سلوك قابل للتطبيق عثر عليه.
ونتيجةً لذلك، تلغي السمات التي يتم تحديدها لاحقًا السمات التي تم تحديدها سابقًا لمفتاح معيّن.
السلوكيات
يتم ربط كلّ خاصيّة بسلوك. السلوك الأكثر شيوعًا هو كتابة حرف، ولكن هناك سلوكيات أخرى.
يتم التعرّف على السلوكيات التالية:
-
none
: لا تكتب أي حرف.يكون هذا السلوك هو الإعداد التلقائي في حال عدم تحديد أي حرف. إنّ تحديد
none
هو اختياري، ولكنه يساهم في تحسين الوضوح. -
'X'
: اكتب الحرف المحدّد.يؤدي هذا السلوك إلى إدخال الحرف المحدّد في عرض النص الذي تم التركيز عليه. يمكن أن يكون الحرف الثابت أي حرف ASCII أو أحد تسلسلات الهروب التالية:
'\\'
: اكتب حرف الشرطة المائلة للخلف.'\n'
: اكتب حرف سطر جديد (استخدِم هذا الحرف بدلاً من مفتاح ENTER / RETURN).'\t'
: اكتب رمز علامة التبويب.'\''
: اكتب حرف علامة الاقتباس أحادية.'\"'
: اكتب حرف اقتباس.'\uXXXX'
: اكتب حرف Unicode الذي تم تحديد موضع رمزه بالترميز السداسي العشري XXXX.
-
fallback
<اسم رمز مفتاح Android>: تنفيذ إجراء تلقائي إذا لم يعالج التطبيق المفتاحيؤدي هذا السلوك إلى محاكاة الضغط على مفتاح مختلف عندما لا يعالج أحد التطبيقات المفتاح المحدّد بشكل أصلي. ويُستخدَم هذا الإجراء لدعم السلوك التلقائي للمفاتيح الجديدة التي لا تعرف بعض التطبيقات كيفية التعامل معها، مثل مفتاح ESCAPE أو مفاتيح لوحة المفاتيح الرقمية (عند عدم الضغط على مفتاح Numlock).
عند تنفيذ سلوك احتياطي، سيتلقّى التطبيق نقرتين على المفتاح: واحدة للمفتاح الأصلي وأخرى للمفتاح الاحتياطي الذي تم اختياره. إذا كان التطبيق يعالج المفتاح الأصلي أثناء رفع إصبع المستخدم عن المفتاح، سيتم إلغاء حدث المفتاح الاحتياطي (سيعرض
KeyEvent.isCanceled
القيمةtrue
).
يحتفظ النظام بحرفين من Unicode لتنفيذ وظائف خاصة:
-
'\uef00'
: عند تنفيذ هذا السلوك، يستهلك عرض النص ويزيل الأحرف الأربعة التي تسبق المؤشر، ويفسّرها كأرقام سداسية عشرية، ويُدرج النقطة رمز Unicode المقابلة. -
'\uef01'
: عند تنفيذ هذا السلوك، يعرض عرض النص مربّع حوار أداة اختيار الأحرف الذي يحتوي على رموز متنوعة.
يتعرّف النظام على أحرف يونيكود التالية على أنّها أحرف مفتاحية ميتة تشمل علامات تشكيلية:
'\u0300'
: علامة الإطالة'\u0301'
: علامة التشكيل الحاد'\u0302'
: علامة المدّ المعقوفة'\u0303'
: علامة المد'\u0308'
: علامة النبر.
عند كتابة مفتاح غير قابل للاستخدام متبوعًا بحرف آخر، يتم تكوين المفتاح غير القابل للاستخدام والحرفين التاليين. على سبيل المثال، عندما يكتب المستخدم علامة نبر ميت يتبعها الحرف "a"، تكون النتيجة "à".
يُرجى الرجوع إلى KeyCharacterMap.getDeadChar
للحصول على مزيد من المعلومات عن معالجة المفاتيح غير الصالحة.
التعليقات
تبدأ أسطر التعليق بعلامة الهاشتاغ (#) وتستمر إلى نهاية السطر. على النحو التالي:
# A comment!
يتم تجاهل السطور الفارغة.
كيفية ربط مجموعات المفاتيح بالسلوكيات
عندما يضغط المستخدم على مفتاح، يبحث النظام عن السلوك المرتبط بمزيج الضغط على هذا المفتاح وعناصر الضبط التي تم الضغط عليها حاليًا.
Shift + A
لنفترض أنّ المستخدم ضغط على A وSHIFT معًا. يحدِّد النظام أولاً
مجموعة المواقع والسلوكيات المرتبطة بـ KEYCODE_A
.
key A { label: 'A' base: 'a' shift, capslock: 'A' ctrl, alt, meta: none }
يفحص النظام السمات من الأولى إلى الأخيرة ومن اليمين إلى اليسار، مع تجاهل
سمتَي label
وnumber
اللتين هما خاصتان.
أول موقع تم العثور عليه هو base
. تنطبق السمة base
دائمًا على
مفتاح، بغض النظر عن مفاتيح التعديل التي يتم الضغط عليها. ويحدِّد بشكل أساسي السلوك
التلقائي للمفتاح ما لم يتم إلغاؤه من خلال السمات التالية.
بما أنّ السمة base
تنطبق على الضغط على هذا المفتاح، يلاحظ النظام
أنّ سلوكه هو 'a'
(اكتب الحرف a
).
يواصل النظام بعد ذلك فحص المواقع اللاحقة في حال كان أيّ منها
أكثر تحديدًا من base
وتجاوزه. يصادف الرمز shift
الذي
ينطبق أيضًا على الضغط على مفتاحَي Shift + A. لذلك، يقرر النظام تجاهل
سلوك السمة base
ويختار السلوك المرتبط
بالسمة shift
، وهو 'A'
(اكتب الحرف A
).
يستمرّ البرنامج بعد ذلك في فحص الجدول، ولكن لا تنطبق أيّ خصائص أخرى على عملية الضغط على المفتاح هذه (لم يتم قفل مفتاح CAPS LOCK، ولم يتم الضغط على مفتاح CONTROL، ولم يتم الضغط على مفتاح ALT، ولم يتم الضغط على مفتاح META).
وبالتالي، فإنّ السلوك الناتج عن مجموعة المفاتيح SHIFT + A هو 'A'
.
CONTROL + A
لنفترض الآن ما سيحدث إذا ضغط المستخدم على A وCONTROL معًا.
وكما في السابق، سيفحص النظام جدول المواقع. سيلاحظ
أنّه تم تطبيق السمة base
، ولكنّه سيواصل أيضًا المسح الضوئي إلى أن
يصل في النهاية إلى السمة control
. في الواقع، تظهر سمة control
بعد base
، لذا تلغي سلوكها سلوك base
.
وبالتالي، فإنّ السلوك الناتج عن مجموعة المفاتيح CONTROL + A هو none
.
ESC
لنفترض الآن أنّ المستخدم ضغط على مفتاح ESCAPE.
key ESCAPE { base: fallback BACK alt, meta: fallback HOME ctrl: fallback MENU }
هذه المرة، يحصل النظام على السلوك fallback BACK
، وهو سلوك احتياطي.
وبما أنّه لا يظهر أي حرف حرفي، لن يتم كتابة أي حرف.
عند معالجة المفتاح، سيرسل النظام أولاً KEYCODE_ESCAPE
إلى
التطبيق. إذا لم يعالج التطبيق هذا الإجراء، سيحاول النظام
المحاولة مرة أخرى ولكن هذه المرة سيرسل KEYCODE_BACK
إلى التطبيق كما هو مطلوب في السلوك الاحتياطي.
وبالتالي، فإنّ التطبيقات التي تتعرّف على KEYCODE_ESCAPE
وتتوافق معها تملك
الفرصة للتعامل معها كما هي، ولكن التطبيقات الأخرى التي لا تتوافق معها يمكنها بدلاً من ذلك
تنفيذ الإجراء الاحتياطي المتمثل في التعامل مع المفتاح كما لو كان KEYCODE_BACK
.
NUMPAD_0 مع أو بدون NUM LOCK
تختلف تفسيرات مفاتيح لوحة المفاتيح الرقمية اختلافًا كبيرًا حسب ما إذا كان مفتاح NUM LOCK مُقفَلاً.
يضمن بيان المفاتيح التالي أنّ KEYCODE_NUMPAD_0
يكتب 0
عند الضغط على مفتاح NUM LOCK. عندما لا يتم الضغط على مفتاح NUM LOCK، يتم إرسال المفتاح
إلى التطبيق كالمعتاد، وإذا لم يتم التعامل معه، يتم إرسال المفتاح العميق
KEYCODE_INSERT
بدلاً من ذلك.
key NUMPAD_0 { label, number: '0' base: fallback INSERT numlock: '0' ctrl, alt, meta: none }
كما نرى، تُحسِّن بيانات مفاتيح النسخ الاحتياطي التوافق بشكل كبير مع التطبيقات القديمة التي لا تتعرّف على جميع المفاتيح المتوفّرة على لوحة مفاتيح كاملة بتصميم الكمبيوتر الشخصي أو لا تتيح استخدامها مباشرةً.
أمثلة
لوحة المفاتيح الكاملة
# This is an example of part of a key character map file for a full keyboard # include a few fallback behaviors for special keys that few applications # handle themselves. type FULL key C { label: 'C' base: 'c' shift, capslock: 'C' alt: '\u00e7' shift+alt: '\u00c7' ctrl, meta: none } key SPACE { label: ' ' base: ' ' ctrl: none alt, meta: fallback SEARCH } key NUMPAD_9 { label, number: '9' base: fallback PAGE_UP numlock: '9' ctrl, alt, meta: none }
لوحة مفاتيح أبجدية رقمية
# This is an example of part of a key character map file for an alphanumeric # thumb keyboard. Some keys are combined, such as `A` and `2`. Here we # specify `number` labels to tell the system what to do when the user is # typing a number into a dial pad. # # Also note the special character '\uef01' mapped to ALT+SPACE. # Pressing this combination of keys invokes an on-screen character picker. type ALPHA key A { label: 'A' number: '2' base: 'a' shift, capslock: 'A' alt: '#' shift+alt, capslock+alt: none } key SPACE { label: ' ' number: ' ' base: ' ' shift: ' ' alt: '\uef01' shift+alt: '\uef01' }
لوحة ألعاب
# This is an example of part of a key character map file for a game pad. # It defines fallback actions that enable the user to navigate the user interface # by pressing buttons. type SPECIAL_FUNCTION key BUTTON_A { base: fallback BACK } key BUTTON_X { base: fallback DPAD_CENTER } key BUTTON_START { base: fallback HOME } key BUTTON_SELECT { base: fallback MENU }
ملاحظة حول التوافق
قبل نظام التشغيل Android Honeycomb 3.0، تم تحديد خريطة أحرف مفاتيح Android
باستخدام بنية مختلفة جدًا وتم تجميعها في تنسيق ملف ثنائي
(.kcm.bin
) في وقت التصميم.
على الرغم من أنّ التنسيق الجديد يستخدم الإضافة نفسها .kcm
، إلا أنّ البنية مختلفة تمامًا (وأكثر فعالية).
اعتبارًا من الإصدار 3.0 من Android Honeycomb، يجب أن تستخدم جميع ملفات خريطة أحرف مفاتيح Android
البنية الجديدة وتنسيق ملف النص العادي الموضّحَين في هذا المستند.
لا تتوفّر البنية القديمة ولا يتعرّف النظام على ملفات .kcm.bin
القديمة.
ملاحظة حول اللغة
لا يتيح نظام التشغيل Android حاليًا استخدام لوحات المفاتيح المتعددة اللغات. بالإضافة إلى ذلك، يفترض جدول تحويل الأحرف المفتاحية العام المضمّن تخطيط لوحة مفاتيح باللغة الإنجليزية (الولايات المتحدة).
ننصح المصنّعين الأصليّين للأجهزة بتوفير خرائط مخصّصة لشخصيات المفاتيح في لوحات المفاتيح إذا كانت مصمّمة للغات أخرى.
قد توفّر الإصدارات المستقبلية من Android دعمًا أفضل للوحات المفاتيح المتعدّدة اللغات أو تنسيقات لوحات المفاتيح التي يمكن للمستخدم اختيارها.
التحقُّق
احرص على التحقّق من صحة ملفات خريطة الرموز الرئيسية باستخدام أداة التحقّق من صحة خرائط المفاتيح.