emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 5fdf4fc: i18n: Add function ngettext for pluralizat


From: Juri Linkov
Subject: [Emacs-diffs] master 5fdf4fc: i18n: Add function ngettext for pluralization.
Date: Sun, 24 Mar 2019 17:55:15 -0400 (EDT)

branch: master
commit 5fdf4fc07df7dd897931efb5dbf5f26dfaff9274
Author: Juri Linkov <address@hidden>
Commit: Juri Linkov <address@hidden>

    i18n: Add function ngettext for pluralization.
    
    * lisp/international/mule-cmds.el (ngettext): New function.
    https://lists.gnu.org/archive/html/emacs-devel/2019-03/msg00586.html
    
    * lisp/replace.el (flush-lines, how-many, occur-1, occur-engine)
    (perform-replace): Use ngettext.
    
    * lisp/progmodes/grep.el (grep-exit-message): Use ngettext.
    (grep-mode-font-lock-keywords): Match both singular and plural form
    of "matches".
---
 etc/NEWS                        |  5 ++++
 lisp/international/mule-cmds.el | 14 +++++++++++
 lisp/progmodes/grep.el          |  7 ++++--
 lisp/replace.el                 | 51 ++++++++++++++++++++++++-----------------
 4 files changed, 54 insertions(+), 23 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index cb48599..bbba59c 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1364,6 +1364,11 @@ Now, such rx expressions generate an error.
 
 * Lisp Changes in Emacs 27.1
 
+** i18n (internationalization)
+
+*** ngettext can be used now to return the right plural form
+according to the given numeric value.
+
 +++
 ** inhibit-null-byte-detection is renamed to inhibit-nul-byte-detection
 
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index 5f87d89..035932e 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -2798,6 +2798,20 @@ See also `locale-charset-language-names', 
`locale-language-names',
                      'a4)))))))
   nil)
 
+;;; i18n (internationalization)
+
+(defun ngettext (msgid msgid_plural n)
+  "Return the plural form of the translation of the string.
+This function is similar to the `gettext' function as it finds the message
+catalogs in the same way.  But it takes two extra arguments.  The MSGID
+parameter must contain the singular form of the string to be converted.
+It is also used as the key for the search in the catalog.
+The MSGID_PLURAL parameter is the plural form.  The parameter N is used
+to determine the plural form.  If no message catalog is found MSGID is
+returned if N is equal to 1, otherwise MSGID_PLURAL."
+  (if (= n 1) msgid msgid_plural))
+
+
 ;;; Character property
 
 (put 'char-code-property-table 'char-table-extra-slots 5)
diff --git a/lisp/progmodes/grep.el b/lisp/progmodes/grep.el
index a5427dd..c0f4715 100644
--- a/lisp/progmodes/grep.el
+++ b/lisp/progmodes/grep.el
@@ -459,7 +459,7 @@ abbreviated part can also be toggled with
      ;; remove match from grep-regexp-alist before fontifying
      ("^Grep[/a-zA-Z]* started.*"
       (0 '(face nil compilation-message nil help-echo nil mouse-face nil) t))
-     ("^Grep[/a-zA-Z]* finished with \\(?:\\(\\(?:[0-9]+ \\)?matches 
found\\)\\|\\(no matches found\\)\\).*"
+     ("^Grep[/a-zA-Z]* finished with \\(?:\\(\\(?:[0-9]+ \\)?match\\(?:es\\)? 
found\\)\\|\\(no matches found\\)\\).*"
       (0 '(face nil compilation-message nil help-echo nil mouse-face nil) t)
       (1 compilation-info-face nil t)
       (2 compilation-warning-face nil t))
@@ -552,7 +552,10 @@ Set up `compilation-exit-message-function' and run 
`grep-setup-hook'."
       ;; so the buffer is still unmodified if there is no output.
       (cond ((and (zerop code) (buffer-modified-p))
             (if (> grep-num-matches-found 0)
-                 (cons (format "finished with %d matches found\n" 
grep-num-matches-found)
+                 (cons (format (ngettext "finished with %d match found\n"
+                                         "finished with %d matches found\n"
+                                         grep-num-matches-found)
+                               grep-num-matches-found)
                        "matched")
                '("finished with matches found\n" . "matched")))
            ((not (buffer-modified-p))
diff --git a/lisp/replace.el b/lisp/replace.el
index 59ad1a3..318a9fb 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -983,7 +983,10 @@ also print the number."
                       (progn (forward-line 1) (point)))
         (setq count (1+ count))))
     (set-marker rend nil)
-    (when interactive (message "Deleted %d matching lines" count))
+    (when interactive (message (ngettext "Deleted %d matching line"
+                                        "Deleted %d matching lines"
+                                        count)
+                              count))
     count))
 
 (defun how-many (regexp &optional rstart rend interactive)
@@ -1032,9 +1035,10 @@ a previously found match."
        (if (= opoint (point))
            (forward-char 1)
          (setq count (1+ count))))
-      (when interactive (message "%d occurrence%s"
-                                count
-                                (if (= count 1) "" "s")))
+      (when interactive (message (ngettext "%d occurrence"
+                                          "%d occurrences"
+                                          count)
+                                count))
       count)))
 
 
@@ -1617,11 +1621,12 @@ See also `multi-occur'."
                  (not (eq occur-excluded-properties t))))))
          (let* ((bufcount (length active-bufs))
                 (diff (- (length bufs) bufcount)))
-           (message "Searched %d buffer%s%s; %s match%s%s"
-                    bufcount (if (= bufcount 1) "" "s")
+           (message "Searched %d %s%s; %s %s%s"
+                    bufcount
+                    (ngettext "buffer" "buffers" bufcount)
                     (if (zerop diff) "" (format " (%d killed)" diff))
                     (if (zerop count) "no" (format "%d" count))
-                    (if (= count 1) "" "es")
+                    (ngettext "match" "matches" count)
                     ;; Don't display regexp if with remaining text
                     ;; it is longer than window-width.
                     (if (> (+ (length (or (get-text-property 0 'isearch-string 
regexp)
@@ -1856,14 +1861,15 @@ See also `multi-occur'."
                  (let ((beg (point))
                        end)
                    (insert (propertize
-                            (format "%d match%s%s%s in buffer: %s%s\n"
-                                    matches (if (= matches 1) "" "es")
+                            (format "%d %s%s%s in buffer: %s%s\n"
+                                    matches
+                                    (ngettext "match" "matches" matches)
                                     ;; Don't display the same number of lines
                                     ;; and matches in case of 1 match per line.
                                     (if (= lines matches)
-                                        "" (format " in %d line%s"
+                                        "" (format " in %d %s"
                                                    lines
-                                                   (if (= lines 1) "" "s")))
+                                                   (ngettext "line" "lines" 
lines)))
                                     ;; Don't display regexp for multi-buffer.
                                     (if (> (length buffers) 1)
                                         "" (occur-regexp-descr regexp))
@@ -1889,13 +1895,15 @@ See also `multi-occur'."
        (goto-char (point-min))
        (let ((beg (point))
              end)
-         (insert (format "%d match%s%s total%s:\n"
-                         global-matches (if (= global-matches 1) "" "es")
+         (insert (format "%d %s%s total%s:\n"
+                         global-matches
+                         (ngettext "match" "matches" global-matches)
                          ;; Don't display the same number of lines
                          ;; and matches in case of 1 match per line.
                          (if (= global-lines global-matches)
-                             "" (format " in %d line%s"
-                                        global-lines (if (= global-lines 1) "" 
"s")))
+                             "" (format " in %d %s"
+                                        global-lines
+                                        (ngettext "line" "lines" 
global-lines)))
                          (occur-regexp-descr regexp)))
          (setq end (point))
          (when title-face
@@ -2730,10 +2738,10 @@ characters."
                                            (1+ num-replacements))))))
                              (when (and (eq def 'undo-all)
                                         (null (zerop num-replacements)))
-                               (message "Undid %d %s" num-replacements
-                                        (if (= num-replacements 1)
-                                            "replacement"
-                                          "replacements"))
+                               (message (ngettext "Undid %d replacement"
+                                                  "Undid %d replacements"
+                                                  num-replacements)
+                                        num-replacements)
                                (ding 'no-terminate)
                                (sit-for 1)))
                           (setq replaced nil last-was-undo t 
last-was-act-and-show nil)))
@@ -2859,9 +2867,10 @@ characters."
                       last-was-act-and-show     nil))))))
       (replace-dehighlight))
     (or unread-command-events
-       (message "Replaced %d occurrence%s%s"
+       (message (ngettext "Replaced %d occurrence%s"
+                          "Replaced %d occurrences%s"
+                          replace-count)
                 replace-count
-                (if (= replace-count 1) "" "s")
                 (if (> (+ skip-read-only-count
                           skip-filtered-count
                           skip-invisible-count)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]