#
#
# Copyright (c) 1998, 2005, 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.
#

# "rmid", inetd", and "wait" should not be translated.
rmid.syntax.exec.invalid=\
        rmid was launched from inetd with an invalid status (must be wait)

# "rmid" and "inetd" should not be translated.
rmid.syntax.port.badarg=\
	port cannot be specified if rmid is launched from inetd

# "port" here refers to a TCP port for the server to listen on.
rmid.syntax.port.badnumber=\
	port is not a number

# "-port" should not be translated, because it's part of command syntax.
rmid.syntax.port.missing=\
	-port option requires argument

# "-log" should not be translated, because it's part of command syntax.
rmid.syntax.log.missing=\
	-log option requires argument

# "-log" should not be translated, because it's part of command syntax.
rmid.syntax.log.required=\
	-log option required

# {0} = the (string) illegal argument in question
rmid.syntax.illegal.option=\
	illegal option: {0}

# {0} = the (string) reason text that came with a thrown exception
# "Activation.main" should not be translated, because it's a codepoint
rmid.unexpected.exception=\
	Activation.main: an exception occurred: {0}

# "java.home" should not be translated, because it's a property name
# "ActivatorImpl" should not be translated, because it's a codepoint
rmid.unfound.java.home.property=\
	ActivatorImpl: unable to locate java.home

# "rmid" should not be translated
rmid.inherited.channel.info=\
	rmid startup with inherited channel

# "Activation.main" should not be translated, because it's a codepoint
rmid.exec.policy.invalid=\
	Activation.main: invalid exec policy class

# "rmid" should not be translated
rmid.exec.policy.exception=\
	rmid: attempt to obtain exec policy throws:

# "rmid" should not be translated
rmid.exec.command=\
	rmid: debugExec: running "{0}"

# "rmid" should not be translated
rmid.group.inactive=\
	rmid: activation group inactive: {0}

# "Activation.main", "sun.rmi.activation.execPolicy", "ExecPermission" and 
# "ExecOptionPermission" should not be translated, since they refer to
# class/permission names.
rmid.exec.perms.inadequate=\
	Activation.main: warning: sun.rmi.activation.execPolicy system\n\
        property unspecified and no ExecPermissions/ExecOptionPermissions\n\
        granted; subsequent activation attempts may fail due to unsuccessful\n\
	ExecPermission/ExecOptionPermission permission checks.  For\n\
	documentation on how to configure rmid security, refer to:\n\
\n\
        http://java.sun.com/j2se/1.4/docs/tooldocs/solaris/rmid.html\n\
        http://java.sun.com/j2se/1.4/docs/tooldocs/win32/rmid.html\n

# "rmid", "-port", "-log", "-stop", "-C" and "-J" should not be translated,
# because they are syntax
rmid.usage=Usage: {0} <options>\
\n\
\nwhere <options> include:\
\n  -port <port>        Specify port for rmid to use\
\n  -log <directory>    Specify directory in which rmid writes log\
\n  -stop               Stop current invocation of rmid (for specified port)\
\n  -C<runtime flag>    Pass argument to each child process (activation group)\
\n  -J<runtime flag>    Pass argument to the java interpreter\
\n\

# This means "The currently running activation daemon has been shut down,
# and is about to exit".
rmid.daemon.shutdown=\
	activation daemon shut down

# "rmid" should not be translated
rmid.restart.group.warning=\
\nrmid: (WARNING) restart group throws:

# "rmid" should not be translated
rmid.restart.service.warning=\
\nrmid: (WARNING) restart service throws:

# "rmid" should not be translated
rmid.log.update.warning=\
\nrmid: (WARNING) log update throws:

# "rmid" should not be translated
rmid.log.snapshot.warning=\
\nrmid: (SEVERE) log snapshot throws:

# "rmid" should not be translated
rmid.log.recover.warning=\
\nrmid: (WARNING) {0}: skipping log record during recovery:
