]> git.eshelyaron.com Git - emacs.git/commitdiff
Add input methods for Urdu, Pashto and Sindhi (bug#66470)
authorRahguzar <rahguzar@zohomail.eu>
Sun, 29 Oct 2023 16:14:02 +0000 (17:14 +0100)
committerEli Zaretskii <eliz@gnu.org>
Sat, 18 Nov 2023 09:30:51 +0000 (11:30 +0200)
* lisp/leim/quail/pakistan.el ("urdu-keyboard")
("urdu-phonetic-keyboard", "urdu-custom", "sindhi-keyboard")
("pashto-keyboard"): New input methods.
(pakistan--define-quail-rules, pakistan--make-setter)
(pakistan--regenerate-translations, pakistan--set-prefixes)
(pakistan--define-numeral-translations)
(pakistan--set-numeral-translations):
Internal helper functions.
(pakistan-urdu-input): New customization group.
(pakistan-urdu-prefixes, pakistan-urdu-translations)
(pakistan-urdu-diacritics-and-other-symbols)
(pakistan-urdu-poetic-symbols, pakistan-urdu-religious-symbols)
(pakistan-extra-balochi-brahui-translations)
(pakistan-extra-pashto-translations)
(pakistan-extra-sindhi-translations)
(pakistan-extra-saraiki-hindko-translations)
(pakistan-urdu-use-roman-digits): New custom variables.
(pakistan): New package.

lisp/leim/quail/pakistan.el [new file with mode: 0644]

diff --git a/lisp/leim/quail/pakistan.el b/lisp/leim/quail/pakistan.el
new file mode 100644 (file)
index 0000000..ff92577
--- /dev/null
@@ -0,0 +1,726 @@
+;;; pakistan.el --- Input methods for some languages from Pakistan -*- lexical-binding: t; -*-
+;;
+;; Copyright (C) 2023 Free Software Foundation, Inc.
+
+;; Author: Rahguzar <rahguzar@zohomail.eu>
+;; 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
+;;;;;; Variable declarations
+;; We define these variables now so that byte-compiler does not complain.
+;; Later they will be changed to custom variables. Their value must be void
+;; here as otherwise cutsom will not initialize them to their standard value.
+(defvar pakistan-urdu-prefixes)
+(defvar pakistan-urdu-translations)
+(defvar pakistan-urdu-diacritics-and-other-symbols)
+(defvar pakistan-urdu-poetic-symbols)
+(defvar pakistan-urdu-religious-symbols)
+(defvar pakistan-urdu-use-roman-digits)
+(defvar pakistan-extra-balochi-brahui-translations)
+(defvar pakistan-extra-pashto-translations)
+(defvar pakistan-extra-saraiki-hindko-translations)
+(defvar pakistan-extra-sindhi-translations)
+
+;;;;;; Helper functions
+(defun pakistan--define-quail-rules (rules &optional prefix package)
+  "Define translations for `urdu-custom' input method as determined by RULES.
+PACKAGE determines the input method and defaults to `urdu-custom'.  RULES is
+the list of rules to define, see `quail-defrule' for details.  If non-nil
+PREFIX is a string that is prefixed 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--define-numeral-translations (&optional package)
+  "Define translations to translate digits to arabic digits.
+Translations are for PACKAGE which defaults to `urdu-custom'."
+  (pakistan--define-quail-rules
+   '(("0"  ?۰)
+     ("1"  ?۱)
+     ("2"  ?۲)
+     ("3"  ?۳)
+     ("4"  ?۴)
+     ("5"  ?۵)
+     ("6"  ?۶)
+     ("7"  ?۷)
+     ("8"  ?۸)
+     ("9"  ?۹)
+     ("%" ?٪))
+   nil package))
+
+(defun pakistan--set-numeral-translations (var val)
+  "VAR should be `pakistan-urdu-use-roman-digits' and VAL its value.
+This is a setter function for the custom-variable."
+  (set-default-toplevel-value var val)
+  (if val
+      (pakistan--regenerate-translations)
+    (pakistan--define-numeral-translations)))
+
+(defun pakistan--regenerate-translations ()
+  "Regenerate the translations for urdu-custom input method."
+  (quail-select-package "urdu-custom")
+  (quail-install-map (list nil))
+  (pakistan--define-quail-rules pakistan-urdu-translations)
+  (unless pakistan-urdu-use-roman-digits
+    (pakistan--define-numeral-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-brahui-translations 'balochi-brahui)
+  (pakistan--define-quail-rules pakistan-extra-pashto-translations 'pashto)
+  (pakistan--define-quail-rules
+   pakistan-extra-saraiki-hindko-translations 'saraiki-hindko)
+  (pakistan--define-quail-rules pakistan-extra-sindhi-translations 'sindhi))
+
+(defun pakistan--set-prefixes (var val)
+  "VAR should be `pakistan-urdu-prefixes' and VAL is the value to be set.
+Setter function for `pakistan-urdu-prefixes'."
+  (set-default-toplevel-value var val)
+  (when (boundp 'pakistan-urdu-use-roman-digits)
+    (pakistan--regenerate-translations)))
+
+(defun pakistan--make-setter (&optional prefix)
+  "Return the setter function.
+The function adds rules to `urdu-custom' with PREFIX."
+  (lambda (var val)
+    (set-default-toplevel-value var val)
+    (if (boundp 'pakistan-urdu-use-roman-digits)
+        (pakistan--regenerate-translations)
+      (pakistan--define-quail-rules val prefix))))
+
+;;;;;; 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 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))
+  :version "30.1")
+
+(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 and common punctuations."
+  :set (pakistan--make-setter)
+  :type '(repeat (list string character))
+  :version "30.1")
+
+(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))
+  :version "30.1")
+
+(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))
+  :version "30.1")
+
+(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))
+  :version "30.1")
+
+;; 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))
+  :version "30.1")
+
+(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))
+  :version "30.1")
+
+(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))
+  :version "30.1")
+
+(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))
+  :version "30.1")
+
+(defcustom pakistan-urdu-use-roman-digits
+  nil
+  "Whether urdu-custom input method should use roman digits."
+  :set #'pakistan--set-numeral-translations
+  :type 'boolean
+  :version "30.1")
+
+;;;; 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