#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
#
# Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
#
# Oracle and Java are registered trademarks of Oracle and/or its affiliates.
# Other names may be trademarks of their respective owners.
#
# The contents of this file are subject to the terms of either the GNU General Public
# License Version 2 only ("GPL") or the Common Development and Distribution
# License("CDDL") (collectively, the "License"). You may not use this file except in
# compliance with the License. You can obtain a copy of the License at
# http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
# License for the specific language governing permissions and limitations under the
# License.  When distributing the software, include this License Header Notice in
# each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
# designates this particular file as subject to the "Classpath" exception as provided
# by Oracle in the GPL Version 2 section of the License file that accompanied this code.
# If applicable, add the following below the License Header, with the fields enclosed
# by brackets [] replaced by your own identifying information:
# "Portions Copyrighted [year] [name of copyright owner]"
# 
# Contributor(s):
# 
# The Original Software is NetBeans. The Initial Developer of the Original Software
# is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
# Rights Reserved.
# 
# If you wish your version of this file to be governed by only the CDDL or only the
# GPL Version 2, indicate your decision by adding "[Contributor] elects to include
# this software in this distribution under the [CDDL or GPL Version 2] license." If
# you do not indicate a single choice of license, a recipient has the option to
# distribute your version of this file under either the CDDL, the GPL Version 2 or
# to extend the choice of license to its licensees as provided above. However, if you
# add GPL Version 2 code and therefore, elected the GPL Version 2 license, then the
# option applies only if the new code is made subject to such option by the copyright
# holder.
# 

R.loading.local.registry=Chargement du registre local [{0}]
R.error.loading.local.registry.failed.title=\u00c9chec du chargement du registre local
R.error.loading.local.registry.failed.msg=Le registre local [{0}] ne peut pas \u00eatre charg\u00e9, ou a \u00e9t\u00e9 charg\u00e9 partiellement.\nLe programme d'installation peut continuer normalement, mais cela peut peut entrainer une corruption du registre global.\n\nChoisir Oui pour continuer, Non pour quitter le programme d'installation.

R.loading.bundled.registry=Chargement du registre embarqu\u00e9 [{0}]
R.error.loading.bundled.registry.failed.title=\u00c9chec du chargement du registre embarqu\u00e9
R.error.loading.bundled.registry.failed.msg=Le registre embarqu\u00e9 ({0}) ne peut pas \u00eatre charg\u00e9 ou a \u00e9t\u00e9 charg\u00e9 partiellement.\nLe programme d'installation peut continuer normalement, mais cela peut entrainer une corruption du registre global.\n\nChoisir Oui pour continuer, Non pour quitter le programme d'installation.

R.loading.remote.registry=Chargement du registre distant [{0}]
R.error.loading.remote.registry.failed.title=\u00c9chec du chargement du registre distant
R.error.loading.remote.registry.failed.msg=Le registre distant ({0}) ne peut \u00eatre charg\u00e9 ou a \u00e9t\u00e9 charg\u00e9 partiellement.\nLe programme d'installation peut continuer normalement, mais cela peut entrainer la corruption du registre global.\n\nChoisir Oui pour continuer, Non pour quitter le programme d'installation.

R.error.cannot.delete.data=Impossible de supprimer les donn\u00e9es d''installation mises en cache
R.save.local.registry.title=Enregistrement du registre local
R.save.local.registry.detail=Enregistrement dans {0}

R.error.missing.target.component.title=Composant cible manquant
R.error.missing.target.component.msg=Le composant cible sp\u00e9cifi\u00e9 - {0}/{1}\n n''a pu \u00eatre trouv\u00e9 dans le registre. Le programme d'installation\n peut continuer comme si le composant cible n''\u00e9tait pas sp\u00e9cifi\u00e9.\nCliquez Oui pour continuer, Non pour quitter le programme d'installation.

R.error.validation.title=Probl\u00e8me de validation
R.error.validation.msg=Il semble que l''installation de {0} est corrompue.\nLa proc\u00e9dure de validation a g\u00e9n\u00e9r\u00e9 l''avertissement suivant:\n\n{1}\n\n Voulez-vous marquer ce produit comme non install\u00e9 et continuer ?\nSi vous cliquez sur Non l''installateur se fermera.\n\nNotez que les produits qui d\u00e9pendent de {2} seront aussi d\u00e9sactiv\u00e9s :\n{3} 

R.error.matching.requirement=Aucun des composants ne correspond aux exigences : {0} n\u00e9cessite {1}
R.error.cyclic.dependency=D\u00e9pendance cyclique : {0}, {1}

R.loading.registry.properties=Chargement des propri\u00e9t\u00e9s du registre
R.loading.component=Chargement du composant : uid={0}, version={1}
R.error.loading.components=Impossible de charger les composants
R.error.registry.finalization=Impossible de finaliser le registre
R.error.registry.document.loading=Impossible de charger le document du registre

R.error.cannot.create.cache.directory=Impossible de cr\u00e9er le r\u00e9pertoire cache de produits local {0}
R.error.cache.is.file=Le r\u00e9pertoire cache de produits local existe et c''est un fichier : {0}
R.error.cannot.read.cache=Impossible d'\u00e9crire le r\u00e9pertoire local de cache du produit {0} - droits insuffisants
R.error.cannot.write.cache=Impossible de lire le r\u00e9pertoire local de cache du produit {0} - droits insuffisants
R.error.cannot.create.registry=Impossible de cr\u00e9er un registre local

R.error.registry.is.dir=Le registre local {0} est un r\u00e9pertoire
R.error.cannot.read.registry=Impossible de lire le registre local {0} - droits insuffisants
R.error.cannot.write.registry=Impossible d''\u00e9crire dans le registre local {0} - droits insuffisants

R.error.cannot.parse.platform=Impossible de d\u00e9terminer la plateforme \u00e0 partir de "{0}"
R.error.cannot.load.registry=Impossible de charger le registre
R.error.parser.not.support.schemas=Le parser courant - {0} - ne prend pas en charge les sch\u00e9mas.

R.error.unknown.dependency=Type de d\u00e9pendance inconnu {0}

