Subject: Re: bug#66470: 29.1; Provide Urdu input method

From: Rahguzar <[email-masked]>
Date: Sat, 21 Oct 2023 20:59:10 +0200

Hi Eli,
I have attached a new patch with this email containing 5 input methods.
3 of them for Urdu and 1 each for Pashto and Sindhi. Two of Urdu input
methods correspond to the two keyboards at https://www.branah.com/urdu
and the Pashto and Sindhi input methods follow keyboard layouts from the
same page.

The remaining input method roughly corresponds to the one I sent
before. The changes are:
1) Translations are customizable.

2) Numerals can be Arabic or Roman depending on a customizable variable.
This is because both are routinely used in Urdu text.

3) There are a bunch of prefixes which are customizable. Some of these
prefixes are for inputting characters from Balochi, Brahui, Hindko,
Pashto, Saraiki and Sindhi. After including Punjabi which can be
inputted using the same characters as Urdu (along with maybe one
character from Saraiki) this covers all characters from all languages
spoken by more than 1% of people in Pakistan according to Wikipedia
https://en.wikipedia.org/wiki/Languages_of_Pakistan .

In (not too distant) future I would also like to add keyboard layouts
for Balochi and Saraiki. I cannot speak these languages but I can find
some keyboard layouts on internet, e.g.
https://keymanweb.com/#skr-arab,Keyboard_saraiki
https://keymanweb.com/#bal,Keyboard_balochi_phonetic

Are there any copyright issues to be aware of in using the layouts
from web?

Another question: For the customize types, I have opted for character as
the type of a translation. I think it is the most convenient choice for
someone wanting to customize. However it is not most general type quail
allows. Is there any opinion on what the type should be?

Lastly customizing these variables has the potential to shadow some
translations. For this I would like to add a check to the setter
functions that checks for that and raises a warning if such a shadowing
occurs. Is there a standard customize way of raising such a warning?

Please let me know of any changes to be made.

Thanks,
Rahguzar

>From f65a94261c15eb004a522827656e157b8f9fd944 Mon Sep 17 00:00:00 2001
From: Rahguzar <[email-masked]>
Date: Sat, 21 Oct 2023 20:57:21 +0200
Subject: [PATCH] Input methods for Urdu, Pashto and Sindhi

---
 lisp/leim/quail/pakistan.el | 700 ++++++++++++++++++++++++++++++++++++
 1 file changed, 700 insertions(+)
 create mode 100644 lisp/leim/quail/pakistan.el

diff --git a/lisp/leim/quail/pakistan.el b/lisp/leim/quail/pakistan.el
new file mode 100644
index 00000000000..9f969ba6719
--- /dev/null
+++ b/lisp/leim/quail/pakistan.el
@@ -0,0 +1,700 @@
+;;; pakistan.el --- Input methods for some languages from Pakistan -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2023 Free Software Foundation, Inc.
+
+;; Author: Rahguzar <[email-masked]>
+;; Keywords: convenience, multilingual, input method, Urdu, Balochi, Pashto, Sindhi, Hindko, Brahui
+;;
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+;;
+;;; Commentary:
+;; Provides a semi-phonetic input method for Urdu
+;;
+;;; Code:
+(require 'quail)
+
+;;;; Urdu Input Methods
+;;;;; Keyboard
+;; Layout taken from https://www.branah.com/urdu
+(quail-define-package
+ "urdu-keyboard" "Urdu" "اردو تختی" t
+ "Input method for Urdu.
+Uses keyboard layout from https://www.branah.com/urdu"
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ط)
+ ("w" ?ص)
+ ("e" ?ھ)
+ ("r" ?د)
+ ("t" ?ٹ)
+ ("y" ?پ)
+ ("u" ?ت)
+ ("i" ?ب)
+ ("o" ?ج)
+ ("p" ?ح)
+ ("a" ?م)
+ ("s" ?و)
+ ("d" ?ر)
+ ("f" ?ن)
+ ("g" ?ل)
+ ("h" ?ہ)
+ ("j" ?ا)
+ ("k" ?ک)
+ ("l" ?ی)
+ ("z" ?ق)
+ ("x" ?ف)
+ ("c" ?ے)
+ ("v" ?س)
+ ("b" ?ش)
+ ("n" ?غ)
+ ("m" ?ع)
+ ("Q" ?ظ)
+ ("W" ?ض)
+ ("E" ?ذ)
+ ("R" ?ڈ)
+ ("T" ?ث)
+ ("Y" ?ّ)
+ ("U" ?ۃ)
+ ("I" ?ـ)
+ ("O" ?چ)
+ ("P" ?خ)
+ ("A" ?ژ)
+ ("S" ?ز)
+ ("D" ?ڑ)
+ ("F" ?ں)
+ ("G" ?ۂ)
+ ("H" ?ء)
+ ("J" ?آ)
+ ("K" ?گ)
+ ("L" ?ي)
+ ("C" ?ۓ)
+ ("B" ?ؤ)
+ ("N" ?ئ)
+ ("[" ?\])
+ ("]" ?\[)
+ ("{" ?})
+ ("}" ?{)
+ (";" ?؛)
+ ("." ?۔)
+ ("," ?،)
+ ("?" ?؟))
+
+;;;;; Phonetic Keyboard
+(quail-define-package
+ "urdu-phonetic-keyboard" "Urdu" "اردو صوتی" t
+ "Input method for Urdu.
+Uses phonetic keyboard layout from https://www.branah.com/urdu"
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ق)
+ ("w" ?و)
+ ("e" ?ع)
+ ("r" ?ر)
+ ("t" ?ت)
+ ("y" ?ے)
+ ("u" ?ء)
+ ("i" ?ی)
+ ("o" ?ہ)
+ ("p" ?پ)
+ ("a" ?ا)
+ ("s" ?س)
+ ("d" ?د)
+ ("f" ?ف)
+ ("g" ?گ)
+ ("h" ?ح)
+ ("j" ?ج)
+ ("k" ?ک)
+ ("l" ?ل)
+ ("z" ?ز)
+ ("x" ?ش)
+ ("c" ?چ)
+ ("v" ?ط)
+ ("b" ?ب)
+ ("n" ?ن)
+ ("m" ?م)
+ ("Q" ?ْ)
+ ("W" ?ٔ)
+ ("E" ?ٰ)
+ ("R" ?ڑ)
+ ("T" ?ٹ)
+ ("Y" ?َ)
+ ("U" ?ئ)
+ ("I" ?ِ)
+ ("O" ?ۃ)
+ ("P" ?ُ)
+ ("A" ?آ)
+ ("S" ?ص)
+ ("D" ?ڈ)
+ ("F" ?أ)
+ ("G" ?غ)
+ ("H" ?ھ)
+ ("J" ?ض)
+ ("K" ?خ)
+ ("L" ?ٖ)
+ ("Z" ?ذ)
+ ("X" ?ژ)
+ ("C" ?ث)
+ ("V" ?ظ)
+ ("B" ?ً)
+ ("N" ?ں)
+ ("M" ?ّ)
+ ("1" ?۱)
+ ("2" ?۲)
+ ("3" ?۳)
+ ("4" ?۴)
+ ("5" ?۵)
+ ("6" ?٦)
+ ("7" ?۷)
+ ("8" ?۸)
+ ("9" ?۹)
+ ("0" ?۰)
+ ("`" ?؏)
+ ("#" ?ؔ)
+ ("$" ?ؒ)
+ ("%" ?٪)
+ ("^" ?ؓ)
+ ("&" ?ؑ)
+ ("*" ?ؐ)
+ ("(" ?\))
+ (")" ?\()
+ ("=" ?+)
+ (";" ?؛)
+ ("\\" ?÷)
+ ("|" ?x)
+ ("," ?،)
+ ("." ?۔)
+ ("<" ?ٗ)
+ (">" ?.)
+ ("?" ?؟)
+ ("[" ?﷽)
+ ("]" ?ﷲ)
+ ("{" ?ﷺ))
+
+;;;;; Customizable Input Method
+;;;;;; Helper functions
+(defun pakistan--define-quail-rules (rules &optional prefix package)
+  "Define the rules for an input method.
+PACKAGE determines the input method and defaults to `urdu-custom'.
+RULES is the list of rules to define, see `quail-define-rules' for details.  If
+non-nil PREFIX is a string that is added to prefix to each string in RULES.
+PREFIX can be a symbol in which case it is looked up in `pakistan-urdu-prefixes'
+to obtain the string."
+  (setq package (or package "urdu-custom"))
+  (when (and prefix (symbolp prefix))
+    (setq prefix (car (alist-get prefix pakistan-urdu-prefixes))))
+  (dolist (rule rules)
+    (quail-defrule (concat prefix (car rule)) (cadr rule) package)))
+
+(defun pakistan--make-setter (&optional prefix package)
+  "Retrun the setter function.
+The function add rules to PACKAGE with PREFIX."
+  (lambda (var val)
+    (set-default-toplevel-value var val)
+    (pakistan--define-quail-rules val prefix package)
+    (when (equal current-input-method (quail-name))
+      (activate-input-method current-input-method))))
+
+(defun pakistan--regenerate-translations ()
+  "Regenerate the translations for urdu-custom input method."
+  (quail-install-map '(nil) "urdu-custom")
+  (pakistan--define-quail-rules pakistan-urdu-translations)
+  (pakistan--define-quail-rules
+   pakistan-urdu-diacritics-and-other-symbols 'diacritics)
+  (pakistan--define-quail-rules pakistan-urdu-poetic-symbols 'poetic)
+  (pakistan--define-quail-rules pakistan-urdu-religious-symbols 'religious)
+  (pakistan--define-quail-rules pakistan-extra-balochi-translations 'balochi-brahui)
+  (pakistan--define-quail-rules pakistan-extra-pashto-translations 'pashto)
+  (pakistan--define-quail-rules pakistan-extra-saraiki-translations 'saraiki-hindko)
+  (pakistan--define-quail-rules pakistan-extra-sindhi-translations 'sindhi))
+
+(defun pakistan--set-prefixes (var val)
+  "Setter function for `pakistan-urdu-prefixes'.
+VAR should be `pakistan-urdu-prefixes' and VAL is value to be set."
+  (set-default-toplevel-value var val)
+  (when (boundp 'pakistan-urdu-translations)
+    (pakistan--regenerate-translations)))
+
+(defun pakistan--set-numeral-translations (var val)
+  "Add translations for digits.
+VAR should be `pakistan-urdu-use-roman-digits' and VAL its value."
+  (set-default-toplevel-value var val)
+  (if val
+      (pakistan--regenerate-translations)
+    (pakistan--define-quail-rules
+     '(("0"  ?۰)
+       ("1"  ?۱)
+       ("2"  ?۲)
+       ("3"  ?۳)
+       ("4"  ?۴)
+       ("5"  ?۵)
+       ("6"  ?۶)
+       ("7"  ?۷)
+       ("8"  ?۸)
+       ("9"  ?۹)
+       ("%" ?٪)))))
+
+;;;;;; Package definition
+(quail-define-package
+ "urdu-custom" "Urdu" "اردو انفر۱دی" t
+ "Intuitive and customizable transl input method for Urdu.
+By default this input method doesn't try to follow the common romanization of Urdu
+very closely.  The reason for this is allow to for input efficiency. It works as
+follows:
+
+1) All lower case letters on QWERTY keyboard are translated to an urdu
+character.  When more than one Urdu letter corresponds to the same Roman letter,
+the most common Urdu letter has been chosen.  The frequency analysis was done
+on the basis of Urdu word list at
+https://github.com/urduhack/urdu-words/blob/master/words.txt
+As a result some of the translations are:
+h → ہ
+s → س , c → ص
+z → ز
+
+2) For the next common letter the uppercase English letter is used, e.g.
+r → ر , R → ڑ
+n → ن , N → ں
+
+3) The letter x is used for postfix completions.  There are two subcases:
+3a) When more than two urdu letter map to the same roman letter,
+e.g.
+t → ت, T → ٹ , tx → ط , Tx → ۃ
+h → ہ , H → ھ , hx → ح , Hx → ۂ
+s → س , c → ص , sx → ش , S → ث , cx → چ
+z → ز , Z → ض, zx → ذ , Zx → ظ
+3b) The urdu letters that are commonly romanized by a English letter + h
+can be obtained by the same English letter + x i.e.
+gx → غ , cx → چ, kx → خ , sx → ش
+
+4) Y → ژ is somewhat of an abberation.  All four of z, Z, zx and Zx which are
+used by more common letters.  Y is used for ژ because it is sometimes pronounced
+close to Y for some European languages.
+
+These translations can be changed by customizing `pakistan-urdu-translations'.
+
+5) o is used for prefix completion of diacrtics or اعر۱ب as well as some
+poetic and religious symbols.  The most common three diacritics are mapped to
+oa → zabr (a for above)
+ob → zer  (b for below)
+oo → pesh (o for the circle in pesh)
+
+6) The poetic symbols are also available under G (for غزل), while religious
+symbols are also available under M (for مزہب).
+
+7) Characters from Balochi, Brahui Pashto, Saraiki and Sindhi which are not
+part of Urdu alphabet can also be input.  Each set of these sets correspond to a
+different prefixes. See `pakistan-urdu-prefixes' for the prefixes.
+
+The translations and the prefixes described above can be customized. Various
+customization options can be found under the customization group
+`pakistan-urdu-input'."
+ nil t t t t nil nil nil nil nil t)
+
+;;;;;; Customizations
+(defgroup pakistan-urdu-input nil
+  "Customization group for Urdu input methods."
+  :group 'quail)
+
+(defcustom pakistan-urdu-prefixes
+  '((diacritics "o")
+    (poetic "G")
+    (religious "M")
+    (balochi-brahui "B")
+    (pashto "P")
+    (sindhi "C")
+    (saraiki-hindko "X"))
+  "Prefixes for `urdu-custom' input method."
+  :set #'pakistan--set-prefixes
+  :type '(repeat (list symbol string))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-translations
+  '(("a" ?ا)
+    ("y" ?ی)
+    ("r" ?ر)
+    ("n" ?ن)
+    ("v" ?و)
+    ("m" ?م)
+    ("t" ?ت)
+    ("l" ?ل)
+    ("k" ?ک)
+    ("b" ?ب)
+    ("d" ?د)
+    ("h" ?ہ)
+    ("s" ?س)
+    ("H" ?ھ)
+    ("p" ?پ)
+    ("N" ?ں)
+    ("g" ?گ)
+    ("sx" ?ش)
+    ("j" ?ج)
+    ("T" ?ٹ)
+    ("f" ?ف)
+    ("cx" ?چ)
+    ("z" ?ز)
+    ("u" ?ع)
+    ("q" ?ق)
+    ("kx" ?خ)
+    ("e" ?ے)
+    ("E" ?ۓ)
+    ("hx" ?ح)
+    ("i" ?ئ)
+    ("R" ?ڑ)
+    ("tx" ?ط)
+    ("c" ?ص)
+    ("D" ?ڈ)
+    ("gx" ?غ)
+    ("A" ?آ)
+    ("Z" ?ض)
+    ("V" ?ؤ)
+    ("zx" ?ذ)
+    ("S" ?ث)
+    ("Zx" ?ظ)
+    ("Hx" ?ۂ)
+    ("ix" ?ء)
+    ("Tx" ?ۃ)
+    ("Y" ?ژ)
+    ("ax" ?أ)
+    ("." ?۔)
+    ("," ?،)
+    (";"  ?؛)
+    ("?"  ?؟))
+  "Translations for Urdu characters, digits and common punctuations."
+  :set (pakistan--make-setter)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-diacritics-and-other-symbols
+  '(("a" ?َ)  ;; zabar زبر
+    ("b" ?ِ)  ;; zer زير
+    ("o" ?ُ)  ;; pesh پيش
+    ("j" ?ْ)  ;; jazam جزم
+    ("S" ?ّ)  ;; tashdid تشدید
+    ("k" ?ٰ)  ;; khari zabar کھڑی زبر
+    ("u" ?٘)  ;; ulti jazm الٹی جزم
+    ("s" ?؎)
+    ("m" ?؏)
+    ("t" ?ؔ)
+    ("c" ?ؐ)
+    ("r" ?ؒ)
+    ("R" ?ؓ)
+    ("A" ?ؑ))
+  "Translations to input Urdu diacrtics.
+These are available under the prefix specified in `pakistan-urdu-prefixes'."
+  :set (pakistan--make-setter 'diacritics)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-poetic-symbols
+  '(("s" ?؎)
+    ("m" ?؏)
+    ("t" ?ؔ))
+  "Translation to input Urdu peotic symbols.
+These are available under the prefix specified in `pakistan-urdu-prefixes'"
+  :set (pakistan--make-setter 'poetic)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-religious-symbols
+  '(("s" ?ؐ)
+    ("r" ?ؒ)
+    ("R" ?ؓ)
+    ("a" ?ؑ)
+    ("A" ?ﷲ)
+    ("S" ?ﷺ))
+  "Translation to input Urdu peotic symbols.
+These are available under the prefix specified in `pakistan-urdu-prefixes'"
+  :set (pakistan--make-setter 'religious)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+;; I don't understand how many of these letters are pronounced.
+;; So better translations are welcome.
+(defcustom pakistan-extra-balochi-brahui-translations
+  '(("v" ?ۏ)
+    ("y" ?ݔ)
+;; Brahui
+   ("l" ?ڷ))
+  "Translations to input Balochi and Brahui letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'"
+  :set (pakistan--make-setter 'balochi-brahui)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-extra-pashto-translations
+  '(("t" ?ټ)
+    ("d" ?ډ)
+    ("r" ?ړ)
+    ("n" ?ڼ)
+    ("s" ?ښ)
+    ("R" ?ږ)
+    ("h" ?څ)
+    ("H" ?ځ))
+  "Translations to input Pashto letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'"
+  :set (pakistan--make-setter 'pashto)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-extra-sindhi-translations
+  '(("k" ?ڪ)
+    ("j" ?ڄ)
+    ("t" ?ٺ)
+    ("T" ?ٽ)
+    ("tx" ?ٿ)
+    ("b" ?ٻ)
+    ("B" ?ڀ)
+    ("r" ?ڙ)
+    ("d" ?ڌ)
+    ("D" ?ڏ)
+    ("dx" ?ڊ)
+    ("Dx" ?ڍ)
+    ("h" ?ڃ)
+    ("c" ?ڇ)
+    ("p" ?ڦ)
+    ("n" ?ڻ)
+    ("g" ?ڳ)
+    ("G" ?ڱ))
+  "Translations to input Sindhi letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'"
+  :set (pakistan--make-setter 'sindhi)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-extra-saraiki-hindko-translations
+  '(("b" ?ٻ)
+    ("h" ?ڄ)
+    ("g" ?ڳ)
+    ("d" ?ݙ)
+    ("n" ?ݨ)
+;; Hindko
+    ("r" ?ݬ)
+    ("v" ?ڨ)
+    ("N" ?ݩ)
+    ("V" ?ٷ))
+"Translations to input Saraiki letters not found in Urdu.
+These are available under the prefix specified in `pakistan-urdu-prefixes'"
+  :set (pakistan--make-setter 'saraiki-hindko)
+  :type '(repeat (list string character))
+  :group 'pakistan-urdu-input)
+
+(defcustom pakistan-urdu-use-roman-digits
+  nil
+  "Whether urdu-custom input method should use roman digits."
+  :set #'pakistan--set-numeral-translations
+  :type 'boolean
+  :group 'pakistan-urdu-input)
+
+;;;; Sindhi Input Methods
+;;;;; Keyboard
+;; Layout taken from https://www.branah.com/sindhi
+(quail-define-package
+ "sindhi-keyboard" "Sindhi" "سِنڌِي" t
+ "Input method for Sindhi.
+Uses keyboard layout from https://www.branah.com/sindhi"
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ق)
+ ("w" ?ص)
+ ("e" ?ي)
+ ("r" ?ر)
+ ("t" ?ت)
+ ("y" ?ٿ)
+ ("u" ?ع)
+ ("i" ?ڳ)
+ ("o" ?و)
+ ("p" ?پ)
+ ("a" ?ا)
+ ("s" ?س)
+ ("d" ?د)
+ ("f" ?ف)
+ ("g" ?گ)
+ ("h" ?ه)
+ ("j" ?ج)
+ ("k" ?ڪ)
+ ("l" ?ل)
+ ("z" ?ز)
+ ("x" ?خ)
+ ("c" ?ط)
+ ("v" ?ڀ)
+ ("b" ?ب)
+ ("n" ?ن)
+ ("m" ?م)
+ ("Q" ?َ)
+ ("W" ?ض)
+ ("E" ?ِ)
+ ("R" ?ڙ)
+ ("T" ?ٽ)
+ ("Y" ?ث)
+ ("U" ?غ)
+ ("I" ?ھ)
+ ("O" ?ُ)
+ ("P" ?ڦ)
+ ("A" ?آ)
+ ("S" ?ش)
+ ("D" ?ڊ)
+ ("F" ?ڦ)
+ ("G" ?ً)
+ ("H" ?ح)
+ ("J" ?ٍ)
+ ("K" ?ۡ)
+ ("L" ?:)
+ ("Z" ?ذ)
+ ("X" ?ّ)
+ ("C" ?ظ)
+ ("V" ?ء)
+ ("B" ?ٻ)
+ ("N" ?ڻ)
+ ("M" ?۾)
+ ("1" ?۱)
+ ("2" ?۲)
+ ("3" ?۳)
+ ("4" ?۴)
+ ("5" ?۵)
+ ("6" ?٦)
+ ("7" ?۷)
+ ("8" ?۸)
+ ("9" ?۹)
+ ("0" ?۰)
+ ("`" ?’)
+ ("-" ?ڏ)
+ ("=" ?ڌ)
+ ("~" ?‘)
+ ("@" ?ى)
+ ("#" ?ؔ)
+ ("$" ?ؒ)
+ ("%" ?٪)
+ ("^" ?ؓ)
+ ("&" ?۽)
+ ("*" ?ؤ)
+ ("(" ?\))
+ (")" ?\()
+ ("[" ?ڇ)
+ ("]" ?چ)
+ ("{" ?ڃ)
+ ("}" ?ڄ)
+ (";" ?ک)
+ ("'" ?ڱ)
+ ("\\" ?ڍ)
+ (":" ?؛)
+ ("|" ?ٺ)
+ ("," ?،)
+ ("/" ?ئ)
+ ("<" ?“)
+ (">" ?”)
+ ("?" ?؟))
+
+
+;;;; Pashto Input Methods
+;;;;; Keyboard
+(quail-define-package
+ "pashto-keyboard" "Pashto" "پښتو" t
+ "Input method for Pashto.
+Uses keyboard layout from https://www.branah.com/pashto"
+ nil t t t t nil nil nil nil nil t)
+
+(quail-define-rules
+ ("q" ?ض)
+ ("w" ?ص)
+ ("e" ?ث)
+ ("r" ?ق)
+ ("t" ?ف)
+ ("y" ?غ)
+ ("u" ?ع)
+ ("i" ?ه)
+ ("o" ?خ)
+ ("p" ?ح)
+ ("a" ?ش)
+ ("s" ?س)
+ ("d" ?ی)
+ ("f" ?ب)
+ ("g" ?ل)
+ ("h" ?ا)
+ ("j" ?ت)
+ ("k" ?ن)
+ ("l" ?م)
+ ("z" ?ۍ)
+ ("x" ?ې)
+ ("c" ?ز)
+ ("v" ?ر)
+ ("b" ?ذ)
+ ("n" ?د)
+ ("m" ?ړ)
+ ("Q" ?ْ)
+ ("W" ?ٌ)
+ ("E" ?ٍ)
+ ("R" ?ً)
+ ("T" ?ُ)
+ ("Y" ?ِ)
+ ("U" ?َ)
+ ("I" ?ّ)
+ ("O" ?څ)
+ ("P" ?ځ)
+ ("A" ?ښ)
+ ("S" ?ﺉ)
+ ("D" ?ي)
+ ("F" ?پ)
+ ("G" ?أ)
+ ("H" ?آ)
+ ("J" ?ټ)
+ ("K" ?ڼ)
+ ("L" ?ة)
+ ("Z" ?ظ)
+ ("X" ?ط)
+ ("C" ?ژ)
+ ("V" ?ء)
+ ("B" ?‌)
+ ("N" ?ډ)
+ ("M" ?ؤ)
+ ("1" ?۱)
+ ("2" ?۲)
+ ("3" ?۳)
+ ("4" ?۴)
+ ("5" ?۵)
+ ("6" ?۶)
+ ("7" ?۷)
+ ("8" ?۸)
+ ("9" ?۹)
+ ("0" ?۰)
+ ("`" ?‍)
+ ("~" ?÷)
+ ("@" ?٬)
+ ("#" ?٫)
+ ("%" ?٪)
+ ("^" ?×)
+ ("&" ?«)
+ ("*" ?»)
+ ("_" ?ـ)
+ ("[" ?ج)
+ ("]" ?چ)
+ ("{" ?\[)
+ ("}" ?\])
+ (";" ?ک)
+ ("'" ?ګ)
+ ("\"" ?؛)
+ ("|" ?٭)
+ ("," ?و)
+ ("." ?ږ)
+ ("<" ?،)
+ (">" ?.)
+ ("?" ?؟))
+
+;;; End Matter
+(provide 'pakistan)
+;;; pakistan.el ends here
-- 
2.42.0