#
# Copyright (c) 1999, 2009, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

#
# COMPONENT_NAME: idl.toJava
#
# ORIGINS: 27
#
# Licensed Materials - Property of IBM
# 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
# RMI-IIOP v1.0
#
#
# Translator:  Each line below is of the form "<key>=<message>".
#              The keys are NOT to be translated.
#              The messages ARE to be translated.
#
#              DO NOT translate the following:
#               IBM
#               IDL
#               Java
#
#              %0 is a parameter to the message.  Do not translate it.
#
#              A backslash (\) at the end of a line is a line continuation
#              character.  A backslash at the beginning of a line means don't
#              ignore leading blanks (they normally are).  These backslashes
#              should remain in the message.
#
# Translator:  Start Translating
#
toJavaProlog1=Generated by the %0
toJavaProlog2=from %0
PreEmit.indeterminateTypeInfo=Cannot determine type infomation for %0.
InterfaceGen.noImpl=No local implementation found for %0.
Version.product=IDL-to-Java compiler (portable), version "%0"
Version.number=3.2
NameModifier.TooManyPercent=Pattern contains more than one percent characters
NameModifier.NoPercent=Pattern does not contain a percent character
NameModifier.InvalidChar=Pattern contains an invalid character %0
#
# Translator: In the list of options below, do not translate:
#             -d, -emitAll, -f, -i, -keep, -m, -sep, -pkgPrefix, -td, -v, -verbose, -version, -implbase
#             Do not translate the string "java com.sun.tools.corba.se.idl.toJavaPortable.Compile"
#
usage=Compiler Usage:\n\
\n\
\    java com.sun.tools.corba.se.idl.toJavaPortable.Compile [options] <idl file>\n\
\n\
where <idl file> is the name of a file containing IDL definitions, and\n\
[options] is any combination of the options listed below.  The options\n\
are optional and may appear in any order; <idl file> is required and\n\
must appear last.\n\
\ \n\
Options:\n\
  -d <symbol>               This is equivalent to the following line in an\n\
\                          IDL file:  #define <symbol>\n\
  -emitAll                  Emit all types, including those found in #included files.\n\
  -f<side>                  Define what bindings to emit.  <side> is one of client,\n\
\                          server, all, serverTIE, allTIE.  serverTIE and allTIE\n\
\                          cause delegate model skeletons to be emitted.  If this\n\
\                          flag is not used, -fclient is assumed.\n\
  -i <include path>         By default, the current directory is scanned for\n\
\                          included files.  This option adds another directory.\n\
  -keep                     If a file to be generated already exists, do not\n\
\                          overwrite it.  By default it is overwritten.\n\
  -noWarn                   Suppress warnings.\n\
  -oldImplBase              Generate skeletons compatible with old (pre-1.4) JDK ORBs.\n\
  -pkgPrefix <t> <prefix>   When the type or module name <t> is encountered at\n\
\                          file scope, begin the Java package name for all files\n\
\                          generated for <t> with <prefix>.\n\
  -pkgTranslate <t> <pkg>   When the type or module name <t> in encountered, replace\n\
\                          it with <pkg> in the generated java package.  Note that\n\
\                          pkgPrefix changes are made first.  <t> must match the\n\
\                          full package name exactly.  Also, <t> must not be\n\
\                          org, org.omg, or any subpackage of org.omg.\n\
  -skeletonName <xxx%yyy>   Name the skeleton according to the pattern.\n\
\                          The defaults are:\n\
\                          %POA for the POA base class (-fserver or -fall) \n\
\                          _%ImplBase for the oldImplBase base class\n\
\                          (-oldImplBase and (-fserver or -fall)).\n\
  -td <dir>                 use <dir> for the output directory instead of\n\
\                          the current directory.\n\
  -tieName <xxx%yyy>        Name the tie according to the pattern.  The defaults are:\n\
\                          %POATie for the POA tie (-fserverTie or -fallTie) \n\
\                          %_Tie for the oldImplBase tie\n\
\                          (-oldImplBase and (-fserverTie or -fallTie)).\n\
  -v, -verbose              Verbose mode.\n\
  -version                  Display the version number and quit.\n
