% File src/library/tools/man/checkRdaFiles.Rd
% Part of the R package, https://www.R-project.org
% Copyright 2012-2024 R Core Team
% Distributed under GPL 2 or later

\name{checkPoFiles}
\alias{checkPoFile}
\alias{checkPoFiles}
\title{Check Translation Files for Inconsistent Format Strings}
\description{
  These functions compare formats embedded in English messages
  with translated strings to check for consistency.  \code{checkPoFile}
  checks one file, while \code{checkPoFiles} checks all files for specified
  or all languages.
}
\usage{
checkPoFile(f, strictPlural = FALSE)
checkPoFiles(language, dir = ".")
}
\arguments{
  \item{f}{a character string giving a single filepath.}
  \item{strictPlural}{whether to compare formats of singular and plural
    forms in a strict way.}
  \item{language}{a character string giving a language code, or a
    \sQuote{\link{regexp}} (regular expression), to match languages in \code{dir}.
    Use \code{""} to denote all languages in the \code{dir} path.}
  \item{dir}{a path to a directory in which to check files.}
}
\details{
  Part of \R's internationalization depends on translations of messages
  in \file{.po} files.  In these files an \sQuote{English} message taken
  from the \R sources is followed by a translation into another
  language.  Many of these messages are format strings for C or \R
  \code{\link{sprintf}} and related functions.  In these cases, the
  translation must give a compatible format or an error will be
  generated when the message is displayed.

  The rules for compatibility differ between C and \R in several ways. C
  supports several conversions not supported by \R, namely \code{c},
  \code{u}, \code{p}, \code{n}.  It is allowed in C's \code{sprintf()}
  function to have more arguments than are needed by the format string,
  but in \R the counts must match exactly.  \R requires types of
  arguments to match, whereas C will do the display whether it makes
  sense or not.

  These functions compromise on the testing as follows.  The additional
  formats allowed in C are accepted, and all differences in argument
  type or count are reported.  As a consequence some reported
  differences are not errors.

  If the \code{strictPlural} argument is \code{TRUE}, then argument
  lists must agree exactly between singular and plural forms of messages; if
  \code{FALSE}, then translations only need to match one or the other
  of the two forms.  When \code{checkPoFiles} calls \code{checkPoFile},
  the \code{strictPlural} argument is set to \code{TRUE} for files with
  names starting \file{R-}, and to \code{FALSE} otherwise.

  Items marked as \sQuote{fuzzy} in the \file{.po} file are not
  processed (as they are ignored by the message compiler).

  If a difference is found, the translated string is checked for variant
  percent signs (e.g., the wide percent sign \code{"\uFF05"}).  Such signs
  will not be recognized as format specifiers, and are likely to be
  errors.
}
\value{
  Both functions return an object of S3 class \code{"check_po_files"}.  A
  \code{print} method is defined for this class to display a report on
  the differences.
}
\references{
  See the GNU gettext manual for the \file{.po} file format:\cr
  \url{https://www.gnu.org/software/gettext/manual/gettext.html}.
}
\author{
  Duncan Murdoch
}
\seealso{
  \code{\link{update_pkg_po}()} which calls \code{checkPoFile()};
  \code{\link{xgettext}}, \code{\link{sprintf}}.
}
\examples{
\dontrun{
checkPoFiles("de", "/path/to/R/src/directory")
}
}
\keyword{ utilities }
