Commit 5fdf4fc0 authored by Juri Linkov's avatar Juri Linkov

i18n: Add function ngettext for pluralization.

* lisp/international/mule-cmds.el (ngettext): New function.

* 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".
parent 36535caf
Pipeline #1066 passed with stage
in 51 minutes and 1 second
......@@ -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
......@@ -2798,6 +2798,20 @@ See also `locale-charset-language-names', `locale-language-names',
;;; 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)
......@@ -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"
'("finished with matches found\n" . "matched")))
((not (buffer-modified-p))
......@@ -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"
(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"
(if (= count 1) "" "s")))
(when interactive (message (ngettext "%d occurrence"
"%d occurrences"
......@@ -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"
(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))
(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"
(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"
(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))
(insert (format "%d match%s%s total%s:\n"
global-matches (if (= global-matches 1) "" "es")
(insert (format "%d %s%s total%s:\n"
(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"
(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)
(message (ngettext "Undid %d replacement"
"Undid %d 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))))))
(or unread-command-events
(message "Replaced %d occurrence%s%s"
(message (ngettext "Replaced %d occurrence%s"
"Replaced %d occurrences%s"
(if (= replace-count 1) "" "s")
(if (> (+ skip-read-only-count
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment