# Portuguese translations for R package.
# Copyright (C) 2005 The R Foundation
# This file is distributed under the same license as the R package.
# Fernando Henrique Ferraz P. da Rosa <feferraz@ime.usp.br>, 2005.
msgid ""
msgstr ""
"Project-Id-Version: R 2.3.0\n"
"Report-Msgid-Bugs-To: bugs.r-project.org\n"
"POT-Creation-Date: 2018-03-29 07:06\n"
"PO-Revision-Date: 2011-03-26 08:57-0300\n"
"Last-Translator: Fernando Henrique Ferraz P. da Rosa <feferraz@.ime.usp.br>\n"
"Language-Team: http://www.feferraz.net/br/P/Projeto_Traducao_R_Portugues\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Translate Toolkit 1.7.0\n"

msgid "must have at least 'ord' knots"
msgstr "pelo menos os nós 'ord' devem estar presentes"

#, fuzzy
msgid "length of 'derivs' is larger than length of 'x'"
msgstr "comprimento de 'derivs' deve ser igual ao comprimento de 'x'"

msgid "empty 'derivs'"
msgstr ""

msgid "'ord' must be positive integer, at most the number of knots"
msgstr ""
"'ord' deve ser um inteiro positivo, sendo no máximo igual ao número de nós"

#, fuzzy
msgid "need at least %s (=%d) knots"
msgstr "são necessários pelo menos 2*ord -1 (=%d) nós"

#, fuzzy
msgid "the 'x' data must be in the range %g to %g unless you set '%s'"
msgstr ""
"os dados 'x' devem estar na faixa de %g a %g, a não ser que você especifique "
"'outer.ok = TRUE'"

msgid "%s needs package 'Matrix' correctly installed"
msgstr ""

msgid "values of 'x' must be distinct"
msgstr "valores de 'x' devem ser distintos"

#, fuzzy
msgid "must have at least 'ord'=%d points"
msgstr "pelo menos os nós 'ord' devem estar presentes"

msgid "'formula' must be of the form \"y ~ x\""
msgstr "'formula' deve ser da forma \"y ~ x\""

msgid "lengths of 'x' and 'y' must match"
msgstr "comprimentos de 'x' e 'y' devem ser iguais"

msgid "values of 'x' must be strictly increasing"
msgstr "valores de 'x' devem ser estritamente crescentes"

msgid "'ord' must be >= 2"
msgstr "'ord' deve ser >= 2"

msgid "the range of 'x' values exceeds one period"
msgstr "a faixa de variação dos valores de 'x' escede um período"

msgid "knot positions must be non-decreasing"
msgstr "posições dos nós devem ser não decrescentes"

msgid "lengths of 'x' and 'y' must be the same"
msgstr "comprimentos de 'x' e 'y' devem ser iguais"

msgid "'deriv' must be between 0 and %d"
msgstr "'deriv' deve estar entre 0 e %d"

msgid "knot positions must be strictly increasing"
msgstr "posições dos nós devem ser estritamente crescentes"

msgid "currently implemented only for cubic splines"
msgstr ""

msgid "spline must be monotone"
msgstr "spline deve ser monótono"

msgid "'degree' must be integer >= 1"
msgstr "'degree' deve ser inteiro >= 1"

#, fuzzy
msgid "'df' was too small; have used %d"
msgstr "'df' muito pequeno; foi usado"

msgid "some 'x' values beyond boundary knots may cause ill-conditioned bases"
msgstr ""
"alguns valores de 'x' depois dos nós de fronteira podem causar bases má "
"condicionadas"
